2016-07-14 44 views
0

我有一個頭文件是在構建時在編譯任務依賴的任務中生成的,問題在於編譯任務在增量編譯中更改頭文件時無法識別。所以即使任務運行,它也不會編譯源文件。如何獲得gradle incremental本機C++編譯來處理生成的頭文件?

我本來希望生成的頭文件應該顯示爲「發現的包含」,並導致源文件被重建,但並非如此。

下面是我想到的最好的,但它不起作用。

apply plugin: 'cpp' 

model { 
    binaries { 
    all { 
     cppCompiler.args "-I$buildDir/gen" 
    } 
    } 
    components { 
    test(NativeExecutableSpec) { 
     sources { 
     cpp { 
      source { 
      srcDir "." 
      include "*.cpp" 
      } 
     } 
     } 
    } 
    } 
} 

task generateHeader(type: Copy) { 
    into "$buildDir/gen" 
    from(rootProject.file('template.h')) { 
    rename(/template/, 'generated') 
    expand([text: 'foo']) 
    } 
} 

tasks.all { task -> 
    def match = task.name =~ /^compile.*Cpp$/ 
    if (match) { 
    task.dependsOn generateHeader 

    task.inputs.files project.fileTree(dir: "$buildDir/gen").matching { 
     include '*.h' 
    } 
    } 
} 

示例項目:https://github.com/thejk/gradle-incremental-cpp-generated-header

回答

0

在gradle這個論壇得到幫助,長話短說:創建一個C(PP)SourceSet與generatedBy tasks.generateHeader和修改generateHeader出口HEADERDIR和sourceDir性能。將源代碼集與lib中的真實代碼鏈接起來。

sources { 
    headers(CppSourceSet) { 
     generatedBy tasks.generateHeader 
    } 
    cpp { 
     source { 
     srcDir "." 
     include "*.cpp" 
     } 
     lib sources.headers 
    } 
} 

task generateHeader(type: HeaderGenerator) { 
    template rootProject.file('template.h') 
    headerDir project.file("$buildDir/gen") 
} 

class HeaderGenerator extends DefaultTask { 
    @InputFile 
    File template 
    @OutputDirectory 
    File headerDir 
    @OutputDirectory 
    @Optional 
    File sourceDir 

    @TaskAction 
    void generate() { 
    project.copy { 
     into headerDir 
     from(template) { 
     rename(/template/, 'generated') 
     expand([text: 'foo']) 
     } 
    } 
    } 
} 
相關問題