Каково название цели сборки по умолчанию CMake?
У меня есть настраиваемая цель, и я хочу, чтобы она зависела от целевой по умолчанию (той, которая построена с помощью 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
?...
Цель сборки по умолчанию не существует в качестве цели CMake в времени настройки CMake. Он существует только в сгенерированной системе сборки. Поэтому невозможно, чтобы цель по умолчанию зависела от настраиваемой цели.
Я думаю, что возможное решение сильно зависит от варианта использования. Например. если это необходимо для выполнения теста после сборки системы, вы должны использовать 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>
)