在 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
命令。
有什么方法可以去除 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
命令。