commit b1ecba32a48b1a8bba558a6a07694ca5d3adce39 Author: Patrick Maschek Date: Mon Aug 26 00:45:24 2024 +0200 Initial commit with first draft diff --git a/README.md b/README.md new file mode 100644 index 0000000..77936e8 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Git Module Manager for CMake + +A simple function which clones a git repository and includes it's CMake project + +## Usage + +1. download the file module-manager.cmake +2. include the file in your CMakeLists.txt + +``include(module-manager.cmake) + +load_module(TestModule SOURCE "http://git.fritz.box/Patrick/cmake-module-manager.git" UPDATE)`` diff --git a/module-manager.cmake b/module-manager.cmake new file mode 100644 index 0000000..4efa0e2 --- /dev/null +++ b/module-manager.cmake @@ -0,0 +1,66 @@ +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() +