如何修改FetchContent拉取的CMake依赖的运行时输出目录?
解决FetchContent拉取的CMake依赖运行时输出目录修改问题
核心原因
FetchContent会将依赖项目作为子目录引入,若依赖自身的CMakeLists.txt中显式设置了*RUNTIME_OUTPUT_DIRECTORY*相关属性,且设置时机晚于你调用set_target_properties的时机,就会覆盖你的配置。
可行方案
方案1:使用全局变量提前配置
在调用FetchContent_MakeAvailable之前设置全局输出目录,子项目默认会继承这个全局设置(除非子项目硬编码了路径):
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${POTATO_BIN_DIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${POTATO_BIN_DIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${POTATO_BIN_DIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${POTATO_BIN_DIR}) FetchContent_Declare(Potato GIT_REPOSITORY https://git.superpotato.com ) FetchContent_MakeAvailable(Potato)
方案2:POST_BUILD钩子强制复制
如果子项目硬编码了输出路径,可以通过添加POST_BUILD命令,将生成的产物复制到目标目录:
FetchContent_Declare(Potato GIT_REPOSITORY https://git.superpotato.com ) FetchContent_MakeAvailable(Potato) add_custom_command(TARGET PotatoLib POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:PotatoLib> ${POTATO_BIN_DIR}/$<CONFIG>/ COMMENT "Copying PotatoLib to target directory" )
方案3:修改子项目CMake配置(进阶)
通过FetchContent_GetProperties获取子项目源码目录,直接修改其CMakeLists.txt或添加补丁:
FetchContent_Declare(Potato GIT_REPOSITORY https://git.superpotato.com ) FetchContent_GetProperties(Potato) if(NOT Potato_POPULATED) FetchContent_Populate(Potato) # 根据子项目实际配置调整替换逻辑 file(READ ${Potato_SOURCE_DIR}/CMakeLists.txt content) string(REPLACE "RUNTIME_OUTPUT_DIRECTORY" "RUNTIME_OUTPUT_DIRECTORY ${POTATO_BIN_DIR}" modified_content "${content}") file(WRITE ${Potato_SOURCE_DIR}/CMakeLists.txt "${modified_content}") add_subdirectory(${Potato_SOURCE_DIR} ${Potato_BINARY_DIR}) endif()
注意:该方案耦合性较强,若子项目更新可能需要同步调整替换逻辑。
内容的提问来源于stack exchange,提问作者scx
相关产品推荐
相关产品推荐

