1

我有一个像这样的规则的 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”目录(包含源代码)到存储二进制文件的“build”目录生成许多 .so 库。

现在的问题是,由于这种“目录交换”,rake 似乎无法将 .so 文件识别为它生成的文件,导致每次运行 rake 命令时都会重新编译每个 .so 模块,即使没有任何更改。

有没有办法解决这个问题?

谢谢

4

1 回答 1

2

您可以使用路径映射语法或显式 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
于 2010-05-20T17:54:02.813 回答