1# Macro that defines variables describing the Fortran name mangling 2# convention 3# 4# Sets the following outputs on success: 5# 6# INTFACE 7# Add_ 8# NoChange 9# f77IsF2C 10# UpCase 11# 12macro(FORTRAN_MANGLING CDEFS) 13message(STATUS "=========") 14 get_filename_component(F77_NAME ${CMAKE_Fortran_COMPILER} NAME) 15 get_filename_component(F77_PATH ${CMAKE_Fortran_COMPILER} PATH) 16 set(F77 ${F77_NAME} CACHE INTERNAL "Name of the fortran compiler.") 17 18 if(${F77} STREQUAL "ifort.exe") 19 #settings for Intel Fortran 20 set(F77_OPTION_COMPILE "/c" CACHE INTERNAL 21 "Fortran compiler option for compiling without linking.") 22 set(F77_OUTPUT_OBJ "/Fo" CACHE INTERNAL 23 "Fortran compiler option for setting object file name.") 24 set(F77_OUTPUT_EXE "/Fe" CACHE INTERNAL 25 "Fortran compiler option for setting executable file name.") 26 else() 27 # in other case, let user specify their fortran configurations. 28 set(F77_OPTION_COMPILE "-c" CACHE STRING 29 "Fortran compiler option for compiling without linking.") 30 set(F77_OUTPUT_OBJ "-o" CACHE STRING 31 "Fortran compiler option for setting object file name.") 32 set(F77_OUTPUT_EXE "-o" CACHE STRING 33 "Fortran compiler option for setting executable file name.") 34 set(F77_LIB_PATH "" CACHE PATH 35 "Library path for the fortran compiler") 36 set(F77_INCLUDE_PATH "" CACHE PATH 37 "Include path for the fortran compiler") 38 endif() 39 40 41message(STATUS "Testing FORTRAN_MANGLING") 42 43message(STATUS "Compiling Finface.f...") 44 45 execute_process ( COMMAND ${CMAKE_Fortran_COMPILER} ${F77_OPTION_COMPILE} ${PROJECT_SOURCE_DIR}/lapacke/mangling/Fintface.f 46 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp 47 OUTPUT_VARIABLE OUTPUT 48 RESULT_VARIABLE RESULT 49 ERROR_VARIABLE ERROR) 50 51 if(RESULT EQUAL 0) 52 message(STATUS "Compiling Finface.f successful") 53 else() 54 message(FATAL_ERROR " Compiling Finface.f FAILED") 55 message(FATAL_ERROR " Error:\n ${ERROR}") 56 endif() 57 58message(STATUS "Compiling Cintface.c...") 59 60 execute_process ( COMMAND ${CMAKE_C_COMPILER} ${F77_OPTION_COMPILE} ${PROJECT_SOURCE_DIR}/lapacke/mangling/Cintface.c 61 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp 62 OUTPUT_VARIABLE OUTPUT 63 RESULT_VARIABLE RESULT 64 ERROR_VARIABLE ERROR) 65 66 if(RESULT EQUAL 0) 67 message(STATUS "Compiling Cintface.c successful") 68 else() 69 message(FATAL_ERROR " Compiling Cintface.c FAILED") 70 message(FATAL_ERROR " Error:\n ${ERROR}") 71 endif() 72 73message(STATUS "Linking Finface.f and Cintface.c...") 74 75 execute_process ( COMMAND ${CMAKE_Fortran_COMPILER} ${F77_OUTPUT_OBJ} xintface.exe Fintface.o Cintface.o 76 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp 77 OUTPUT_VARIABLE OUTPUT 78 RESULT_VARIABLE RESULT 79 ERROR_VARIABLE ERROR) 80 81 if(RESULT EQUAL 0) 82 message(STATUS "Linking Finface.f and Cintface.c successful") 83 else() 84 message(FATAL_ERROR " Linking Finface.f and Cintface.c FAILED") 85 message(FATAL_ERROR " Error:\n ${ERROR}") 86 endif() 87 88message(STATUS "Running ./xintface...") 89 90 execute_process ( COMMAND ./xintface.exe 91 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp 92 RESULT_VARIABLE xintface_RES 93 OUTPUT_VARIABLE xintface_OUT 94 ERROR_VARIABLE xintface_ERR) 95 96 97 if (xintface_RES EQUAL 0) 98 string(REPLACE "\n" "" xintface_OUT "${xintface_OUT}") 99 message(STATUS "Fortran MANGLING convention: ${xintface_OUT}") 100 set(CDEFS ${xintface_OUT}) 101 else() 102 message(FATAL_ERROR "FORTRAN_MANGLING:ERROR ${xintface_ERR}") 103 endif() 104 105endmacro() 106