我有一个Rakefile,其规则如下:
rule '.so' => '.cc' do |t|
puts "@ Compiling #{t.source}"
output = t.source.ext("so")
output['stdlib'] = 'build'
sh "mkdir -p #{File.dirname(output)}"
sh "#{CXX} #{t.source} -o#{output} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end
正如您所看到的,它会从'stdlib'目录(包含源代码)生成许多.so库到存储二进制文件的'build'目录。
现在的问题是,由于这个“目录交换”,rake似乎无法将.so文件识别为它生成的文件,导致每次运行rake命令时重新编译每个.so模块,即使没有改变了。
有什么方法可以解决这个问题吗?
谢谢
答案 0 :(得分:2)
您可以使用pathmap语法或显式proc将输出文件名/路径更改为输入文件名/路径。
路径映射语法看起来像这样(未经测试):
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”并使用“目录”任务(如果您事先知道可能的目标目录)
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