如何保留CMake生成的文件?

时间:2019-04-08 12:37:01

标签: cmake

我正在使用<div class="wrapper"> <div class="elem">elem that I'd like to select</div> <div class="elem">elem</div> <div class="elem">elem</div> <div class="elem">elem</div> <div class="elem">elem</div> <div class="elem">elem</div> </div> <div class="wrapper"> <div class="elem">Unfortunately, this elem is selected too</div> <div class="elem">elem</div> <div class="elem">elem</div> <div class="elem">elem</div> <div class="elem">elem</div> <div class="elem">elem</div> </div>生成一些文件。 add_custom_command()将其删除。其中一个文件旨在作为默认/示例实现,由用户修改。仅当它不存在时才生成。我希望ninja clean不要删除此文件。

我尝试了很多事情,但没有成功:

  • ninja clean:除非我在add_custom_target()中命名,否则CMake会抱怨丢失的文件,但是这样做也会导致干净删除
  • BYPRODUCTS不起作用,因为CMake抱怨文件丢失。
  • set_file_properties(... GENERATED FALSE)以类似的方式失败:“文件夹不存在或尚未处理”(确实存在)

我以前生成了示例实现,只是让用户复制它或在其上建模代码。这可行,但并不完全令人满意。我的用例不太可能导致CMake不支持吗?

2 个答案:

答案 0 :(得分:2)

恐怕您的要求(从概念上讲,让make创建make clean不会删除的内容) 很不寻常。我可以想到两个潜在的解决方案/解决方法。

一个,将文件的生成时间移至CMake时间。也就是说,使用execute_process()而不是add_custom_command()创建它。基于文件生成过程(当前的自定义命令)是否取决于构建的其余部分,这可能可行,也可能无法。

两个,完全从CMake隐藏示例文件的存在。也就是说,让custom命令还生成其他文件(也许只是一个时间戳文件),并使其驱动自定义目标依赖于该文件。不要在自定义命令的依赖项,输出或副产品出现时列出示例文件。这样,任何东西都不会依赖它,CMake和Ninja都不应该在乎它是否存在,因此他们不会抱怨或尝试清理它。

答案 1 :(得分:0)

如果它是用户的示例,则它不应位于您的build文件夹中,而应位于install文件夹中。我不明白为什么您需要使用add_custom_command或列出的其他命令。

因此,您必须提供install()指令。 然后,您可以呼叫make install。清洁不会删除这些文件,并且仅在必要时重新安装才会覆盖它们。