mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47433 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			199 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# Rake DSL functions.
 | 
						|
require 'rake/file_utils_ext'
 | 
						|
 | 
						|
module Rake
 | 
						|
 | 
						|
  ##
 | 
						|
  # DSL is a module that provides #task, #desc, #namespace, etc.  Use this
 | 
						|
  # when you'd like to use rake outside the top level scope.
 | 
						|
  #
 | 
						|
  # For a Rakefile you run from the comamnd line this module is automatically
 | 
						|
  # included.
 | 
						|
 | 
						|
  module DSL
 | 
						|
 | 
						|
    #--
 | 
						|
    # Include the FileUtils file manipulation functions in the top
 | 
						|
    # level module, but mark them private so that they don't
 | 
						|
    # unintentionally define methods on other objects.
 | 
						|
    #++
 | 
						|
 | 
						|
    include FileUtilsExt
 | 
						|
    private(*FileUtils.instance_methods(false))
 | 
						|
    private(*FileUtilsExt.instance_methods(false))
 | 
						|
 | 
						|
    private
 | 
						|
 | 
						|
    # :call-seq:
 | 
						|
    #   task task_name
 | 
						|
    #   task task_name: dependencies
 | 
						|
    #   task task_name, arguments => dependencies
 | 
						|
    #   task task_name, argument[, argument ...], :needs: dependencies
 | 
						|
    #
 | 
						|
    # Declare a basic task.  The +task_name+ is always the first argument.  If
 | 
						|
    # the task name contains a ":" it is defined in that namespace.
 | 
						|
    #
 | 
						|
    # The +dependencies+ may be a single task name or an Array of task names.
 | 
						|
    # The +argument+ (a single name) or +arguments+ (an Array of names) define
 | 
						|
    # the arguments provided to the task.
 | 
						|
    #
 | 
						|
    # The task, argument and dependency names may be either symbols or
 | 
						|
    # strings.
 | 
						|
    #
 | 
						|
    # A task with a single dependency:
 | 
						|
    #
 | 
						|
    #   task clobber: %w[clean] do
 | 
						|
    #     rm_rf "html"
 | 
						|
    #   end
 | 
						|
    #
 | 
						|
    # A task with an argument and a dependency:
 | 
						|
    #
 | 
						|
    #   task :package, [:version] => :test do |t, args|
 | 
						|
    #     # ...
 | 
						|
    #   end
 | 
						|
    #
 | 
						|
    # To invoke this task from the command line:
 | 
						|
    #
 | 
						|
    #   $ rake package[1.2.3]
 | 
						|
    #
 | 
						|
    # Alternate definition:
 | 
						|
    #
 | 
						|
    #   task :package, :version, needs: :test do |t, args|
 | 
						|
    #     # ...
 | 
						|
    #   end
 | 
						|
    #
 | 
						|
    def task(*args, &block) # :doc:
 | 
						|
      Rake::Task.define_task(*args, &block)
 | 
						|
    end
 | 
						|
 | 
						|
    # Declare a file task.
 | 
						|
    #
 | 
						|
    # Example:
 | 
						|
    #   file "config.cfg" => ["config.template"] do
 | 
						|
    #     open("config.cfg", "w") do |outfile|
 | 
						|
    #       open("config.template") do |infile|
 | 
						|
    #         while line = infile.gets
 | 
						|
    #           outfile.puts line
 | 
						|
    #         end
 | 
						|
    #       end
 | 
						|
    #     end
 | 
						|
    #  end
 | 
						|
    #
 | 
						|
    def file(*args, &block) # :doc:
 | 
						|
      Rake::FileTask.define_task(*args, &block)
 | 
						|
    end
 | 
						|
 | 
						|
    # Declare a file creation task.
 | 
						|
    # (Mainly used for the directory command).
 | 
						|
    def file_create(*args, &block)
 | 
						|
      Rake::FileCreationTask.define_task(*args, &block)
 | 
						|
    end
 | 
						|
 | 
						|
    # Declare a set of files tasks to create the given directories on
 | 
						|
    # demand.
 | 
						|
    #
 | 
						|
    # Example:
 | 
						|
    #   directory "testdata/doc"
 | 
						|
    #
 | 
						|
    def directory(*args, &block) # :doc:
 | 
						|
      result = file_create(*args, &block)
 | 
						|
      dir, _ = *Rake.application.resolve_args(args)
 | 
						|
      dir = Rake.from_pathname(dir)
 | 
						|
      Rake.each_dir_parent(dir) do |d|
 | 
						|
        file_create d do |t|
 | 
						|
          mkdir_p t.name unless File.exist?(t.name)
 | 
						|
        end
 | 
						|
      end
 | 
						|
      result
 | 
						|
    end
 | 
						|
 | 
						|
    # Declare a task that performs its prerequisites in
 | 
						|
    # parallel. Multitasks does *not* guarantee that its prerequisites
 | 
						|
    # will execute in any given order (which is obvious when you think
 | 
						|
    # about it)
 | 
						|
    #
 | 
						|
    # Example:
 | 
						|
    #   multitask deploy: %w[deploy_gem deploy_rdoc]
 | 
						|
    #
 | 
						|
    def multitask(*args, &block) # :doc:
 | 
						|
      Rake::MultiTask.define_task(*args, &block)
 | 
						|
    end
 | 
						|
 | 
						|
    # Create a new rake namespace and use it for evaluating the given
 | 
						|
    # block.  Returns a NameSpace object that can be used to lookup
 | 
						|
    # tasks defined in the namespace.
 | 
						|
    #
 | 
						|
    # Example:
 | 
						|
    #
 | 
						|
    #   ns = namespace "nested" do
 | 
						|
    #     # the "nested:run" task
 | 
						|
    #     task :run
 | 
						|
    #   end
 | 
						|
    #   task_run = ns[:run] # find :run in the given namespace.
 | 
						|
    #
 | 
						|
    # Tasks can also be defined in a namespace by using a ":" in the task
 | 
						|
    # name:
 | 
						|
    #
 | 
						|
    #   task "nested:test" do
 | 
						|
    #     # ...
 | 
						|
    #   end
 | 
						|
    #
 | 
						|
    def namespace(name=nil, &block) # :doc:
 | 
						|
      name = name.to_s if name.kind_of?(Symbol)
 | 
						|
      name = name.to_str if name.respond_to?(:to_str)
 | 
						|
      unless name.kind_of?(String) || name.nil?
 | 
						|
        raise ArgumentError, "Expected a String or Symbol for a namespace name"
 | 
						|
      end
 | 
						|
      Rake.application.in_namespace(name, &block)
 | 
						|
    end
 | 
						|
 | 
						|
    # Declare a rule for auto-tasks.
 | 
						|
    #
 | 
						|
    # Example:
 | 
						|
    #  rule '.o' => '.c' do |t|
 | 
						|
    #    sh 'cc', '-o', t.name, t.source
 | 
						|
    #  end
 | 
						|
    #
 | 
						|
    def rule(*args, &block) # :doc:
 | 
						|
      Rake::Task.create_rule(*args, &block)
 | 
						|
    end
 | 
						|
 | 
						|
    # Describes the next rake task.  Duplicate descriptions are discarded.
 | 
						|
    #
 | 
						|
    # Example:
 | 
						|
    #   desc "Run the Unit Tests"
 | 
						|
    #   task test: [:build]
 | 
						|
    #     # ... run tests
 | 
						|
    #   end
 | 
						|
    #
 | 
						|
    def desc(description) # :doc:
 | 
						|
      Rake.application.last_description = description
 | 
						|
    end
 | 
						|
 | 
						|
    # Import the partial Rakefiles +fn+.  Imported files are loaded
 | 
						|
    # _after_ the current file is completely loaded.  This allows the
 | 
						|
    # import statement to appear anywhere in the importing file, and yet
 | 
						|
    # allowing the imported files to depend on objects defined in the
 | 
						|
    # importing file.
 | 
						|
    #
 | 
						|
    # A common use of the import statement is to include files
 | 
						|
    # containing dependency declarations.
 | 
						|
    #
 | 
						|
    # See also the --rakelibdir command line option.
 | 
						|
    #
 | 
						|
    # Example:
 | 
						|
    #   import ".depend", "my_rules"
 | 
						|
    #
 | 
						|
    def import(*fns) # :doc:
 | 
						|
      fns.each do |fn|
 | 
						|
        Rake.application.add_import(fn)
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
  extend FileUtilsExt
 | 
						|
end
 | 
						|
 | 
						|
# Extend the main object with the DSL commands. This allows top-level
 | 
						|
# calls to task, etc. to work from a Rakefile without polluting the
 | 
						|
# object inheritance tree.
 | 
						|
self.extend Rake::DSL
 |