在 CMake 中去除变量的路径

Strip path off of variable in CMake

有什么方法可以去除 CMakeLists.txt 中变量的路径?假设我有一个变量

RUNTIME_DEPENDENCIES = {
    src/frontend/solve.py
    src/frontend/other.py
}

这些运行时依赖项被复制到 bin 中供可执行文件在执行期间使用,但按照我复制它们的方式,它们出现在各自的文件夹中。所以我的构建文件夹看起来像

    build
      | \
     src executable
      |
   frontend
   /       \
other.py  solve.py

我希望文件夹只包含

           build
    /       /         \
executable  other.py  solve.py

这里是实际使用的复制命令:

#copy runtime deps
add_custom_target(copy_runtime_dependencies ALL)
foreach(RUNTIME_DEPENDENCY ${RUNTIME_DEPENDENCIES})
    add_custom_command(TARGET copy_runtime_dependencies POST_BUILD
                       COMMAND ${CMAKE_COMMAND} -E copy
                       ${CMAKE_SOURCE_DIR}/${RUNTIME_DEPENDENCY}
                       $<TARGET_FILE_DIR:${EXECUTABLE_NAME}>/${RUNTIME_DEPENDENCY})
endforeach()

我意识到我可以简单地将上面的第 5 行更改为

${CMAKE_SOURCE_DIR}/src/frontend/${RUNTIME_DEPENDENCY}

但如果我在 src/frontend 之外有多个依赖项,我不想在我的 CMakeLists.txt

中编写多个单独的复制语句

函数 get_filename_component 执行此操作:

get_filename_component(barename ${RUNTIME_DEPENDENCY} NAME)

barename 是输出变量,用于保存删除路径的文件名。例如:

get_filename_component(barename "src/frontend/solve.py" NAME)
message(STATUS ${barename})

将打印 solve.py

$<TARGET_FILE_DIR:${EXECUTABLE_NAME}>/../

从 CMake 3.20 开始,您可以使用新的 cmake_path 命令进行路径操作,以获取每个路径的 FILENAME 组件:

cmake_path(GET <path-var> FILENAME <out-var>)

对于您的示例,您可以这样做:

cmake_path(GET RUNTIME_DEPENDENCY FILENAME MY_FILE_NAME)

此命令取代 get_filename_component 命令。