如果执行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
的输出?
答案 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获取灵感。