Каково название цели сборки по умолчанию CMake?

109
9

У меня есть настраиваемая цель, и я хочу, чтобы она зависела от целевой по умолчанию (той, которая построена с помощью make).


add_custom_target(foo ....)
add_dependency(foo default_target_name_goes_here)

Как называется цель по умолчанию?


Я пробовал ALL, ALL_BUILD, MyProjectsName, DEFAULT,...


Поиск чего-либо в документации CMake всегда является неудачным приключением...


UPDATE: похоже, CMake был разработан таким образом, что это очень сложно исправить/реализовать: bugreport получает +1 с 2009 года. Кто действительно хотел бы иметь пользовательскую цель, которая зависит, например, от ALL цели? Или, другими словами: кто когда-либо писал make && make test?...

спросил(а) 2021-01-19T18:49:07+03:00 6 месяцев, 1 неделя назад
1
Решение
78

Цель сборки по умолчанию не существует в качестве цели CMake в времени настройки CMake. Он существует только в сгенерированной системе сборки. Поэтому невозможно, чтобы цель по умолчанию зависела от настраиваемой цели.

ответил(а) 2021-01-19T18:49:07+03:00 6 месяцев, 1 неделя назад
45

Я думаю, что возможное решение сильно зависит от варианта использования. Например. если это необходимо для выполнения теста после сборки системы, вы должны использовать CTest вместо прямого вызова make.


В ваш CMakeLists.txt вы добавите:


 add_test(NAME foo COMMAND ...)

а затем используйте CTest для создания и выполнения:


 ctest --build-and-test ...

В более общем плане и не рассматривая вопрос о том, почему вы хотели бы это сделать, я думаю, что лучше всего просто назвать и полагаться на конкретные целевые зависимости вместо того, чтобы просто принимать цели ALL - я просто хотел добавить две возможности сделать то, что вы хотели сделать.


Можно было бы определить/отследить список всех целей, используемых, как обсуждалось здесь. Это будет выглядеть, например. для таких библиографических объектов (получение собственного/частного GlobalTargetList):

macro(add_library _target)
_add_library(${_target} ${ARGN})
set_property(GLOBAL APPEND PROPERTY GlobalTargetList ${_target})
endmacro()

и использовать его в конце основного файла CMakeLists.txt с помощью


get_property(_allTargets GLOBAL PROPERTY GlobalTargetList)
add_dependencies(foo ${_allTargets})

Изменить: Глобальное BUILDSYSTEM_TARGETS свойство было выпущено с помощью CMake 3.7


Второй - менее благоприятный подход требует, чтобы цель foo не была частью сборки ALL (иначе вы заканчиваете бесконечный цикл):


add_custom_target(foo)
set_target_properties(foo PROPERTIES EXCLUDE_FROM_ALL 1)

add_custom_command(
TARGET foo
PRE_BUILD
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target ALL_BUILD --config $<CONFIGURATION>
)

ответил(а) 2021-01-19T18:49:07+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема