给基于cmake的工程添加uninstall功能

  我们知道,cmake提供了install指令可以让我们在项目构建完成后,通过make install命令,或者通过cmake --install . --prefix=<安装目录> 命令的方式来将CMakeLists.txt文件中通过install指令配置的文件安装到目标目录中。

  但是,cmake却没有提供uninstall指令来移除这些安装进去的文件的功能,这给工程的卸载添加了一些麻烦。为了实现卸载功能,我们只能自己来编写CMake脚本来实现。

  为了实现卸载功能,我们首先需要知道cmake在部署的时候在目标目录安装进去了哪些文件。幸好,cmake本身已经为我们准备了一个文件叫做install_manifest.txt,它包含了所有通过install指令安装的文件列表,每个文件占用一行。只要我们通过make install安装过,我们就可以在cmake的当前工作目录下面找到这个文件。

  因此,我们就可以利用这个install_manifest.txt文件来执行删除文件的操作,从而来达成卸载安装文件的目的。当然,我们可以用一个shell脚本只要少数几行代码来实现,但是,这里还是基于cmake,让用户能够已约定俗成的习惯方式通过make uninstall的方式来进行卸载操作。

  首先创建一个Uninstall.cmake.in 的文件,该文件和CMakeLists.txt放在一个目录下面,如下:


# CMAKE_BINARY_DIR变量指向cmake build tree的顶级目录。
if(NOT EXISTS "@CMAKE_BINARY_DIR@/install_manifest.txt")
  message(FATAL_ERROR "Cannot find install manifest: @CMAKE_BINARY_DIR@/install_manifest.txt")
endif()

# 从install_manifest.txt中读取文本内容,并根据\n拆分成一个文件列表
file(READ "@CMAKE_BINARY_DIR@/install_manifest.txt" files)
string(REGEX REPLACE "\n" ";" files "${files}")

# 循环删除列表中的文件
foreach(file ${files})
  message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
  
  if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
  
    # 调用cmake -E remove <文件名>来删除文件
    # 其中$ENV{DESTDIR}当make DESTDIR=<安装目录> install
    # 在命令行指定安装目录的将被设置,但是install_manifest.txt中
    # 的文件路径不包括DESTDIR指定的部分
    exec_program(
      "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
      OUTPUT_VARIABLE rm_out
      RETURN_VALUE rm_retval
      )
      
    if(NOT "${rm_retval}" STREQUAL 0)
      message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
    endif()
    
  else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
    message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
  endif()
endforeach()

  然后在CMakeLists.txt文件中添加下面代码,如下:


# 创建卸载target
if(NOT TARGET uninstall)

  # 利用前面的Uninstall.cmake.in文件自动生成Uninstall.cmake
  configure_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/Uninstall.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/Uninstall.cmake"
    IMMEDIATE @ONLY)
  
  # 通过add_custom_target创建一个自定义构建目标的命令
  # 自定义目标可以在构建时被执行,但不会产生实际的构建输出。
  add_custom_target(uninstall
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/Uninstall.cmake)

endif()

相关推荐

  1. 基于cmake工程添加uninstall功能

    2024-07-13 20:06:01       18 阅读
  2. wordpress添加自定义字段分类筛选功能

    2024-07-13 20:06:01       37 阅读
  3. 基于axios请求添加token

    2024-07-13 20:06:01       31 阅读
  4. wordpress添加限制游客浏览数量功能

    2024-07-13 20:06:01       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-13 20:06:01       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-13 20:06:01       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-13 20:06:01       57 阅读
  4. Python语言-面向对象

    2024-07-13 20:06:01       68 阅读

热门阅读

  1. js登陆验证

    2024-07-13 20:06:01       17 阅读
  2. Linux学习笔记(二)

    2024-07-13 20:06:01       19 阅读
  3. 2024 暑假友谊赛 1

    2024-07-13 20:06:01       22 阅读
  4. python合并列表的方法

    2024-07-13 20:06:01       23 阅读
  5. 中药学--更新中

    2024-07-13 20:06:01       16 阅读
  6. Mybatis-plus自动填充的使用以及常见问题

    2024-07-13 20:06:01       22 阅读
  7. swiper结合gsap进行切换

    2024-07-13 20:06:01       19 阅读
  8. 昇思训练营打卡第二十四天(LSTM+CRF序列标注)

    2024-07-13 20:06:01       16 阅读
  9. Nginx 日志统计分析命令

    2024-07-13 20:06:01       21 阅读
  10. 天童美语:放假给孩子看什么地理纪录片

    2024-07-13 20:06:01       17 阅读
  11. Perl 语言开发(十三):网络编程

    2024-07-13 20:06:01       21 阅读