【问题标题】:Rakefile rule output generation problemRakefile 规则输出生成问题
【发布时间】:2010-05-14 20:57:25
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: c++ rake rakefile


    【解决方案1】:

    您可以使用路径映射语法或显式 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
    

    【讨论】:

    • 如果我使用路径映射方法,我会收到以下消息:rake aborted!不知道如何构建任务'stdlib/std/math.so'
    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多