1
votes

If you execute vim --version, it will show some information about how it was compiled. On my system, it looks like this:

Compilation: 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

Linking: 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 -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,--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 ```

I want to add similar information to the version output of an application that is built using CMake.

I know that there are variables like CMAKE_C_FLAGS, but it depends on other variables if these are actually used. For example, CMAKE_C_FLAGS_RELEASE is used if CMAKE_BUILD_TYPE=Release is specified. Thus it might be error-prone to try to piece this information together from individual CMake variables, and in the end you can't be sure that this is really what CMake uses to compile your sources.

Is there a way to get the actual command CMake uses to compile a source file, similar to the output from vim --version above?

1

1 Answers

1
votes

moreover, CMAKE_C_FLAGS could vary for different source files, directories and targets… so your output can be far from accurate…

and using variables like CMAKE_BUILD_TYPE is pretty stable actually and may give you what you want:

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

little problem is: make sure CMAKE_BUILD_TYPE is set and valid before get the value!

advanced way: one may use CMAKE_<lang>_COMPILE_OBJECT variable to get a "compile template". then use directory properties to collect COMPILE_DEFINITIONS and replace a pattern <DEFINES> in the template. then collect INCLUDE_DIRECTORIES and other options depending on build type. You may look here for inspiration.