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: 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)
)
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 .