我的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
命令执行此操作的任何方法。
答案 0 :(得分:3)
正如在评论中已经说过的那样,从systemd
命令“使用w install
”(以及进行与项目的构建或打包无关的任何工作)是一个非常糟糕的主意。 install
命令(甚至SCRIPT
和CODE
签名)旨在用于安装操作,而不用于其他任何副作用 >。
此处正确的操作方式是使用安装后脚本生成本地软件包(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
这当然是把戏,但这对我有用。