From 812d2db1ba78453ddbcb3a91b99b0e2228b4b89d Mon Sep 17 00:00:00 2001 From: Lars Bilke <lars.bilke@ufz.de> Date: Thu, 1 Jul 2021 15:16:32 +0200 Subject: [PATCH] [cmake] Added module BuildExternalProject. https://github.com/Sbte/BuildExternalProject/commit/ce1a70996aa538aac17a6faf07db487c3a238838 --- scripts/cmake/BuildExternalProject.cmake | 87 ++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 scripts/cmake/BuildExternalProject.cmake diff --git a/scripts/cmake/BuildExternalProject.cmake b/scripts/cmake/BuildExternalProject.cmake new file mode 100644 index 00000000000..2a971810bf5 --- /dev/null +++ b/scripts/cmake/BuildExternalProject.cmake @@ -0,0 +1,87 @@ +macro (BuildExternalProject_find_package target) + set(build_dir ${CMAKE_BINARY_DIR}/external/build_${target}) + + # Set CMake prefix path so we can look there for the module + set(_CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH}) + mark_as_advanced(_CMAKE_PREFIX_PATH) + list(APPEND CMAKE_PREFIX_PATH ${build_dir}) + + find_package(${target} MODULE QUIET) + if (NOT ${target}_FOUND) + # Look for config version if there was no module + find_package(${target} CONFIG REQUIRED HINTS ${build_dir} NO_DEFAULT_PATH) + endif() + + # Set CMake prefix path back to what it was + set(CMAKE_PREFIX_PATH ${_CMAKE_PREFIX_PATH}) + unset(_CMAKE_PREFIX_PATH) +endmacro() + +function (BuildExternalProject target) + set(build_dir ${CMAKE_BINARY_DIR}/external/build_${target}) + + message(STATUS "Building ${target}") + + file(MAKE_DIRECTORY ${build_dir}) + + set(CMAKE_LIST_CONTENT " + cmake_minimum_required(VERSION 2.8.2) + + include(ExternalProject) + ExternalProject_add(${target} + PREFIX ${build_dir} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> + LOG_DOWNLOAD ON + LOG_UPDATE ON + LOG_CONFIGURE ON + LOG_BUILD ON + LOG_TEST ON + LOG_INSTALL ON + ${ARGN} + ) + + add_custom_target(build_${target}) + add_dependencies(build_${target} ${target}) + ") + + if (EXISTS ${build_dir}/CMakeLists.txt) + file(SHA256 ${build_dir}/CMakeLists.txt file_sha) + string(SHA256 new_sha "${CMAKE_LIST_CONTENT}") + + if (NOT file_sha STREQUAL new_sha) + file(WRITE ${build_dir}/CMakeLists.txt "${CMAKE_LIST_CONTENT}") + BuildExternalProject_configure(${build_dir}) + endif() + else() + file(WRITE ${build_dir}/CMakeLists.txt "${CMAKE_LIST_CONTENT}") + BuildExternalProject_configure(${build_dir}) + endif() + + BuildExternalProject_build(${build_dir}) + + message(STATUS "Finished building ${target}") +endfunction() + +function (BuildExternalProject_configure build_dir) + execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE result + WORKING_DIRECTORY ${build_dir} + OUTPUT_QUIET + ) + + if(result) + message(FATAL_ERROR "CMake step for external project failed: ${result}") + endif() +endfunction() + +function (BuildExternalProject_build build_dir) + execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${build_dir} + OUTPUT_QUIET + ) + + if(result) + message(FATAL_ERROR "Build step for external project failed: ${result}") + endif() +endfunction() \ No newline at end of file -- GitLab