CMake-如何在打包期间阻止执行安装脚本?

时间:2018-09-13 23:46:30

标签: cmake cpack

我的NSMutableArray<subclass *> *文件包含命令,这些命令应由CMakeLists.txt执行,并且所有这些工作正常。下面的示例make install是我的实际CMake文件的简短摘录(CMakeLists.txt的内容在这里并不重要-它可能是任何C ++程序):

tm0001.cpp

我看到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 执行安装脚本?我找不到使用CMake make package命令执行此操作的任何方法。

3 个答案:

答案 0 :(得分:3)

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

此处正确的操作方式是使用安装后脚本生成本地软件包(DEB / RPM),在该软件包中,使用系统提供的宏(如here所述)可以正确安装软件包。看一下CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA,了解提供软件包安装操作的方式。

另一个不好的事情是使用硬编码的路径(/usr/bin/)。顺便说一句,我建议/usr/sbin/使用(纯)守护程序更好的地方。请查看带有CMake的GNUInstallDirs模块,以获取更多参考。

答案 1 :(得分:1)

我所做的是用CODE / SCRIPT作为单独的组件指定安装命令,例如安装(代码...组件安装后)。

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

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

当然,结果包在安装过程中不会运行这些CODE组件-需要将它们作为安装后脚本单独添加。

答案 2 :(得分:0)

我正在回答自己的问题,因为现有答案无法解决我的主要问题。我找不到任何方法(在CMake级别上)阻止install期间运行的make package命令-甚至postinst脚本都被该命令调用。

幸运的是,我可以修改postinst脚本本身,以防万一它被dpkg称为 时不执行任何操作:

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

这当然是把戏,但这对我有用。