Как получить относительный путь для модульных тестов CMake? - PullRequest
0 голосов
/ 11 января 2020

У меня есть проект, созданный с помощью CMake, который использует Catch2 для модульных тестов. Некоторые из модульных тестов проверяют код, который загружает данные из файла, например так:

std::string resource_dir = "TEST_CWD/resources/";
std::ifstream infile{resource_dir + "datafile.txt"}

Вопрос в том, как правильно получить значение TEST_CWD.

Структура каталога проста (и не в камне):

my_project/
    test/
        resources/datafile.txt
        loader_test.cpp

Оставление TEST_CWD пустым иногда работает, но прерывается при запуске тестов через IDE. Установка переменной среды с абсолютным путем также работает, но не работает на чужих машинах. Точно так же принуждение всех пользователей вручную устанавливать переменные среды является недружественным для пользователя.

Что является хорошим способом указать относительные пути к файлам в проектах CMake?

1 Ответ

3 голосов
/ 11 января 2020

Я не знаю об относительных путях, но вы можете использовать ${CMAKE_SOURCE_DIR}, чтобы получить путь к каталогу верхнего уровня вашего проекта, где находится основной файл CMakeLists.txt.

From CMake docs для CMAKE_SOURCE_DIR:

Путь к верхнему уровню исходного дерева.

Это полный путь к верхнему уровню текущее исходное дерево CMake. Для сборки в исходном коде это будет то же самое, что и CMAKE_BINARY_DIR.

Тогда вы можете просто основать все свои пути на этом. Например, в сценарии CMake вы можете написать ${CMAKE_SOURCE_DIR}/resources/datafile.txt.

Edit:

Если вам нужен доступ к этому значению в самом коде C ++, вы можете используйте команду configure_file. Например, вы можете создать файл с именем что-то вроде Config.h.in ...

// Config.h.in

#ifndef CONFIG_H
#define CONFIG_H

#define SOURCE_DIR "${CMAKE_SOURCE_DIR}"

#endif

... и затем в вашем файле CMakeLists.txt

configure_file(Config.h.in ${CMAKE_BINARY_DIR}/Config.h)

include_directories(${CMAKE_BINARY_DIR})

Затем вы можете включить Config.h как обычный заголовок, и вы уже в пути!

Ярлык с одной переменной

Просто используйте макрос препроцессора. В CMakeLists.txt в test/:

target_compile_definitions(target_name PUBLIC TEST_RESOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/resources/")

в C ++:

std::string resource_dir = TEST_RESOURCE_DIR;
...