123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- cmake_minimum_required(VERSION ${CMAKE_VERSION})
- project(FortranCInterface C Fortran)
- include(${FortranCInterface_BINARY_DIR}/Input.cmake OPTIONAL)
- include(CheckCSourceCompiles)
- check_c_source_compiles("
- extern int dollar$(void);
- int main() { return 0; }
- " C_SUPPORTS_DOLLAR)
- set(global_symbols
- my_sub
- my_sub_
- my_sub__
- MY_SUB
- mysub
- mysub_
- MYSUB
- ${FortranCInterface_GLOBAL_SYMBOLS}
- )
- list(REMOVE_DUPLICATES global_symbols)
- set(module_symbols
- __my_module_MOD_my_sub
- __my_module_NMOD_my_sub
- __my_module__my_sub
- __mymodule_MOD_mysub
- __mymodule_NMOD_mysub
- __mymodule__mysub
- my_module$my_sub
- my_module_mp_my_sub_
- MY_MODULE_mp_MY_SUB
- my_module_my_sub_
- my_module_MP_my_sub
- mymodule$mysub
- mymodule_mp_mysub_
- MYMODULE_mp_MYSUB
- mymodule_mysub_
- mymodule_MP_mysub
- ${FortranCInterface_MODULE_SYMBOLS}
- )
- list(REMOVE_DUPLICATES module_symbols)
- if(CMAKE_Fortran_COMPILER_SUPPORTS_F90)
- set(myfort_modules mymodule.f90 my_module.f90)
- set(call_mod call_mod.f90)
- set_property(SOURCE main.F PROPERTY COMPILE_DEFINITIONS CALL_MOD)
- else()
- set(module_symbols)
- endif()
- set(symbol_sources)
- if(NOT CMAKE_Fortran_COMPILER_ID MATCHES "^(PathScale|Cray)$")
-
-
-
-
-
-
-
- list(APPEND symbol_sources mymodule_.c my_module_.c MY_MODULE.c MYMODULE.c)
- endif()
- foreach(symbol IN LISTS global_symbols module_symbols)
-
- if(C_SUPPORTS_DOLLAR OR NOT "${symbol}" MATCHES "\\$")
- if("${symbol}" MATCHES "SUB")
- set(upper "-UPPER")
- else()
- set(upper)
- endif()
- string(REPLACE "$" "S" name "${symbol}")
- set(source ${CMAKE_CURRENT_BINARY_DIR}/symbols/${name}${upper}.c)
- configure_file(${CMAKE_CURRENT_SOURCE_DIR}/symbol.c.in ${source} @ONLY)
- list(APPEND symbol_sources ${source})
- endif()
- endforeach()
- add_library(myfort STATIC mysub.f my_sub.f ${myfort_modules})
- add_library(symbols STATIC ${symbol_sources})
- target_link_libraries(symbols PUBLIC myfort)
- set_property(TARGET symbols PROPERTY POSITION_INDEPENDENT_CODE 1)
- add_executable(FortranCInterface main.F call_sub.f ${call_mod})
- target_link_libraries(FortranCInterface PUBLIC symbols)
|