web-dev-qa-db-fra.com

Comment imprimer les drapeaux de compilation actuels qui sont définis avec target_compile_options ()?

J'essaie d'imprimer des drapeaux de compilation définis pour la cible. Le meilleur scénario consiste à imprimer une ligne avec des indicateurs actuels sur les temps de configuration et de compilation, mais si c'est impossible, alors sur la configuration de l'heure uniquement (ou de la compilation uniquement) (solution acceptable).

Voici mon fichier .c de test:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

Et 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}")

et

cmake . && make

Donne cette sortie:

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

Pourquoi CMAKE_C_FLAGS Et C_FLAGS Sont imprimés car ils n'étaient pas définis?

Comment réaliser cette impression sur la commande make:

[ 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

?

Mise à jour: Viktor Sergienko est venu avec une solution de travail, mais un problème avec cela ce n'est pas si joli print: enter image description here Avez-vous des idées sur la façon de le rendre au format d'autres tirages? Par exemple. :

[ 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

Le deuxième problème est que -std=gnu11 N'est pas imprimé (mais il est activé avec set(CMAKE_C_STANDARD 11) et set(CMAKE_C_STANDARD_REQUIRED ON))

9
stackoverflower

Utilisation:

Cela m'a donné un ;-list des options au moment de la configuration et de la compilation:

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})

Mise à jour après la mise à jour de la question: pour obtenir la norme C/CXX, recherchez C_STANDARD . CMake ne définit que -gnu variante du drapeau.

Update2: Pour obtenir les commandes complètes du compilateur/éditeur de liens pour chaque fichier source en tant que fichier JSON, définissez CMAKE_EXPORT_COMPILE_COMMANDS sur ON (ne fonctionne que dans CMake 3.5+, make et ninja générateurs). Le mérite de cette pièce revient au commentaire de Florian dans cette question .

6
Victor Sergienko