Как проверить, существует ли файл, прежде чем делать его исполняемым в CMake - PullRequest
2 голосов
/ 26 февраля 2020

У меня есть проект CLion. Внутри него у меня есть несколько файлов (например, Task1. cpp, Task2. cpp). Я храню их в GitHub в одном репозитории, но в разных ветках ( Task1 и Task2 соответственно). Поэтому, когда я проверяю другую ветку на моем ноутбуке, остается только одна локально. Мне нужно изменить CMakeLists.txt, чтобы я мог строить свой проект, не редактируя его каждый раз, когда я переключаю свою ветку. Я пытался написать так:

if(EXISTS Task1.cpp)
  add_executable(Task1 Task1.cpp)
endif()

if(EXISTS Task2.cpp)
  add_executable(Task2 Task2.cpp)
endif()

Но похоже, что CLion не видит (или, вероятно, не выполняет) строку add_executable(Task1 Task1.cpp) в случае нахождения в ветви Task1.

1 Ответ

2 голосов
/ 26 февраля 2020

Из документации CMake проверка файла EXISTS четко определена только для полных путей:

if(EXISTS path-to-file-or-directory)

Истина, если именованный файл или каталог существует. Поведение четко определено только для полных путей. Разрешает символьные c ссылки, т. Е. Если именованный файл или каталог является символьной c ссылкой, возвращает истину, если существует цель символьной c ссылки.

Попробуйте использовать полный путь к этим файлам (что является более безопасным подходом, независимо от). Если эти источники находятся в той же директории, что и текущий файл CMake, вы можете использовать CMAKE_CURRENT_SOURCE_DIR:

if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Task1.cpp)
  add_executable(Task1 ${CMAKE_CURRENT_SOURCE_DIR}/Task1.cpp)
endif()

if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/Task2.cpp)
  add_executable(Task2 ${CMAKE_CURRENT_SOURCE_DIR}/Task2.cpp)
endif()
...