Структура проекта для модульного тестирования (qtest) при использовании команды target_sources () в подкаталоге - PullRequest
1 голос
/ 09 июля 2020

Прежде всего, я знаю, что на этом форуме есть очень похожие вопросы. Тем не менее, никто не отвечает на мой конкретный c случай. У меня следующая структура проекта:

|---Project_Root
    |---CMakeLists.txt
    |---build
    |---src
    |   |---CMakeLists.txt
    |   |---many .cpp and .h files in multiple subfolders with a different CMakeLists.txt 
    |---tests
    |   |---CMakeLists.txt
    |   |---many .cpp files

В Project_Root / CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)

set(SRC_DIR src)

project(
        Project
        LANGUAGES CXX
        )

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(${PROJECT_NAME} "")
target_include_directories(${PROJECT_NAME} PRIVATE ${SRC_DIR})
add_subdirectory(${SRC_DIR})

В папке sr c и вложенных файлах CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)

set(SRC_FILES
    Source1.cpp
    )

set(HEADER_FILES
    Source1.hpp
    )
target_sources(${PROJECT_NAME}
        PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FILES}
        ${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_FILES}
        )

Теперь в подпапке tests:

project(Test LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
enable_testing()

add_executable(Test tst_test.cpp)
add_test(NAME Test COMMAND Test)

target_link_libraries(Test PRIVATE Qt5::Test)

В приведенном выше файле CMakeLists.txt я хочу включить основной проект как библиотеку stati c. Я могу, например, добавить новую цель библиотеки (скажем, Project_Lib) в root CMakeLists.txt и снова использовать команду:

target_sources(Project_Lib
        PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FILES}
        ${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_FILES}
        )

во всех подпапках. Но есть ли более элегантный способ сделать это без необходимости изменять весь файл CMakeLists.txt во вложенных папках ? Например, есть ли способ извлечь исходные файлы из цели Project, чтобы их можно было повторно использовать для создания цели Project_Lib?

1 Ответ

0 голосов
/ 10 июля 2020

Как вы описали, вы можете создать новую цель библиотеки c stati Project_Lib. Воспользуйтесь тем фактом, что вы параметризовали целевое имя, используя имя проекта (${PROJECT_NAME}), поэтому вам фактически не нужно изменять все файлы CMakeLists.txt во вложенных папках. Просто измените имя проекта.

Как я уже сказал, просто исключите файл main.cpp из библиотеки stati c и вместо этого добавьте его в отдельную исполняемую цель.

В Project_Root / CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)

set(SRC_DIR src)

# Change the project name, as now the static library is the primary target.
project(
        Project_Lib
        LANGUAGES CXX
        )

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Create the static library target, whose sources are populated in subdirectories.
add_library(${PROJECT_NAME} STATIC)
target_include_directories(${PROJECT_NAME} PRIVATE ${SRC_DIR})
# The only modification necessary in the subdirectories is to *exclude* the 
# main.cpp file from the target_sources for the static library.
add_subdirectory(${SRC_DIR})

# Add *only* the main.cpp file to the executable target.
add_executable(Project_Exe src/main.cpp)
# Link the static library target to the executable.
target_link_libraries(Project_Exe PRIVATE ${PROJECT_NAME})

В tests / CMakeLists.txt:

...
# Link the static library to your Test executable also.
target_link_libraries(Test PRIVATE Project_Lib Qt5::Test)
...