CMake: запись исполняемых файлов в несколько подкаталогов - PullRequest
1 голос
/ 15 марта 2019

У меня есть дерево исходного кода и сборки, которое выглядит примерно так:

+-build/
  +-bin/
+-modules/
  +-src/
  +-tests/
    +-test1/
    +-test2/

Я также настроил CMake для записи исполняемых файлов в каталог build/bin.Это все работает нормально.

Я хотел бы, чтобы большинство моих исполняемых файлов были записаны в каталог build/bin, тогда как те, которые собраны из исходных файлов в каталогах тестирования, должны быть записаны в build/bin/tests каталог.

Возможно ли это?Может ли кто-нибудь указать мне правильное направление?

Я пытался установить переменную RUNTIME_OUTPUT_DIRECTORY напрямую и пытался использовать set_target_properties, но безуспешно.

В идеале мне нравитсячтобы можно было что-то установить в файле CMakeLists.txt в каталоге tests и сделать так, чтобы оно попало в подкаталоги.

1 Ответ

1 голос
/ 16 марта 2019

Вы можете установить CMAKE_RUNTIME_OUTPUT_DIRECTORY переменную как много раз , как хотите. Каждый параметр влияет только на исполняемые файлы, созданные с момента этого параметра и до следующего.

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# Futher executables will be placed under 'bin/'
add_executable(my_program <sources>...)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/tests)
# Futher executables will be placed under 'bin/tests/' instead
add_executable(test1 <sources>...)
add_executable(test2 <sources>...)

Если вы создаете тесты в отдельном CMakeLists.txt, настройки можно сделать модульными:

CMakeLists.txt

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# Futher executables will be placed under 'bin/'
add_executable(my_program <sources>...)

add_subdirectory(tests)

Тесты / CMakeLists.txt

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/tests)
# Executables created below will be placed under 'bin/tests/' instead
add_executable(test1 <sources>...)
add_executable(test2 <sources>...)

На самом деле, когда вы вызываете add_executable, он просто использует current значение переменной CMAKE_RUNTIME_OUTPUT_DIRECTORY. Этот факт можно найти в документации о RUNTIME_OUTPUT_DIRECTORY target target, на которую влияет переменная.

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