rake 13.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/macos.yml +22 -0
  3. data/.github/workflows/ubuntu-rvm.yml +28 -0
  4. data/.github/workflows/ubuntu.yml +20 -0
  5. data/.github/workflows/windows.yml +20 -0
  6. data/CONTRIBUTING.rdoc +43 -0
  7. data/Gemfile +10 -0
  8. data/History.rdoc +2359 -0
  9. data/MIT-LICENSE +21 -0
  10. data/README.rdoc +155 -0
  11. data/Rakefile +41 -0
  12. data/bin/bundle +105 -0
  13. data/bin/console +7 -0
  14. data/bin/rake +29 -0
  15. data/bin/rdoc +29 -0
  16. data/bin/rubocop +29 -0
  17. data/bin/setup +6 -0
  18. data/doc/command_line_usage.rdoc +158 -0
  19. data/doc/example/Rakefile1 +38 -0
  20. data/doc/example/Rakefile2 +35 -0
  21. data/doc/example/a.c +6 -0
  22. data/doc/example/b.c +6 -0
  23. data/doc/example/main.c +11 -0
  24. data/doc/glossary.rdoc +42 -0
  25. data/doc/jamis.rb +592 -0
  26. data/doc/proto_rake.rdoc +127 -0
  27. data/doc/rake.1 +156 -0
  28. data/doc/rakefile.rdoc +622 -0
  29. data/doc/rational.rdoc +151 -0
  30. data/exe/rake +27 -0
  31. data/lib/rake.rb +71 -0
  32. data/lib/rake/application.rb +824 -0
  33. data/lib/rake/backtrace.rb +24 -0
  34. data/lib/rake/clean.rb +78 -0
  35. data/lib/rake/cloneable.rb +17 -0
  36. data/lib/rake/cpu_counter.rb +107 -0
  37. data/lib/rake/default_loader.rb +15 -0
  38. data/lib/rake/dsl_definition.rb +195 -0
  39. data/lib/rake/early_time.rb +22 -0
  40. data/lib/rake/ext/core.rb +26 -0
  41. data/lib/rake/ext/string.rb +176 -0
  42. data/lib/rake/file_creation_task.rb +25 -0
  43. data/lib/rake/file_list.rb +435 -0
  44. data/lib/rake/file_task.rb +54 -0
  45. data/lib/rake/file_utils.rb +134 -0
  46. data/lib/rake/file_utils_ext.rb +134 -0
  47. data/lib/rake/invocation_chain.rb +57 -0
  48. data/lib/rake/invocation_exception_mixin.rb +17 -0
  49. data/lib/rake/late_time.rb +18 -0
  50. data/lib/rake/linked_list.rb +112 -0
  51. data/lib/rake/loaders/makefile.rb +54 -0
  52. data/lib/rake/multi_task.rb +14 -0
  53. data/lib/rake/name_space.rb +38 -0
  54. data/lib/rake/packagetask.rb +222 -0
  55. data/lib/rake/phony.rb +16 -0
  56. data/lib/rake/private_reader.rb +21 -0
  57. data/lib/rake/promise.rb +100 -0
  58. data/lib/rake/pseudo_status.rb +30 -0
  59. data/lib/rake/rake_module.rb +67 -0
  60. data/lib/rake/rake_test_loader.rb +27 -0
  61. data/lib/rake/rule_recursion_overflow_error.rb +20 -0
  62. data/lib/rake/scope.rb +43 -0
  63. data/lib/rake/task.rb +433 -0
  64. data/lib/rake/task_argument_error.rb +8 -0
  65. data/lib/rake/task_arguments.rb +109 -0
  66. data/lib/rake/task_manager.rb +328 -0
  67. data/lib/rake/tasklib.rb +12 -0
  68. data/lib/rake/testtask.rb +224 -0
  69. data/lib/rake/thread_history_display.rb +49 -0
  70. data/lib/rake/thread_pool.rb +163 -0
  71. data/lib/rake/trace_output.rb +23 -0
  72. data/lib/rake/version.rb +10 -0
  73. data/lib/rake/win32.rb +51 -0
  74. data/rake.gemspec +36 -0
  75. metadata +132 -0
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module Rake
3
+ module Backtrace # :nodoc: all
4
+ SYS_KEYS = RbConfig::CONFIG.keys.grep(/(?:[a-z]prefix|libdir)\z/)
5
+ SYS_PATHS = RbConfig::CONFIG.values_at(*SYS_KEYS).uniq +
6
+ [ File.join(File.dirname(__FILE__), "..") ]
7
+
8
+ SUPPRESSED_PATHS = SYS_PATHS.
9
+ map { |s| s.tr("\\", "/") }.
10
+ map { |f| File.expand_path(f) }.
11
+ reject { |s| s.nil? || s =~ /^ *$/ }
12
+ SUPPRESSED_PATHS_RE = SUPPRESSED_PATHS.map { |f| Regexp.quote(f) }.join("|")
13
+ SUPPRESSED_PATHS_RE << "|^org\\/jruby\\/\\w+\\.java" if
14
+ Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == "jruby"
15
+
16
+ SUPPRESS_PATTERN = %r!(\A(#{SUPPRESSED_PATHS_RE})|bin/rake:\d+)!i
17
+
18
+ def self.collapse(backtrace)
19
+ pattern = Rake.application.options.suppress_backtrace_pattern ||
20
+ SUPPRESS_PATTERN
21
+ backtrace.reject { |elem| elem =~ pattern }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+ # The 'rake/clean' file defines two file lists (CLEAN and CLOBBER) and
3
+ # two rake tasks (:clean and :clobber).
4
+ #
5
+ # [:clean] Clean up the project by deleting scratch files and backup
6
+ # files. Add files to the CLEAN file list to have the :clean
7
+ # target handle them.
8
+ #
9
+ # [:clobber] Clobber all generated and non-source files in a project.
10
+ # The task depends on :clean, so all the clean files will
11
+ # be deleted as well as files in the CLOBBER file list.
12
+ # The intent of this task is to return a project to its
13
+ # pristine, just unpacked state.
14
+
15
+ require "rake"
16
+
17
+ # :stopdoc:
18
+
19
+ module Rake
20
+ module Cleaner
21
+ extend FileUtils
22
+
23
+ module_function
24
+
25
+ def cleanup_files(file_names)
26
+ file_names.each do |file_name|
27
+ cleanup(file_name)
28
+ end
29
+ end
30
+
31
+ def cleanup(file_name, **opts)
32
+ begin
33
+ opts = { verbose: Rake.application.options.trace }.merge(opts)
34
+ rm_r file_name, **opts
35
+ rescue StandardError => ex
36
+ puts "Failed to remove #{file_name}: #{ex}" unless file_already_gone?(file_name)
37
+ end
38
+ end
39
+
40
+ def file_already_gone?(file_name)
41
+ return false if File.exist?(file_name)
42
+
43
+ path = file_name
44
+ prev = nil
45
+
46
+ while path = File.dirname(path)
47
+ return false if cant_be_deleted?(path)
48
+ break if [prev, "."].include?(path)
49
+ prev = path
50
+ end
51
+ true
52
+ end
53
+ private_class_method :file_already_gone?
54
+
55
+ def cant_be_deleted?(path_name)
56
+ File.exist?(path_name) &&
57
+ (!File.readable?(path_name) || !File.executable?(path_name))
58
+ end
59
+ private_class_method :cant_be_deleted?
60
+ end
61
+ end
62
+
63
+ CLEAN = ::Rake::FileList["**/*~", "**/*.bak", "**/core"]
64
+ CLEAN.clear_exclude.exclude { |fn|
65
+ fn.pathmap("%f").downcase == "core" && File.directory?(fn)
66
+ }
67
+
68
+ desc "Remove any temporary products."
69
+ task :clean do
70
+ Rake::Cleaner.cleanup_files(CLEAN)
71
+ end
72
+
73
+ CLOBBER = ::Rake::FileList.new
74
+
75
+ desc "Remove any generated files."
76
+ task clobber: [:clean] do
77
+ Rake::Cleaner.cleanup_files(CLOBBER)
78
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ module Rake
3
+ ##
4
+ # Mixin for creating easily cloned objects.
5
+
6
+ module Cloneable # :nodoc:
7
+ # The hook that is invoked by 'clone' and 'dup' methods.
8
+ def initialize_copy(source)
9
+ super
10
+ source.instance_variables.each do |var|
11
+ src_value = source.instance_variable_get(var)
12
+ value = src_value.clone rescue src_value
13
+ instance_variable_set(var, value)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+ module Rake
3
+
4
+ # Based on a script at:
5
+ # http://stackoverflow.com/questions/891537/ruby-detect-number-of-cpus-installed
6
+ class CpuCounter # :nodoc: all
7
+ def self.count
8
+ new.count_with_default
9
+ end
10
+
11
+ def count_with_default(default=4)
12
+ count || default
13
+ rescue StandardError
14
+ default
15
+ end
16
+
17
+ begin
18
+ require "etc"
19
+ rescue LoadError
20
+ else
21
+ if Etc.respond_to?(:nprocessors)
22
+ def count
23
+ return Etc.nprocessors
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ unless Rake::CpuCounter.method_defined?(:count)
31
+ Rake::CpuCounter.class_eval <<-'end;', __FILE__, __LINE__+1
32
+ require 'rbconfig'
33
+
34
+ def count
35
+ if RUBY_PLATFORM == 'java'
36
+ count_via_java_runtime
37
+ else
38
+ case RbConfig::CONFIG['host_os']
39
+ when /linux/
40
+ count_via_cpuinfo
41
+ when /darwin|bsd/
42
+ count_via_sysctl
43
+ when /mswin|mingw/
44
+ count_via_win32
45
+ else
46
+ # Try everything
47
+ count_via_win32 ||
48
+ count_via_sysctl ||
49
+ count_via_cpuinfo
50
+ end
51
+ end
52
+ end
53
+
54
+ def count_via_java_runtime
55
+ Java::Java.lang.Runtime.getRuntime.availableProcessors
56
+ rescue StandardError
57
+ nil
58
+ end
59
+
60
+ def count_via_win32
61
+ require 'win32ole'
62
+ wmi = WIN32OLE.connect("winmgmts://")
63
+ cpu = wmi.ExecQuery("select NumberOfCores from Win32_Processor") # TODO count hyper-threaded in this
64
+ cpu.to_enum.first.NumberOfCores
65
+ rescue StandardError, LoadError
66
+ nil
67
+ end
68
+
69
+ def count_via_cpuinfo
70
+ open('/proc/cpuinfo') { |f| f.readlines }.grep(/processor/).size
71
+ rescue StandardError
72
+ nil
73
+ end
74
+
75
+ def count_via_sysctl
76
+ run 'sysctl', '-n', 'hw.ncpu'
77
+ end
78
+
79
+ def run(command, *args)
80
+ cmd = resolve_command(command)
81
+ if cmd
82
+ IO.popen [cmd, *args] do |io|
83
+ io.read.to_i
84
+ end
85
+ else
86
+ nil
87
+ end
88
+ end
89
+
90
+ def resolve_command(command)
91
+ look_for_command("/usr/sbin", command) ||
92
+ look_for_command("/sbin", command) ||
93
+ in_path_command(command)
94
+ end
95
+
96
+ def look_for_command(dir, command)
97
+ path = File.join(dir, command)
98
+ File.exist?(path) ? path : nil
99
+ end
100
+
101
+ def in_path_command(command)
102
+ IO.popen ['which', command] do |io|
103
+ io.eof? ? nil : command
104
+ end
105
+ end
106
+ end;
107
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ module Rake
3
+
4
+ # Default Rakefile loader used by +import+.
5
+ class DefaultLoader
6
+
7
+ ##
8
+ # Loads a rakefile into the current application from +fn+
9
+
10
+ def load(fn)
11
+ Rake.load_rakefile(File.expand_path(fn))
12
+ end
13
+ end
14
+
15
+ end
@@ -0,0 +1,195 @@
1
+ # frozen_string_literal: true
2
+ # Rake DSL functions.
3
+ require "rake/file_utils_ext"
4
+
5
+ module Rake
6
+
7
+ ##
8
+ # DSL is a module that provides #task, #desc, #namespace, etc. Use this
9
+ # when you'd like to use rake outside the top level scope.
10
+ #
11
+ # For a Rakefile you run from the command line this module is automatically
12
+ # included.
13
+
14
+ module DSL
15
+
16
+ #--
17
+ # Include the FileUtils file manipulation functions in the top
18
+ # level module, but mark them private so that they don't
19
+ # unintentionally define methods on other objects.
20
+ #++
21
+
22
+ include FileUtilsExt
23
+ private(*FileUtils.instance_methods(false))
24
+ private(*FileUtilsExt.instance_methods(false))
25
+
26
+ private
27
+
28
+ # :call-seq:
29
+ # task(task_name)
30
+ # task(task_name: dependencies)
31
+ # task(task_name, arguments => dependencies)
32
+ #
33
+ # Declare a basic task. The +task_name+ is always the first argument. If
34
+ # the task name contains a ":" it is defined in that namespace.
35
+ #
36
+ # The +dependencies+ may be a single task name or an Array of task names.
37
+ # The +argument+ (a single name) or +arguments+ (an Array of names) define
38
+ # the arguments provided to the task.
39
+ #
40
+ # The task, argument and dependency names may be either symbols or
41
+ # strings.
42
+ #
43
+ # A task with a single dependency:
44
+ #
45
+ # task clobber: %w[clean] do
46
+ # rm_rf "html"
47
+ # end
48
+ #
49
+ # A task with an argument and a dependency:
50
+ #
51
+ # task :package, [:version] => :test do |t, args|
52
+ # # ...
53
+ # end
54
+ #
55
+ # To invoke this task from the command line:
56
+ #
57
+ # $ rake package[1.2.3]
58
+ #
59
+ def task(*args, &block) # :doc:
60
+ Rake::Task.define_task(*args, &block)
61
+ end
62
+
63
+ # Declare a file task.
64
+ #
65
+ # Example:
66
+ # file "config.cfg" => ["config.template"] do
67
+ # open("config.cfg", "w") do |outfile|
68
+ # open("config.template") do |infile|
69
+ # while line = infile.gets
70
+ # outfile.puts line
71
+ # end
72
+ # end
73
+ # end
74
+ # end
75
+ #
76
+ def file(*args, &block) # :doc:
77
+ Rake::FileTask.define_task(*args, &block)
78
+ end
79
+
80
+ # Declare a file creation task.
81
+ # (Mainly used for the directory command).
82
+ def file_create(*args, &block)
83
+ Rake::FileCreationTask.define_task(*args, &block)
84
+ end
85
+
86
+ # Declare a set of files tasks to create the given directories on
87
+ # demand.
88
+ #
89
+ # Example:
90
+ # directory "testdata/doc"
91
+ #
92
+ def directory(*args, &block) # :doc:
93
+ result = file_create(*args, &block)
94
+ dir, _ = *Rake.application.resolve_args(args)
95
+ dir = Rake.from_pathname(dir)
96
+ Rake.each_dir_parent(dir) do |d|
97
+ file_create d do |t|
98
+ mkdir_p t.name unless File.exist?(t.name)
99
+ end
100
+ end
101
+ result
102
+ end
103
+
104
+ # Declare a task that performs its prerequisites in
105
+ # parallel. Multitasks does *not* guarantee that its prerequisites
106
+ # will execute in any given order (which is obvious when you think
107
+ # about it)
108
+ #
109
+ # Example:
110
+ # multitask deploy: %w[deploy_gem deploy_rdoc]
111
+ #
112
+ def multitask(*args, &block) # :doc:
113
+ Rake::MultiTask.define_task(*args, &block)
114
+ end
115
+
116
+ # Create a new rake namespace and use it for evaluating the given
117
+ # block. Returns a NameSpace object that can be used to lookup
118
+ # tasks defined in the namespace.
119
+ #
120
+ # Example:
121
+ #
122
+ # ns = namespace "nested" do
123
+ # # the "nested:run" task
124
+ # task :run
125
+ # end
126
+ # task_run = ns[:run] # find :run in the given namespace.
127
+ #
128
+ # Tasks can also be defined in a namespace by using a ":" in the task
129
+ # name:
130
+ #
131
+ # task "nested:test" do
132
+ # # ...
133
+ # end
134
+ #
135
+ def namespace(name=nil, &block) # :doc:
136
+ name = name.to_s if name.kind_of?(Symbol)
137
+ name = name.to_str if name.respond_to?(:to_str)
138
+ unless name.kind_of?(String) || name.nil?
139
+ raise ArgumentError, "Expected a String or Symbol for a namespace name"
140
+ end
141
+ Rake.application.in_namespace(name, &block)
142
+ end
143
+
144
+ # Declare a rule for auto-tasks.
145
+ #
146
+ # Example:
147
+ # rule '.o' => '.c' do |t|
148
+ # sh 'cc', '-o', t.name, t.source
149
+ # end
150
+ #
151
+ def rule(*args, &block) # :doc:
152
+ Rake::Task.create_rule(*args, &block)
153
+ end
154
+
155
+ # Describes the next rake task. Duplicate descriptions are discarded.
156
+ # Descriptions are shown with <code>rake -T</code> (up to the first
157
+ # sentence) and <code>rake -D</code> (the entire description).
158
+ #
159
+ # Example:
160
+ # desc "Run the Unit Tests"
161
+ # task test: [:build]
162
+ # # ... run tests
163
+ # end
164
+ #
165
+ def desc(description) # :doc:
166
+ Rake.application.last_description = description
167
+ end
168
+
169
+ # Import the partial Rakefiles +fn+. Imported files are loaded
170
+ # _after_ the current file is completely loaded. This allows the
171
+ # import statement to appear anywhere in the importing file, and yet
172
+ # allowing the imported files to depend on objects defined in the
173
+ # importing file.
174
+ #
175
+ # A common use of the import statement is to include files
176
+ # containing dependency declarations.
177
+ #
178
+ # See also the --rakelibdir command line option.
179
+ #
180
+ # Example:
181
+ # import ".depend", "my_rules"
182
+ #
183
+ def import(*fns) # :doc:
184
+ fns.each do |fn|
185
+ Rake.application.add_import(fn)
186
+ end
187
+ end
188
+ end
189
+ extend FileUtilsExt
190
+ end
191
+
192
+ # Extend the main object with the DSL commands. This allows top-level
193
+ # calls to task, etc. to work from a Rakefile without polluting the
194
+ # object inheritance tree.
195
+ self.extend Rake::DSL
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ module Rake
3
+
4
+ # EarlyTime is a fake timestamp that occurs _before_ any other time value.
5
+ class EarlyTime
6
+ include Comparable
7
+ include Singleton
8
+
9
+ ##
10
+ # The EarlyTime always comes before +other+!
11
+
12
+ def <=>(other)
13
+ -1
14
+ end
15
+
16
+ def to_s # :nodoc:
17
+ "<EARLY TIME>"
18
+ end
19
+ end
20
+
21
+ EARLY = EarlyTime.instance
22
+ end