我有一个在构建时在生成编译任务所依赖的任务中生成的标头,麻烦的是编译任务在增量编译中更改标头时无法识别。因此,即使任务运行,它也不会编译源文件。
我原本期望生成的标题应该显示为“已发现的包含”并导致重建源文件但不是这样。
以下是我提出的最好但不起作用。
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 :(得分:0)
在gradle论坛上获得帮助,长话短说:使用generatedBy tasks.generateHeader创建一个C(pp)SourceSet并修改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'])
}
}
}
}