| #============================================================================= |
| # Copyright 2009 Kitware, Inc. |
| # |
| # Distributed under the OSI-approved BSD License (the "License"); |
| # see accompanying file Copyright.txt for details. |
| # |
| # This software is distributed WITHOUT ANY WARRANTY; without even the |
| # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| # See the License for more information. |
| #============================================================================= |
| |
| cmake_minimum_required(VERSION ${CMAKE_VERSION}) |
| project(FortranCInterface C Fortran) |
| include(${FortranCInterface_BINARY_DIR}/Input.cmake OPTIONAL) |
| |
| # Check if the C compiler supports '$' in identifiers. |
| include(CheckCSourceCompiles) |
| check_c_source_compiles(" |
| extern int dollar$(void); |
| int main() { return 0; } |
| " C_SUPPORTS_DOLLAR) |
| |
| # List manglings of global symbol names to try. |
| set(global_symbols |
| my_sub # VisualAge |
| my_sub_ # GNU, Intel, HP, SunPro, MIPSpro |
| my_sub__ # GNU g77 |
| MY_SUB # Intel on Windows |
| mysub # VisualAge |
| mysub_ # GNU, Intel, HP, SunPro, MIPSpro |
| MYSUB # Intel on Windows |
| ${FortranCInterface_GLOBAL_SYMBOLS} |
| ) |
| list(REMOVE_DUPLICATES global_symbols) |
| |
| # List manglings of module symbol names to try. |
| set(module_symbols |
| __my_module_MOD_my_sub # GNU 4.3 |
| __my_module_NMOD_my_sub # VisualAge |
| __my_module__my_sub # GNU 4.2 |
| __mymodule_MOD_mysub # GNU 4.3 |
| __mymodule_NMOD_mysub # VisualAge |
| __mymodule__mysub # GNU 4.2 |
| my_module$my_sub # HP |
| my_module_mp_my_sub_ # Intel |
| MY_MODULE_mp_MY_SUB # Intel on Windows |
| my_module_my_sub_ # PGI |
| my_module_MP_my_sub # NAG |
| mymodule$mysub # HP |
| mymodule_mp_mysub_ # Intel |
| MYMODULE_mp_MYSUB # Intel on Windows |
| mymodule_mysub_ # PGI |
| mymodule_MP_mysub # NAG |
| ${FortranCInterface_MODULE_SYMBOLS} |
| ) |
| list(REMOVE_DUPLICATES module_symbols) |
| |
| # Note that some compiler manglings cannot be invoked from C: |
| # MIPSpro uses "MY_SUB.in.MY_MODULE" |
| # SunPro uses "my_module.my_sub_" |
| # PathScale uses "MY_SUB.in.MY_MODULE" |
| |
| # Add module symbols only with Fortran90. |
| 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() |
| |
| # Generate C symbol sources. |
| set(symbol_sources) |
| if(NOT CMAKE_Fortran_COMPILER_ID MATCHES "^(PathScale|Cray)$") |
| # Provide mymodule_ and my_module_ init symbols because: |
| # - PGI Fortran uses module init symbols |
| # but not for: |
| # - PathScale Fortran uses module init symbols but module symbols |
| # use '.in.' so we cannot provide them anyway. |
| # - Cray Fortran >= 7.3.2 uses module init symbols but module symbols |
| # use 'mysub$mymodule_' so we cannot provide them anyway. |
| list(APPEND symbol_sources mymodule_.c my_module_.c) |
| endif() |
| foreach(symbol IN LISTS global_symbols module_symbols) |
| # Skip symbols with '$' if C cannot handle them. |
| 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() |
| |
| # Provide symbols through Fortran. |
| add_library(myfort STATIC mysub.f my_sub.f ${myfort_modules}) |
| |
| # Provide symbols through C but fall back to Fortran. |
| add_library(symbols STATIC ${symbol_sources}) |
| target_link_libraries(symbols myfort) |
| |
| # Require symbols through Fortran. |
| add_executable(FortranCInterface main.F call_sub.f ${call_mod}) |
| target_link_libraries(FortranCInterface symbols) |