CMake Как проверить цель для сборки
Я попытался найти решение: Как проверить цель для сборки?
Рассмотрим следующий скрипт CMake:
cmake_minimum_required(VERSION 3.5.1)
project(cppTests)
# How to check at this point the target of build
if(TARGET "cppTests")
message(STATUS "Target is cppTests")
else()
message(STATUS "Target is not cppTests")
endif()
message(STATUS "Target is ${TARGET}")
set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp)
add_executable(cppTests ${SOURCE_FILES})
Тогда я называю следующее:
/home/username/Software/clion-2017.1.1/bin/cmake/bin/cmake --build /home/username/Projects/cppTests/cmake-build-debug --target cppTests -- -j 8
Как я могу проверить целевые cppTests в сценарии CMake после параметров --target? Я ищу что-то вроде MAKECMDGOALS в Makefiles. Я нашел любое полезное решение...
4 ответа
Я нашел решение:
add_custom_command(
OUTPUT fidl_files_generated
DEPENDS "./interfaces/*.fidl"
COMMAND touch fidl_files_generated
COMMAND /home/redra/Projects/Automotive/cgen/commonapi-generator/commonapi-generator-linux-x86_64 -sk ../interfaces/ *.fidl
COMMAND /home/redra/Projects/Automotive/cgen/commonapi_dbus_generator/commonapi-dbus-generator-linux-x86_64 ../interfaces/ *.fidl
)
add_custom_target(fidl_gen
DEPENDS fidl_files_generated)
set(GENERATED_FILES "../cmake-build-debug/src-gen/v1/commonapi/HelloWorldDBusProxy.cpp"
"../cmake-build-debug/src-gen/v1/commonapi/HelloWorldDBusDeployment.cpp"
"../cmake-build-debug/src-gen/v1/commonapi/HelloWorldDBusStubAdapter.cpp"
"../cmake-build-debug/src-gen/v1/commonapi/HelloWorldStubDefault.cpp"
"../cmake-build-debug/src-gen/v1/commonapi/HelloWorldDBusDeployment.cpp")
set_source_files_properties(${GENERATED_FILES} PROPERTIES GENERATED TRUE)
add_executable(
CommonAPI_Server
${SOURCE_FILES}
${GENERATED_FILES})
add_dependencies(CommonAPI_Server fidl_gen)
Спасибо всем за поддержку!
Отдельное спасибо Angew за поддержку и помощь!!!!
Разработчик выбирает, какую цель (цели) создавать после того, как CMake сгенерировал файлы проекта. Когда CMake запускается, CMake не может знать, какую цель разработчик будет строить. Поэтому то, что вы просите, не имеет смысла для проекта CMake. В Makefile нет отдельного шага конфигурирования, он является частью сборки, и именно так он может предоставлять такую функцию, как MAKECMDGOALS. Также может быть стоит пересмотреть, если вы действительно хотите эту функциональность Makefiles, так как она не предназначена для обычного использования (выделено мое):
Make установит специальную переменную MAKECMDGOALS в список целей, которые вы указали в командной строке. Если в командной строке не было задано ни одной цели, эта переменная пуста. Обратите внимание, что эта переменная должна использоваться только в особых случаях.
В вашем примере вы также неправильно используете if(TARGET...)
, Эта конструкция используется для проверки, была ли определенная цель CMake определена проектом (чего в вашем примере нет до тех пор, пока if()
команда, поэтому он всегда будет оцениваться как ложный). Смотрите документацию здесь для деталей.
То, что вы спрашиваете, не имеет смысла в мире CMake. Временная шкала проекта CMake состоит из 3 отдельных шагов:
configure time > generate time > build time
\---------------v--------------/ \---v----/
CMake is running make is running
На этапе настройки CMake считывает и анализирует CMakeLists.txt
файлы и хранит обработанные данные в памяти. Это происходит, когда вы нажимаете Configure
кнопка в CMake GUI.
На этапе генерации CMake воздействует на данные в памяти для генерации файлов системы сборки (Makefiles, решения и проекты Visual Studio и т. Д.). Это происходит, когда вы нажимаете Generate
кнопка в CMake GUI.
Бег cmake
из командной строки выполняет настройку сразу же после генерации.
Затем CMake завершает работу с системой builds и завершает ее запуск. Теперь у вас есть работающая система сборки, которая может быть обработана инструментом сборки (например, make
или же msbuild
). Даже если вы запустите этот инструмент сборки, используя cmake --build
этот новый вызов cmake
не читает ваши CMakeLists.txt
файлы вообще. Он просто обращается к минимуму из сгенерированного CMakeCache.txt
выяснить, какой инструмент сборки запустить, и запускает его.
Вы не указали, что вы пытаетесь достичь с помощью информации, но, возможно, вы могли бы работать с такими вещами, как add_custom_command(TARGET cppTests PRE_LINK)
?
Я не уверен на 100%, что правильно понял ваш вопрос, но, насколько я понимаю, вы ищете переменные CMAKE_PROJECT_NAME
а также PROJECT_NAME
,
if (${CMAKE_PROJECT_NAME} STREQUAL "cppTests")
message("CMAKE_PROJECT_NAME is \"cppTests\"")
else ()
message("CMAKE_PROJECT_NAME is NOT \"cppTests\"")
endif ()
Смотрите список общих переменных здесь. Я часто держу эту ссылку открытой, когда делаю CMake; Я думаю, вы тоже найдете это полезным.