为什么-DCMAKE_EXPORT_COMPILE_COMMANDS不会创建compile_commands.json文件

3

我的 cmake --version2.8.12.2

我使用以下命令配置项目构建:

cmake ../klein/ -DBUILD_KLEIN_DEPS=1 -DCMAKE_EXPORT_COMPILE_COMMANDS=1
cmake ../klein/ -DBUILD_KLEIN_DEPS=1 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
cmake ../klein/ -DBUILD_KLEIN_DEPS=1 -DCMAKE_EXPORT_COMPILE_COMMANDS=on
CMAKE_EXPORT_COMPILE_COMMANDS=1 cmake ../klein/ -DBUILD_KLEIN_DEPS=1 

从一个干净的构建和一个已经成功构建的目录中,我想查看compiler_commands.json文件,但它没有出现。应该在什么时候创建:在cmake之后还是在make命令之后?它应该在./还是../klein目录中?我的cmake没有提到这个选项,但它总是抱怨未使用的构建变量。它是否可以在“脏”目录中工作,在那里我已经执行了一次成功的构建,或者它只能在空文件夹中进行新的运行?
编辑:我在我的Ubuntu Linux机器上使用默认生成器“Unix Makefiles”
编辑2:我不是问题下项目的作者(我只是想用需要编译命令json文件的rtags探索它),并且我对CMake机制不是很熟悉。然而,CMakeLists.txt可能被配置为超级构建(它确实下载和构建依赖项-如llvm、z3等),它包括ExternalProject,但它也从源代码构建项目本身(klein)。所以这是一个混合体,我想说。

乍一看,尝试使用以下命令:-DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON类型说明符很重要。 - StAlphonzo
嗯,现在它抱怨无用:CMake警告:项目未使用手动指定的变量:CMAKE_EXPORT_COMPILE_COMMANDS - Necto
听起来很奇怪,但我觉得这是进步。我还不太了解CMAKE_EXPORT_COMPILE_COMMANDS的内部使用方法,无法提供建议。如果与生成器有关,您可以考虑参考以下线程:https://dev59.com/f2Ij5IYBdhLWcg3wn2Zn - StAlphonzo
1个回答

2

请问您正在使用哪个生成器?从cmake 3.1.0版本的源代码快速扫描中可以看出,此命令仅适用于以下两种情况。

if(CMAKE_GENERATOR MATCHES "Unix Makefiles")

并且

if(CMAKE_GENERATOR MATCHES "Ninja")

如果你直接使用Visual Studio,除非你想要给CMake添加一个补丁,否则你就没什么希望了。不过,我知道很多Windows开发者都转向了Ninja。其中的一个优点是它比Visual Studio在构建方面快得多。如果你正在使用Ninja或Unix Makefiles,那么深入挖掘一下是值得的。


我使用Unix Makefiles,并从cmake的输出中获得一堆makefile。我还尝试了Ninja生成器,如提到的线程建议-我得到了一个Ninja make文件,但没有编译器命令的json痕迹。 - Necto
好的,谢谢。那我想这值得深入研究。我会在工作中询问是否有人对这个命令有更深入的了解。这不是我以前用过的命令。也许我们等待期间会有其他人加入讨论。 - StAlphonzo
1
首先,在您的原始帖子中,您说您正在使用make命令...等等..我猜您是指cmake,对吗? 因此,回答您的其他初始问题 1)它应该在干净或脏树上工作(错误总是让我从头开始清理以保持清醒)2)它将在cmake命令之后,在make之前生成该文件。最后一个问题是关于您的项目是否是超级构建,即是否使用ExternalProject?当我配置我的超级构建时,我也没有得到json文件。 - StAlphonzo
感谢您的关注,@StAlphonzo,我已经修复了(make->cmake)。该项目确实似乎是超级构建,因为它下载并构建依赖项,但也编译源代码。我已更新问题。 - Necto
嗯,非常有趣的问题。我有一个externalProject only build,它只下载/构建第三方库,但不添加任何自己的库。在该项目上运行cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ../src/不会生成compile_commands.json。如果我添加一个add_library(foo foo.c),例如,我可以在根构建目录中获得json文件。我认为看看你的项目CMake(如果可能的话),我只能想象出了一些问题。也许最容易的方法是提供一个很简单的示例来显示失败。 - StAlphonzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接