about summary refs log tree commit homepage
path: root/projects/mongrel_service/tools/freebasic.rb
diff options
context:
space:
mode:
Diffstat (limited to 'projects/mongrel_service/tools/freebasic.rb')
-rw-r--r--projects/mongrel_service/tools/freebasic.rb361
1 files changed, 0 insertions, 361 deletions
diff --git a/projects/mongrel_service/tools/freebasic.rb b/projects/mongrel_service/tools/freebasic.rb
deleted file mode 100644
index 0b3e445..0000000
--- a/projects/mongrel_service/tools/freebasic.rb
+++ /dev/null
@@ -1,361 +0,0 @@
-#--
-# FreeBASIC project builder
-# inspired by Asset Compiler by Jeremy Voorhis
-# coded by Luis Lavena
-#--
-
-# FreeBASIC Project library for compilation.
-# For example:
-#
-# namespace :projects do
-#   project_task :my_fb_project do
-#     lib         'static'
-#     dylib       'dynamic library'
-#     executable  'exename'
-#    
-#     build_to    'bin'
-#    
-#     define      'MY_DEFINE'
-#    
-#     main        'src/main.bas'
-#     source      'src/other_module.bas'
-#     source      "src/*.bas"
-#   end
-# end
-#
-# This example defines the following tasks:
-#
-#   rake projects:build                 # Build all projects
-#   rake projects:clobber               # Clobber all projects
-#   rake projects:my_fb_project:build   # Build the my_fb_project files
-#   rake projects:my_fb_project:clobber # Remove the my_fb_project files
-#   rake projects:my_fb_project:rebuild # Force a rebuild of the my_fb_project files
-#   rake projects:rebuild               # Rebuild all projects
-
-require 'rake/tasklib'
-require 'pp'
-
-module FreeBASIC
-  # this help me reduce the attempts to remove already removed files.
-  # works with src_files
-  CLOBBER = Rake::FileList.new
-  ON_WINDOWS = (RUBY_PLATFORM =~ /mswin|cygwin|bccwin/)
-  
-  class ProjectTask
-    attr_accessor :name
-    attr_accessor :output_name
-    attr_accessor :type
-    attr_accessor :build_path
-    attr_accessor :defines
-    attr_accessor :main_file
-    attr_accessor :sources
-    attr_accessor :libraries
-    attr_accessor :search_path
-    attr_accessor :libraries_path
-    
-    def initialize(name, &block)
-      @name = name.to_s
-      @build_path = '.'
-      @defines = []
-      @sources = Rake::FileList.new
-      @libraries = []
-      @search_path = []
-      @libraries_path = []
-      @options = {}
-      
-      instance_eval(&block) if block_given?
-      
-      do_cleanup
-      
-      namespace @name do
-        define_clobber_task
-        define_rebuild_task
-        define_build_directory_task
-        define_build_task
-      end
-      add_dependencies_to_main_task
-    end
-    
-    public
-      # using this will set your project type to :executable
-      # and assign exe_name as the output_name for the project
-      # it dynamically will assign extension when running on windows
-      def executable(exe_name)
-        @type = :executable
-        @output_name = "#{exe_name}.#{(ON_WINDOWS ? "exe" : "")}"
-        @real_file_name = @output_name
-      end
-      
-      # lib will set type to :lib and assign 'lib#{lib_name}.a'
-      # as output_name for the project
-      def lib(lib_name)
-        @type = :lib
-        @output_name = "#{lib_name}"
-        @real_file_name = "lib#{lib_name}.a"
-      end
-      
-      # dynlib will set type to :dynlib and assign '#{dll_name}.dll|so'
-      # as output_name for this project
-      def dylib(dll_name)
-        @type = :dylib
-        @output_name = "#{dll_name}.#{(ON_WINDOWS ? "dll" : "so")}"
-        @real_file_name = @output_name
-        @complement_file = "lib#{@output_name}.a"
-      end
-      
-      # this set where the final, compiled executable should be linked
-      # uses @build_path as variable
-      def build_to(path)
-        @build_path = path
-      end
-      
-      # define allow you set compiler time options
-      # collect them into @defines and use later
-      # to call source file compilation process (it wil require cleanup)
-      def define(*defines)
-        @defines << defines
-      end
-      
-      # main set @main_file to be the main module used during the linking
-      # process. also, this module requires special -m flag during his
-      # own compile process
-      # question: in case @no main_file was set, will use the first 'source'
-      # file defined as main? or it should raise a error?
-      def main(main_file)
-        @main_file = main_file
-      end
-      
-      # used to collect sources files for compilation
-      # it will take .bas, .rc, .res as sources
-      # before compilation we should clean @sources!
-      def source(*sources)
-        @sources.include sources
-      end
-    
-      # this is similar to sources, instead library linking is used
-      # also will require cleanup services ;-)
-      def library(*libraries)
-        @libraries << libraries
-      end
-  
-      # use this to set the include path when looking for, ehem, includes
-      # (equals -i fbc compiler param)
-      def search_path(*search_path)
-        @search_path << search_path
-      end
-      
-      # use this to tell the compiler where to look for libraries
-      # (equals -p fbc compiler param)
-      def lib_path(*libraries_path)
-        @libraries_path << libraries_path
-      end
-      
-      # use this to add additional compiler parameters (like debug or errorchecking options)
-      #
-      def option(new_options = {})
-        @options.merge!(new_options)
-      end
-      
-    protected
-      # this method will fix nested libraries and defines
-      # also, if main_file is missing (or wasn't set) will shift the first one
-      # as main
-      def do_cleanup
-        # remove duplicated definitions, flatten
-        @defines.flatten!
-        @defines.uniq! if @defines.length > 1
-
-        # set main_file
-        if @type == :executable
-          @main_file = @sources.shift unless defined?(@main_file)
-        end
-        
-        # empty path? must be corrected
-        @build_path = '.' if @build_path == ''
-        
-        # remove duplicates from sources
-        @sources.uniq! if @sources.length > 1
-        
-        # now the libraries
-        @libraries.flatten!
-        @libraries.uniq! if @libraries.length > 1
-        
-        # search path
-        @search_path.flatten!
-        @search_path.uniq! if @search_path.length > 1
-        
-        # libraries path
-        @libraries_path.flatten!
-        @libraries_path.uniq! if @libraries_path.length > 1
-        
-        # if no target was set, default to executable
-        unless defined?(@output_name)
-          executable(@name)
-        end
-      end
-      
-      # return the compiled name version of the passed source file (src)
-      # compiled_form("test.bas") => "test.o"
-      def compiled_form(src)
-        unless src.nil?
-          src.ext({ ".bas" => "o", ".rc" => "obj" }[File.extname(src)])
-        end
-      end
-      
-      def compiled_project_file
-        File.join @build_path, @real_file_name
-      end
-      
-      def fbc_compile(source, target, main = nil)
-        cmdline = []
-        cmdline << "fbc"
-        cmdline << "-w pedantic" if (@options.has_key?(:pedantic) && @options[:pedantic] == true)
-        cmdline << "-g" if (@options.has_key?(:debug) && @options[:debug] == true)
-        cmdline << "-#{@options[:errorchecking].to_s}" if @options.has_key?(:errorchecking)
-        cmdline << "-mt" if (@options.has_key?(:mt) && @options[:mt] == true)
-        cmdline << "-profile" if (@options.has_key?(:profile) && @options[:profile] == true)
-        cmdline << "-c #{source}"
-        cmdline << "-o #{target}"
-        cmdline << "-m #{main}" unless main.nil?
-        cmdline << @defines.collect { |defname| "-d #{defname}" }
-        cmdline << @search_path.collect { |path| "-i #{path}" }
-        cmdline.flatten.join(' ')
-      end
-      
-      def fbc_link(target, files, extra_files = [])
-        cmdline = []
-        cmdline << "fbc"
-        cmdline << "-g" if (@options.has_key?(:debug) && @options[:debug] == true)
-        cmdline << "-mt" if (@options.has_key?(:mt) && @options[:mt] == true)
-        cmdline << "-profile" if (@options.has_key?(:profile) && @options[:profile] == true)
-        cmdline << "-#{@type.to_s}" unless @type == :executable
-        cmdline << "-x #{target}"
-        cmdline << files << extra_files
-        cmdline << @defines.collect { |defname| "-d #{defname}" }
-        unless @type == :lib
-          cmdline << @libraries_path.collect { |path| "-p #{path}" }
-          cmdline << @libraries.collect { |libname| "-l #{libname}" }
-        end
-        cmdline.flatten.join(' ')
-      end
-      
-      def define_clobber_task
-        desc "Remove all compiled files for #{@name}"
-        task :clobber do
-          # remove compiled and linked file
-          rm compiled_project_file rescue nil if File.exist?(compiled_project_file)
-          if @type == :dylib
-            rm File.join(@build_path, @complement_file) rescue nil if File.exist?(File.join(@build_path, @complement_file))
-          end
-          
-          # remove main file
-          unless @main_file.nil? || !File.exists?(compiled_form(@main_file))
-            rm compiled_form(@main_file) rescue nil
-          end
-          
-          # now the sources files
-          # avoid attempt to remove the file two times (this is a bug in Rake)
-          @sources.each do |src|
-            # exclude compiled source files (c obj).
-            unless src =~ /o$/
-              target = compiled_form(src)
-              unless CLOBBER.include?(target)
-                CLOBBER.include(target)
-                rm target rescue nil if File.exist?(target)
-              end
-            end
-          end
-        end
-      end
-      
-      def define_rebuild_task
-        desc "Force a rebuild of files for #{@name}"
-        task :rebuild => [:clobber, :build]
-      end
-      
-      def define_build_directory_task
-        directory @build_path
-        task :build => @build_path
-      end
-      
-      def define_build_task
-        desc "Build project #{@name}"
-        task :build
-        
-        # empty file task
-        file compiled_project_file
-        
-        # compile main_file
-        # use as pre-requisite the source filename
-        if @type == :executable
-          file compiled_form(@main_file) => @main_file do |t|
-            # remove the path and the extension
-            main_module = File.basename(t.name).ext
-            sh fbc_compile(@main_file, t.name, main_module)
-          end
-        
-          # add dependency
-          file compiled_project_file => compiled_form(@main_file)
-        end
-        
-        # gather files that are passed "as-is" to the compiler
-        unprocessed_files = @sources.select { |rcfile| rcfile =~ /(res|rc|o|obj)$/ }
-        
-        @sources.each do |src|
-          # is a unprocessed file?
-          unless unprocessed_files.include?(src)
-            target = compiled_form(src)
-            
-            # is already in our list of tasks?
-            if not Rake::Task.task_defined?(target)
-              # if not, compile
-              
-              file target => src do
-                sh fbc_compile(src, target)
-              end
-            end
-          
-            # include dependency
-            file compiled_project_file => target
-          end
-        end
-        
-        # now the linking process
-        file compiled_project_file do |t|
-          target = File.join(@build_path, @output_name)
-          sh fbc_link(target, t.prerequisites, unprocessed_files)
-        end
-        
-        # add the dependency
-        task :build => compiled_project_file
-      end
-
-      # Adds dependencies in the parent namespace
-      def add_dependencies_to_main_task
-        desc 'Build all projects' unless task( :build ).comment
-        task :build => "#{@name}:build"
-        
-        desc 'Clobber all projects' unless task( :clobber ).comment
-        task :clobber => "#{@name}:clobber"
-        
-        desc 'Rebuild all projects' unless task( :rebuild ).comment
-        task :rebuild => ["#{@name}:clobber", "#{@name}:build"]
-      end
-  end
-end
-  
-# helper method to define a FreeBASIC::ProjectTask in the current namespace
-def project_task name, &block
-  FreeBASIC::ProjectTask.new name, &block
-end
-
-def include_projects_of name
-  desc 'Build all projects' unless task( :build ).comment
-  task :build => "#{name}:build"
-  
-  desc 'Clobber all projects' unless task( :clobber ).comment
-  task :clobber => "#{name}:clobber"
-  
-  desc 'Rebuild all projects' unless task( :rebuild ).comment
-  task :rebuild => "#{name}:rebuild"
-end