如何在使文件在CMake中可执行之前检查文件是否存在
How to check whether the file exists before making it executable in CMake
我有一个 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 在分支 Task1 中看不到(或可能不执行)行 add_executable(Task1 Task1.cpp)
。
来自 CMake documentation,文件 EXISTS
检查仅针对 完整 路径定义明确:
if(EXISTS path-to-file-or-directory)
True if the named file or directory exists. Behavior is well-defined only for full paths. Resolves symbolic links, i.e. if the named file or directory is a symbolic link, returns true if the target of the symbolic link exists.
尝试使用这些文件的完整路径(无论如何,这是一种更安全的方法)。如果这些源与您当前的 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()
我有一个 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 在分支 Task1 中看不到(或可能不执行)行 add_executable(Task1 Task1.cpp)
。
来自 CMake documentation,文件 EXISTS
检查仅针对 完整 路径定义明确:
if(EXISTS path-to-file-or-directory)
True if the named file or directory exists. Behavior is well-defined only for full paths. Resolves symbolic links, i.e. if the named file or directory is a symbolic link, returns true if the target of the symbolic link exists.
尝试使用这些文件的完整路径(无论如何,这是一种更安全的方法)。如果这些源与您当前的 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()