CMake 支持 "make uninstall"?

CMake support "make uninstall"?

我正在尝试寻找一些 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-free 并且对于非系统管理员来说并不复杂。

  1. CMake 是否支持 make uninstall

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

不,没有。参见 FAQ from CMake wiki:

By default, CMake does not provide the "make uninstall" target, so you cannot do this. We do not want "make uninstall" to remove useful files from the system.

If you want an "uninstall" target in your project, then nobody prevents you from providing one. You need to delete the files listed in install_manifest.txt file. [followed by some example code]

如果你想添加一个 uninstall 目标,你可以查看官方 CMake FAQ at:

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.

时创建的

从 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. 打开 install_manifest.txt(由 make install 创建)

  2. 删除所有列出的 directories/files

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

    xargs rm < install_manifest.txt

  4. 删除任何隐藏的 directories/files:

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