制作支持“制作卸载”?

我试图找到一些 sudo免费解决方案,使我的用户安装和卸载我的应用程序

set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/opt/${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}/")
SET(CMAKE_INSTALL_RPATH "$ENV{HOME}/${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}/")

我可以将文件导向用户的主目录,并且

make install

工作良好。关于 与 make install 相反的是什么,即如何在 Linux 中卸载库? 我没有发现任何想法,这是 sudo免费的,并不复杂的非系统管理员的人。

  1. CMake 是否支持 make uninstall

  2. 我的卸载非常简单: 所有文件都放在用户主目录的子目录中。原则上,删除新的子目录可以解决问题。有 make install,以上参数,任何副作用,或者我可以写在我的用户指南,新产生的子目录可以删除’卸载’?

75446 次浏览

不,没有。看看 来自 CMake wiki 的常见问题解答:

默认情况下,CMake 不提供“ make uninstall”目标,因此 我们不希望“ make uninstall”删除有用的文件 从系统中。

如果您希望在项目中有一个“卸载”目标, 那么没有人阻止你提供一个。你需要删除 [后面是一些示例代码]中列出的文件

如果你想增加一个 卸载目标,你可以看看官方的 制作常见问题解答在:

Https://gitlab.kitware.com/cmake/community/wikis/faq#can-i-do-make-uninstall-with-cmake

如果您只想快速卸载所有文件,只需运行:

xargs rm < install_manifest.txt

运行 make install时创建 install_manifest.txt文件。

从 cmake 项目中删除由 make install添加的文件和文件夹(仅为空) :

cat install_manifest.txt | sudo xargs rm
cat install_manifest.txt | xargs -L1 dirname | sudo xargs rmdir -p

第二个命令将打印一系列错误,因为它递归地删除文件夹,直到找到一个不是空的文件夹。我喜欢看到这些错误,以了解哪些文件夹被留下。如果要隐藏这些错误,可以将 --ignore-fail-on-non-empty添加到 rmdir。

来自源文件夹:

  1. Open install _ Manif.txt (由 make install创建)

  2. 删除列出的所有目录/文件

  3. 删除所有遗漏的文件:

    xargs rm < install_manifest.txt

  4. 删除任何隐藏的目录/文件:

    $rm -rf ~/.packagename

删除源文件夹。

# make uninstall
add_custom_target("uninstall" COMMENT "Uninstall installed files")
add_custom_command(
TARGET "uninstall"
POST_BUILD
COMMENT "Uninstall files with install_manifest.txt"
COMMAND xargs rm -vf < install_manifest.txt || echo Nothing in
install_manifest.txt to be uninstalled!
)

将其添加到 CMakeLists.txt,然后手工制作 uninstall目标。

一种解决方案是使用包装与 CPack。在 Linux 中,这将创建一个可由包管理器安装/卸载的包。在带有 NSIS 生成器的 Windows 中,您将获得一个安装程序,它也将 uninstall.exe 部署到您的程序文件中。

下面是创建 debian 软件包的一个基本例子:

$ touch file
$ cat CMakeLists.txt
cmake_minimum_required(VERSION 3.0)


install(FILES file DESTINATION etc)


set(CPACK_PACKAGE_NAME foo)
set(CPACK_PACKAGE_CONTACT "me <me@example.com>")
set(CPACK_GENERATOR DEB)
include(CPack)
$ cmake .
$ cpack

然后使用 sudo dpkg -i foo-0.1.1-Linux.deb代替 make install DESTDIR=/usr/local

要卸载使用 sudo dpkg -P foosudo apt purge foo

make install相比,使用包管理器的优势有很多:

  • 如果你丢失了源代码,你仍然可以卸载软件。
  • 如果你的 dpkg -S /etc/foo,它会告诉你哪个包“拥有”这个文件。
  • 如果要安装新版本的软件,则不需要手动卸载以前的版本。都是自动的。
  • 您可以发布软件包,以便其他人可以安装它。
  • 如果您的软件包部署的文件也属于另一个软件包,那么它将无法安装。这很好,因为它可以防止您意外地破坏其他包。
  • 您可以向安装中添加脚本。在升级过程中,您可以添加系统用户、启用服务或在旧数据库上执行兼容性操作,而不仅仅是复制文件。