From 59e2ddfcf61b677aedff9e8e84ad9a5037eb5ee1 Mon Sep 17 00:00:00 2001 From: Jaime Calzada Date: Tue, 16 Dec 2025 14:50:10 -0500 Subject: [PATCH 1/2] fix Fortran module race condition in parallel builds Add explicit add_dependencies() to utility CMakeLists.txt files to ensure utillib is built before utilities that use its modules. This prevents "Cannot rename module file" errors when building with make -jN. Changes: - Grid_Scripts: add dependency for interpolate_unstructured - Pre-Processing: add dependencies for targets using utillib modules - Particle_Tracking: add dependency for ptrack3 - ArcGIS: fix incorrect schism_geometry link to utillib --- src/Utility/ArcGIS/CMakeLists.txt | 11 ++++++----- src/Utility/Grid_Scripts/CMakeLists.txt | 5 +++++ src/Utility/Particle_Tracking/CMakeLists.txt | 2 ++ src/Utility/Pre-Processing/CMakeLists.txt | 12 ++++++++++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Utility/ArcGIS/CMakeLists.txt b/src/Utility/ArcGIS/CMakeLists.txt index c982b99d7..113118fe5 100644 --- a/src/Utility/ArcGIS/CMakeLists.txt +++ b/src/Utility/ArcGIS/CMakeLists.txt @@ -1,10 +1,11 @@ - - add_executable( binary_2_ncstruc binary_2_ncstruc.f90) #add_executable( read_output7b_group_zfs2 read_output7b_group_zfs2.f90) - -target_link_libraries (binary_2_ncstruc ${NetCDFLIBS} ${HDF5_LIBRARIES} schism_geometry) -add_dependencies(utility binary_2_ncstruc read_output7b_group_zfs2) +# Link to utillib which contains stripesearch_unstr.f90 (called by binary_2_ncstruc) +target_link_libraries(binary_2_ncstruc ${NetCDFLIBS} ${HDF5_LIBRARIES} utillib) +target_include_directories(binary_2_ncstruc PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../UtilLib) +# Add dependency on utillib to ensure it's built before compilation +add_dependencies(binary_2_ncstruc utillib) +add_dependencies(utility binary_2_ncstruc) diff --git a/src/Utility/Grid_Scripts/CMakeLists.txt b/src/Utility/Grid_Scripts/CMakeLists.txt index 82525dcac..d9a409d0f 100644 --- a/src/Utility/Grid_Scripts/CMakeLists.txt +++ b/src/Utility/Grid_Scripts/CMakeLists.txt @@ -15,3 +15,8 @@ add_executable(mergegrid5 mergegrid5.f90) target_link_libraries(mergegrid5 utillib) target_include_directories(mergegrid5 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../UtilLib) add_dependencies(mergegrid5 utillib) + +# Add dependency on utillib for executables that define their own modules +# to ensure utillib modules are built first and avoid race conditions +# when multiple targets write .mod files to the shared include directory +add_dependencies(interpolate_unstructured utillib) diff --git a/src/Utility/Particle_Tracking/CMakeLists.txt b/src/Utility/Particle_Tracking/CMakeLists.txt index b0f7d9939..a8f7dc0d1 100644 --- a/src/Utility/Particle_Tracking/CMakeLists.txt +++ b/src/Utility/Particle_Tracking/CMakeLists.txt @@ -4,5 +4,7 @@ add_executable(ptrack3 ptrack3.f90) add_dependencies(utility ptrack3) ## ptrack4) target_link_libraries(ptrack3 utillib ${NetCDFLIBS} ${HDF5_LIBRARIES}) target_include_directories(ptrack3 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../UtilLib) +# Add dependency on utillib to ensure Fortran .mod files exist before compilation +add_dependencies(ptrack3 utillib) #target_link_libraries(ptrack4 utillib ${NetCDFLIBS} ${HDF5_LIBRARIES}) #target_include_directories(ptrack4 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../UtilLib) diff --git a/src/Utility/Pre-Processing/CMakeLists.txt b/src/Utility/Pre-Processing/CMakeLists.txt index f0db97a9b..3411ff1c6 100644 --- a/src/Utility/Pre-Processing/CMakeLists.txt +++ b/src/Utility/Pre-Processing/CMakeLists.txt @@ -58,3 +58,15 @@ target_link_libraries(gen_nudge_from_hycom utillib ${NetCDFLIBS} ${HDF5_LIBRARIE target_include_directories(gen_vqs_1 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../UtilLib) target_include_directories(gen_vqs_2masters PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../UtilLib) target_include_directories(gen_nudge_from_hycom PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../UtilLib) + +# Add dependencies on utillib for targets that use utillib modules +# to ensure Fortran .mod files exist before compilation +add_dependencies(convert_3Dth_nc utillib) +add_dependencies(convert_nudge_nc utillib) +add_dependencies(gen_vqs_1 utillib) +add_dependencies(gen_vqs_2masters utillib) +add_dependencies(gen_nudge_from_hycom utillib) + +# Add dependency for gen_source which defines its own 'module global' +# to avoid race conditions with other modules in the shared include directory +add_dependencies(gen_source utillib) From 58f33b1db3141128e55f422270692f04c00225c2 Mon Sep 17 00:00:00 2001 From: jreniel Date: Wed, 17 Dec 2025 11:07:48 -0400 Subject: [PATCH 2/2] update CMake policy CMP0074 from OLD to NEW Switch CMP0074 policy to NEW behavior to resolve deprecation warning. The OLD behavior will be removed in a future CMake version. The NEW behavior allows find_package() to properly use _ROOT variables for finding packages. --- src/CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bcbe80ffc..fc2985fa8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,9 +4,8 @@ cmake_minimum_required (VERSION 3.12) set(CMAKE_DISABLE_SOURCE_CHANGES ON) set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) -# This policy has to do with variables called _ROOT -# and possible collisions with module-finding. -cmake_policy(SET CMP0074 OLD) +# CMP0074: find_package() uses _ROOT variables +cmake_policy(SET CMP0074 NEW) enable_testing()