Skip to content

Commit 91f97c6

Browse files
authored
Merge pull request #5824 from mathomp4/bugfix/5823-fix-for-nag
Fix shared lib build with NAG Fortran on macOS
2 parents 1bd74ad + 7a2b8b5 commit 91f97c6

1 file changed

Lines changed: 34 additions & 3 deletions

File tree

CMakeLists.txt

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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)
268276
endif()
@@ -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

Comments
 (0)