在CMake中剥离变量的路径

时间:2015-01-28 20:34:09

标签: 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中编写多个单独的复制语句

3 个答案:

答案 0 :(得分:8)

函数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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

从 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 命令。