I am trying to print compilation flags that are set for target. The best scenario is to print a line with current flags on configure and compilation times, but if it's impossible, then on configure time only (or compilation only) (acceptable solution).
This is my testing .c file:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
And CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(cmake_gcc_options_try_c C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
add_executable(cmake_gcc_options_try_c main.c)
target_compile_options(cmake_gcc_options_try_c
PUBLIC -W -Wall -Wextra -pedantic -pedantic-errors)
# This fails
message("-- Current compiler flags CMAKE_C_FLAGS are: ${CMAKE_C_FLAGS}")
message("-- Current compiler flags C_FLAGS are: ${C_FLAGS}")
and
cmake . && make
Gives this output:
-- The C compiler identification is GNU 7.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Current compiler flags CMAKE_C_FLAGS are:
-- Current compiler flags C_FLAGS are:
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/Projects/cmake-gcc-options-try-c
Scanning dependencies of target cmake_gcc_options_try_c
[ 50%] Building C object CMakeFiles/cmake_gcc_options_try_c.dir/main.c.o
[100%] Linking C executable cmake_gcc_options_try_c
[100%] Built target cmake_gcc_options_try_c
Why CMAKE_C_FLAGS
and C_FLAGS
are printed as they were undefined?
How to achieve this print on make
command:
[ 50%] Building C object CMakeFiles/cmake_gcc_options_try_c.dir/main.c.o
[ 50%] Current compiler flags are: -W -Wall -Wextra -pedantic -pedantic-errors -std=gnu11
[100%] Linking C executable cmake_gcc_options_try_c
[100%] Built target cmake_gcc_options_try_c
?
Update: Viktor Sergienko came with a working solution, but one problem with this it's not so pretty print: Any thoughts how to make it to be in format of other prints? E. g. :
[ 50%] Building C object CMakeFiles/cmake_gcc_options_try_c.dir/main.c.o
[100%] Linking C executable cmake_gcc_options_try_c
[100%] Current compiler flags are: -W -Wall -Wextra -pedantic -pedantic-errors -std=gnu11
[100%] Built target cmake_gcc_options_try_c
Second problem is that -std=gnu11
is not printed (but it is enabled with set(CMAKE_C_STANDARD 11)
and set(CMAKE_C_STANDARD_REQUIRED ON)
)
target_compile_options(<target> [BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) Adds options to the COMPILE_OPTIONS or INTERFACE_COMPILE_OPTIONS target properties.
When compiling a pattern string into a pattern object, it's possible to modify the standard behavior of the patterns. In order to do that, we have to use the compilation flags. These can be combined using the bitwise OR " | ".
RDBMS-specific flags are used at compile time and the Rogue Wave® DB Link drivers corresponding to the target RDBMSs are linked to the application, together with the RDBMS client libraries. The application is generic with respect to the RDBMSs: No compile-time flag is used.
Use:
This gave me a ;-list
of the options both at configure and compile times:
cmake_minimum_required(VERSION 3.10)
project(cmake_gcc_options_try_c C)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
add_executable(cmake_gcc_options_try_c main.c)
target_compile_options(cmake_gcc_options_try_c
PUBLIC -W -Wall -Wextra -pedantic -pedantic-errors)
get_target_property(MAIN_CFLAGS cmake_gcc_options_try_c COMPILE_OPTIONS)
# also see: COMPILE_DEFINITIONS INCLUDE_DIRECTORIES
message("-- Target compiler flags are: ${MAIN_CFLAGS}")
add_custom_command(TARGET cmake_gcc_options_try_c POST_BUILD
COMMAND echo built with the flags: ${MAIN_CFLAGS})
Update after question was updated: to get C/CXX standard, look up C_STANDARD. If you wonder why CMake sets -gnu
variant of the flag, it's because of CXX_EXTENSIONS
is ON
by default.
Update2: To get the full compiler/linker commands for every source file as a JSON file, set CMAKE_EXPORT_COMPILE_COMMANDS to ON
(only works in CMake 3.5+, make
and ninja
generators). Credit for this piece goes to Florian's comment in this question.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With