Files
2026-06-22 15:35:18 +08:00

212 lines
7.2 KiB
CMake

# ============================================================================
# Copyright (c) 2011-2012 University of Pennsylvania
# Copyright (c) 2013-2014 Andreas Schuh
# All rights reserved.
#
# See COPYING file for license information or visit
# http://opensource.andreasschuh.com/cmake-basis/download.html#license
# ============================================================================
##############################################################################
# @file cmake_uninstall.cmake
# @brief Uninstallation script based on install_manifest*.txt files.
#
# @ingroup CMakeTools
##############################################################################
cmake_minimum_required (VERSION 2.8.4)
# ----------------------------------------------------------------------------
# set the install prefix
if (NOT DEFINED CMAKE_INSTALL_PREFIX)
set (CMAKE_INSTALL_PREFIX "@CMAKE_INSTALL_PREFIX@")
endif ()
# ----------------------------------------------------------------------------
# set the install configuration name
if (NOT DEFINED CMAKE_INSTALL_CONFIG_NAME)
if (BUILD_TYPE)
string (REGEX REPLACE "^[^A-Za-z0-9_]+" "" CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}")
else ()
set (CMAKE_INSTALL_CONFIG_NAME "@CMAKE_BUILD_TYPE@")
endif ()
message (STATUS "Uninstall configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"")
endif ()
# ----------------------------------------------------------------------------
# set the component getting uninstalled
if (NOT CMAKE_INSTALL_COMPONENT)
if (COMPONENT)
message (STATUS "Uninstall component: \"${COMPONENT}\"")
set (CMAKE_INSTALL_COMPONENT "${COMPONENT}")
else ()
set (CMAKE_INSTALL_COMPONENT)
endif ()
endif ()
# ----------------------------------------------------------------------------
# read manifest file
if (MANIFEST_FILE)
if (NOT EXISTS "${MANIFEST_FILE}")
message (FATAL_ERROR "Manifest file ${MANIFEST_FILE} does not exist!")
endif ()
else ()
if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@InstallManifest.txt")
# install manifest written to installation tree
set (MANIFEST_FILE "${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@InstallManifest.txt")
elseif (CMAKE_INSTALL_COMPONENT)
set (MANIFEST_FILE "${CMAKE_CURRENT_LIST_DIR}/install_manifest_${CMAKE_INSTALL_COMPONENT}.txt")
else ()
set (MANIFEST_FILE "${CMAKE_CURRENT_LIST_DIR}/install_manifest.txt")
endif ()
endif ()
if (NOT EXISTS "${MANIFEST_FILE}")
message ("No manifest file found.")
return ()
endif ()
file (READ "${MANIFEST_FILE}" MANIFEST)
string (REGEX REPLACE "\n" ";" MANIFEST "${MANIFEST}")
list (REVERSE MANIFEST)
# ----------------------------------------------------------------------------
# remove package from CMake package registry
set (REGISTERED "@BASIS_REGISTER@")
if (WIN32 AND REGISTERED)
set (PKGUID "@TOPLEVEL_PROJECT_PACKAGE_UID@")
execute_process (
COMMAND reg delete "HKCU\\Software\\Kitware\\CMake\\Packages\\@PROJECT_PACKAGE_CONFIG_PREFIX@" /v "${PKGUID}" /f
RESULT_VARIABLE RT
ERROR_VARIABLE ERR
)
if (RT EQUAL 0)
message (STATUS "Deregister: Removed HKCU\\Software\\Kitware\\CMake\\Packages\\@PROJECT_PACKAGE_CONFIG_PREFIX@\\${PKGUID}")
else ()
string (STRIP "${ERR}" ERR)
message (STATUS "Deregister: Failed to remove package from registry: ${ERR}")
endif ()
endif ()
# ----------------------------------------------------------------------------
# remove installed files
foreach (F ${MANIFEST}) # skip empty entries, i.e., blank lines
set (F "$ENV{DESTDIR}${F}") # support change of root
if (EXISTS "${F}")
set (FILE_IN_USE FALSE)
if (NOT FILE_IN_USE)
message (STATUS "Uninstalling: ${F}")
execute_process (COMMAND "${CMAKE_COMMAND}" -E remove -f "${F}" RESULT_VARIABLE RT)
if (NOT RT EQUAL 0)
set (OK FALSE)
message (STATUS "Failed to uninstall ${F}")
endif ()
# remove .pyc files of .py files
if (F MATCHES "\\.py$" AND EXISTS "${F}c")
message (STATUS "Uninstalling: ${F}c")
execute_process (COMMAND "${CMAKE_COMMAND}" -E remove -f "${F}c" RESULT_VARIABLE RT)
if (NOT RT EQUAL 0)
message (STATUS "Failed to uninstall ${F}c")
endif ()
endif ()
else ()
message (STATUS "File-in-use: ${F}")
endif ()
else ()
message (STATUS "Non-existent: ${F}")
endif ()
endforeach ()
if (EXISTS "${MANIFEST_FILE}")
execute_process (COMMAND "${CMAKE_COMMAND}" -E remove -f "${MANIFEST_FILE}")
endif ()
# ----------------------------------------------------------------------------
# remove empty directories
list (APPEND EXCLUDE_DIRS
"/"
"/usr"
"/usr/local"
"/opt"
"/opt/local"
"$ENV{HOME}"
"$ENV{HOME}/local"
# these should anyway never be used as installation prefix without subdirectory
"/bin"
"/boot"
"/dev"
"/etc"
"/home"
"/lib"
"/lib32"
"/lib64"
"/media"
"/mnt"
"/root"
"/proc"
"/sys"
"/var"
"/tmp"
"/lost+found"
"/cdrom"
)
if (WIN32)
get_filename_component (PROGRAM_FILES_DIR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion;ProgramFilesDir]" ABSOLUTE)
if (NOT PROGRAM_FILES_DIR OR PROGRAM_FILES_DIR MATCHES "/registry")
set (PROGRAM_FILES_DIR "C:/Program Files")
endif ()
list (APPEND EXCLUDE_DIRS "${PROGRAM_FILES_DIR}")
string (REPLACE "/" "\\" PROGRAM_FILES_DIR "${PROGRAM_FILES_DIR}")
list (APPEND EXCLUDE_DIRS "${PROGRAM_FILES_DIR}")
endif ()
# stop removing directories at root installation directory
# the subdirectory will be still removed if it is not in the
# list of excluded system directories
get_filename_component (D "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}" PATH)
list (APPEND EXCLUDE_DIRS "${D}")
string (REPLACE "." "\\." CMAKE_INSTALL_PREFIX_RE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}")
string (REPLACE "." "\\." CMAKE_REGISTRY_PREFIX_RE "$ENV{HOME}/.cmake")
foreach (F ${MANIFEST}) # skip empty entries, i.e., blank lines
# remove directories only if file was installed inside the installation root
# or the CMake package registration on Unix
if (F MATCHES "^${CMAKE_INSTALL_PREFIX_RE}" OR
(UNIX AND F MATCHES "^${CMAKE_REGISTRY_PREFIX_RE}"))
get_filename_component (D "$ENV{DESTDIR}${F}" PATH)
while (D)
# skip directory if we removed it already
if (NOT EXISTS "${D}" OR NOT IS_DIRECTORY "${D}")
if ("${D}" STREQUAL "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}")
return () # we are done, the installation root has been removed
endif ()
break ()
endif ()
# skip directory if it is in list of excluded directories
list (FIND EXCLUDE_DIRS "${D}" IDX)
if (NOT IDX EQUAL -1)
break ()
endif ()
# glob files in directory to make sure it is empty
file (GLOB FILES "${D}/*")
if (NOT FILES)
# remove directory
message (STATUS "Uninstalling: ${D}")
execute_process (COMMAND "${CMAKE_COMMAND}" -E remove_directory "${D}" RESULT_VARIABLE RT)
if (NOT RT EQUAL 0)
set (OK FALSE)
message (STATUS "Failed to remove ${D}")
endif ()
endif ()
if ("${D}" STREQUAL "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}")
# we reached the root installation direcory
break ()
endif ()
# procede with parent directory
get_filename_component (D "${D}" PATH)
endwhile ()
endif ()
endforeach ()