cmake_minimum_required(VERSION 3.16) function(load_module MODULE_NAME) set(keyword_optional_args UPDATE RECURSIVE) set(keyword_single_arg_args SOURCE DESTINATION VERSION) set(keyword_multi_arg_args) cmake_parse_arguments(LOAD_MODULE ${keyword_optional_args} ${keyword_single_arg_args} ${keyword_multi_arg_args} ${ARGN}) if (NOT LOAD_MODULE_DESTINATION) set(LOAD_MODULE_DESTINATION "${CMAKE_CURRENT_LIST_DIR}/modules") endif() if (LOAD_MODULE_VERSION) set(MODULE_DIR_NAME "${MODULE_NAME}-${LOAD_MODULE_VERSION}") else() set(MODULE_DIR_NAME ${MODULE_NAME}) endif() set(MODULE_PATH "${LOAD_MODULE_DESTINATION}/${MODULE_DIR_NAME}") message(CHECK_START "Loading module ${MODULE_NAME}") if (EXISTS ${MODULE_PATH}) message(CHECK_PASS "Module already installed") if (LOAD_MODULE_UPDATE) message(CHECK_START "Updating Module ${MODULE_NAME}") execute_process( COMMAND git pull WORKING_DIRECTORY ${MODULE_PATH} RESULT_VARIABLE GIT_PULL_RESULT) if (GIT_PULL_RESULT EQUAL 0) message(CHECK_PASS "successful") else() message(CHECK_FAIL "failed") endif() endif() else() message(CHECK_FAIL "Module not installed") message(CHECK_START "Downloading module ${MODULE_NAME}") # Create module destination directory file(MAKE_DIRECTORY ${LOAD_MODULE_DESTINATION}) execute_process( COMMAND git clone ${LOAD_MODULE_SOURCE} ${MODULE_NAME} WORKING_DIRECTORY ${LOAD_MODULE_DESTINATION} RESULT_VARIABLE GIT_CLONE_RESULT) if (GIT_CLONE_RESULT EQUAL 0) message(CHECK_PASS "successful") else() message(CHECK_FAIL "failed") message(SEND_ERROR "Failed to load module ${MODULE_NAME}") return() endif() endif() add_subdirectory(${MODULE_PATH}) endfunction()