For VS Intel Fortran IDE builds, add a check to find the Fortran library PATH.

To use VS C and Fotran in the same solution, it is required that VS be
able to find the Fortran run time libraries as they will be implicitly
linked by any Fortran library used by VS C programs.  This adds a check
into CMakeDetermineCompilerABI using a try-compile to find the correct
PATH.
This commit is contained in:
Bill Hoffman 2011-09-08 17:42:49 -04:00
parent 71402eb252
commit 555f589a5a
4 changed files with 49 additions and 0 deletions

View File

@ -83,6 +83,32 @@ FUNCTION(CMAKE_DETERMINE_COMPILER_ABI lang src)
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Parsed ${lang} implicit link information from above output:\n${log}\n\n") "Parsed ${lang} implicit link information from above output:\n${log}\n\n")
ENDIF() ENDIF()
# for VS IDE Intel Fortran we have to figure out the
# implicit link path for the fortran run time using
# a try-compile
IF("${lang}" MATCHES "Fortran"
AND "${CMAKE_GENERATOR}" MATCHES "Visual Studio")
SET(_desc "Determine Intel Fortran Compiler Implicit Link Path")
MESSAGE(STATUS "${_desc}")
# Build a sample project which reports symbols.
TRY_COMPILE(IFORT_LIB_PATH_COMPILED
${CMAKE_BINARY_DIR}/CMakeFiles/IntelVSImplicitPath
${CMAKE_ROOT}/Modules/FortranCInterface/IntelVSImplicitPath
IntelFortranImplicit
CMAKE_FLAGS
"-DCMAKE_Fortran_FLAGS:STRING=${CMAKE_Fortran_FLAGS}"
OUTPUT_VARIABLE _output)
FILE(READ
${CMAKE_BINARY_DIR}/CMakeFiles/IntelVSImplicitPath/implict_link.txt
dir)
LIST(APPEND implicit_dirs "${dir}")
FILE(WRITE
"${CMAKE_BINARY_DIR}/CMakeFiles/IntelVSImplicitPath/output.txt"
"${_output}")
SET(_desc "Determine Intel Fortran Compiler Implicit Link Path -- done")
MESSAGE(STATUS "${_desc}")
ENDIF()
SET(CMAKE_${lang}_IMPLICIT_LINK_LIBRARIES "${implicit_libs}" PARENT_SCOPE) SET(CMAKE_${lang}_IMPLICIT_LINK_LIBRARIES "${implicit_libs}" PARENT_SCOPE)
SET(CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES "${implicit_dirs}" PARENT_SCOPE) SET(CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES "${implicit_dirs}" PARENT_SCOPE)

View File

@ -0,0 +1,11 @@
cmake_minimum_required (VERSION 2.8)
project(IntelFortranImplicit Fortran)
add_custom_command(OUTPUT ${IntelFortranImplicit_BINARY_DIR}/env.txt
COMMAND set > ${IntelFortranImplicit_BINARY_DIR}/env.txt)
add_library(FortranLib hello.f
${IntelFortranImplicit_BINARY_DIR}/env.txt)
add_custom_target(ExtractLibPath ALL
COMMAND ${CMAKE_COMMAND} -P ${IntelFortranImplicit_SOURCE_DIR}/extract.cmake
WORKING_DIRECTORY ${IntelFortranImplicit_BINARY_DIR}
)
add_dependencies(ExtractLibPath FortranLib)

View File

@ -0,0 +1,12 @@
file(STRINGS env.txt LIB REGEX "^LIB=.*$")
string(REPLACE "LIB=" "" LIB "${LIB}" )
# change LIB from a string to a ; separated list of paths
set(LIB ${LIB})
# look at each path and try to find ifconsol.lib
foreach( dir ${LIB})
file(TO_CMAKE_PATH "${dir}" dir)
if(EXISTS "${dir}/ifconsol.lib")
file(WRITE implict_link.txt ${dir})
return()
endif()
endforeach()