2017-01-04 40 views
9

我试图找到一些sudo免费解决方案,以使我的用户可以安装和取消阻止我的应用程序。使用CMake支持“make uninstall”吗?

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. 无论如何make uninstall支持CMake?

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

+0

潜在重复:http://stackoverflow.com/questions/19921017/cleaning-cmake-installed-files – usr1234567

+1

[清理CMake安装文件](https:// stackoverflow。com/questions/19921017/clean-cmake-installed-files) –

回答

6

不,没有。看到FAQ from CMake wiki

默认情况下,CMake的不提供“使卸载”的目标,所以你 无法做到这一点。我们不希望“卸载”从系统中删除有用的文件 。

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

+0

我很高兴看到有人相信,如果在开发过程中安装了一个文件,它应该永远呆在那里。感谢提示,我将使用示例代码。顺便说一句:我想你也回答了我的#2问题:只是删除包含文件的目录将没有副作用。 – katang

13

如果你想添加一个卸载的目标,你可以在看一下官方CMake的常见问题

https://cmake.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F

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

xargs rm < install_manifest.txt 

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

+1

但是这只能删除不是目录的文件。没关系,如果你只有头文件和库,但是如果你安装了一个Python包,你必须创建类似'/home/user/.local/miniconda3/envs/galario3/lib/python3.6/site-packages/galario/ '。简单的'xargs ...'不会删除它们,因此您必须手动添加逻辑,例如在'uninstall'目标中 –

1

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

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

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