CMake - 如何在打包过程中阻止执行安装脚本?

CMake - how to block executing installation scripts during packaging?

我的 CMakeLists.txt 文件包含命令,这些命令应该由 make install 执行,并且一切正常。下面的示例 CMakeLists.txt 是我实际 CMake 文件的一小段摘录(tm0001.cpp 内容在这里并不重要 - 它可能是任何 C++ 程序):

cmake_minimum_required(VERSION 3.12)

project(tm0001)

set(CMAKE_CXX_STANDARD 11)
add_executable(${PROJECT_NAME} tm0001.cpp)

install(
  TARGETS ${PROJECT_NAME}
  DESTINATION /usr/local/bin
  PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
)

install(CODE "message(\"-- This must be called during installation only\")")

set(CPACK_PACKAGE_CONTACT "HEKTO")
set(CPACK_GENERATOR "DEB")
include(CPack)

我看到 message 命令也由 make package 执行,这是 不是 我想要的。

如何让CMake通过make package命令执行安装脚本?我找不到使用 CMake if 命令执行此操作的任何方法。

正如评论中已经说过的那样,从 install 命令 "work w/ systemd" (以及做任何与项目的构建或打包无关的事情)是一个非常糟糕的主意。 install 命令(甚至 SCRIPTCODE 签名) 旨在用于安装操作 而不是任何 其他副作用.

此处的正确操作方法是使用 post-安装脚本生成本机包 (DEB/RPM),其中使用系统提供的宏(如 here), you can install your package properly. Take a look to CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA 所述提供包安装操作的方式。

另一件坏事是使用硬编码路径 (/usr/bin/)。顺便说一句,我建议 /usr/sbin/(纯)守护程序应用程序的更好位置。查看 GNUInstallDirs 随 CMake 一起提供的模块以获取更多参考。

我正在回答我自己的问题,因为现有的答案没有解决我的主要问题。我找不到任何方法(在 CMake 级别)在 make package 期间阻止来自 运行 的 install 命令 - 即使 postinst 脚本也由此命令调用。

幸运的是,我可以修改 postinst 脚本本身以防它被调用 而不是 dpkg:

if [ -z ${DPKG_ADMINDIR} ]; then
  echo "postinst: missing 'dpkg' environment (not an error during packaging)"
  exit 0
fi

这当然是一个技巧,但它对我有用。

我所做的是将带有 CODE/SCRIPT 的安装命令指定为单独的组件,例如安装(代码 ... 组件 post-安装)。

然后还添加了其他非代码安装命令作为不同的组件,例如安装(文件 ... 组件文件-安装)

然后需要将 CPack 配置为仅打包文件安装组件(很容易找到解决方案 - 提示:使用 CPACK_COMPONENTS_ALL_IN_ONE_PACKAGE、CPACK_COMPONENTS_ALL 和 CPACK_( RPM/DEB/...)_COMPONENT_INSTALL 个变量).

当然,生成的包在安装包期间不会 运行 这些 CODE 组件 - 它们需要作为 post 安装脚本单独添加。