Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to print current compilation flags that are set with target_compile_options()?

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: enter image description here 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))

like image 298
stackoverflower Avatar asked May 13 '19 00:05

stackoverflower


People also ask

What is Target_compile_options?

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.

What is the use of compilation flag in Python?

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 " | ".

What is Flag in compiling?

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.


1 Answers

Use:

  • COMPILE_OPTIONS target property to get target-specific compilation flags;
  • add_custom_command with a POST_BUILD option to print any variable;

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.

like image 126
Victor Sergienko Avatar answered Oct 20 '22 17:10

Victor Sergienko