cmake - 从外部项目中清除复制的文件

标签 cmake

作为构建过程的一部分,我正在构建网络服务器 lighttpd .

以下 CMakeLists.txt 正在运行:

include(ExternalProject)

ExternalProject_Add(
    lighttpd
    URL ${PROJECT_SOURCE_DIR}/ext/lighttpd.tar.gz
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_OUTPUT_PATH}/lighttpd
)

ExternalProject_Add_Step(
    lighttpd copy2bin
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${EXTERNAL_OUTPUT_PATH}/lighttpd/sbin ${EXECUTABLE_OUTPUT_PATH}
    COMMAND ${CMAKE_COMMAND} -E copy_directory ${EXTERNAL_OUTPUT_PATH}/lighttpd/lib/lighttpd ${LIBRARY_OUTPUT_PATH}
    DEPENDEES install
)

当我键入 make 时,生成的二进制文件和库分别位于 bin/lib/ 中,就像在 copy2bin 中完成的一样 步骤。但是,当我键入 make clean 时,文件并没有被清除。

如何通知 CMake 在调用 clean 时也清除 bin/lib/ lighttpd 文件?

有没有更好的方法可以做到这一点?我基本上是根据我在 GitHub 上找到的模型建模的.

这是我的顶级 CMakeLists:

# Specify the minimum version for CMake
cmake_minimum_required(VERSION 3.5)

# Project's name
project(CMakeTest)

# Set the output folder where your program will be created
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH    ${CMAKE_BINARY_DIR}/lib)
set(EXTERNAL_OUTPUT_PATH   ${CMAKE_BINARY_DIR}/ext_install)

add_subdirectory(ext) #Contains CMakeLists above

编辑:

我能够使用它:

set_property(DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES
    "${EXTERNAL_OUTPUT_PATH}"
    "${EXECUTABLE_OUTPUT_PATH}/lighttpd"
    "${EXECUTABLE_OUTPUT_PATH}/lighttpd-angel"
)

最佳答案

set_directory_propertiesADDITIONAL_MAKE_CLEAN_FILES允许在 make clean 阶段添加要清理的文件:

set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${EXECUTABLE_OUTPUT_PATH}")
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${LIBRARY_OUTPUT_PATH}")

由于其签名,我使用了对 set_directory_properties 的单独调用:

set_directory_properties(PROPERTIES prop1 value1 prop2 value2)

这允许将属性仅与一个值相关联。一体化解决方案如下所示:

set_directory_properties(PROPERTIES
    ADDITIONAL_MAKE_CLEAN_FILES "${EXECUTABLE_OUTPUT_PATH}"
    ADDITIONAL_MAKE_CLEAN_FILES "${LIBRARY_OUTPUT_PATH}"
)

我不喜欢在同一调用中重复 ADDITIONAL_MAKE_CLEAN_FILES。或者,您可以使用 set_property :

set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES
    "${EXECUTABLE_OUTPUT_PATH}"
    "${LIBRARY_OUTPUT_PATH}"
)

注意:

在路径中使用变量时,应始终将路径写在引号 "" 之间:如果变量包含空格字符,则生成的路径可能被视为值列表:

set(EXECUTABLE_OUTPUT_PATH "/path/with a/space")
set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES
    ${EXECUTABLE_OUTPUT_PATH}
)

在上面的代码中,不带引号的${EXECUTABLE_OUTPUT_PATH}将被解释如下:

set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES
    /path/with a/space
)

这里属性不会按需应用于路径/path/with a/space,而是应用于路径/path/witha/空格.

关于cmake - 从外部项目中清除复制的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41384447/

相关文章:

c - 构建过程后如何在 cmake 中编译其他源文件

c++ - 如何访问 CMake 中的源文件名?

c++ - 构建库时的 Clang 和 undefined symbol

c++ - CMake无法在不同的静态库中检测符号冲突

c++ - 如何在没有调试符号和优化的情况下创建 cmake 构建配置?

ruby - OS X Homebrew 需要为 cmake 创建构建目录

带有 CMakeLists.txt 的 C++ AddressSanitizer 导致 asan 错误

cmake - 如何在 cmake add_test 中使用重定向

c++ - 如何使用配置模式进行 find_package 搜索并在模块模式下进行回退?

c++11 - 让cmake和clang一起使用c++11(c++14)