|
| 1 | +# based on github.com/gemini3d/external |
| 2 | + |
| 3 | +include_guard() |
| 4 | + |
| 5 | +include(ExternalProject) |
| 6 | + |
| 7 | +if(CMAKE_VERSION VERSION_LESS 3.19) |
| 8 | + message(FATAL_ERROR "CMake >= 3.19 required to use JSON") |
| 9 | +endif() |
| 10 | + |
| 11 | +file(READ ${CMAKE_CURRENT_LIST_DIR}/libraries.json json) |
| 12 | + |
| 13 | + |
| 14 | +function(extproj name cmake_args byproducts depends) |
| 15 | + |
| 16 | +# PREPEND so that user arguments can override these defaults |
| 17 | +list(PREPEND cmake_args |
| 18 | +-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX} |
| 19 | +-DCMAKE_PREFIX_PATH:PATH=${CMAKE_INSTALL_PREFIX} |
| 20 | +-DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS} |
| 21 | +-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} |
| 22 | +-DBUILD_TESTING:BOOL=false |
| 23 | +-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} |
| 24 | +-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} |
| 25 | +-DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER} |
| 26 | +) |
| 27 | +if(CMAKE_TOOLCHAIN_FILE) |
| 28 | + list(APPEND cmake_args -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_TOOLCHAIN_FILE}) |
| 29 | +endif() |
| 30 | + |
| 31 | +# builds each project in parallel, without needing to build all projects simultaneously in parallel. |
| 32 | +# this greatly aids debugging while maintaining speed of build overall. |
| 33 | +if(CMAKE_GENERATOR MATCHES "Makefiles" AND NOT DEFINED ENV{CMAKE_BUILD_PARALLEL_LEVEL}) |
| 34 | + cmake_host_system_information(RESULT Ncpu QUERY NUMBER_OF_PHYSICAL_CORES) |
| 35 | +endif() |
| 36 | +set(build_parallel ${CMAKE_COMMAND} --build <BINARY_DIR> --parallel ${Ncpu}) |
| 37 | + |
| 38 | +string(JSON url GET ${json} ${name} url) |
| 39 | +if(url MATCHES ".git$") |
| 40 | + |
| 41 | + string(JSON tag GET ${json} ${name} tag) |
| 42 | + |
| 43 | + set(download_args |
| 44 | + GIT_REPOSITORY ${url} |
| 45 | + GIT_TAG ${tag} |
| 46 | + GIT_SHALLOW true |
| 47 | + GIT_PROGRESS true |
| 48 | + ) |
| 49 | + |
| 50 | +else() |
| 51 | + |
| 52 | + set(download_args |
| 53 | + URL ${url} |
| 54 | + ) |
| 55 | + |
| 56 | +endif() |
| 57 | + |
| 58 | + |
| 59 | +# BUILD_BYPRODUCTS is vital for Ninja, else build-time error "missing and no known rule to make it" |
| 60 | + |
| 61 | +ExternalProject_Add(${name} |
| 62 | +${download_args} |
| 63 | +BUILD_COMMAND ${build_parallel} |
| 64 | +TEST_COMMAND "" |
| 65 | +CMAKE_ARGS ${cmake_args} |
| 66 | +DEPENDS ${depends} |
| 67 | +BUILD_BYPRODUCTS ${byproducts} |
| 68 | +INACTIVITY_TIMEOUT 60 |
| 69 | +CONFIGURE_HANDLED_BY_BUILD true |
| 70 | +USES_TERMINAL_DOWNLOAD true |
| 71 | +USES_TERMINAL_UPDATE true |
| 72 | +USES_TERMINAL_BUILD true |
| 73 | +USES_TERMINAL_INSTALL true |
| 74 | +USES_TERMINAL_TEST true |
| 75 | +) |
| 76 | + |
| 77 | +endfunction(extproj) |
0 commit comments