如何为 CPack TGZ 生成器指定不同的文件夹结构?
Posted
技术标签:
【中文标题】如何为 CPack TGZ 生成器指定不同的文件夹结构?【英文标题】:How to specify different folder structure for CPack TGZ generator? 【发布时间】:2016-04-12 22:25:20 【问题描述】:我有一个 CMake 项目,它根据install
命令将东西安装到系统中,如下所示:
install (
TARGETS myTarget
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
)
make install
完美运行。然后我想要一个二进制存档:
set(CPACK_GENERATOR "TGZ")
make package
生成一个 tar.gz 文件,其文件夹结构与指定的install
命令相同。但是,我想要一个扁平的结构,即把所有东西(可执行文件和库)都放在“prefix”中,没有“bin”和“lib”目录。
这可能吗?可能是对组件系统、构建类型系统或CPACK_PROJECT_CONFIG_FILE
的一些巧妙使用?
【问题讨论】:
你知道make package_source
吗?也许它会做你想要的。
However, I want to have a flat structure, that is, put everything (both executables and libraries) in "prefix", without the "bin" and "lib" directory.
- 然后您需要将目标直接安装到“前缀”。可能,DESTINATION .
应该可以工作。
@usr1234567 是的,但是make package_source
用于打包源存档,这与我的问题无关。或者你的意思是它可以被滥用来以某种方式解决我的问题?
@Tsyvarev 但是DESTINATION .
也会影响make install
,而不仅仅是make package
。我仍然希望make install
使用“bin”/“lib”文件夹。
@AndyLi 它为您提供平面结构。但你是对的,它不能包含可执行文件或库。
【参考方案1】:
最后我添加了一个自定义安装脚本,它通过查看CMAKE_INSTALL_PREFIX
来检测它是否由 CPack 运行,并在必要时重新构建安装树。
这是我的解决方案:
在 CMakeLists.txt 中,在所有 install()
命令之后,添加
install(SCRIPT "$CMAKE_SOURCE_DIR/cmake/flatten.cmake")
添加一个文件,“cmake/flatten.cmake”,内容如下
# Detect if the install is run by CPack.
if ($CMAKE_INSTALL_PREFIX MATCHES "/_CPack_Packages/.*/(TGZ|ZIP)/")
# Flatten the directory structure such that everything except the header files is placed in root.
file(GLOB bin_files LIST_DIRECTORIES FALSE $CMAKE_INSTALL_PREFIX/bin/*)
file(GLOB lib_files LIST_DIRECTORIES FALSE $CMAKE_INSTALL_PREFIX/lib/*)
foreach(file $bin_files $lib_files)
get_filename_component(file_name $file NAME)
execute_process(
COMMAND $CMAKE_COMMAND -E rename
$file
$CMAKE_INSTALL_PREFIX/$file_name
)
endforeach()
execute_process( COMMAND $CMAKE_COMMAND -E remove_directory $CMAKE_INSTALL_PREFIX/bin)
execute_process( COMMAND $CMAKE_COMMAND -E remove_directory $CMAKE_INSTALL_PREFIX/lib)
endif()
【讨论】:
以上是关于如何为 CPack TGZ 生成器指定不同的文件夹结构?的主要内容,如果未能解决你的问题,请参考以下文章