如何使用cmake强制重新编译应用程序

时间:2014-01-30 13:02:11

标签: c++ cmake

我正在使用源文件生成器应用程序来生成使用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(与解决方案一起)。

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

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

问题是:是否有可能让cmake重新运行生成器以防其源被修改?如果是,怎么样?

2 个答案:

答案 0 :(得分:2)

那么,您应该在生成器编译目标和源生成目标之间引入人为依赖。

您应该按照Ronny Andersson在该页面上的回答中的建议,将以下内容添加到上述SO问题的CMakeLists.txt中。

  1. 在add_custom_command中使用MAIN_DEPENDENCY参数来引入“顶级”源与生成的文件之间的依赖关系。
  2. 使用DEPENDS参数来引入其他依赖项,例如对构建生成器的目标的依赖性(如果像add_binary(generator_name generator_source1... generator_source2...)那样添加了生成器的创建,那么使用generator_name作为依赖项名称)
  3. 使用PROPERTIES GENERATED 1中的参数add_custom_command标记生成的来源。
  4. 这三个参数在CMake生成的Makefile中构成了一个正确的依赖链。请参阅SWIG_ADD_SOURCE_TO_MODULE/usr/share/CMake/Modules/UseSWIG.cmake底部的文字(或您的CMake发布内部所在的位置),了解完成与您的任务基本相同的任务所做的工作。

答案 1 :(得分:0)

仅当修改了任何CMakeLists.txt或* .cmake文件时,CMake才会重新运行。 一个技巧可以修改 然后,您可以通过修改cmake文件来完成这一操作,从而再次触发CMake。