gpt4 book ai didi

visual-studio - CMake - 仅当文件不存在时复制文件

转载 作者:行者123 更新时间:2023-12-05 04:07:34 26 4
gpt4 key购买 nike

我想使用 cmake 将 postbuild 中的文件复制到构建目录,但前提是它们尚不存在。

我知道“add_custom_command”有一个“copy_if_different”开关,但我找不到类似“copy_if_doesnt_exist”的东西。

目前我坚持这个:

file(GLOB CONFIGURATION_DATA ${PROJECT_SOURCE_DIR}/data/configurations/*)

foreach(data ${CONFIGURATION_DATA})
#only copy if file doesnt exists
if(NOT EXISTS ?? how to get same path as - $<TARGET_FILE_DIR:${PROJECT_NAME_STR}>/data/configurations) )
add_custom_command(TARGET ${PROJECT_NAME_STR} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${data}
$<TARGET_FILE_DIR:${PROJECT_NAME_STR}>/data/configurations)
endif()
endforeach()

我不知道如何获取目标文件路径的地方

$<TARGET_FILE_DIR:${PROJECT_NAME_STR}>/data/configurations

为了把它放到if语句中

最佳答案

对于不直接支持的情况,file(GENERATE ...)命令非常有用(因为它会评估 generator expressions )。

所以在您的情况下,我已经成功测试了以下代码示例:

cmake_minimum_required(VERSION 2.8.12)

if (POLICY CMP0070)
cmake_policy(SET CMP0070 NEW)
endif()

project(CopyFileIfNotExists)

file(
GENERATE
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/CopyConfigurationData$<CONFIG>.cmake"
CONTENT
"if (NOT EXISTS \"$<TARGET_FILE_DIR:${PROJECT_NAME}>/data/configurations\")
execute_process(
COMMAND \"${CMAKE_COMMAND}\" -E copy_directory
\"${PROJECT_SOURCE_DIR}/data/configurations\"
\"$<TARGET_FILE_DIR:${PROJECT_NAME}>/data/configurations\"
)
endif()"
)

file(WRITE "main.cpp" "int main() { return 0; }")

add_executable(${PROJECT_NAME} "main.cpp")

add_custom_command(
TARGET ${PROJECT_NAME}
POST_BUILD
COMMAND "${CMAKE_COMMAND}" -P "CopyConfigurationData$<CONFIG>.cmake"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
)

备选

或者如果可以运行每个 CMake(重新)配置,只需添加以下内容而不是构建后步骤:

file(
GLOB
CONFIGURATION_DATA
RELATIVE "${PROJECT_SOURCE_DIR}"
"${PROJECT_SOURCE_DIR}/data/configurations/*"
)

foreach(data IN LISTS CONFIGURATION_DATA)
file(
GENERATE
OUTPUT "$<TARGET_FILE_DIR:${PROJECT_NAME}>/${data}"
INPUT "${PROJECT_SOURCE_DIR}/${data}"
)
endforeach()

替代方案:优化版本

利用file(COPY ...)我能想到的最短的基于脚本的版本也优化了现有的项目

"Copying preserves input file timestamps, and optimizes out a file if it exists at the destination with the same timestamp."

看起来像这样:

file(
GENERATE
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/CopyConfigurationData$<CONFIG>.cmake"
CONTENT "file(
COPY \"${PROJECT_SOURCE_DIR}/data/configurations\"
DESTINATION \"$<TARGET_FILE_DIR:${PROJECT_NAME}>/data\"
)"
)

关于visual-studio - CMake - 仅当文件不存在时复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48593311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com