2

我正在尝试使用 CPack 创建一个包,但努力寻找可以帮助我解决我没有使用 cmake 项目构建代码的用例的示例或文档。我有一个 GO 项目,它生成了我想通过 Linux 上的 RPM 或 Windows 上的 MSI 安装在系统上的二进制文件。

我的文件夹结构是这样的:

HelloWorld
 |
 +---bin
 |    |
 |    +---l_run_me
 |    +---w_run_me.exe
 |
 +---src
 |    |
 |    +---hello_world.go
 |
 +---helper
 |     |
 |     +---pre_in.sh
 |     +---pre_un.sh
 |     +---post_in.sh
 |     +---post_un.sh
 |     +---wix_patch.xml
 |
 +---Copyright.txt
 +---CPackConfig.cmake

为安装程序选择的文件将取决于我正在构建的操作系统。对于使用 WiX 生成器的 Windows 来说,这一切似乎都是微不足道的。我能够使用下面列出的代码构建安装程序:

SET(CPACK_PACKAGE_NAME "HelloWorld")
SET(CPACK_PACKAGE_VENDOR "ABC Software")
SET(CPACK_PACKAGE_DESCRIPTION "A long package description should go here")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A summary description goes here")
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_LIST_DIR}/Copyright.txt")
SET(CPACK_PACKAGE_VERSION_MAJOR "1")
SET(CPACK_PACKAGE_VERSION_MINOR "0")
SET(CPACK_PACKAGE_VERSION_PATCH "0")
SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
SET(CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CMAKE_HOST_SYSTEM_NAME})
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "HelloWorld")
SET(CPACK_INSTALLED_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/bin" "/")
if(WIN32)
    SET(CPACK_GENERATOR WIX)
    SET(CPACK_WIX_UPGRADE_GUID "b7cf4d8b-7479-481d-8d4a-b3db19545b43")
    SET(CPACK_WIX_PRODUCT_GUID "b0e09ef0-80bc-4b20-b7e0-98bc75bd2670")
    SET(CPACK_WIX_SIZEOF_VOID_P "4")
    SET(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_LIST_DIR}/patch.xml")
endif()

并运行生成的 MSI 将二进制文件安装到C:\Program Files(x86)\HelloWorld中,正如我所料。

现在,对于 linux,我添加了一个条件,例如:

if(WIN32)
    ....
elseif(UNIX)
    SET(CPACK_GENERATOR RPM)
endif

期望 RPM 将二进制文件安装到/usr/local/HelloWorld中(根据 ${CMAKE_INSTALL_PREFIX} 指定),但我将二进制文件放在/中。

我想要发生的是将二进制文件安装到/var/opt/HelloWorld/所以我尝试根据 CPack 文档设置更多变量:

SET(CMAKE_INSTALL_PREFIX "/var/opt/${CPACK_PACKAGE_NAME}")
SET(CPACK_PACKAGING_INSTALL_PREFIX "/var/opt/${CPACK_PACKAGE_NAME}")
SET(CPACK_PACKAGE_DEFAULT_LOCATION "/var/opt/${CPACK_PACKAGE_NAME}") 

但没有像我预期的那样奏效。我注意到我唯一指定路径的地方是我设置 ${ CPACK_INSTALLED_DIRECTORIES } 时。现在,这似乎在 Windows 上被忽略了,但在 Linux 上它似乎很重要。

我似乎无法找到答案的问题:

1) 当没有 cmake 项目存在时,使用 ${CPACK_INSTALLED_DIRECTORIES} 将项目添加到安装程序的正确方法是什么?我对使用它有点担心,因为我对文档的解释似乎表明它用于不属于主安装程序的补充项目。

2) 为了选择不同的安装位置,需要设置哪些正确的 CPack/CMake 变量?似乎有一些可供选择,在 Windows 上,${CPACK_PACKAGE_INSTALL_DIRECTORY} 似乎受到尊重,但在 Linux 上却不是。

4

0 回答 0