I'm trying to use CMake to build a static library consisting of one Fortran source file and a lot of object libraries from subdirectories. Try as I might, I always get an error like this:
[  0%] Building Fortran object modules/map/CMakeFiles/maplib_obj.dir/src/MAP_Fortran_Types.f90.o
cd /home/rcrozier/src/openfast-reos-git/build/modules/map && /usr/bin/gfortran -DHAS_FORTRAN2008_FEATURES -DOPENFAST_DOUBLE_PRECISION -DUSE_DLL_INTERFACE -I/home/rcrozier/src/openfast-reos-git/build/ftnmods  -DCOMPILE_SIMULINK -fpic  -ffree-line-length-none -cpp -fstack-reuse=none -fdefault-real-8 -O3 -DNDEBUG -O3 -J../../ftnmods   -c /home/rcrozier/src/openfast-reos-git/modules/map/src/MAP_Fortran_Types.f90 -o CMakeFiles/maplib_obj.dir/src/MAP_Fortran_Types.f90.o
/home/rcrozier/src/openfast-reos-git/modules/map/src/MAP_Fortran_Types.f90:34:4:
   34 | USE NWTC_Library
      |    1
Fatal Error: Cannot open module file ‘nwtc_library.mod’ for reading at (1): No such file or directory
My project structure is like this:
root_dir
|- CMakeLists.txt
|- nwtc-library
  |- CMakeLists.txt
  |- src
    |- nwtc_source_1.f90
    |- nwtc_source_2.f90
|- version
  |- CMakeLists.txt
  |- src
    |- VersionInfo.f90
|- lots_more_libraries
  |- CMakeLists.txt
  |- src
    |- foo.f90
    |- bar.f90
My versioninfo CMakelists.txt file looks like this:
add_library(versioninfolib src/VersionInfo.f90)
add_library(versioninfolib_obj OBJECT src/VersionInfo.f90)
install(TARGETS versioninfolib
  EXPORT "${CMAKE_PROJECT_NAME}Libraries"
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib)
I believe the relevant part of the nwtc lib CMakelists.txt is like this:
set(NWTCLIBS_SOURCES
  src/ModMesh.f90
  src/ModMesh_Mapping.f90
  src/ModMesh_Types.f90
  src/NWTC_Base.f90
  <snip, lots more source files>
  src/NetLib/slatec/xermsg.f  )
add_library(nwtclibs ${NWTCLIBS_SOURCES})
add_library(nwtclibs_obj OBJECT ${NWTCLIBS_SOURCES})
install(TARGETS nwtclibs
  EXPORT "${CMAKE_PROJECT_NAME}Libraries"
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib)
The relevant part of the top level CMakeLists.txt looks like this:
set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_SOURCE_DIR}/build/ftnmods)
set(OPENFAST_MODULES
  nwtc-library
  inflowwind
  aerodyn
  aerodyn14
  servodyn
  elastodyn
  beamdyn
  subdyn
  hydrodyn
  orcaflex-interface
  extptfm
  openfoam
  supercontroller
  turbsim
  openfast-library
  version
  feamooring
  moordyn
  icedyn
  icefloe
  map
  wakedynamics
  awae
)
set(OPENFAST_REGISTRY_INCLUDES "" CACHE INTERNAL "Registry includes paths")
set_registry_includes("modules" ${OPENFAST_MODULES})
# Fix non-standard path addition to OPENFAST_REGISTRY_INCLUDES in icefloe module
set(OPENFAST_REGISTRY_INCLUDES
  ${OPENFAST_REGISTRY_INCLUDES} -I ${CMAKE_SOURCE_DIR}/modules/icefloe/src/interfaces/FAST/
  CACHE INTERNAL "Registry includes paths")
foreach(IDIR IN ITEMS ${OPENFAST_MODULES})
  add_subdirectory("${CMAKE_SOURCE_DIR}/modules/${IDIR}")
endforeach(IDIR IN ITEMS ${OPENFAST_MODULES})
add_subdirectory(glue-codes)
add_library(openfastlib STATIC
  ${CMAKE_SOURCE_DIR}/modules/openfast-library/src/FAST_Library.f90
  $<TARGET_OBJECTS:openfast_prelib_obj>
  $<TARGET_OBJECTS:maplib_obj>
  $<TARGET_OBJECTS:nwtclibs_obj>
  $<TARGET_OBJECTS:ifwlib_obj>
  $<TARGET_OBJECTS:aerodynlib_obj>
  $<TARGET_OBJECTS:aerodyn14lib_obj>
  $<TARGET_OBJECTS:servodynlib_obj>
  $<TARGET_OBJECTS:elastodynlib_obj>
  $<TARGET_OBJECTS:beamdynlib_obj>
  $<TARGET_OBJECTS:subdynlib_obj>
  $<TARGET_OBJECTS:hydrodynlib_obj>
  $<TARGET_OBJECTS:orcaflexlib_obj>
  $<TARGET_OBJECTS:extptfm_mckflib_obj>
  $<TARGET_OBJECTS:openfoamtypeslib_obj>
  $<TARGET_OBJECTS:foamfastlib_obj>
  $<TARGET_OBJECTS:scdataextypeslib_obj>
  $<TARGET_OBJECTS:feamlib_obj>
  $<TARGET_OBJECTS:moordynlib_obj>
  $<TARGET_OBJECTS:icedynlib_obj>
  $<TARGET_OBJECTS:icefloelib_obj>
  $<TARGET_OBJECTS:openfast_postlib_obj>
  $<TARGET_OBJECTS:versioninfolib_obj>
)
target_link_libraries(openfastlib 
  versioninfolib_obj
  openfast_prelib_obj
  maplib_obj
  nwtclibs_obj
  ifwlib_obj
  aerodynlib_obj
  aerodyn14lib_obj
  servodynlib_obj
  elastodynlib_obj
  beamdynlib_obj
  subdynlib_obj
  hydrodynlib_obj
  orcaflexlib_obj
  extptfm_mckflib_obj
  openfoamtypeslib_obj
  foamfastlib_obj
  scdataextypeslib_obj
  feamlib_obj
  moordynlib_obj
  icedynlib_obj
  icefloelib_obj
  openfast_postlib_obj
  versioninfolib_obj
  ${LAPACK_LIBRARIES} 
  ${CMAKE_DL_LIBS}
)
I have tried lots of different things, but am absolutely stumped, why am I receiveing the error about missing mod files, and how do do this correctly to avoid the problem?
EDIT
The main CMake file already contains
set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_SOURCE_DIR}/build/ftnmods)
I have also now tried the following:
add_library(openfastlib STATIC
  ${CMAKE_SOURCE_DIR}/modules/openfast-library/src/FAST_Library.f90
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/openfast-library/,$<TARGET_PROPERTY:openfast_prelib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/map/,$<TARGET_PROPERTY:maplib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/nwtc-library/,$<TARGET_PROPERTY:nwtclibs_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/inflowwind/,$<TARGET_PROPERTY:ifwlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/aerodyn/,$<TARGET_PROPERTY:aerodynlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/aerodyn14/,$<TARGET_PROPERTY:aerodyn14lib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/servodyn/,$<TARGET_PROPERTY:servodynlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/elastodyn/,$<TARGET_PROPERTY:elastodynlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/beamdyn/,$<TARGET_PROPERTY:beamdynlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/subdyn/,$<TARGET_PROPERTY:subdynlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/hydrodyn/,$<TARGET_PROPERTY:hydrodynlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/orcaflex-interface/,$<TARGET_PROPERTY:orcaflexlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/extptfm/,$<TARGET_PROPERTY:extptfm_mckflib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/openfoam/,$<TARGET_PROPERTY:openfoamtypeslib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/openfoam/,$<TARGET_PROPERTY:foamfastlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/supercontroller/,$<TARGET_PROPERTY:scdataextypeslib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/feamooring/,$<TARGET_PROPERTY:feamlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/moordyn/,$<TARGET_PROPERTY:moordynlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/icedyn/,$<TARGET_PROPERTY:icedynlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/icefloe/,$<TARGET_PROPERTY:icefloelib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/openfast-library/,$<TARGET_PROPERTY:openfast_postlib_obj,SOURCES>>
  $<JOIN:${CMAKE_SOURCE_DIR}/modules/version/,$<TARGET_PROPERTY:versioninfolib_obj,SOURCES>>
)
to see if it would work, but I get the same error, the mod files are not being created.
EDIT2
The verbose make output is shown below:
$ make -j1 VERBOSE=1
/usr/bin/cmake -S/home/rcrozier/src/openfast-reos-git -B/home/rcrozier/src/openfast-reos-git/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake -E cmake_progress_start /home/rcrozier/src/openfast-reos-git/build/CMakeFiles /home/rcrozier/src/openfast-reos-git/build/CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make[1]: Entering directory '/home/rcrozier/src/openfast-reos-git/build'
make -f modules/map/CMakeFiles/maplib_obj.dir/build.make modules/map/CMakeFiles/maplib_obj.dir/depend
make[2]: Entering directory '/home/rcrozier/src/openfast-reos-git/build'
cd /home/rcrozier/src/openfast-reos-git/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/rcrozier/src/openfast-reos-git /home/rcrozier/src/openfast-reos-git/modules/map /home/rcrozier/src/openfast-reos-git/build /home/rcrozier/src/openfast-reos-git/build/modules/map /home/rcrozier/src/openfast-reos-git/build/modules/map/CMakeFiles/maplib_obj.dir/DependInfo.cmake --color=
Dependee "/home/rcrozier/src/openfast-reos-git/build/modules/map/CMakeFiles/maplib_obj.dir/DependInfo.cmake" is newer than depender "/home/rcrozier/src/openfast-reos-git/build/modules/map/CMakeFiles/maplib_obj.dir/depend.internal".
Dependee "/home/rcrozier/src/openfast-reos-git/build/modules/map/CMakeFiles/CMakeDirectoryInformation.cmake" is newer than depender "/home/rcrozier/src/openfast-reos-git/build/modules/map/CMakeFiles/maplib_obj.dir/depend.internal".
Scanning dependencies of target maplib_obj
make[2]: Leaving directory '/home/rcrozier/src/openfast-reos-git/build'
make -f modules/map/CMakeFiles/maplib_obj.dir/build.make modules/map/CMakeFiles/maplib_obj.dir/build
make[2]: Entering directory '/home/rcrozier/src/openfast-reos-git/build'
[  0%] Building Fortran object modules/map/CMakeFiles/maplib_obj.dir/src/MAP_Fortran_Types.f90.o
cd /home/rcrozier/src/openfast-reos-git/build/modules/map && /usr/bin/gfortran -DHAS_FORTRAN2008_FEATURES -DOPENFAST_DOUBLE_PRECISION -DUSE_DLL_INTERFACE -I/home/rcrozier/src/openfast-reos-git/build/ftnmods  -DCOMPILE_SIMULINK -fpic  -ffree-line-length-none -cpp -fstack-reuse=none -fdefault-real-8 -O3 -DNDEBUG -O3 -J../../ftnmods   -c /home/rcrozier/src/openfast-reos-git/modules/map/src/MAP_Fortran_Types.f90 -o CMakeFiles/maplib_obj.dir/src/MAP_Fortran_Types.f90.o
/home/rcrozier/src/openfast-reos-git/modules/map/src/MAP_Fortran_Types.f90:34:4:
   34 | USE NWTC_Library
      |    1
Fatal Error: Cannot open module file ‘nwtc_library.mod’ for reading at (1): No such file or directory
compilation terminated.
make[2]: *** [modules/map/CMakeFiles/maplib_obj.dir/build.make:349: modules/map/CMakeFiles/maplib_obj.dir/src/MAP_Fortran_Types.f90.o] Error 1
make[2]: Leaving directory '/home/rcrozier/src/openfast-reos-git/build'
make[1]: *** [CMakeFiles/Makefile2:2595: modules/map/CMakeFiles/maplib_obj.dir/all] Error 2
make[1]: Leaving directory '/home/rcrozier/src/openfast-reos-git/build'
make: *** [Makefile:130: all] Error 2