CMake支持"make uninstall"?

kat*_*ang 34 uninstall cmake

我试图找到一些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}/")
Run Code Online (Sandbox Code Playgroud)

我可以将文件定向到用户的主目录,和

make install
Run Code Online (Sandbox Code Playgroud)

工作良好.参考 'make install'的相反之处,即.如何在Linux中卸载库? 我没有找到任何想法,sudo对于非系统管理员来说,这是免费的并且并不复杂.

  1. 无论如何make uninstall由CMake支持?

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

小智 50

如果您想添加卸载目标,可以查看官方CMake常见问题解答:

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

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

xargs rm < install_manifest.txt
Run Code Online (Sandbox Code Playgroud)

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

  • 但这只会删除文件而不是目录.如果您只有头文件和库,那就没关系,但如果您安装了python包,则必须创建`/home/user/.local/miniconda3/envs/galario3/lib/python3.6/site-packages/galario/等目录. `.简单的`xargs ...`不会删除它们,所以你必须手动添加逻辑,例如在`uninstall`目标中 (4认同)

usr*_*567 23

不,那里没有.请参阅CMake wiki常见问题解答:

默认情况下,CMake不提供"make uninstall"目标,因此您无法执行此操作.我们不希望"make uninstall"从系统中删除有用的文件.

如果您想在项目中使用"卸载"目标,那么没有人会阻止您提供.您需要删除install_manifest.txt文件中列出的文件.[后跟一些示例代码]

  • 我不完全理解该语句背后的逻辑:“我们不希望'进行卸载'从系统中删除有用的文件。” 如果“ make uninstall”从某人的系统中删除了文件,这是否意味着系统上的“ make install” _overwrote_文件?我的意思是,如果您的想法是卸载文件仅卸载使用“ make install”安装的文件?如果有任何文件被覆盖,那不是用户设置意外安装目标的问题吗? (3认同)
  • 我很高兴看到有人相信,如果在开发期间安装文件,它将永远留在那里.感谢提示,我将使用示例代码.顺便说一句:我想你也回答了我的第二个问题:只需删除包含文件的目录就没有副作用了. (2认同)

qwe*_*guy 16

删除make installcmake项目添加的文件和文件夹(仅为空):

cat install_manifest.txt | sudo xargs rm
cat install_manifest.txt | xargs -L1 dirname | sudo xargs rmdir -p
Run Code Online (Sandbox Code Playgroud)

第二个命令将打印一堆错误,因为它会递归删除文件夹,直到找到一个非空的文件夹.我喜欢看到这些错误,知道剩下哪些文件夹.如果要隐藏这些错误,可以添加--ignore-fail-on-non-empty到rmdir.

  • AFAIK 使用 `xargs -I "{}" -- rm -- '{}'` 应该可以解决空白问题 (5认同)
  • `rm` _will_ 不会删除它,如果它是一个目录。并且 `rmdir` _will_ 只有在它是一个空目录时才会删除。(当然,除非你为这些命令做了一些别名)。所以我的评论仍然有效。它唯一可以删除的是一个与空格字符之间的确切名称匹配的单个文件。 (3认同)
  • 似乎第一个命令中的 xargs 不会在文件名中正确[处理空格](/sf/ask/1173096781/​​ontain-spaces) . (2认同)
  • **绝对不是!** 如果路径确实存在,它不会出错。示例:如果工作目录是 `~` 并且 xargs 被传递给 `/tmp/school work`,这将被解释为 `/tmp/school` 和 `work`。玩得开心恢复`~/work`!-- 不过,如果`rm` 发现它是一个目录,它可能会停止。 (2认同)

Yan*_*ong 9

# 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!
)
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*art 6

一种解决方案是使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

使用包管理器的优点make install有很多。以下是一些:

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


V L*_* Li 5

从源文件夹:

  1. 打开 install_manifest.txt(创建者make install

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

  3. 删除您错过的任何剩余文件:

    xargs rm < install_manifest.txt

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

    $rm -rf ~/.packagename

删除源文件夹。