diff --git a/RepoMan.cmake b/RepoMan.cmake index 89b2bea..ebfa7f2 100755 --- a/RepoMan.cmake +++ b/RepoMan.cmake @@ -51,10 +51,7 @@ Alternatively, you can also include it via add_subdirectory() or provide it via FetchContent_MakeAvailable(cmake_utilities) -You can also run the RepoManResolve.cmake script as a command directly from the command line. This also works for non-CMake projects. This s called ``script mode``, in contrast to ``project mode``, which is the normal usage of the module though a CMake project file. - - -In oder to actually do anything, the project root directory must contain a ``dependencies. txt`` file or a file with a different name, if ``REPOMAN_DEPENDENCIES_FILE_NAME`` is set accordingly. +In oder to actually do anything, the project root directory must contain a ``dependencies.txt`` file or a file with a different name, if ``REPOMAN_DEPENDENCIES_FILE_NAME`` is set accordingly. This file must contain one line for each dependency, in the format given to ``FetchContent()``. All arguments of ``FetchContent()`` are supported. Empty and commented lines are also allowed and will be ignored. Each dependency defined this way will be provided and included via ``add_subdirectory()``. Any sub-dependencies in a dependency's ``dependencies.txt`` will also be added. If a dependency has already been defined in a parent project, that definition takes precedence, so higher-level projects can override their child dependency's requirements. @@ -86,18 +83,8 @@ The following variables modify the behaviour of the module. They are set to reas # Update this if the dependencies file format changes set(DEPENDENCIES_FILE_REQUIRED_VERSION "v1.0.0") -cmake_path(GET CMAKE_SOURCE_DIR FILENAME PROJECT_DIRECTORY_NAME) -if(CMAKE_SCRIPT_MODE_FILE) - set(SCRIPT_MODE TRUE) - # If RepoMan is run as a script (outside of a CMake project), the variables below do not have any meaning by default. - set(PROJECT_SOURCE_DIR $ENV{PWD}) - set(FETCHCONTENT_BASE_DIR "${CMAKE_SOURCE_DIR}/../RepoMan-${PROJECT_DIRECTORY_NAME}-temp" CACHE PATH "The FetchContent base directory, modified by RepoMan." FORCE) -else() - set(SCRIPT_MODE FALSE) -endif() - # Module Configuration -set(REPOMAN_DEPENDENCIES_USE_WORKSPACE ${SCRIPT_MODE} CACHE BOOL "Allow editing of dependencies. This puts the sources next to the main project to allow easier editing.") +set(REPOMAN_DEPENDENCIES_USE_WORKSPACE FALSE CACHE BOOL "Allow editing of dependencies. This puts the sources next to the main project to allow easier editing.") set(REPOMAN_DEPENDENCIES_FILE_NAME "dependencies.txt" CACHE STRING "The dependencies file name.") mark_as_advanced(REPOMAN_DEPENDENCIES_FILE_NAME) @@ -105,6 +92,7 @@ if(REPOMAN_DEPENDENCIES_WORKSPACE) file(REAL_PATH "${REPOMAN_DEPENDENCIES_WORKSPACE}" REPOMAN_WORKSPACE BASE_DIRECTORY "${CMAKE_SOURCE_DIR}" EXPAND_TILDE) cmake_path(IS_PREFIX REPOMAN_WORKSPACE "${CMAKE_SOURCE_DIR}" NORMALIZE IS_PREFIX) cmake_path(COMPARE "${REPOMAN_WORKSPACE}" EQUAL "${CMAKE_SOURCE_DIR}" IS_PROJECT_DIR) + if(IS_PREFIX OR IS_PROJECT_DIR) file(REAL_PATH "${REPOMAN_WORKSPACE}/${PROJECT_DIRECTORY_NAME}-dependencies" REPOMAN_WORKSPACE) endif() @@ -127,26 +115,29 @@ DIRECTORY The directory to search for REPOMAN_DEPENDENCIES_FILE_NAME #]] function(repoman__internal__handle_dependencies DIRECTORY) set(REPOMAN_DEPENDENCY_FILE "${DIRECTORY}/${REPOMAN_DEPENDENCIES_FILE_NAME}") + + define_property(GLOBAL PROPERTY GLOBAL_REPOMAN_DEPENDENCIES) + if(EXISTS "${REPOMAN_DEPENDENCY_FILE}") message(STATUS "Resolving dependencies of project ${DIRECTORY}") file(MAKE_DIRECTORY "${REPOMAN_WORKSPACE}") - if(NOT SCRIPT_MODE) - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${REPOMAN_DEPENDENCY_FILE}") - set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${REPOMAN_WORKSPACE}") - endif() + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${REPOMAN_DEPENDENCY_FILE}") + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${REPOMAN_WORKSPACE}") unset(REPOMAN_DEPENDENCIES) file(STRINGS "${REPOMAN_DEPENDENCY_FILE}" REPOMAN_DEPENDENCY_SPECS ENCODING UTF-8) list(GET REPOMAN_DEPENDENCY_SPECS 0 VERSION_INFO) + if(VERSION_INFO MATCHES "Version: *(v[0-9\.]+)") set(DEPENDENCIES_FILE_VERSION "${CMAKE_MATCH_1}") list(POP_FRONT REPOMAN_DEPENDENCY_SPECS) else() set(DEPENDENCIES_FILE_VERSION "") endif() + if(NOT DEPENDENCIES_FILE_REQUIRED_VERSION STREQUAL DEPENDENCIES_FILE_VERSION) message(FATAL_ERROR "Dependencies file '${REPOMAN_DEPENDENCY_FILE}' has version '${DEPENDENCIES_FILE_VERSION}', but required version is '${DEPENDENCIES_FILE_REQUIRED_VERSION}'") endif() @@ -157,145 +148,164 @@ function(repoman__internal__handle_dependencies DIRECTORY) continue() endif() - # Change line to list - string(REPLACE " " ";" DEPENDENCY_INFO ${DEPENDENCY}) + # Convert the arguments in ${DEPENDENCY} into a list of strings, + # thereby dropping any space characters and store the list in DEPENDENCY_INFO. + string(REGEX MATCHALL "[^ \t\r\n]+" DEPENDENCY_INFO ${DEPENDENCY}) - # Parse dependency definition to be used in checks and printed information + # Extract the first argument which will be interpreted as dependency name as chosen by user list(GET DEPENDENCY_INFO 0 REPOMAN_DEPENDENCY_NAME) - unset(REPOMAN_DEPENDENCY_GIT_REPOSITORY) - unset(REPOMAN_DEPENDENCY_URL) - unset(REPOMAN_DEPENDENCY_SVN_REPOSITORY) - unset(REPOMAN_DEPENDENCY_HG_REPOSITORY) - unset(REPOMAN_DEPENDENCY_CVS_REPOSITORY) + message("REPOMAN_DEPENDENCY_NAME = ${REPOMAN_DEPENDENCY_NAME}") + message("DEPENDENCY_INFO = ${DEPENDENCY_INFO}") + cmake_parse_arguments(REPOMAN_DEPENDENCY - "" - "GIT_REPOSITORY;GIT_TAG;URL_HASH;URL_MD5;SVN_REPOSITORY;SVN_REVISION;HG_REPOSITORY;HG_TAG;CVS_REPOSITORY;CVS_MODULE;CVS_TAG" - "URL" - "${DEPENDENCY_INFO}") + "" + "GIT_REPOSITORY;GIT_TAG;URL_HASH;URL_MD5;SVN_REPOSITORY;SVN_REVISION;HG_REPOSITORY;HG_TAG;CVS_REPOSITORY;CVS_MODULE;CVS_TAG" + "URL" + "${DEPENDENCY_INFO}") + + message("REPOMAN_DEPENDENCY_GIT_REPOSITORY = ${REPOMAN_DEPENDENCY_GIT_REPOSITORY}") + if(REPOMAN_DEPENDENCY_GIT_REPOSITORY) + # TODO check for already defined stuff ${REPOMAN_DEPENDENCY_NAME}_GIT_REPOSITORY set(REPOMAN_DEPENDENCY_URI ${REPOMAN_DEPENDENCY_GIT_REPOSITORY}) - set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_GIT_TAG}) + set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_GIT_TAG}) elseif(REPOMAN_DEPENDENCY_URL) set(REPOMAN_DEPENDENCY_URI ${REPOMAN_DEPENDENCY_URL}) + if(REPOMAN_DEPENDENCY_URL_HASH) - set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_URL_HASH}) + set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_URL_HASH}) elseif(REPOMAN_DEPENDENCY_URL_MD5) - set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_URL_MD5}) + set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_URL_MD5}) endif() elseif(REPOMAN_DEPENDENCY_SVN_REPOSITORY) set(REPOMAN_DEPENDENCY_URI ${REPOMAN_DEPENDENCY_SVN_REPOSITORY}) - set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_SVN_TAG}) + set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_SVN_TAG}) elseif(REPOMAN_DEPENDENCY_HG_REPOSITORY) set(REPOMAN_DEPENDENCY_URI ${REPOMAN_DEPENDENCY_HG_REPOSITORY}) - set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_HG_TAG}) + set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_HG_TAG}) elseif(REPOMAN_DEPENDENCY_CVS_REPOSITORY) set(REPOMAN_DEPENDENCY_URI ${REPOMAN_DEPENDENCY_CVS_REPOSITORY}) - set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_CVS_TAG}) + set(REPOMAN_DEPENDENCY_REVISION ${REPOMAN_DEPENDENCY_CVS_TAG}) endif() message(STATUS "Checking dependency '${REPOMAN_DEPENDENCY_NAME}': ${REPOMAN_DEPENDENCY_URI} @ ${REPOMAN_DEPENDENCY_REVISION}") - # Set first-encountered revision - get_property(OVERWRITE_REVISION GLOBAL PROPERTY ${REPOMAN_DEPENDENCY_NAME}_REVISION) - if(NOT OVERWRITE_REVISION) - set_property(GLOBAL PROPERTY ${REPOMAN_DEPENDENCY_NAME}_REVISION ${REPOMAN_DEPENDENCY_REVISION}) - set_property(GLOBAL APPEND PROPERTY GLOBAL_REPOMAN_DEPENDENCIES ${REPOMAN_DEPENDENCY_NAME}) - endif() + # # Set first-encountered revision + # get_property(OVERWRITE_REVISION GLOBAL PROPERTY ${REPOMAN_DEPENDENCY_NAME}_REVISION) + + # if(NOT OVERWRITE_REVISION) + set_property(GLOBAL PROPERTY ${REPOMAN_DEPENDENCY_NAME}_REVISION ${REPOMAN_DEPENDENCY_REVISION}) + message(STATUS "Adding '${REPOMAN_DEPENDENCY_NAME}' to GLOBAL_REPOMAN_DEPENDENCIES") + set_property(GLOBAL APPEND PROPERTY GLOBAL_REPOMAN_DEPENDENCIES ${REPOMAN_DEPENDENCY_NAME}) + message(STATUS "!!!!!!!!!!!!!! GLOBAL_REPOMAN_DEPENDENCIES = ${GLOBAL_REPOMAN_DEPENDENCIES}") + + # endif() set_property(GLOBAL APPEND PROPERTY ${REPOMAN_DEPENDENCY_NAME}_REQUESTED_REVISIONS ${REPOMAN_DEPENDENCY_REVISION}) list(APPEND REPOMAN_DEPENDENCIES ${REPOMAN_DEPENDENCY_NAME}) - # Set depedencvy directories - if(REPOMAN_DEPENDENCIES_USE_WORKSPACE) - set(DEPENDENCY_SOURCE_DIR ${REPOMAN_WORKSPACE}/${REPOMAN_DEPENDENCY_NAME}) - else() - set(DEPENDENCY_SOURCE_DIR ${FETCHCONTENT_BASE_DIR}/${REPOMAN_DEPENDENCY_NAME}-src) - endif() - set(DEPENDENCY_BINARY_DIR ${FETCHCONTENT_BASE_DIR}/${REPOMAN_DEPENDENCY_NAME}-build) - set(DEPENDENCY_SUBBUILD_DIR ${FETCHCONTENT_BASE_DIR}/${REPOMAN_DEPENDENCY_NAME}-subbuild) - - # FetchContent_Declare() defines properties and i thus not usable in script mode - if(NOT SCRIPT_MODE) - FetchContent_Declare(${DEPENDENCY_INFO} - SOURCE_DIR "${DEPENDENCY_SOURCE_DIR}" - BINARY_DIR "${DEPENDENCY_BINARY_DIR}" - SUBBUILD_DIR "${DEPENDENCY_SUBBUILD_DIR}") - endif() + # Check if someone has run FetchContent_Declare(${DEPENDENCY_INFO}) before + # If this is a repository, compare revisions - # Handle dependency - if(NOT EXISTS "${DEPENDENCY_SOURCE_DIR}" OR NOT REPOMAN_DEPENDENCIES_USE_WORKSPACE) - # Define and fetch dependencies - FetchContent_GetProperties(${REPOMAN_DEPENDENCY_NAME} POPULATED IS_POPULATED) - if(NOT IS_POPULATED) - message(STATUS "Initializing in '${DEPENDENCY_SOURCE_DIR}'") - - if(SCRIPT_MODE) - # Script mode without FetchContent_Declare(): define and provide - FetchContent_Populate(${DEPENDENCY_INFO} - SOURCE_DIR "${DEPENDENCY_SOURCE_DIR}" - BINARY_DIR "${DEPENDENCY_BINARY_DIR}" - SUBBUILD_DIR "${DEPENDENCY_SUBBUILD_DIR}") - else() - # Inside a CMake project: dependency has been declared with FetchContent_Declare() above. - FetchContent_Populate(${REPOMAN_DEPENDENCY_NAME}) - endif() - - if(NOT REPOMAN_DEPENDENCY_URI) - string(TOLOWER ${REPOMAN_DEPENDENCY_NAME} LOWER_NAME) - string(TOUPPER ${REPOMAN_DEPENDENCY_NAME} UPPER_NAME) - set(FETCHCONTENT_SOURCE_DIR_${UPPER_NAME} "${${LOWER_NAME}_SOURCE_DIR}") - endif() - endif() + # Set depedency directories + if(NOT REPOMAN_DEPENDENCIES_USE_WORKSPACE) + # Depend on standard CMake behavior for choosing paths, let CMake decide where to save data + message(STATUS "FetchContent_Declare()") + FetchContent_Declare(${DEPENDENCY_INFO}) else() - # Dependency already exists, show status information - string(TOLOWER ${REPOMAN_DEPENDENCY_NAME} LOWER_NAME) - set(FETCH_CONTENT_PREFIX "_FetchContent_${LOWER_NAME}") - - set_property(GLOBAL PROPERTY "${FETCH_CONTENT_PREFIX}_sourceDir" "${DEPENDENCY_SOURCE_DIR}") - set_property(GLOBAL PROPERTY "${FETCH_CONTENT_PREFIX}_binaryDir" "${DEPENDENCY_BINARY_DIR}") - set_property(GLOBAL PROPERTY "${FETCH_CONTENT_PREFIX}_populated" TRUE) - - file(MAKE_DIRECTORY "${DEPENDENCY_BINARY_DIR}") - - if(OVERWRITE_REVISION AND NOT REPOMAN_DEPENDENCY_REVISION STREQUAL OVERWRITE_REVISION) - # Print message in case a dependency is overridden by a parent. - message(STATUS "Dependency '${REPOMAN_DEPENDENCY_NAME} @ ${REPOMAN_DEPENDENCY_REVISION}' is overridden with '${REPOMAN_DEPENDENCY_NAME} @ ${OVERWRITE_REVISION}'") - set(REPOMAN_DEPENDENCY_REVISION ${OVERWRITE_REVISION}) - endif() + set(DEPENDENCY_SOURCE_DIR ${REPOMAN_WORKSPACE}/${REPOMAN_DEPENDENCY_NAME}) - if (EXISTS ${DEPENDENCY_SOURCE_DIR}/.git AND NOT OVERWRITE_REVISION) - # Show status of local repository - # Only supports git for now - set(NAME ${REPOMAN_DEPENDENCY_NAME}) - set(REPO ${DEPENDENCY_SOURCE_DIR}) - set(EXPECTED_REVISION ${REPOMAN_DEPENDENCY_REVISION}) - set(EXPECTED_REMOTE ${REPOMAN_DEPENDENCY_URI}) - include(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/RepoManStatus.cmake) + # If dependency exists in workspace, use it instead of the entry in the configuration file. + # You reach here also on subsequent CMake calls. + if(EXISTS "${DEPENDENCY_SOURCE_DIR}") + message(STATUS "Using dependency found in '${DEPENDENCY_SOURCE_DIR}'") + message("Calling FetchContent_Declare(${REPOMAN_DEPENDENCY_NAME} SOURCE_DIR \"${DEPENDENCY_SOURCE_DIR}\")") + FetchContent_Declare(${REPOMAN_DEPENDENCY_NAME} SOURCE_DIR "${DEPENDENCY_SOURCE_DIR}") + else() + # Declare the dependency using the original arguments but tell CMake to store the files in the workspace + message(STATUS "FetchContent_Declare(${DEPENDENCY_INFO} SOURCE_DIR \"${DEPENDENCY_SOURCE_DIR}\")") + FetchContent_Declare(${DEPENDENCY_INFO} SOURCE_DIR "${DEPENDENCY_SOURCE_DIR}") endif() endif() + endforeach() - set_property(GLOBAL PROPERTY ${REPOMAN_DEPENDENCY_NAME}_EXPECTED_REVISION ${REPOMAN_DEPENDENCY_REVISION}) - set_property(GLOBAL PROPERTY ${REPOMAN_DEPENDENCY_NAME}_EXPECTED_REMOTE ${REPOMAN_DEPENDENCY_URI}) + get_property(REPOMAN_DEPENDENCIES GLOBAL PROPERTY GLOBAL_REPOMAN_DEPENDENCIES) + + message(STATUS "!!!!!!!!!!!!!! REPOMAN_DEPENDENCIES = ${REPOMAN_DEPENDENCIES}") + + foreach(REPOMAN_DEPENDENCY_NAME IN LISTS REPOMAN_DEPENDENCIES) + message(STATUS "!!!!!!!!!!!!!! Populating ${REPOMAN_DEPENDENCY_NAME}") + FetchContent_MakeAvailable(${REPOMAN_DEPENDENCY_NAME}) endforeach() + # message(FATAL_ERROR "Stopping her for DEBUG.") + + # # Handle dependency + # if(NOT EXISTS "${DEPENDENCY_SOURCE_DIR}" OR NOT REPOMAN_DEPENDENCIES_USE_WORKSPACE) + # # Define and fetch dependencies + # FetchContent_GetProperties(${REPOMAN_DEPENDENCY_NAME} POPULATED IS_POPULATED) + + # if(NOT IS_POPULATED) + # message(STATUS "Initializing in '${DEPENDENCY_SOURCE_DIR}'") + + # # Inside a CMake project: dependency has been declared with FetchContent_Declare() above. + # FetchContent_Populate(${REPOMAN_DEPENDENCY_NAME}) + + # if(NOT REPOMAN_DEPENDENCY_URI) + # string(TOLOWER ${REPOMAN_DEPENDENCY_NAME} LOWER_NAME) + # string(TOUPPER ${REPOMAN_DEPENDENCY_NAME} UPPER_NAME) + # set(FETCHCONTENT_SOURCE_DIR_${UPPER_NAME}"${${LOWER_NAME}_SOURCE_DIR}") + # endif() + # endif() + # else() + # # Dependency already exists, show status information + # string(TOLOWER ${REPOMAN_DEPENDENCY_NAME} LOWER_NAME) + # set(FETCH_CONTENT_PREFIX "_FetchContent_${LOWER_NAME}") + + # set_property(GLOBAL PROPERTY "${FETCH_CONTENT_PREFIX}_sourceDir" "${DEPENDENCY_SOURCE_DIR}") + # set_property(GLOBAL PROPERTY "${FETCH_CONTENT_PREFIX}_binaryDir" "${DEPENDENCY_BINARY_DIR}") + # set_property(GLOBAL PROPERTY "${FETCH_CONTENT_PREFIX}_populated " TRUE) + + # file(MAKE_DIRECTORY "${DEPENDENCY_BINARY_DIR}") + + # if(OVERWRITE_REVISION AND NOT REPOMAN_DEPENDENCY_REVISION STREQUAL OVERWRITE_REVISION) + # # Print message in case a dependency is overridden by a parent. + # message(STATUS "Dependency '${REPOMAN_DEPENDENCY_NAME} @ ${REPOMAN_DEPENDENCY_REVISION}' is overridden with '${REPOMAN_DEPENDENCY_NAME} @ ${OVERWRITE_REVISION}' ") + # set(REPOMAN_DEPENDENCY_REVISION ${OVERWRITE_REVISION}) + # endif() + + # if(EXISTS ${DEPENDENCY_SOURCE_DIR}/.git AND NOT OVERWRITE_REVISION) + # # Show status of local repository + # # Only supports git for now + # set(NAME ${REPOMAN_DEPENDENCY_NAME}) + # set(REPO ${DEPENDENCY_SOURCE_DIR}) + # set(EXPECTED_REVISION ${REPOMAN_DEPENDENCY_REVISION}) + # set(EXPECTED_REMOTE ${REPOMAN_DEPENDENCY_URI}) + # include(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/RepoManStatus.cmake) + # endif() + # set_property(GLOBAL PROPERTY ${REPOMAN_DEPENDENCY_NAME}_EXPECTED_REVISION ${REPOMAN_DEPENDENCY_REVISION}) + # set_property(GLOBAL PROPERTY ${REPOMAN_DEPENDENCY_NAME}_EXPECTED_REMOTE ${REPOMAN_DEPENDENCY_URI}) + # Include dependencies as sub-projects and resolve their dependencies - foreach(DEPENDENCY IN LISTS REPOMAN_DEPENDENCIES) - get_property(ADDED GLOBAL PROPERTY ${DEPENDENCY}_ADDED) - string(TOLOWER ${DEPENDENCY} NAME) + # foreach(DEPENDENCY IN LISTS REPOMAN_DEPENDENCIES) + # get_property(ADDED GLOBAL PROPERTY ${DEPENDENCY}_ADDED) + # string(TOLOWER ${DEPENDENCY} NAME) - FetchContent_GetProperties(${NAME}) + # FetchContent_GetProperties(${NAME}) - # Add not-yet included dependencies - if(NOT ADDED AND ${NAME}_POPULATED) - repoman__internal__handle_dependencies(${${NAME}_SOURCE_DIR}) - if(NOT SCRIPT_MODE) - # add_subdirectory() does not work in script mode - add_subdirectory(${${NAME}_SOURCE_DIR} ${${NAME}_BINARY_DIR}) - endif() - set_property(GLOBAL PROPERTY ${DEPENDENCY}_ADDED TRUE) - endif() - endforeach() + # # Add not-yet included dependencies + # if(NOT ADDED AND ${NAME}_POPULATED) + # repoman__internal__handle_dependencies(${${NAME}_SOURCE_DIR}) + + # message(***** !!!!! *****) + # message("Calling add_subdirectory(${${NAME}_SOURCE_DIR} ${${NAME}_BINARY_DIR}) ") + + # add_subdirectory(${${NAME}_SOURCE_DIR} ${${NAME}_BINARY_DIR}) + + # set_property(GLOBAL PROPERTY ${DEPENDENCY}_ADDED TRUE) + # endif() + # endforeach() endif() endfunction() @@ -303,20 +313,24 @@ endfunction() # Prints a summary of requested and provided dependencies. function(repoman__internal__print_summary) get_property(REPOMAN_DEPENDENCIES GLOBAL PROPERTY GLOBAL_REPOMAN_DEPENDENCIES) + if(REPOMAN_DEPENDENCIES) - message(STATUS "Dependencies:") + message(STATUS "Dependencies: ") + foreach(DEPENDENCY IN LISTS REPOMAN_DEPENDENCIES) get_property(REVISION GLOBAL PROPERTY ${DEPENDENCY}_REVISION) get_property(ALL_REVISIONS GLOBAL PROPERTY ${DEPENDENCY}_REQUESTED_REVISIONS) list(LENGTH ALL_REVISIONS REVISION_COUNT) + if(REVISION_COUNT GREATER 1) string(REPLACE ";" ", " ALL_REVISIONS "${ALL_REVISIONS}") - set(CHOICES ", chosen from [${ALL_REVISIONS}]") + set(CHOICES ", chosen from [${ALL_REVISIONS}] ") else() set(CHOICES "") endif() - message(STATUS " ${DEPENDENCY} @ ${REVISION}${CHOICES}") + + message(STATUS "${DEPENDENCY} @ ${REVISION}${CHOICES}") endforeach() endif() endfunction() @@ -325,36 +339,33 @@ endfunction() repoman__internal__handle_dependencies(${PROJECT_SOURCE_DIR}) # Print summary after resolving all dependencies. -if(SCRIPT_MODE) - repoman__internal__print_summary() - file(REMOVE_RECURSE "${FETCHCONTENT_BASE_DIR}") -else() - if(NOT TARGET repoman-status) - get_property(REPOMAN_DEPENDENCIES GLOBAL PROPERTY GLOBAL_REPOMAN_DEPENDENCIES) +if(NOT TARGET repoman-status) + get_property(REPOMAN_DEPENDENCIES GLOBAL PROPERTY GLOBAL_REPOMAN_DEPENDENCIES) - if(REPOMAN_DEPENDENCIES) - foreach(DEPENDENCY IN LISTS REPOMAN_DEPENDENCIES) - get_property(DEPENDENCY_SOURCE_DIR GLOBAL PROPERTY ${DEPENDENCY}_SOURCE_DIR) - get_property(DEPENDENCY_EXPECTED_REVISION GLOBAL PROPERTY ${DEPENDENCY}_EXPECTED_REVISION) - get_property(DEPENDENCY_EXPECTED_REMOTE GLOBAL PROPERTY ${DEPENDENCY}_EXPECTED_REMOTE) - if (EXISTS ${${DEPENDENCY}_SOURCE_DIR}/.git) - list(APPEND REPOMAN_STATUS_COMMANDS "COMMAND" "${CMAKE_COMMAND}" "-DNAME=${DEPENDENCY}" "-DREPO=${${DEPENDENCY}_SOURCE_DIR}" "-DEXPECTED_REVISION=${DEPENDENCY_EXPECTED_REVISION}" "-DEXPECTED_REMOTE=${DEPENDENCY_EXPECTED_REMOTE}" "-P" "${CMAKE_CURRENT_LIST_DIR}/RepoManStatus.cmake") - endif() - endforeach() + if(REPOMAN_DEPENDENCIES) + foreach(DEPENDENCY IN LISTS REPOMAN_DEPENDENCIES) + get_property(DEPENDENCY_SOURCE_DIR GLOBAL PROPERTY ${DEPENDENCY}_SOURCE_DIR) + get_property(DEPENDENCY_EXPECTED_REVISION GLOBAL PROPERTY ${DEPENDENCY}_EXPECTED_REVISION) + get_property(DEPENDENCY_EXPECTED_REMOTE GLOBAL PROPERTY ${DEPENDENCY}_EXPECTED_REMOTE) - add_custom_target(repoman-status - ${REPOMAN_STATUS_COMMANDS}) - endif() - endif() + if(EXISTS ${${DEPENDENCY}_SOURCE_DIR}/.git) + list(APPEND REPOMAN_STATUS_COMMANDS "COMMAND" "${CMAKE_COMMAND}" "-DNAME=${DEPENDENCY}" "-DREPO=${${DEPENDENCY}_SOURCE_DIR}" "-DEXPECTED_REVISION=${DEPENDENCY_EXPECTED_REVISION}" "-DEXPECTED_REMOTE=${DEPENDENCY_EXPECTED_REMOTE}" "-P" "${CMAKE_CURRENT_LIST_DIR}/RepoManStatus.cmake ") + endif() + endforeach() - get_property(DEFER_INSTALLED GLOBAL PROPERTY REPOMAN_DEFER_INSTALLED) - if(NOT DEFER_INSTALLED) - cmake_language(DEFER DIRECTORY "${CMAKE_SOURCE_DIR}" ID repo_man_summary CALL repoman__internal__print_summary) - set_property(GLOBAL PROPERTY REPOMAN_DEFER_INSTALLED TRUE) + add_custom_target(repoman-status + ${REPOMAN_STATUS_COMMANDS}) endif() endif() +get_property(DEFER_INSTALLED GLOBAL PROPERTY REPOMAN_DEFER_INSTALLED) + +if(NOT DEFER_INSTALLED) + cmake_language(DEFER DIRECTORY "${CMAKE_SOURCE_DIR}" ID repo_man_summary CALL repoman__internal__print_summary) + set_property(GLOBAL PROPERTY REPOMAN_DEFER_INSTALLED TRUE) +endif() + # Prevent setup function to be called from outside after inclusion function(repoman__internal__handle_dependencies) - message(FATAL_ERROR "Please do not call any RepoMan functions. Including the module is sufficient.") -endfunction() + message(FATAL_ERROR "Please do not call any RepoMan functions. Including the module is sufficient. ") +endfunction() \ No newline at end of file diff --git a/RepoManResolve.cmake b/RepoManResolve.cmake index 14dfb6c..c1fe890 100755 --- a/RepoManResolve.cmake +++ b/RepoManResolve.cmake @@ -1,4 +1,4 @@ -#!/usr/bin/env -S cmake -P +# !/usr/bin/env -S cmake -P #[[ This script can be used to resolve dependencies without a top-level CMake project. @@ -9,5 +9,7 @@ It can be called either via ``RepoManResolve.cmake`` or more traditionally via ` The working/project directory is always the current directory. Only call this script while in your project root directory. #]] -cmake_path(GET CMAKE_SCRIPT_MODE_FILE PARENT_PATH SCRIPT_PATH) -include(${SCRIPT_PATH}/RepoMan.cmake) +error("This script is broken and can no longer work") + +# cmake_path(GET CMAKE_SCRIPT_MODE_FILE PARENT_PATH SCRIPT_PATH) +# include(${SCRIPT_PATH}/RepoMan.cmake)