CMake настраиваемая команда после сборки для нескольких целей? - PullRequest
0 голосов
/ 27 мая 2018

Я изучаю CMake через хобби-проект на C ++ с использованием Visual Studio 2017, и, как я его настроил, у меня есть одна папка для исходного кода и одна папка для тестового кода.Я строю исходный код в виде статической библиотеки и строю тестовый код в виде исполняемого файла (используя Catch2).Проблема, с которой я столкнулся сейчас, состоит в том, что это две отдельные цели, и всякий раз, когда одна или обе эти цели перестраиваются, я хочу запустить исполняемый файл тестирования.Теперь я могу узнать, как запустить событие после сборки, используя ADD_CUSTOM_COMMAND, но это работает только для одной цели.Установка нескольких целей после «TARGET» приводит к тому, что используется только последняя используемая цель (я проверял это), а дублирование пользовательской команды может привести к повторному запуску тестов, а также к плохому стилю кода.Есть ли способ сделать это элегантно?Мой файл CMake выглядит так:

# CMakeList.txt : Top-level CMake project file, do global configuration
# and include sub-projects here.
#
cmake_minimum_required (VERSION 3.8)

project ("SheepyEngine")

set (CMAKE_CXX_STANDARD 17)

set (HEADER_FILES 3rdParty/CImg/CImg.h)

set (SOURCE_DIRECTORY Source)

set (TEST_DIRECTORY Test)

# Include sub-projects.
add_subdirectory ("Source")
add_subdirectory ("Test")

# Include libraries
include_directories (
    "${CMAKE_CURRENT_LIST_DIR}/3rdParty/CImg"
    "${CMAKE_CURRENT_LIST_DIR}/3rdParty/Catch2/single_include"
)


add_library (SheepyEngine STATIC 
    "${SOURCE_DIRECTORY}/Game.cpp" 
    "${SOURCE_DIRECTORY}/Game.h" 
    "${SOURCE_DIRECTORY}/GameObject.h"
    ${HEADER_FILES})

target_include_directories(SheepyEngine PRIVATE ${CMAKE_CURRENT_LIST_DIR}/3rdParty/CImg/)

add_executable(SheepyEngineTest "${TEST_DIRECTORY}/test.cpp" "3rdParty/Catch2/single_include/catch.hpp")

target_include_directories(SheepyEngineTest PRIVATE ${CMAKE_CURRENT_LIST_DIR}/3rdParty/Catch2/)

# TODO: Add tests and install targets if needed.

if(${RUN_TESTS})
    ADD_CUSTOM_COMMAND(
        TARGET SheepyEngineTest SheepyEngine
        POST_BUILD
        COMMAND ${CMAKE_CURRENT_LIST_DIR}/Build/Debug/SheepyEngineTest.exe
    )
endif()

1 Ответ

0 голосов
/ 28 мая 2018

Цель SheepyTestProgram должна зависеть от SheepyEngine:

target_link_libraries(SheepyEngineTest SheepyEngine)

Тогда целью add_custom_command будет просто SheepyEngineTest (add_custom_command принимает только одну цель).

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