我不确定什么对你不起作用。
这对我来说适用于 Windows 上的 ZIP 生成器。我将尝试找到一台 linux 机器,看看这是否也适用于 TGZ(编辑:确实如此):
目录结构:
CMakeLists.txt
ProjectA/
doc
foo.txt
include
foo.h
test
foo.test
ProjectB/
doc
bar.txt
include
bar.h
test
bar.test
项目A/CMakeLists.txt
project( ProjectA )
INSTALL( DIRECTORY include DESTINATION . )
INSTALL( DIRECTORY doc DESTINATION ${PROJECT_NAME}/ )
INSTALL( DIRECTORY test DESTINATION ${PROJECT_NAME}/ )
项目B/CMakeLists.txt
project( ProjectB )
INSTALL( DIRECTORY include DESTINATION . )
INSTALL( DIRECTORY doc DESTINATION ${PROJECT_NAME}/ )
INSTALL( DIRECTORY test DESTINATION ${PROJECT_NAME}/ )
CMakeLists.txt:
project( MyProject )
ADD_SUBDIRECTORY(ProjectA)
ADD_SUBDIRECTORY(ProjectB)
INCLUDE(CPack)
如果我创建包,我会得到
MyProject-0.1.1-win32.zip
MyProject-0.1.1-win32
include
bar.h
foo.h
ProjectA
doc
foo.txt
test
foo.test
ProjectB
doc
bar.txt
test
bar.test
那是你的意图吗?
源包
对于源包创建,默认情况下 CPack 会忽略安装命令并安装/复制所有在CPACK_SOURCE_INSTALLED_DIRECTORIES
. 此变量包含成对的源目录和目标目录。"${CMAKE_SOURCE_DIR};/"
如果不手动设置,则默认为。准确地说,它会覆盖这些目录,忽略CPACK_SOURCE_IGNORE_FILES
默认为所有主要 VCS 簿记文件的所有文件(参见您CPackSourceConfig.cmake
的示例)。
您可以执行以下操作:
CMakeLists.txt
project( MyProject )
SET( PROJECTS ProjectA ProjectB )
SET(CPACK_SOURCE_INSTALLED_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR};/")
FOREACH( p ${PROJECTS} )
ADD_SUBDIRECTORY( ${p} )
LIST( APPEND CPACK_SOURCE_INSTALLED_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR/${p}/include include )
ENDFOREACH()
INCLUDE(CPack)
或将操作添加CPACK_SOURCE_INSTALLED_DIRECTORIES
到相应的项目文件中。
但是:这会将您的包含目录安装到顶级包含目录,但由于通配,仍会在项目目录中创建另一个副本。您可能可以为您的doc
和test
目录创建额外的目录对,并跳过命令CPACK_SOURCE_INSTALLED_DIRECTORIES
中的初始化SET
。如果这样做,您将需要找到一种方法来安装/复制特定于项目的 CMake 文件。
大警告:如果ProjectA
或ProjectB
引用项目本地包含目录(例如,INCLUDE_DIRECTORIES(...)
您将破坏您的 CMake 代码,使源安装(部分)无用。因此您可能需要重新考虑您对顶级包含目录的想法。