CMake是否支持“make卸载”?

vsmadaxz  于 2022-11-11  发布在  其他
关注(0)|答案(6)|浏览(381)

我试图找到一些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

关于What's the opposite of 'make install', ie. how do you uninstall a library in Linux?,我没有找到任何想法,这是sudo免费的,对于一个非系统管理员来说并不复杂。

  1. CMake是否支持make uninstall
    1.我的卸载非常简单:所有的文件都放在用户主目录的一个子目录中。原则上,删除这个新的子目录可以解决这个问题。使用上面的参数make install有什么副作用吗?或者我可以在我的用户指南中写上,新生成的子目录可以作为“卸载”删除?
gpnt7bae

gpnt7bae1#

如果您要添加卸载目标,可以查看官方的CMake常见问题解答,网址为:
https://gitlab.kitware.com/cmake/community/wikis/FAQ#can-i-do-make-uninstall-with-cmake
如果您只是想快速卸载所有文件,只需运行:

xargs rm < install_manifest.txt

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

uinbv5nw

uinbv5nw2#

没有。请参阅CMake wiki的常见问题解答:
默认情况下,CMake不提供“make uninstall”目标,因此您无法执行此操作。我们不希望“make uninstall”从系统中删除有用的文件。
如果你想在你的项目中有一个“uninstall”目标,那么没有人会阻止你提供一个。你需要删除install_manifest. txt文件中列出的文件。[后跟一些示例代码]

yh2wf1be

yh2wf1be3#

从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。

rsl1atfo

rsl1atfo4#

从源文件夹:
1.打开安装清单. txt(由make install创建)
1.删除列出的所有目录/文件
1.移除任何丢失的剩余文件:
xargs rm < install_manifest.txt
1.删除所有隐藏目录/文件:
$rm -rf ~/.packagename
删除源文件夹。

x6492ojm

x6492ojm5#


# 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目标。

huwehgph

huwehgph6#

一个解决方案是使用CPack打包。在Linux中,这将创建一个可以由包管理器安装/卸载的包。在Windows中,使用NSIS生成器,您将获得一个安装程序,它也将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,它会告诉你哪个软件包“拥有”这个文件。
  • 如果您想安装新版本的软件,您不需要手动卸载以前的版本。它是自动的。
  • 您可以发布软件包,以便其他人可以安装它。
  • 如果你的软件包部署了一个文件,而这个文件也被另一个软件包所拥有,那么它将无法安装。这很好,因为它可以防止你意外地破坏其他软件包。
  • 您可以新增命令档至安装。您可以在升级期间新增系统使用者、启用服务器或对旧数据库执行兼容性作业,而不只是复制档案。

相关问题