@@ -263,6 +263,14 @@ if(APPLE)
263263 if (NOT NOFORTRAN)
264264 set (CMAKE_Fortran_USE_RESPONSE_FILE_FOR_OBJECTS ON )
265265 set (CMAKE_Fortran_USE_RESPONSE_FILE_FOR_LIBRARIES ON )
266+ # NAG Fortran does not support the GCC-specific -x f95-cpp-input flag
267+ # used in the shared library link rule below. Override
268+ # CMAKE_Fortran_CREATE_SHARED_LIBRARY early (before targets are defined)
269+ # to use the C compiler link rule instead; the shared library contains
270+ # only C and assembler objects so this is safe.
271+ if (CMAKE_Fortran_COMPILER_ID MATCHES "NAG" )
272+ set (CMAKE_Fortran_CREATE_SHARED_LIBRARY ${CMAKE_C_CREATE_SHARED_LIBRARY} )
273+ endif ()
266274 endif ()
267275 set (CMAKE_NINJA_FORCE_RESPONSE_FILE ON )
268276endif ()
@@ -360,9 +368,32 @@ if(APPLE AND BUILD_STATIC_LIBS)
360368 if (NOT NOFORTRAN)
361369 set (CMAKE_Fortran_CREATE_STATIC_LIBRARY ${CREATE_STATIC_LIBRARY_COMMAND} )
362370 if (BUILD_SHARED_LIBS )
363- set (CMAKE_Fortran_CREATE_SHARED_LIBRARY
364- "sh -c 'echo \"\" | ${CMAKE_Fortran_COMPILER} -o dummy.o -c -x f95-cpp-input - '"
365- "sh -c '${CMAKE_Fortran_COMPILER} -fpic -shared -Wl,-all_load -Wl,-force_load,${STATIC_PATH} dummy.o -o ${SHARED_PATH} ${OMP_LIB} '" )
371+ if (CMAKE_Fortran_COMPILER_ID MATCHES "GNU" )
372+ set (CMAKE_Fortran_CREATE_SHARED_LIBRARY
373+ "sh -c 'echo \"\" | ${CMAKE_Fortran_COMPILER} -o dummy.o -c -x f95-cpp-input - '"
374+ "sh -c '${CMAKE_Fortran_COMPILER} -fpic -shared -Wl,-all_load -Wl,-force_load,${STATIC_PATH} dummy.o -o ${SHARED_PATH} ${OMP_LIB} '" )
375+ elseif (CMAKE_Fortran_COMPILER_ID MATCHES "NAG" )
376+ # NAG does not support -x f95-cpp-input, and macOS needs -dynamiclib
377+ # rather than -Wl,-shared. Use the C compiler as the linker driver
378+ # and add the NAG Fortran runtime so NAGf90_* symbols resolve.
379+ # Locate the NAG Fortran runtime (libf<XY>rts) without hardcoding the
380+ # version digits: NAG 7.1 ships libf71rts, 7.2 ships libf72rts, etc.
381+ get_filename_component (_NAG_FC_DIR "${CMAKE_Fortran_COMPILER} " DIRECTORY )
382+ set (_NAG_RTS_DIR "${_NAG_FC_DIR} /../lib/NAG_Fortran" )
383+ file (GLOB _NAG_RTS_CANDIDATES
384+ "${_NAG_RTS_DIR} /libf*rts.dylib"
385+ "${_NAG_RTS_DIR} /libf*rts.a" )
386+ if (_NAG_RTS_CANDIDATES)
387+ list (GET _NAG_RTS_CANDIDATES 0 _NAG_RTS_LIB)
388+ get_filename_component (_NAG_RTS_NAME "${_NAG_RTS_LIB} " NAME_WE )
389+ string (REGEX REPLACE "^lib" "" _NAG_RTS_LIBNAME "${_NAG_RTS_NAME} " )
390+ set (_NAG_RTS_FLAGS "-L${_NAG_RTS_DIR} -l${_NAG_RTS_LIBNAME} " )
391+ else ()
392+ set (_NAG_RTS_FLAGS "" )
393+ endif ()
394+ set (CMAKE_Fortran_CREATE_SHARED_LIBRARY
395+ "sh -c '${CMAKE_C_COMPILER} -dynamiclib -Wl,-all_load -Wl,-force_load,${STATIC_PATH} -o ${SHARED_PATH} ${OMP_LIB} ${_NAG_RTS_FLAGS} '" )
396+ endif ()
366397 endif ()
367398 else ()
368399 set (CMAKE_C_CREATE_STATIC_LIBRARY ${CREATE_STATIC_LIBRARY_COMMAND} )
0 commit comments