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
命令(甚至 SCRIPT
和 CODE
签名) 旨在用于安装操作 而不是任何 其他副作用.
此处的正确操作方法是使用 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 安装脚本单独添加。
我的 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
命令(甚至 SCRIPT
和 CODE
签名) 旨在用于安装操作 而不是任何 其他副作用.
此处的正确操作方法是使用 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 安装脚本单独添加。