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 сценарий после —цель опции ?
Я ищу что-то вроде MAKECMDGOALS в Makefiles.
Я нашел любое полезное решение …

2

Решение

Разработчик выбирает, какую цель (ы) построить после CMake сгенерировал файлы проекта. Когда CMake запускается, CMake не может знать, какую цель разработчик будет строить. Поэтому то, что вы просите, не имеет смысла для проекта CMake. В Makefile нет отдельного шага конфигурирования, он является частью сборки, и именно так он может предоставлять такую ​​функцию, как MAKECMDGOALS. Также может быть стоит пересмотреть, если вы действительно хотите эту функциональность Makefiles, так как не предназначен для типичного использования (выделение мое):

Make установит специальную переменную MAKECMDGOALS в список целей, которые вы указали в командной строке. Если в командной строке не было задано ни одной цели, эта переменная пуста. Обратите внимание, что эта переменная должна использоваться только в особых случаях.

В вашем примере вы также неправильно используете if(TARGET...), Эта конструкция используется для проверки того, была ли конкретная цель CMake определенный по проекту (что в вашем примере это не до после if() команда, поэтому он всегда будет оцениваться как ложный). Посмотреть документы Вот для деталей.

2

Другие решения

То, что вы спрашиваете, не имеет смысла в мире 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)?

2

Я не уверен на 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; Я думаю, вы тоже найдете это полезным.

0

Я нашел решение:

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 за поддержку и помощь !!!!

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector