【问题标题】:How to force recompile of application with cmake如何使用 cmake 强制重新编译应用程序
【发布时间】:2014-01-30 23:06:02
【问题描述】:

我正在使用源文件生成器应用程序来生成使用 CMake 编译的另一个应用程序的源文件(不是一个项目)。

基本设置如下:

a. generator

b. something_else

The generator is a few CPP files linked together

The something_else is:

a. a few "normal" CPP files

b. generated CPP/h files which I have to link in. 
   These CPP files are generated by the generator

生成器在配置阶段配置了一些选项,根据这些选项生成的文件的内容是不同的。

问题出现在这里:CMake compile time generation of source(连同解决方案)。

现在,当我ma​​ke编译并执行生成器时,然后编译并链接something_else。

但是,现在我遇到了以下问题:如果我修改 only 生成器的源代码并在构建目录中执行 make,那么 generator 可执行文件将被重新编译并链接,但是它没有被执行,something_else也没有被重新编译和链接,所以我必须再次make cleanmake才能执行生成器。

问题是:如果它的源被修改,是否可以让 cmake 重新运行 generator?如果是,怎么做?

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    好吧,你应该在生成器编译目标和源生成目标之间引入人为的依赖关系。

    您应该从提到的 SO 问题中将以下内容添加到 CMakeLists.txt 中,正如 Ronny Andersson 在该页面上的回答中所建议的那样。

    1. 在 add_custom_command 中使用 MAIN_DEPENDENCY 参数在“顶级”源和生成的文件之间引入依赖关系。
    2. 使用 DEPENDS 参数来引入其他依赖项,例如对构建生成器的目标的依赖(如果生成器的创建像 add_binary(generator_name generator_source1... generator_source2...) 这样添加,则使用 generator_name 作为依赖项名称)
    3. 将生成的源标记为在add_custom_command 中使用参数PROPERTIES GENERATED 1 生成。

    这三个参数在 CMake 生成的 Makefile 中构成了正确的依赖链。请参阅 /usr/share/CMake/Modules/UseSWIG.cmakeSWIG_ADD_SOURCE_TO_MODULE 底部的文本(或您的 CMake 发行版内部所在的任何位置),了解为解决与您的任务基本相同的任务所做的工作。

    【讨论】:

    【解决方案2】:

    只有当任何 CMakeLists.txt 或 *.cmake 文件被修改时,CMake 才会重新运行。 可以修改一个技巧 然后,您可以通过修改 cmake 文件来解决问题,这样 CMake 就会再次被触发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2020-02-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多