如何获得gradle增量本机c ++编译来处理生成的头文件?

时间:2016-07-14 16:08:39

标签: gradle

我有一个在构建时在生成编译任务所依赖的任务中生成的标头,麻烦的是编译任务在增量编译中更改标头时无法识别。因此,即使任务运行,它也不会编译源文件。

我原本期望生成的标题应该显示为“已发现的包含”并导致重建源文件但不是这样。

以下是我提出的最好但不起作用。

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

1 个答案:

答案 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'])
      }
    }
  }
}