代码之家  ›  专栏  ›  技术社区  ›  Simone Margaritelli

规则输出生成问题

  •  1
  • Simone Margaritelli  · 技术社区  · 16 年前

    我有一个像这样的规则:

    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
    

    如您所见,它生成许多.so库,从“stdlib”目录(包含源)到存储二进制文件的“build”目录。

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

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

    谢谢

    1 回复  |  直到 16 年前
        1
  •  2
  •   Heath    16 年前

    您可以使用路径映射语法或显式过程将输出文件名/路径更改为输入文件名/路径。

    路径映射语法如下(未测试):

    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