diff options
| author | KOBAYASHI Shuji <[email protected]> | 2019-08-07 21:50:22 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2019-08-07 21:50:22 +0900 |
| commit | 7e42b6ad3f449cb49568dcd5b7439f7ba3908dae (patch) | |
| tree | b01b2610b75d58768e02bdc9f6133c0ced0b9efa /minirake | |
| parent | b377b7d58062d555cc45249ae038c8b2875eec9e (diff) | |
| download | mruby-7e42b6ad3f449cb49568dcd5b7439f7ba3908dae.tar.gz mruby-7e42b6ad3f449cb49568dcd5b7439f7ba3908dae.zip | |
Improve MiniRake rule enhancement for Rake compatibility
Support pathmap notation, recursive dependencies search, and so on.
Diffstat (limited to 'minirake')
| -rwxr-xr-x | minirake | 38 |
1 files changed, 27 insertions, 11 deletions
@@ -206,25 +206,41 @@ module MiniRake # task with the prerequisites and actions from the rule. Set the # source attribute of the task appropriately for the rule. Return # the enhanced task or nil of no rule was found. - def enhance_with_matching_rule(task_name) + def enhance_with_matching_rule(task_name, level=0) + fail "Rule Recursion Too Deep: #{task_name}" if level >= 16 RULES.each do |pattern, extensions, block| - if pattern.match(task_name) - ext = extensions.first - deps = extensions[1..-1] + next unless pattern && pattern.match(task_name) + sources = extensions.flat_map do |ext| case ext + when /%/ + task_name.pathmap(ext) + when %r{/} + ext + when /^\./ + source = task_name.sub(pattern, ext) + source == ext ? task_name.ext(ext) : source when String - source = task_name.sub(/\.[^.]*$/, ext) - when Proc - source = ext.call(task_name) + ext + when Proc, Method + ext.arity == 1 ? ext.call(task_name) : ext.call else fail "Don't know how to handle rule dependent: #{ext.inspect}" end - if File.exist?(source) - task = FileTask.define_task({task_name => [source]+deps}, &block) - task.source = source - return task + end + prereqs = sources.map do |source| + if File.exist?(source) || TASKS[source] + source + elsif parent = enhance_with_matching_rule(source, level + 1) + parent.name + else + break nil end end + if prereqs + task = FileTask.define_task(task_name => prereqs, &block) + task.source = prereqs.first + return task + end end nil end |
