diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d83d66..d0e461a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,9 @@ cmake_minimum_required(VERSION 3.15) -project(CMakeMM VERSION "1.1" DESCRIPTION "" HOMEPAGE_URL "https://github.com/flagarde/CMakeMM" LANGUAGES NONE) +project(CMakeMM VERSION "2.0" DESCRIPTION "CMake Modules Manager" HOMEPAGE_URL "https://github.com/flagarde/CMakeMM" LANGUAGES NONE) -option(CMAKEMM_TEST "Run tests" OFF) +option(BUILD_TEST "Run tests" OFF) -if(CMAKEMM_TEST) +if(BUILD_TEST) add_subdirectory(tests) endif() diff --git a/CMakeMM.cmake b/CMakeMM.cmake index c08c98e..4cc6981 100644 --- a/CMakeMM.cmake +++ b/CMakeMM.cmake @@ -1,5 +1,7 @@ include_guard(GLOBAL) +cmake_policy(VERSION "3.0") + if(NOT COMMAND colors) # Colorize macro(colors) @@ -14,106 +16,125 @@ if(NOT COMMAND colors) endmacro() endif() -# Test if raw from github is available -macro(check_accessible) - file(DOWNLOAD "https://raw.githubusercontent.com/flagarde/Ping/main/Ping.cmake" "${CMAKE_CURRENT_BINARY_DIR}/Ping.cmake" STATUS PING_STATUS) - list(GET PING_STATUS 0 PING_RC) - list(GET PING_STATUS 1 PING_MSG) - if(${PING_RC}) - set(IS_ONLINE_RAW FALSE) - set(IS_OFFLINE_RAW TRUE) - else() - include(${CMAKE_CURRENT_BINARY_DIR}/Ping.cmake) - if(${PING_RESPONSE} STREQUAL "Pong") - set(IS_ONLINE_RAW TRUE) - set(IS_OFFLINE_RAW FALSE) - else() - set(IS_ONLINE_RAW FALSE) - set(IS_OFFLINE_RAW TRUE) - endif() - unset(PING_RESPONSE) - endif() -endmacro() - -# Do the update check. - +# Do the update check function(cmmm_changes CHANGELOG_VERSION) - if(${CMMM_VERSION} VERSION_LESS ${CHANGELOG_VERSION}) - message("${BoldYellow} - Changes in ${CHANGELOG_VERSION} :${Reset}") - foreach(CMMM_CHANGE IN LISTS ARGN) - message("${BoldYellow} - ${CMMM_CHANGE}${Reset}") - endforeach() - endif() + message("${BoldGreen} - Changes in ${CHANGELOG_VERSION} :${Reset}") + foreach(CMMM_CHANGE IN LISTS ARGN) + message("${BoldGreen} - ${CMMM_CHANGE}${Reset}") + endforeach() endfunction() function(print_changelog) - if(NOT ${CMMM_VERSION} STREQUAL "master" AND NOT ${CMMM_VERSION} STREQUAL "main") - if(NOT ${CMMM_VERSION} STREQUAL ${CMMM_LATEST_VERSION}) - message("${BoldYellow}## [CMakeMM] Using CMakeMM version ${CMMM_VERSION}. The latest is ${CMMM_LATEST_VERSION}.${Reset}") - message("${BoldYellow} Changes since ${CMMM_VERSION} include the following :${Reset}") - changelog() - message("${BoldYellow} To update, simply change the value of VERSION in cmmm function.${Reset}") - message("${BoldYellow} You can disable these messages by setting IGNORE_NEW_VERSION in cmmm function. ##${Reset}") - endif() - endif() + message("${BoldGreen}## [CMakeMM] Using CMakeMM version ${CMMM_VERSION}. The latest is ${CMMM_LATEST_VERSION}.${Reset}") + message("${BoldGreen} Changes since ${CMMM_VERSION} include the following :${Reset}") + changelog() + message("${BoldGreen} To update, simply change the value of VERSION in cmmm function.${Reset}") + message("${BoldGreen} You can disable these messages by setting IGNORE_NEW_VERSION in cmmm function. ##${Reset}") endfunction() function(cmmm_check_updates) - cmake_parse_arguments(CMMM "IGNORE_NEW_VERSION" "REPOSITORY" "" ${ARGN}) + cmake_parse_arguments(CMMM "IGNORE_NEW_VERSION" "URL;DESTINATION" "" "${ARGN}") + + if(NOT ${CMMM_IGNORE_NEW_VERSION}) + + # LatestVersion and Changelog must be up-to-date so must be in main + set(CMMM_CHANGELOG_FILE "${CMMM_DESTINATION}/Changelog.cmake") + set(CMMM_CHANGELOG_URL "${CMMM_URL}/main/Changelog.cmake") + + file(DOWNLOAD "${CMMM_CHANGELOG_URL}" "${CMMM_CHANGELOG_FILE}" STATUS CMMM_STATUS TIMEOUT "${CMMM_TIMEOUT}" INACTIVITY_TIMEOUT "${CMMM_INACTIVITY_TIMEOUT}") + list(GET CMMM_STATUS 0 CMMM_RC) + list(GET CMMM_STATUS 1 CMMM_MESSAGE) + if(${CMMM_RC} EQUAL 0) + include("${CMMM_CHANGELOG_FILE}") + if(DEFINED CMMM_LATEST_VERSION) + if(${CMMM_VERSION} VERSION_LESS ${CMMM_LATEST_VERSION}) + if(NOT ${CMMM_VERSION} STREQUAL "main") + print_changelog() + endif() + endif() + else() + message("${BoldYellow}** [CMakeMM] Error while downloading file ${CMMM_CHANGELOG_URL} **${Reset}") + endif() + else() + message("${BoldYellow}** [CMakeMM] Error while downloading file ${CMMM_CHANGELOG_URL} : ${CMMM_MESSAGE} **${Reset}") + endif() - if("${CMMM_PROVIDER}" STREQUAL "https://github.com") - check_accessible() - message("${BoldYellow}## [CMakeMM] https://raw.githubusercontent.com not accessible; Use https://cdn.jsdelivr.net ##${Reset}") endif() - if(IS_ONLINE_RAW STREQUAL "TRUE" AND CMMM_PROVIDER STREQUAL "https://github.com") - set(CMMM_GIT_URL "https://raw.githubusercontent.com/${CMMM_REPOSITORY}/main") - elseif(IS_ONLINE_RAW STREQUAL "FALSE" AND CMMM_PROVIDER STREQUAL "https://github.com") - set(CMMM_GIT_URL "https://cdn.jsdelivr.net/gh/${CMMM_REPOSITORY}@main") - elseif(CMMM_PROVIDER STREQUAL "https://gitlab.com") - set(CMMM_GIT_URL "https://gitlab.com/${CMMM_REPOSITORY}/-/raw/main") - elseif(CMMM_PROVIDER STREQUAL "https://gitee.com") - set(CMMM_GIT_URL "https://gitee.com/${CMMM_REPOSITORY}/raw/main") +endfunction() + +macro(cmmm_entry) + cmake_parse_arguments(CMMM "ALWAYS_DOWNLOAD;NO_COLOR" "TAG;DESTINATION;TIMEOUT;INACTIVITY_TIMEOUT;VERBOSITY;URL" "" "${ARGN}") + + if(NOT ${CMMM_NO_COLOR}) + colors() endif() - # LatestVersion and Changelog must be up-to-date so must be in main - set(CMMM_CHANGELOG_FILE "${CMMM_DESTINATION}/Changelog.cmake") - set(CMMM_CHANGELOG_URL "${CMMM_GIT_URL}/Changelog.cmake") - file(DOWNLOAD "${CMMM_CHANGELOG_URL}" "${CMMM_CHANGELOG_FILE}" STATUS CMMM_STATUS TIMEOUT ${CMMM_TIMEOUT} INACTIVITY_TIMEOUT ${CMMM_INACTIVITY_TIMEOUT}) - list(GET CMMM_STATUS 0 CMMM_RC) - if(${CMMM_RC} EQUAL 0) - include("${CMMM_CHANGELOG_FILE}") - if(${CMMM_VERSION} VERSION_LESS ${CMMM_LATEST_VERSION}) - if(NOT ${CMMM_IGNORE_NEW_VERSION}) - print_changelog() - endif() + set_property(GLOBAL PROPERTY CMMM_NO_COLOR ${CMMM_NO_COLOR}) + + list(INSERT VERBOSITY 0 "FATAL_ERROR" "SEND_ERROR" "WARNING" "AUTHOR_WARNING" "DEPRECATION" "NOTICE" "STATUS" "VERBOSE" "DEBUG" "TRACE") + + if(DEFINED CMMM_VERBOSITY) + list(FIND VERBOSITY ${CMMM_VERBOSITY} FOUND) + if(${FOUND} STREQUAL "-1") + message("${BoldYellow}## [CMakeMM] VERBOSITY ${CMMM_VERBOSITY} unknown. VERBOSITY set to STATUS. ##${Reset}") + set(CMMM_VERBOSITY "STATUS") + endif() + elseif(DEFINED CMAKE_MESSAGE_LOG_LEVEL) + list(FIND VERBOSITY ${CMAKE_MESSAGE_LOG_LEVEL} FOUND) + if(${FOUND} STREQUAL "-1") + message("${BoldYellow}## [CMakeMM] VERBOSITY ${CMAKE_MESSAGE_LOG_LEVEL} unknown. VERBOSITY set to STATUS. ##${Reset}") + set(CMMM_VERBOSITY "STATUS") + else() + set(CMMM_VERBOSITY ${CMAKE_MESSAGE_LOG_LEVEL}) endif() else() - message("${BoldYellow}** Error while downloading file ${CMMM_CHANGELOG_URL} **${Reset}") + set(CMMM_VERBOSITY "STATUS") endif() -endfunction() + set_property(GLOBAL PROPERTY CMMM_VERBOSITY ${CMMM_VERBOSITY}) + + set_property(GLOBAL PROPERTY CMMM_TIMEOUT ${CMMM_TIMEOUT}) + set_property(GLOBAL PROPERTY CMMM_INACTIVITY_TIMEOUT ${CMMM_INACTIVITY_TIMEOUT}) + + set_property(GLOBAL PROPERTY CMMM_DESTINATION ${CMMM_DESTINATION}) + + cmmm_check_updates(${ARGN}) + + set(CMAKEMM_INITIALIZED_${CMMM_TAG} TRUE CACHE INTERNAL "CMakeMM ${CMMM_TAG} is initialized.") + +endmacro() + +## CMCM function(cmcm_module ARG_NAME) cmake_parse_arguments(ARG "" "REMOTE;LOCAL;VERSION" "ALSO" "${ARGV}") + get_property(CMMM_NO_COLOR GLOBAL PROPERTY CMMM_NO_COLOR) if(NOT ${CMMM_NO_COLOR}) colors() endif() + if(NOT ARG_REMOTE AND NOT ARG_LOCAL) - message("${BoldRed}!! [CMakeCM] Either LOCAL or REMOTE is required for cmmm_module !!${Reset}") + message("${BoldRed}!! [CMakeCM] Either LOCAL or REMOTE is required for cmcm_module !!${Reset}") message(FATAL_ERROR) endif() + if(NOT ARG_VERSION) - message("${BoldRed}!! [CMakeCM] Expected a VERSION for cmmm_module !!${Reset}") + message("${BoldRed}!! [CMakeCM] Expected a VERSION for cmcm_module !!${Reset}") message(FATAL_ERROR) endif() - file(MAKE_DIRECTORY "${CMMM_INSTALL_DESTINATION}") + + get_property(CMMM_DESTINATION_PREMODULES GLOBAL PROPERTY CMMM_DESTINATION_PREMODULES) + file(MAKE_DIRECTORY "${CMMM_DESTINATION_PREMODULES}") + get_property(CMMM_URL_MODULES GLOBAL PROPERTY CMMM_URL_MODULES) + if(ARG_REMOTE) - file(WRITE "${CMMM_INSTALL_DESTINATION}/${ARG_NAME}" "cmmm_include_module([[${ARG_NAME}]] [[${ARG_REMOTE}]] [[${ARG_VERSION}]] [[${ARG_ALSO}]])\n") + file(WRITE "${CMMM_DESTINATION_PREMODULES}/${ARG_NAME}" "cmmm_include_module([[${ARG_NAME}]] [[${ARG_REMOTE}]] [[${ARG_VERSION}]] [[${ARG_ALSO}]])\n") else() - file(WRITE "${CMMM_INSTALL_DESTINATION}/${ARG_NAME}" "cmmm_include_module([[${ARG_NAME}]] [[${CMMM_URL_MODULES}/${ARG_LOCAL}]] [[${ARG_VERSION}]] [[${ARG_ALSO}]])\n") + file(WRITE "${CMMM_DESTINATION_PREMODULES}/${ARG_NAME}" "cmmm_include_module([[${ARG_NAME}]] [[${CMMM_URL_MODULES}/${ARG_LOCAL}]] [[${ARG_VERSION}]] [[${ARG_ALSO}]])\n") endif() + endfunction() macro(cmmm_include_module MODULE_NAME MODULE_URL version also) @@ -122,13 +143,14 @@ macro(cmmm_include_module MODULE_NAME MODULE_URL version also) colors() endif() - get_property(CMMM_INSTALL_DESTINATION GLOBAL PROPERTY CMMM_DESTINATION) get_property(CMMM_DESTINATION_MODULES GLOBAL PROPERTY CMMM_DESTINATION_MODULES) get_property(CMMM_URL_MODULES GLOBAL PROPERTY CMMM_URL_MODULES) get_filename_component(CMMM_RESOLVED_DIR "${CMMM_DESTINATION_MODULES}" ABSOLUTE) get_filename_component(CMMM_RESOLVED "${CMMM_RESOLVED_DIR}/${MODULE_NAME}" ABSOLUTE) - get_filename_component(CMMM_RESOLVED_STAMP "${CMMM_INSTALL_DESTINATION}/${MODULE_NAME}.whence" ABSOLUTE) + + get_property(CMMM_INSTALLED_DESTINATION GLOBAL PROPERTY CMMM_DESTINATION) + get_filename_component(CMMM_RESOLVED_STAMP "${CMMM_INSTALLED_DESTINATION}/Whence/${MODULE_NAME}.whence" ABSOLUTE) set(CMMM_WHENCE_STRING "${CMMM_URL_MODULES}::${MODULE_URL}.${version}") set(DOWNLOAD_MODULE FALSE) if(EXISTS "${CMMM_RESOLVED}") @@ -141,12 +163,12 @@ macro(cmmm_include_module MODULE_NAME MODULE_URL version also) endif() if(DOWNLOAD_MODULE) file(MAKE_DIRECTORY "${CMMM_RESOLVED_DIR}") - message("${BoldMagenta}-- [CMakeCM] Downloading new module ${MODULE_NAME} --${Reset}") + message("${BoldMagenta}-- [CMakeMM] Downloading new module ${MODULE_NAME} --${Reset}") file(DOWNLOAD "${MODULE_URL}" "${CMMM_RESOLVED}" STATUS DOWNLOAD_STATUS) list(GET DOWNLOAD_STATUS 0 CODE) list(GET DOWNLOAD_STATUS 1 MESSAGE) if(CODE) - message("${BoldRed}!! [CMakeCM] Error while downloading file from '${MODULE_URL}' to '${CMMM_RESOLVED}' [${CODE}]: ${MESSAGE} !!${Reset}") + message("${BoldRed}!! [CMakeMM] Error while downloading file from '${MODULE_URL}' to '${CMMM_RESOLVED}' [${CODE}]: ${MESSAGE} !!${Reset}") message(FATAL_ERROR) endif() file(WRITE "${CMMM_RESOLVED_STAMP}" "${CMMM_WHENCE_STRING}") @@ -181,12 +203,7 @@ function(cmmm_modules_list) if(DEFINED CMMM_REPOSITORY) if(NOT DEFINED CMMM_PROVIDER OR CMMM_PROVIDER STREQUAL "github") - check_accessible() - if(${IS_ONLINE_RAW}) - set(CMMM_URL "https://raw.githubusercontent.com/${CMMM_REPOSITORY}") - else() - set(CMMM_URL "https://cdn.jsdelivr.net/gh/${CMMM_REPOSITORY}") - endif() + set(CMMM_URL "https://raw.githubusercontent.com/${CMMM_REPOSITORY}") elseif(CMMM_PROVIDER STREQUAL "gitlab") set(CMMM_URL "https://gitlab.com/${CMMM_REPOSITORY}/-/raw") elseif(CMMM_PROVIDER STREQUAL "gitee") @@ -195,49 +212,46 @@ function(cmmm_modules_list) if(CMMM_NO_COLOR OR WIN32) message("## [CMakeMM] Provider \"${CMMM_PROVIDER}\" unknown. Fall back to \"github\" ##") else() - message("${Esc}[1;33m## [CMakeMM] Provider \"${CMMM_PROVIDER}\" unknown. Fall back to \"github\" ##${Esc}[m") - endif() - check_accessible() - if(${IS_ONLINE_RAW}) - set(CMMM_URL "https://raw.githubusercontent.com/${CMMM_REPOSITORY}") - else() - set(CMMM_URL "https://cdn.jsdelivr.net/gh/${CMMM_REPOSITORY}") + message("${BoldYellow}## [CMakeMM] Provider \"${CMMM_PROVIDER}\" unknown. Fall back to \"github\" ##${Reset}") endif() + set(CMMM_URL "https://raw.githubusercontent.com/${CMMM_REPOSITORY}") endif() endif() string(FIND ${CMMM_URL} "/" HAS_FLASH REVERSE) string(LENGTH ${CMMM_URL} CMMM_URL_LENGTH) math(EXPR HAS_FLASH_PLUS_ONE ${HAS_FLASH}+1) - if(${HAS_FLASH_PLUS_ONE} STREQUAL ${CMMM_URL_LENGTH}) - string(SUBSTRING ${CMMM_URL} 0 ${HAS_FLASH} CMMM_URL) + if("${HAS_FLASH_PLUS_ONE}" STREQUAL "${CMMM_URL_LENGTH}") + string(SUBSTRING "${CMMM_URL}" 0 "${HAS_FLASH}" CMMM_URL) endif() if(DEFINED CMMM_REPOSITORY) if(NOT DEFINED CMMM_BRANCH) set(CMMM_BRANCH "main") endif() - if(NOT DEFINED CMMM_PROVIDER OR CMMM_PROVIDER STREQUAL "github") - if(${IS_ONLINE_RAW}) - set(CMMM_URL "${CMMM_URL}/${CMMM_BRANCH}") - else() - set(CMMM_URL "${CMMM_URL}@${CMMM_BRANCH}") - endif() - else() - set(CMMM_URL "${CMMM_URL}/${CMMM_BRANCH}") - endif() + set(CMMM_URL "${CMMM_URL}/${CMMM_BRANCH}") endif() set_property(GLOBAL PROPERTY CMMM_URL_MODULES "${CMMM_URL}") - get_property(CMMM_INSTALL_DESTINATION GLOBAL PROPERTY CMMM_DESTINATION) + get_property(CMMM_INSTALLED_DESTINATION GLOBAL PROPERTY CMMM_DESTINATION) + set(CMMM_DESTINATION_PREMODULES "${CMMM_INSTALLED_DESTINATION}/PreModules") + # Set default modules installation folders if(NOT DEFINED CMMM_DESTINATION) - set(CMMM_DESTINATION_MODULES "${CMMM_INSTALL_DESTINATION}/Modules") + set(CMMM_DESTINATION_MODULES "${CMMM_INSTALLED_DESTINATION}/Modules") else() - get_filename_component(CMMM_DESTINATION_MODULES "${CMMM_DESTINATION}" ABSOLUTE BASE_DIR ${CMAKE_CURRENT_BINARY_DIR}) + get_filename_component(CMMM_DESTINATION_MODULES "${CMMM_DESTINATION}" ABSOLUTE BASE_DIR "${CMAKE_BINARY_DIR}") endif() - set_property(GLOBAL PROPERTY CMMM_DESTINATION_MODULES ${CMMM_DESTINATION_MODULES}) + + set_property(GLOBAL PROPERTY CMMM_DESTINATION_MODULES "${CMMM_DESTINATION_MODULES}") + set_property(GLOBAL PROPERTY CMMM_DESTINATION_PREMODULES "${CMMM_DESTINATION_PREMODULES}") + + # add the CMakeMM installation directory to CMAKE_MODULE_PATH + list(INSERT CMAKE_MODULE_PATH 0 "${CMMM_DESTINATION_PREMODULES}") + list(INSERT CMAKE_MODULE_PATH 0 "${CMMM_DESTINATION_MODULES}") + list(REMOVE_DUPLICATES CMAKE_MODULE_PATH) + set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE) if(NOT DEFINED CMMM_FOLDER) set(CMMM_COMPLET_URL "${CMMM_URL}") @@ -245,96 +259,28 @@ function(cmmm_modules_list) set(CMMM_COMPLET_URL "${CMMM_URL}/${CMMM_FOLDER}") endif() - if(${CMMM_ALWAYS_DOWNLOAD} OR NOT EXISTS "${CMMM_DESTINATION_MODULES}/${CMMM_FILENAME}.cmake") - message("${BoldMagenta}-- [CMakeMM] Downloading ${CMMM_FILENAME}.cmake\n From : ${CMMM_COMPLET_URL}/${CMMM_FILENAME}.cmake\n To : ${CMMM_DESTINATION_MODULES}/${CMMM_FILENAME}.cmake --${Reset}") + if(${CMMM_ALWAYS_DOWNLOAD} OR NOT EXISTS "${CMMM_INSTALLED_DESTINATION}/${CMMM_FILENAME}.cmake") + message("${BoldMagenta}-- [CMakeMM] Downloading ${CMMM_FILENAME}.cmake\n From : ${CMMM_COMPLET_URL}/${CMMM_FILENAME}.cmake\n To : ${CMMM_INSTALLED_DESTINATION}/${CMMM_FILENAME}.cmake --${Reset}") - file(DOWNLOAD "${CMMM_COMPLET_URL}/${CMMM_FILENAME}.cmake" "${CMMM_DESTINATION_MODULES}/${CMMM_FILENAME}Temp.cmake" INACTIVITY_TIMEOUT ${CMMM_INACTIVITY_TIMEOUT} STATUS CMAKECM_STATUS TIMEOUT ${CMMM_TIMEOUT}) + file(DOWNLOAD "${CMMM_COMPLET_URL}/${CMMM_FILENAME}.cmake" "${CMMM_INSTALLED_DESTINATION}/${CMMM_FILENAME}Temp.cmake" INACTIVITY_TIMEOUT ${CMMM_INACTIVITY_TIMEOUT} STATUS CMAKECM_STATUS TIMEOUT ${CMMM_TIMEOUT}) list(GET CMAKECM_STATUS 0 CMAKECM_CODE) list(GET CMAKECM_STATUS 1 CMAKECM_MESSAGE) if(${CMAKECM_CODE}) - if(NOT EXISTS "${CMMM_DESTINATION_MODULES}/${CMMM_FILENAME}.cmake") - file(REMOVE "${CMMM_DESTINATION_MODULES}/${CMMM_FILENAME}Temp.cmake") - message(FATAL_ERROR "${BoldRed}[CMakeCM] Error downloading ${CMMM_FILENAME} : ${CMAKECM_MESSAGE}${Reset}") + if(NOT EXISTS "${CMMM_INSTALLED_DESTINATION}/${CMMM_FILENAME}.cmake") + file(REMOVE "${CMMM_INSTALLED_DESTINATION}/${CMMM_FILENAME}Temp.cmake") + message(FATAL_ERROR "${BoldRed}[CMakeMM] Error downloading ${CMMM_FILENAME} : ${CMAKECM_MESSAGE}${Reset}") else() - message("${BoldYellow}## [CMakeCM] Error downloading ${CMMM_FILENAME} : ${CMAKECM_MESSAGE} ##${Reset}") - message("${BoldYellow}## [CMakeCM] Using the one already downloaded ##${Reset}") - file(REMOVE "${CMMM_DESTINATION_MODULES}/${CMMM_FILENAME}Temp.cmake") - include("${CMMM_DESTINATION_MODULES}/${CMMM_FILENAME}.cmake") + message("${BoldYellow}## [CMakeMM] Error downloading ${CMMM_FILENAME} : ${CMAKECM_MESSAGE} ##${Reset}") + message("${BoldYellow}## [CMakeMM] Using the one already downloaded ##${Reset}") + file(REMOVE "${CMMM_INSTALLED_DESTINATION}/${CMMM_FILENAME}Temp.cmake") endif() else() - file(RENAME "${CMMM_DESTINATION_MODULES}/${CMMM_FILENAME}Temp.cmake" "${CMMM_DESTINATION_MODULES}/${CMMM_FILENAME}.cmake") - include("${CMMM_DESTINATION_MODULES}/${CMMM_FILENAME}.cmake") - endif() - message("${BoldGreen}** [CMakeCM] Modules will be installed in \"${CMMM_DESTINATION_MODULES}\" **${Reset}") - endif() -endfunction() - -macro(cmmm_entry) - cmake_parse_arguments(CMMM "ALWAYS_DOWNLOAD;NO_COLOR" "REPOSITORY;VERSION;DESTINATION;TIMEOUT;INACTIVITY_TIMEOUT;VERBOSITY;PROVIDER" "" ${ARGN}) - - if(NOT ${CMMM_NO_COLOR}) - colors() - endif() - set_property(GLOBAL PROPERTY CMMM_NO_COLOR ${CMMM_NO_COLOR}) - - list( - INSERT - VERBOSITY - 0 - "FATAL_ERROR" - "SEND_ERROR" - "WARNING" - "AUTHOR_WARNING" - "DEPRECATION" - "NOTICE" - "STATUS" - "VERBOSE" - "DEBUG" - "TRACE" - ) - - if(DEFINED CMMM_VERBOSITY) - list(FIND VERBOSITY ${CMMM_VERBOSITY} FOUND) - if(${FOUND} STREQUAL "-1") - message("${BoldYellow}## [CMakeMM] VERBOSITY ${CMMM_VERBOSITY} unknown. VERBOSITY set to STATUS. ##${Reset}") - set(CMMM_VERBOSITY "STATUS") - endif() - elseif(DEFINED CMAKE_MESSAGE_LOG_LEVEL) - list(FIND VERBOSITY ${CMAKE_MESSAGE_LOG_LEVEL} FOUND) - if(${FOUND} STREQUAL "-1") - message("${BoldYellow}## [CMakeMM] VERBOSITY ${CMAKE_MESSAGE_LOG_LEVEL} unknown. VERBOSITY set to STATUS. ##${Reset}") - set(CMMM_VERBOSITY "STATUS") - else() - set(CMMM_VERBOSITY ${CMAKE_MESSAGE_LOG_LEVEL}) + file(RENAME "${CMMM_INSTALLED_DESTINATION}/${CMMM_FILENAME}Temp.cmake" "${CMMM_INSTALLED_DESTINATION}/${CMMM_FILENAME}.cmake") endif() - else() - set(CMMM_VERBOSITY "STATUS") - endif() - set_property(GLOBAL PROPERTY CMMM_VERBOSITY ${CMMM_VERBOSITY}) - - if(NOT DEFINED CMMM_TIMEOUT) - set(CMMM_TIMEOUT 10) - endif() - set_property(GLOBAL PROPERTY CMMM_TIMEOUT ${CMMM_TIMEOUT}) - - if(NOT DEFINED CMMM_INACTIVITY_TIMEOUT) - set(CMMM_INACTIVITY_TIMEOUT 5) - endif() - set_property(GLOBAL PROPERTY CMMM_INACTIVITY_TIMEOUT ${CMMM_INACTIVITY_TIMEOUT}) - - if(NOT DEFINED CMMM_DESTINATION) - set(CMMM_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/CMakeMM") - else() - get_filename_component(CMMM_DESTINATION "${CMMM_DESTINATION}" ABSOLUTE BASE_DIR ${CMAKE_CURRENT_BINARY_DIR}) + message("${BoldGreen}** [CMakeMM] Modules will be installed in \"${CMMM_DESTINATION_MODULES}\" **${Reset}") endif() - set(CMMM_DESTINATION "${CMMM_DESTINATION}/${CMMM_VERSION}") - set_property(GLOBAL PROPERTY CMMM_DESTINATION ${CMMM_DESTINATION}) + #Always regenerate PreModules + include("${CMMM_INSTALLED_DESTINATION}/${CMMM_FILENAME}.cmake") - # add the CMakeMM installation directory to CMAKE_MODULE_PATH - list(INSERT CMAKE_MODULE_PATH 0 "${CMMM_DESTINATION}") - list(REMOVE_DUPLICATES CMAKE_MODULE_PATH) - set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" PARENT_SCOPE) - - cmmm_check_updates(${ARGN}) -endmacro() +endfunction() diff --git a/Changelog.cmake b/Changelog.cmake index cbda77a..da6b547 100644 --- a/Changelog.cmake +++ b/Changelog.cmake @@ -1,7 +1,8 @@ -set(CMMM_LATEST_VERSION 1.0) +set(CMMM_LATEST_VERSION 2.0) function(changelog) cmmm_changes(0.9 "Alpha version") cmmm_changes(1.0 "Initial version") cmmm_changes(1.1 "Default branch is now main not master" "Avoid redownloading modules list") + cmmm_changes(2.0 "Supress git and FetchContent dependencies" "${BoldRed}!! Please download the new GetCmakeMM.cmake !!${Reset}") endfunction() diff --git a/GetCMakeMM.cmake b/GetCMakeMM.cmake index c4638ce..8a5c93e 100644 --- a/GetCMakeMM.cmake +++ b/GetCMakeMM.cmake @@ -1,59 +1,77 @@ include_guard(GLOBAL) function(cmmm) - include(FetchContent) + cmake_parse_arguments(CMMM "NO_COLOR" "VERSION;DESTINATION;INACTIVITY_TIMEOUT;TIMEOUT;REPOSITORY;PROVIDER" "" "${ARGN}") - cmake_parse_arguments(CMMM "NO_COLOR" "REPOSITORY;VERSION;VERBOSITY;PROVIDER" "" ${ARGN}) - if(NOT DEFINED CMMM_PROVIDER) - set(CMMM_PROVIDER "https://github.com") - elseif("${CMMM_PROVIDER}" STREQUAL "github") - set(CMMM_PROVIDER "https://github.com") - elseif("${CMMM_PROVIDER}" STREQUAL "gitlab") - set(CMMM_PROVIDER "https://gitlab.com") - elseif("${CMMM_PROVIDER}" STREQUAL "gitee") - set(CMMM_PROVIDER "https://gitee.com") + if(NOT DEFINED CMMM_VERSION) + set(CMMM_TAG "main") + elseif(CMMM_VERSION STREQUAL "main") + set(CMMM_TAG "${CMMM_VERSION}") else() - string(ASCII 27 Esc) - if(CMMM_NO_COLOR OR WIN32) - message("## [CMakeMM] Provider \"${CMMM_PROVIDER}\" unknown. Fall back to \"github\" ##") - else() - message("${Esc}[1;33m## [CMakeMM] Provider \"${CMMM_PROVIDER}\" unknown. Fall back to \"github\" ##${Esc}[m") - endif() - set(CMMM_PROVIDER "https://github.com") + set(CMMM_TAG "v${CMMM_VERSION}") endif() - if(NOT DEFINED CMMM_REPOSITORY) - set(CMMM_REPOSITORY "flagarde/CMakeMM") + if(NOT DEFINED CMMM_DESTINATION) + set(CMMM_DESTINATION "${CMAKE_BINARY_DIR}") endif() + get_filename_component(CMMM_DESTINATION "${CMMM_DESTINATION}" ABSOLUTE BASE_DIR "${CMAKE_BINARY_DIR}") - if(NOT DEFINED CMMM_VERSION OR CMMM_VERSION STREQUAL "master") - set(CMMM_VERSION "main") + if(NOT DEFINED CMMM_INACTIVITY_TIMEOUT) + set(CMMM_INACTIVITY_TIMEOUT "5") endif() - if(${CMMM_VERSION} STREQUAL "main") - fetchcontent_declare(CMakeMM GIT_REPOSITORY "${CMMM_PROVIDER}/${CMMM_REPOSITORY}" GIT_TAG "${CMMM_VERSION}" GIT_SHALLOW) - else() - fetchcontent_declare(CMakeMM GIT_REPOSITORY "${CMMM_PROVIDER}/${CMMM_REPOSITORY}" GIT_TAG "v${CMMM_VERSION}" GIT_SHALLOW) + if(NOT DEFINED CMMM_TIMEOUT) + set(CMMM_TIMEOUT "10") + endif() + + string(ASCII 27 Esc) + + if(NOT DEFINED CMMM_REPOSITORY) + set(CMMM_REPOSITORY "flagarde/CMakeMM") endif() - if(NOT DEFINED CMAKEMM_INITIALIZED) - string(ASCII 27 Esc) + if(NOT DEFINED CMMM_PROVIDER OR CMMM_PROVIDER STREQUAL "github") + set(CMMM_URL "https://raw.githubusercontent.com/${CMMM_REPOSITORY}") + elseif("${CMMM_PROVIDER}" STREQUAL "gitlab") + set(CMMM_URL "https://gitlab.com/${CMMM_REPOSITORY}/-/raw") + elseif("${CMMM_PROVIDER}" STREQUAL "gitee") + set(CMMM_URL "https://gitee.com/${CMMM_REPOSITORY}/raw") + else() if(CMMM_NO_COLOR OR WIN32) - message("-- [CMakeMM] Downloading CMakeMM version \"${CMMM_VERSION}\" from \"${CMMM_PROVIDER}/${CMMM_REPOSITORY}\" --") + message("## [CMakeMM] Provider \"${CMMM_PROVIDER}\" unknown. Fallback to \"github\" ##") else() - message("${Esc}[1;35m-- [CMakeMM] Downloading CMakeMM version \"${CMMM_VERSION}\" from \"${CMMM_PROVIDER}/${CMMM_REPOSITORY}\" --${Esc}[m") + message("${Esc}[1;33m## [CMakeMM] Provider \"${CMMM_PROVIDER}\" unknown. Fallback to \"github\" ##${Esc}[m") endif() + set(CMMM_URL "https://raw.githubusercontent.com/${CMMM_REPOSITORY}") endif() - set(FETCHCONTENT_UPDATES_DISCONNECTED_CMAKEMM ON) + if(NOT CMAKEMM_INITIALIZED_${CMMM_TAG} OR NOT EXISTS "${CMMM_DESTINATION}/CMakeMM-${CMMM_TAG}.cmake") - fetchcontent_getproperties(CMakeMM) + if(CMMM_NO_COLOR OR WIN32) + message("-- [CMakeMM] Downloading CMakeMM (${CMMM_TAG}) from ${CMMM_URL}/${CMMM_TAG}/CMakeMM.cmake to ${CMMM_DESTINATION}/CMakeMM-${CMMM_TAG}.cmake --") + else() + message("${Esc}[1;35m-- [CMakeMM] Downloading CMakeMM (${CMMM_TAG}) from ${CMMM_URL}/${CMMM_TAG}/CMakeMM.cmake ${CMMM_DESTINATION}/CMakeMM-${CMMM_TAG}.cmake --${Esc}[m") + endif() + + file(DOWNLOAD "${CMMM_URL}/${CMMM_TAG}/CMakeMM.cmake" "${CMMM_DESTINATION}/CMakeMM-${CMMM_TAG}.cmake" INACTIVITY_TIMEOUT "${CMMM_INACTIVITY_TIMEOUT}" LOG LOG_ STATUS CMAKECM_STATUS TIMEOUT "${CMMM_TIMEOUT}") + list(GET CMAKECM_STATUS 0 CMAKECM_CODE) + list(GET CMAKECM_STATUS 1 CMAKECM_MESSAGE) + if(${CMAKECM_CODE}) + if(CMMM_NO_COLOR OR WIN32) + message(FATAL_ERROR "[CMakeMM] Error downloading CMakeMM.cmake : ${CMAKECM_MESSAGE}") + else() + message(FATAL_ERROR "${Esc}[1;31m [CMakeMM] Error downloading CMakeMM.cmake : ${CMAKECM_MESSAGE}${Esc}[m") + endif() + endif() - if(NOT cmakemm_POPULATED) - fetchcontent_populate(CMakeMM) - list(INSERT CMAKE_MODULE_PATH 0 ${cmakemm_SOURCE_DIR}) - set(CMAKEMM_INITIALIZED "TRUE" CACHE INTERNAL "CMakeMM has been installed") - include(CMakeMM) - cmmm_entry(${ARGN} PROVIDER ${CMMM_PROVIDER}) endif() + + include("${CMMM_DESTINATION}/CMakeMM-${CMMM_TAG}.cmake") + + set(ARGN "URL;${CMMM_URL};DESTINATION;${CMMM_DESTINATION};INACTIVITY_TIMEOUT;${CMMM_INACTIVITY_TIMEOUT};TIMEOUT;${CMMM_TIMEOUT};TAG;${CMMM_TAG};${ARGN}") + list(REMOVE_DUPLICATES ARGN) + + cmmm_entry("${ARGN}") + endfunction() +