Вы можете использовать синтаксис pathmap или явный процесс для изменения выходного имени файла / пути во входное имя файла / пути.
Синтаксис pathmap будет выглядеть примерно так (не проверено):
rule '.so' => '%{build,stdlib}X.cc' do |t|
puts "@ Compiling #{t.source}"
sh "mkdir -p #{File.dirname(t.name)}"
sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end
Метод proc будет выглядеть примерно так (также не проверено):
rule '.so' => [proc { |f| f.sub(/build/, 'stdlib').ext('.cc') }] do |t|
puts "@ Compiling #{t.source}"
sh "mkdir -p #{File.dirname(t.name)}"
sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end
Обратите внимание, что вы можете избавиться от явного mkdir в вашем действии и использовать вместо него задачу 'directory' (если вы заранее знаете возможные каталоги назначения)
possible_dest_dirs.each { |d|
directory d
}
rule '.so' => [proc { |f| f.sub(/build/, 'stdlib').ext('.cc') },
proc { |f| File.dirname(f) }] do |t|
puts "@ Compiling #{t.source}"
sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end