作为构建过程的一部分,我正在构建网络服务器 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_properties
与 ADDITIONAL_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/with
和a/空格
.
关于cmake - 从外部项目中清除复制的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41384447/