Как напечатать текущие флаги компиляции, которые установлены с target_compile_options ()? - PullRequest
6 голосов
/ 13 мая 2019

Я пытаюсь напечатать флаги компиляции, которые установлены для цели. Наилучшим сценарием является печать строки с текущими флагами во время конфигурирования и компиляции, но если это невозможно, то только во время конфигурирования (или только компиляция) (приемлемое решение).

Это мой тестовый файл .c:

#include <stdio.h>

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

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

и

cmake . && make

Дает этот вывод:

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

Почему CMAKE_C_FLAGS и C_FLAGS печатаются так, как они не определены?

Как добиться этой печати по команде 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

Обновление: Виктор Сергиенко пришел с рабочим решением, но одна проблема с этим, это не так красиво печатать: enter image description here Есть мысли, как сделать так, чтобы это было в формате других принтов? Например :

[ 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

Вторая проблема заключается в том, что -std=gnu11 не печатается (но он активируется с set(CMAKE_C_STANDARD 11) и set(CMAKE_C_STANDARD_REQUIRED ON))

1 Ответ

4 голосов
/ 16 мая 2019

Использование:

Это дало мне ;-list опций как во время настройки, так и во время компиляции:

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

Обновление после обновления вопроса: чтобы получить стандарт C / CXX, найдите C_STANDARD . CMake только устанавливает -gnu вариант флага.

Update2: чтобы получить полные команды компилятора / компоновщика для каждого исходного файла в виде файла JSON, установите CMAKE_EXPORT_COMPILE_COMMANDS в ON (работает только в генераторах CMake 3.5+, make и ninja ). Благодарность за этот кусок идет на комментарий Флориана в этот вопрос .

...