Как напечатать все параметры компиляции в cmake - PullRequest
1 голос
/ 26 апреля 2020

Мой объект использует cmake, некоторые параметры компиляции настроены на set

set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DMY_MACRO_DEBUG")
...
set(CMAKE_CXX_FLAGS_RELEASE "-g")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DMY_MACRO_RELEASE")
...

, а некоторые параметры компиляции настроены на add_definitions()

add_definitions(-DMY_MACRO_1)
add_definitions(-DMY_MACRO_2)
...

после окончания sh я хочу напечатать все параметры компиляции, используя message

Я хочу что-то наподобие следующего:

Compile options in debug mode:   -g -O0 -Wall -DMY_MACRO_DEBUG   -DMY_MACRO_1 -DMY_MACRO_2
Compile options in release mode: -g -O3 -Wall -DMY_MACRO_RELEASE -DMY_MACRO_1 -DMY_MACRO_2

Как я могу это реализовать? Спасибо за ваше время.

Приложение 1

Я знаю, что использование make VERBOSE=1 может показать информацию, но она может показать только параметры отладки в режиме отладки, показать параметры выпуска в режиме выпуска. Он не может показать все параметры режима одновременно. Кроме того, он также включает в себя слишком много -I /path1 -I /path2. Это неудобный способ прочитать это.

Я хочу, чтобы информация отображалась после того, как мы введем cmake ..

Приложение 2

Если -DMY_MACRO_1 -DMY_MACRO_2 можно распечатать некоторая переменная cmake что-то вроде ${CMAKE_ALREADY_ADD_DEFINITIONS}.

message(${CMAKE_ALREADY_ADD_DEFINITIONS})

проблема может быть легко решена. Но я не знаю, существует ли такая переменная.

1 Ответ

1 голос
/ 28 апреля 2020

Команды компиляции

Лучший из известных мне способов сделать это - настройка CMAKE_EXPORT_COMPILE_COMMANDS. При значении ON он будет генерировать compile_commands.json в вашем каталоге компоновки, в котором перечислены все файлы и их команда компиляции. Просто запустите его один раз для отладки и один раз для выпуска, а затем вы можете различить их, чтобы увидеть разницу.

https://cmake.org/cmake/help/latest/variable/CMAKE_EXPORT_COMPILE_COMMANDS.html

В вашем верхнем уровне CMakeLists.txt:

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

Печать

Теперь на основе вашего приложения 2 ... если вы просто хотите распечатать определения компиляции для данной цели, вы бы сделали что-то вроде:

get_target_property(compile_defs app COMPILE_DEFINITIONS)
message(STATUS "App compile definitions are $compile_defs)

Для всех библиотек / исполняемых файлов вы можете сделать так, чтобы они записали свои определения компиляции в файл

function(stash_defs app
file(APPEND 
  ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}_compile_defs.txt 
  "${CMAKE_CURRENT_BINARY_DIR}/${app}: ${compile_defs}")
endfunction()

...
...

# For each binary...
stash_defs(my_binary)

Обратите внимание, что при каждой настройке cmake вы будете добавлять файл. Вам понадобится несколько дополнительных CMake magi c, чтобы сделать файл compile_defs.txt частью цели сборки, чтобы он очищался / повторно запускался при каждом вызове configure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...