2014-11-02 60 views
1

如果您執行vim --version,它將顯示一些關於它如何編譯的信息。在我的系統上,它看起來像這樣:在CMake中獲取完整編譯命令

編譯: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, - 根據需要,-z,relro -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -Wl,-rpath,/ usr/lib/perl5/core_perl/CORE -Wl,-O1, - sort-common, - 根據需要,-z,relro -L -L/usr/local/lib -Wl, - 根據需要-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 -lncurses -lelf -lnsl -lacl -lattr -lgpm -ldl -L/usr/lib -llua -Wl,-E -Wl,-rpath,/ usr/lib/perl5/core_perl/CORE -Wl,-O1, - sort-common, - 根據需要,-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_BUILD_TYPE=Release,則使用CMAKE_C_FLAGS_RELEASE。因此,試圖將這些信息從各個CMake變量中拼湊出來可能會有錯誤傾向,並且最終您不能確定這是CMake用來編譯源代碼的真正原因。

有沒有辦法讓CMake用來編譯源文件的實際命令,類似於上面的vim --version的輸出?

回答

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變量來獲得「編譯模板」。然後使用目錄屬性來收集COMPILE_DEFINITIONS並替換模板中的模式<DEFINES>。然後根據構建類型收集INCLUDE_DIRECTORIES和其他選項。 你可能會看到here的靈感。