我正在使用 CMake 构建我的项目,现在我想使用 CPack 创建 Linux 包(从 DEB 包开始)。我已经设置好现在可以生成一个 DEB 包,但是有一个问题我不完全确定我应该如何解决它。
在编译期间,我还为我的应用程序生成一个 systemd 服务文件,该文件必须包含我的应用程序安装位置的绝对路径。没有什么大问题,因为我们有
CMAKE_INSTALL_PREFIX
,这使我们能够获得所需的路径,该路径与执行时的安装位置一致make install
.
但是,
cpack
似乎使用了不同的安装前缀(/usr/
而不是 /usr/local/
),因此我的 DEB 包中服务文件中的路径与生成的包实际安装可执行文件的位置不匹配.
经过一些研究,我发现 CPACK_PACKAGING_INSTALL_PREFIX 这显然允许我覆盖 cpack 的默认值,但这并不是我想要的。我希望 CPack 做它的事情,但我需要一种方法来基本上预测 CPack 想要安装东西的位置,以便正确配置我的服务文件。链接的文档还指出
每个 CPack 生成器都有一个默认值
表示选择的路径依赖于生成器。
现在,有可能弄清楚例如在哪里。 DEB 生成器安装东西,然后手动将
CMAKE_INSTALL_PREFIX
设置为相同的值,以便服务文件配置按预期工作,但我想避免在此过程中有这样的手动步骤。我认为答案是——从 CPack 包作者的角度来看,没有超级简单的方法。我通过 CMake 的
Modules/
文件夹做了一个 grep,但没有找到在那里设置的默认/回退。事实证明,它在 CPack 二进制文件的源代码中被设置为默认/回退值。您可以自己查看:https://github.com/Kitware/CMake/search?q=SetOptionIfNotSet+CPACK_PACKAGING_INSTALL_PREFIX,您将在其中看到(在撰写本文时):
/
/usr
/usr
/usr/local
/Applications
/usr
因此,如果您想在自己的 CPack 配置脚本中反映该逻辑,则必须自己动手。您可以看看在
CPACK_GENERATOR
中使用 CPACK_PROJECT_CONFIG_FILE
的值(请注意,CPACK_GENERATOR
在不同的脚本上下文中表示不同的东西)。