From 020ce8e4db673d06fc52c17e675b2a65cb6900d6 Mon Sep 17 00:00:00 2001 From: "P.J. Finlay" Date: Sun, 15 Jul 2018 22:26:25 -0400 Subject: [PATCH] Added an uninstall target for make --- CMakeLists.txt | 11 +++++- cmake/uninstall.cmake | 78 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 cmake/uninstall.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index da5be324a..87ef9c952 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7) +CMAKE_MINIMUM_REQUIRED(VERSION 3.3) PROJECT(lmms) @@ -609,6 +609,15 @@ ADD_CUSTOM_TARGET(dist COMMAND tar cjf lmms-${VERSION}-src.tar.bz2 "${TMP}" COMMAND rm -rf "${TMP}") + +# +# add uninstall-target +# +ADD_CUSTOM_TARGET(uninstall + COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/uninstall.cmake" +) + + # # display configuration information # diff --git a/cmake/uninstall.cmake b/cmake/uninstall.cmake new file mode 100644 index 000000000..093d1dbfe --- /dev/null +++ b/cmake/uninstall.cmake @@ -0,0 +1,78 @@ +MESSAGE(STATUS "Attempting to create uninstall target for make") + +#Remove all of the files listed in install_manifest.txt +SET(INSTALL_MANIFEST_PATH "${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt") +IF(NOT EXISTS ${INSTALL_MANIFEST_PATH}) + MESSAGE(FATAL_ERROR "Could not find install manifest at ${CMAKE_CURRENT_BINARY_DIR}/install_manifest.txt\nThis may be because 'make install' has not been run or install_manifest.txt has been deleted") +ENDIF() +MESSAGE(STATUS "install_manifest.txt found") +FILE(STRINGS ${INSTALL_MANIFEST_PATH} FILES_TO_REMOVE) +FOREACH(FILE_TO_REMOVE ${FILES_TO_REMOVE}) + IF(EXISTS ${FILE_TO_REMOVE}) + EXECUTE_PROCESS( + COMMAND ${CMAKE_COMMAND} -E remove ${FILE_TO_REMOVE} + RESULT_VARIABLE EXIT_CODE + ) + IF(${EXIT_CODE} EQUAL 0) + MESSAGE(STATUS "Successfully removed file ${FILE_TO_REMOVE}") + ELSE() + MESSAGE(FATAL_ERROR "Failed to remove file ${FILE_TO_REMOVE} with error code ${EXIT_CODE}") + ENDIF() + ELSE() + MESSAGE(WARNING "Could not find file ${FILE_TO_REMOVE}") + ENDIF() +ENDFOREACH(FILE_TO_REMOVE) + +#Remove empty directories created during installation +#Required to support IN_LIST operator +CMAKE_POLICY(SET CMP0057 NEW) + +# Checks if a directory is empty and saves the result in out_var +FUNCTION(IS_EMPTY_DIR OUT_VAR DIR) + FILE(GLOB FILES "${DIR}/*") + LIST(LENGTH FILES NUM_FILES) + IF(NUM_FILES EQUAL 0) + SET(${OUT_VAR} TRUE PARENT_SCOPE) + ELSE() + SET(${OUT_VAR} FALSE PARENT_SCOPE) + ENDIF() +ENDFUNCTION() + +# Recursively append all parent directories of path to out_var +FUNCTION(PARENT_DIRECTORIES OUT_VAR PATH) + GET_FILENAME_COMPONENT(PARENT "${PATH}" DIRECTORY) + IF(PARENT AND NOT PARENT STREQUAL PATH AND NOT PARENT IN_LIST ${OUT_VAR}) + LIST(APPEND ${OUT_VAR} ${PARENT}) + PARENT_DIRECTORIES(${OUT_VAR} "${PARENT}") + ENDIF() + SET(${OUT_VAR} ${${OUT_VAR}} PARENT_SCOPE) +ENDFUNCTION() + +# Removes all empty parent directories of the given files +FUNCTION(REMOVE_EMPTY_DIRECTORIES FILES) + SET(DIRECTORIES) + FOREACH(FILE_TO_REMOVE ${FILES}) + PARENT_DIRECTORIES(DIRECTORIES "${FILE_TO_REMOVE}") + endforeach() + LIST(REMOVE_DUPLICATES DIRECTORIES) + # Sort and reverse so we remove subdirectories first + LIST(SORT DIRECTORIES) + LIST(REVERSE DIRECTORIES) + + FOREACH(DIR ${DIRECTORIES}) + # Skip directories not inside the install prefix + IF(NOT (EXISTS "${DIR}" AND DIR MATCHES "^${CMAKE_INSTALL_PREFIX}/")) + CONTINUE() + ENDIF() + + IS_EMPTY_DIR(DIR_EMPTY "${DIR}") + IF(DIR_EMPTY) + MESSAGE(STATUS "Removing empty directory ${DIR}") + FILE(REMOVE_RECURSE "${DIR}") + ELSEIF() + MESSAGE(STATUS "Skipping non-empty directory ${DIR}") + ENDIF() + ENDFOREACH() +ENDFUNCTION() + +REMOVE_EMPTY_DIRECTORIES("${FILES_TO_REMOVE}")