From d3ecd23926973faeb5294d16273b36402373e4bd Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Mon, 12 Jan 2026 22:36:04 +0100 Subject: [PATCH 1/2] fix: only build external dependencies that are actually needed Previously, build_all_external_dependencies() unconditionally called all build functions (build_hdf5, build_netcdf_c, etc.) regardless of which dependencies were actually needed. This caused CMake errors like "add_library cannot create imported target 'hdf5::hdf5' because another target with the same name already exists" when system HDF5/NetCDF were usable but only FFTW needed to be built from source. Now each build function is only called if its corresponding NEED_BUILD_* variable is TRUE. Co-Authored-By: Claude Opus 4.5 --- cmake/BuildExternalDependencies.cmake | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cmake/BuildExternalDependencies.cmake b/cmake/BuildExternalDependencies.cmake index 5c182858..534186f2 100644 --- a/cmake/BuildExternalDependencies.cmake +++ b/cmake/BuildExternalDependencies.cmake @@ -250,7 +250,7 @@ function(build_fftw) endfunction() #------------------------------------------------------------------------------ -# Build all dependencies in order +# Build all dependencies in order (only those that are needed) #------------------------------------------------------------------------------ function(build_all_external_dependencies) message(STATUS "") @@ -258,10 +258,16 @@ function(build_all_external_dependencies) message(STATUS "Installation prefix: ${DEPS_PREFIX}") message(STATUS "") - build_hdf5() - build_netcdf_c() - build_netcdf_fortran() - build_fftw() + if(NEED_BUILD_HDF5) + build_hdf5() + endif() + if(NEED_BUILD_NETCDF) + build_netcdf_c() + build_netcdf_fortran() + endif() + if(NEED_BUILD_FFTW) + build_fftw() + endif() message(STATUS "") message(STATUS "=== External Dependencies Configured ===") From 5e0560a997d1f88882f51133e46f86e12ecfde50 Mon Sep 17 00:00:00 2001 From: Christopher Albert Date: Tue, 13 Jan 2026 01:11:26 +0100 Subject: [PATCH 2/2] fix: add DOWNLOAD_EXTRACT_TIMESTAMP and target guards for robustness - Add DOWNLOAD_EXTRACT_TIMESTAMP TRUE to HDF5 and FFTW ExternalProject_Add calls to silence CMP0135 policy warning - Add if(NOT TARGET) guards when creating HDF5 imported targets for extra robustness in case find_package already created them Co-Authored-By: Claude Opus 4.5 --- cmake/BuildExternalDependencies.cmake | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/cmake/BuildExternalDependencies.cmake b/cmake/BuildExternalDependencies.cmake index 534186f2..c43c1d90 100644 --- a/cmake/BuildExternalDependencies.cmake +++ b/cmake/BuildExternalDependencies.cmake @@ -45,6 +45,7 @@ function(build_hdf5) SOURCE_DIR ${DEPS_SOURCE_DIR}/hdf5 BINARY_DIR ${DEPS_BUILD_DIR}/hdf5 INSTALL_DIR ${DEPS_PREFIX} + DOWNLOAD_EXTRACT_TIMESTAMP TRUE CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DHDF5_BUILD_FORTRAN=ON @@ -68,12 +69,25 @@ function(build_hdf5) # Create imported targets that the main build can use # HDF5 creates separate C stub libraries for Fortran bindings - add_library(hdf5::hdf5 STATIC IMPORTED GLOBAL) - add_library(hdf5::hdf5_hl STATIC IMPORTED GLOBAL) - add_library(hdf5::hdf5_f90cstub STATIC IMPORTED GLOBAL) - add_library(hdf5::hdf5_hl_f90cstub STATIC IMPORTED GLOBAL) - add_library(hdf5::hdf5_fortran STATIC IMPORTED GLOBAL) - add_library(hdf5::hdf5_hl_fortran STATIC IMPORTED GLOBAL) + # Use if(NOT TARGET) guards in case find_package already created these targets + if(NOT TARGET hdf5::hdf5) + add_library(hdf5::hdf5 STATIC IMPORTED GLOBAL) + endif() + if(NOT TARGET hdf5::hdf5_hl) + add_library(hdf5::hdf5_hl STATIC IMPORTED GLOBAL) + endif() + if(NOT TARGET hdf5::hdf5_f90cstub) + add_library(hdf5::hdf5_f90cstub STATIC IMPORTED GLOBAL) + endif() + if(NOT TARGET hdf5::hdf5_hl_f90cstub) + add_library(hdf5::hdf5_hl_f90cstub STATIC IMPORTED GLOBAL) + endif() + if(NOT TARGET hdf5::hdf5_fortran) + add_library(hdf5::hdf5_fortran STATIC IMPORTED GLOBAL) + endif() + if(NOT TARGET hdf5::hdf5_hl_fortran) + add_library(hdf5::hdf5_hl_fortran STATIC IMPORTED GLOBAL) + endif() # For static linking, specify all dependencies explicitly to ensure correct link order set_target_properties(hdf5::hdf5 PROPERTIES @@ -218,6 +232,7 @@ function(build_fftw) SOURCE_DIR ${DEPS_SOURCE_DIR}/fftw BINARY_DIR ${DEPS_BUILD_DIR}/fftw INSTALL_DIR ${DEPS_PREFIX} + DOWNLOAD_EXTRACT_TIMESTAMP TRUE CMAKE_ARGS ${COMMON_CMAKE_ARGS} -DCMAKE_POLICY_VERSION_MINIMUM=3.5