From 94f5d50ffc71e702b1f2ac3d277387123075b922 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 22 Jun 2026 06:32:30 +0200 Subject: [PATCH] chore(build): cache FetchContent dependencies across build directories (#7221) Co-authored-by: Claude Opus 4.6 (1M context) --- CMakeLists.txt | 16 ++++++++++++++++ CMakePresets.json | 22 +++++++++++++--------- cmake/FetchGtest.cmake | 4 +++- cmake/FetchImgui.cmake | 6 ++---- cmake/FetchMaxLibQt.cmake | 4 ++-- cmake/FetchMiniz.cmake | 4 ++-- cmake/FetchWamr.cmake | 1 + cmake/FetchYamlCpp.cmake | 4 ++-- tools/build-wasm-modules.sh | 2 +- 9 files changed, 42 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 71b8c217e..0655d8c0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,19 @@ set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}) option(EdgeTX_SUPERBUILD "Cross-compile EdgeTX for each toolchain" ON) include(ExternalProject) +# Cache FetchContent downloads in a shared directory so that multiple build +# directories (and rebuilds after a clean) reuse already-fetched dependencies. +# Priority: -D flag > $ENV{FETCHCONTENT_BASE_DIR} > default (.cache/fetchcontent) +if(NOT FETCHCONTENT_BASE_DIR) + if(DEFINED ENV{FETCHCONTENT_BASE_DIR}) + set(FETCHCONTENT_BASE_DIR "$ENV{FETCHCONTENT_BASE_DIR}" CACHE PATH + "Shared cache for FetchContent downloads" FORCE) + else() + set(FETCHCONTENT_BASE_DIR "${CMAKE_SOURCE_DIR}/.cache/fetchcontent" CACHE PATH + "Shared cache for FetchContent downloads" FORCE) + endif() +endif() + if(EdgeTX_SUPERBUILD) include(Macros) CollectCommandLineArgs(CMAKE_ARGS) @@ -53,6 +66,7 @@ if(EdgeTX_SUPERBUILD) -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_SOURCE_DIR}/cmake/toolchain/native.cmake -DEdgeTX_SUPERBUILD:BOOL=0 -DNATIVE_BUILD:BOOL=1 + -DFETCHCONTENT_BASE_DIR:PATH=${FETCHCONTENT_BASE_DIR} INSTALL_COMMAND "" EXCLUDE_FROM_ALL TRUE ) @@ -66,6 +80,7 @@ if(EdgeTX_SUPERBUILD) -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_SOURCE_DIR}/cmake/toolchain/arm-none-eabi.cmake -DEdgeTX_SUPERBUILD:BOOL=0 -DNATIVE_BUILD:BOOL=0 + -DFETCHCONTENT_BASE_DIR:PATH=${FETCHCONTENT_BASE_DIR} INSTALL_COMMAND "" EXCLUDE_FROM_ALL TRUE ) @@ -92,6 +107,7 @@ if(EdgeTX_SUPERBUILD) -B ${CMAKE_BINARY_DIR}/wasm -DEDGETX_SOURCE_DIR=${CMAKE_SOURCE_DIR} -DEDGETX_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DFETCHCONTENT_BASE_DIR=${FETCHCONTENT_BASE_DIR} ${CMAKE_ARGS} COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/wasm ) diff --git a/CMakePresets.json b/CMakePresets.json index 86ad11bb6..e5f730766 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -1,43 +1,47 @@ { "version": 6, "configurePresets": [ + { + "name": "default", + "hidden": true, + "cacheVariables": { + "FETCHCONTENT_BASE_DIR": "${sourceDir}/.cache/fetchcontent" + }, + "warnings": { + "dev": false + } + }, { "name": "firmware", + "inherits": "default", "displayName": "Firmware", "binaryDir": "build/fw", "toolchainFile": "cmake/toolchain/arm-none-eabi.cmake", "cacheVariables": { "EdgeTX_SUPERBUILD": false, "NATIVE_BUILD": false - }, - "warnings": { - "dev": false } }, { "name": "companion", + "inherits": "default", "displayName": "Companion", "binaryDir": "build/companion", "toolchainFile": "cmake/toolchain/native.cmake", "cacheVariables": { "EdgeTX_SUPERBUILD": false, "NATIVE_BUILD": true - }, - "warnings": { - "dev": false } }, { "name": "simu", + "inherits": "default", "displayName": "SDL Simu", "binaryDir": "build/simu", "toolchainFile": "cmake/toolchain/native.cmake", "cacheVariables": { "EdgeTX_SUPERBUILD": false, "NATIVE_BUILD": true - }, - "warnings": { - "dev": false } } ], diff --git a/cmake/FetchGtest.cmake b/cmake/FetchGtest.cmake index 7cd98ae6a..8d61609ce 100644 --- a/cmake/FetchGtest.cmake +++ b/cmake/FetchGtest.cmake @@ -5,7 +5,9 @@ include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest - GIT_TAG f8d7d77c06936315286eb55f8de22cd23c188571 # v1.14.0 + GIT_TAG v1.14.0 # f8d7d77c06936315286eb55f8de22cd23c188571 + GIT_SHALLOW TRUE + UPDATE_DISCONNECTED TRUE ) # For Windows: Prevent overriding the parent project's compiler/linker settings diff --git a/cmake/FetchImgui.cmake b/cmake/FetchImgui.cmake index cba13e14a..4b69933c3 100644 --- a/cmake/FetchImgui.cmake +++ b/cmake/FetchImgui.cmake @@ -4,10 +4,8 @@ include(FetchContent) FetchContent_Declare( imgui - GIT_REPOSITORY https://github.com/ocornut/imgui - GIT_TAG dbb5eeaadffb6a3ba6a60de1290312e5802dba5a # v1.91.8 - GIT_SHALLOW TRUE - UPDATE_DISCONNECTED TRUE + URL https://github.com/ocornut/imgui/archive/refs/tags/v1.92.6.tar.gz + DOWNLOAD_EXTRACT_TIMESTAMP true ) FetchContent_MakeAvailable(imgui) diff --git a/cmake/FetchMaxLibQt.cmake b/cmake/FetchMaxLibQt.cmake index eb053608e..d5f571dda 100644 --- a/cmake/FetchMaxLibQt.cmake +++ b/cmake/FetchMaxLibQt.cmake @@ -4,8 +4,8 @@ include(FetchContent) FetchContent_Declare( maxLibQt - GIT_REPOSITORY https://github.com/edgetx/maxLibQt - GIT_TAG 7e433da60d3f2e975d46afc91804a88029cd1b78 + URL https://github.com/edgetx/maxLibQt/archive/7e433da60d3f2e975d46afc91804a88029cd1b78.tar.gz + DOWNLOAD_EXTRACT_TIMESTAMP true ) FetchContent_MakeAvailable(maxLibQt) diff --git a/cmake/FetchMiniz.cmake b/cmake/FetchMiniz.cmake index 0ed59446a..0dd8350cd 100644 --- a/cmake/FetchMiniz.cmake +++ b/cmake/FetchMiniz.cmake @@ -4,8 +4,8 @@ include(FetchContent) FetchContent_Declare( miniz - GIT_REPOSITORY https://github.com/richgel999/miniz - GIT_TAG 89d7a5f6c3ce8893ea042b0a9d2a2d9975589ac9 + URL https://github.com/richgel999/miniz/archive/89d7a5f6c3ce8893ea042b0a9d2a2d9975589ac9.tar.gz + DOWNLOAD_EXTRACT_TIMESTAMP true ) FetchContent_MakeAvailable(miniz) diff --git a/cmake/FetchWamr.cmake b/cmake/FetchWamr.cmake index abce2f89a..defb032d2 100644 --- a/cmake/FetchWamr.cmake +++ b/cmake/FetchWamr.cmake @@ -23,6 +23,7 @@ FetchContent_Declare( GIT_REPOSITORY https://github.com/bytecodealliance/wasm-micro-runtime GIT_TAG WAMR-2.4.4 GIT_SHALLOW TRUE + UPDATE_DISCONNECTED TRUE ) # Populate separately so we can patch before building diff --git a/cmake/FetchYamlCpp.cmake b/cmake/FetchYamlCpp.cmake index e6e74e665..3c79f149f 100644 --- a/cmake/FetchYamlCpp.cmake +++ b/cmake/FetchYamlCpp.cmake @@ -4,8 +4,8 @@ include(FetchContent) FetchContent_Declare( yaml-cpp - GIT_REPOSITORY https://github.com/jbeder/yaml-cpp - GIT_TAG 28f93bdec6387d42332220afa9558060c8016795 + URL https://github.com/jbeder/yaml-cpp/archive/28f93bdec6387d42332220afa9558060c8016795.tar.gz + DOWNLOAD_EXTRACT_TIMESTAMP true ) FetchContent_MakeAvailable(yaml-cpp) diff --git a/tools/build-wasm-modules.sh b/tools/build-wasm-modules.sh index 205010bb1..32877bb23 100755 --- a/tools/build-wasm-modules.sh +++ b/tools/build-wasm-modules.sh @@ -81,7 +81,7 @@ file(WRITE "\${CMAKE_CURRENT_BINARY_DIR}/wasi_sdk_path.txt" "\${WASI_SDK_PATH}") CMAKEOF if ! cmake -S "$fetch_dir" -B "$fetch_dir/build" \ - -DFETCHCONTENT_BASE_DIR="$PWD/_deps" 2>&1; then + -DFETCHCONTENT_BASE_DIR="$SRCDIR/.cache/fetchcontent" 2>&1; then echo "❌ Failed to fetch WASI SDK" return 1 fi