2016-07-14 3 views
0

Ich habe eine Kopfzeile, die zur Erstellungszeit in einer Aufgabe generiert wird, von der ich die Kompilieraufgabe abhängig mache, Problem ist, dass die Kompilierungsaufgabe nicht erkennt, wenn die Kopfzeile in der inkrementellen Kompilierung geändert wird. Selbst wenn die Aufgabe ausgeführt wird, wird die Quelldatei nicht kompiliert.Wie bekomme ich Gradle inkrementelle native C++ - Kompilierung für generierte Header?

Ich hätte erwartet, dass der generierte Header als "Discovered Include" angezeigt werden sollte und die Quelldateien neu erstellt werden, aber nicht so.

Unten ist das Beste, was ich habe, aber es funktioniert nicht.

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' 
    } 
    } 
} 

Beispielprojekt: https://github.com/thejk/gradle-incremental-cpp-generated-header

Antwort

0

Got Hilfe auf dem gradle Forum, lange Geschichte kurz: Erstellen Sie eine C (pp) sourceSet mit generatedBy tasks.generateHeader und modifizieren generateHeader headerDir und sourceDir Eigenschaften zu exportieren. Verknüpfen Sie den Quellsatz mit dem echten mit 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']) 
     } 
    } 
    } 
} 
Verwandte Themen