1890c668e9
Update cmake_minimum_required calls in CMakeLists.txt in Modules and in CMakeLists.txt generated by other modules, so that they are always in sync with current CMake version.
109 lines
3.7 KiB
CMake
109 lines
3.7 KiB
CMake
#=============================================================================
|
|
# 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)
|