如何获取 CPack 的默认/回退安装前缀?

问题描述 投票:0回答:1

我正在使用 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 生成器将使用什么路径作为安装前缀?甚至更好:有一种方法可以在 CPack 运行时自动重新配置某些文件,然后即时调整相应的路径,而无需修改在常规 CMake 调用期间配置的文件。

cmake packaging cpack
1个回答
0
投票

我认为答案是——从 CPack 包作者的角度来看,没有超级简单的方法。我通过 CMake 的

Modules/
文件夹做了一个 grep,但没有找到在那里设置的默认/回退。事实证明,它在 CPack 二进制文件的源代码中被设置为默认/回退值。您可以自己查看:https://github.com/Kitware/CMake/search?q=SetOptionIfNotSet+CPACK_PACKAGING_INSTALL_PREFIX,您将在其中看到(在撰写本文时):

  • cmCPackGenerator.cxx(如果特定生成器没有覆盖它,我猜这是默认设置):
    /
  • cmCPackCygwinBinaryGenerator.cxx:
    /usr
  • cmCPackDebGenerator.cxx:
    /usr
  • cmCPackFreeBSDGenerator.cxx:
    /usr/local
  • cmCPackProductBuildGenerator.cxx:
    /Applications
  • cmCPackRPMGenerator.cxx:
    /usr

因此,如果您想在自己的 CPack 配置脚本中反映该逻辑,则必须自己动手。您可以看看在

CPACK_GENERATOR
中使用
CPACK_PROJECT_CONFIG_FILE
的值(请注意,
CPACK_GENERATOR
在不同的脚本上下文中表示不同的东西
)。

© www.soinside.com 2019 - 2024. All rights reserved.