Rakefile规则输出生成问题

时间:2010-05-14 20:57:26

标签: c++ rake rakefile

我有一个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模块,即使没有改变了。

有什么方法可以解决这个问题吗?

谢谢

1 个答案:

答案 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