在CMake中获取完整的编译命令

时间:2014-11-02 12:16:35

标签: c cmake

如果执行vim --version,它将显示有关如何编译的一些信息。在我的系统上,它看起来像这样:

  

编译:gcc -c -I。 -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I / usr / include / gtk-2.0 -I / usr / lib / gtk-2.0 / include -I / usr / include / pango-1.0 -I / usr / include / atk-1.0 -I / usr / include / cairo -I / usr / include / pixman-1 -I / usr / include / libdrm -I / usr / include / gdk-pixbuf-2.0 -I / usr / include / libpng16 -I / usr /include/pango-1.0 -I / usr / include / glib-2.0 -I / usr / lib / glib-2.0 / include -I / usr / include / freetype2 -I / usr / include / libpng16 -I / usr / include / harfbuzz -I / usr / include / freetype2 -I / usr / include / libpng16 -I / usr / include / harfbuzz -D_FORTIFY_SOURCE = 2 -march = x86-64 -mtune = generic -O2 -pipe -fstack-protector-strong --param = ssp-buffer-size = 4 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE = 1

     

链接:gcc -L。 -Wl,-O1, - sort-common, - as-needed,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-rpath,/ usr / lib / perl5 / core_perl / CORE -Wl,-O1, - sort-common, - as-needed,-z,relro -L / usr / local / lib -Wl, - as-needed -o vim -lgtk- x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lSM - lICE -lXt -lX11 -lXdmcp -lSM -lICE -lm -lnrses-lelf -lnsl -lacl -lattr -lgpm -ldl -L / usr / lib -llua -Wl,-E -Wl,-rpath,/ usr / lib / perl5 / core_perl / CORE -Wl,-O1, - sort-common, - as-needed,-z,relro -fstack-protector -L / usr / local / lib -L ​​/ usr / lib / perl5 / core_perl / CORE -lperl -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc -L / usr / lib / python2.7 / config -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -lruby -lpthread -lgmp -ldl -lcrypt -lm -L / usr / lib   ```

我想在使用CMake构建的应用程序的版本输出中添加类似的信息。

我知道有CMAKE_C_FLAGS之类的变量,但如果实际使用这些变量,它还会依赖于其他变量。例如,如果指定了CMAKE_C_FLAGS_RELEASE,则使用CMAKE_BUILD_TYPE=Release。因此,尝试从单个CMake变量中将这些信息拼凑在一起可能容易出错,最终您无法确定这是CMake用来编译源代码的真正原因。

有没有办法获取CMake用来编译源文件的实际命令,类似于上面vim --version的输出?

1 个答案:

答案 0 :(得分:1)

此外,对于不同的源文件,目录和目标,CMAKE_C_FLAGS可能会有所不同......因此您的输出可能远非准确...

并使用像CMAKE_BUILD_TYPE这样的变量实际上相当稳定,可能会给你你想要的东西:

string(TOUPPER "${CMAKE_BUILD_TYPE}" _type_upcase)
# Yeah! CMake can do double expand!
set(_cflags "${CMAKE_C_FLAGS_${_type_upcase}}")

小问题是:在获取值之前确保CMAKE_BUILD_TYPE已设置且有效!

高级方式: 可以使用CMAKE_<lang>_COMPILE_OBJECT变量来获得&#34;编译模板&#34;。然后使用目录属性来收集COMPILE_DEFINITIONS并替换模板中的模式<DEFINES>。然后根据构建类型收集INCLUDE_DIRECTORIES和其他选项。 您可以查看here获取灵感。