Re-order C/C++/Fortran compiler determination logic
Re-organize CMakeDetermine(C|CXX|Fortran)Compiler.cmake to search for the compiler command-line tool only under generators for which it makes sense. For the Visual Studio generators we do not expect to find the compiler tool from the environment, nor would we use the result anyway. Furthermore, set CMAKE_${lang}_COMPILER_ID_TEST_FLAGS only when it has a chance to be used. Extract _CMAKE_TOOLCHAIN_LOCATION from the compiler path after running the compiler id step so in the future that step can help find the path to the compiler.
This commit is contained in:
parent
2c7a451de0
commit
b8b5c8342a
|
@ -39,76 +39,68 @@ if(NOT CMAKE_C_COMPILER_NAMES)
|
|||
set(CMAKE_C_COMPILER_NAMES cc)
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_C_COMPILER)
|
||||
set(CMAKE_C_COMPILER_INIT NOTFOUND)
|
||||
|
||||
# prefer the environment variable CC
|
||||
if($ENV{CC} MATCHES ".+")
|
||||
get_filename_component(CMAKE_C_COMPILER_INIT $ENV{CC} PROGRAM PROGRAM_ARGS CMAKE_C_FLAGS_ENV_INIT)
|
||||
if(CMAKE_C_FLAGS_ENV_INIT)
|
||||
set(CMAKE_C_COMPILER_ARG1 "${CMAKE_C_FLAGS_ENV_INIT}" CACHE STRING "First argument to C compiler")
|
||||
endif()
|
||||
if(NOT EXISTS ${CMAKE_C_COMPILER_INIT})
|
||||
message(FATAL_ERROR "Could not find compiler set in environment variable CC:\n$ENV{CC}.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# next try prefer the compiler specified by the generator
|
||||
if(CMAKE_GENERATOR_CC)
|
||||
if(NOT CMAKE_C_COMPILER_INIT)
|
||||
set(CMAKE_C_COMPILER_INIT ${CMAKE_GENERATOR_CC})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# finally list compilers to try
|
||||
if(NOT CMAKE_C_COMPILER_INIT)
|
||||
set(CMAKE_C_COMPILER_LIST ${_CMAKE_TOOLCHAIN_PREFIX}cc ${_CMAKE_TOOLCHAIN_PREFIX}gcc cl bcc xlc clang)
|
||||
endif()
|
||||
|
||||
_cmake_find_compiler(C)
|
||||
|
||||
else()
|
||||
|
||||
# we only get here if CMAKE_C_COMPILER was specified using -D or a pre-made CMakeCache.txt
|
||||
# (e.g. via ctest) or set in CMAKE_TOOLCHAIN_FILE
|
||||
# if CMAKE_C_COMPILER is a list of length 2, use the first item as
|
||||
# CMAKE_C_COMPILER and the 2nd one as CMAKE_C_COMPILER_ARG1
|
||||
|
||||
list(LENGTH CMAKE_C_COMPILER _CMAKE_C_COMPILER_LIST_LENGTH)
|
||||
if("${_CMAKE_C_COMPILER_LIST_LENGTH}" EQUAL 2)
|
||||
list(GET CMAKE_C_COMPILER 1 CMAKE_C_COMPILER_ARG1)
|
||||
list(GET CMAKE_C_COMPILER 0 CMAKE_C_COMPILER)
|
||||
endif()
|
||||
|
||||
# if a compiler was specified by the user but without path,
|
||||
# now try to find it with the full path
|
||||
# if it is found, force it into the cache,
|
||||
# if not, don't overwrite the setting (which was given by the user) with "NOTFOUND"
|
||||
# if the C compiler already had a path, reuse it for searching the CXX compiler
|
||||
get_filename_component(_CMAKE_USER_C_COMPILER_PATH "${CMAKE_C_COMPILER}" PATH)
|
||||
if(NOT _CMAKE_USER_C_COMPILER_PATH)
|
||||
find_program(CMAKE_C_COMPILER_WITH_PATH NAMES ${CMAKE_C_COMPILER})
|
||||
mark_as_advanced(CMAKE_C_COMPILER_WITH_PATH)
|
||||
if(CMAKE_C_COMPILER_WITH_PATH)
|
||||
set(CMAKE_C_COMPILER ${CMAKE_C_COMPILER_WITH_PATH} CACHE STRING "C compiler" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
mark_as_advanced(CMAKE_C_COMPILER)
|
||||
|
||||
if (NOT _CMAKE_TOOLCHAIN_LOCATION)
|
||||
get_filename_component(_CMAKE_TOOLCHAIN_LOCATION "${CMAKE_C_COMPILER}" PATH)
|
||||
endif ()
|
||||
|
||||
# Build a small source file to identify the compiler.
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual Studio")
|
||||
set(CMAKE_C_COMPILER_ID_RUN 1)
|
||||
set(CMAKE_C_PLATFORM_ID "Windows")
|
||||
set(CMAKE_C_COMPILER_ID "MSVC")
|
||||
endif()
|
||||
set(CMAKE_C_COMPILER "${CMAKE_GENERATOR_CC}")
|
||||
else()
|
||||
if(NOT CMAKE_C_COMPILER)
|
||||
set(CMAKE_C_COMPILER_INIT NOTFOUND)
|
||||
|
||||
if(NOT CMAKE_C_COMPILER_ID_RUN)
|
||||
set(CMAKE_C_COMPILER_ID_RUN 1)
|
||||
# prefer the environment variable CC
|
||||
if($ENV{CC} MATCHES ".+")
|
||||
get_filename_component(CMAKE_C_COMPILER_INIT $ENV{CC} PROGRAM PROGRAM_ARGS CMAKE_C_FLAGS_ENV_INIT)
|
||||
if(CMAKE_C_FLAGS_ENV_INIT)
|
||||
set(CMAKE_C_COMPILER_ARG1 "${CMAKE_C_FLAGS_ENV_INIT}" CACHE STRING "First argument to C compiler")
|
||||
endif()
|
||||
if(NOT EXISTS ${CMAKE_C_COMPILER_INIT})
|
||||
message(FATAL_ERROR "Could not find compiler set in environment variable CC:\n$ENV{CC}.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# next try prefer the compiler specified by the generator
|
||||
if(CMAKE_GENERATOR_CC)
|
||||
if(NOT CMAKE_C_COMPILER_INIT)
|
||||
set(CMAKE_C_COMPILER_INIT ${CMAKE_GENERATOR_CC})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# finally list compilers to try
|
||||
if(NOT CMAKE_C_COMPILER_INIT)
|
||||
set(CMAKE_C_COMPILER_LIST ${_CMAKE_TOOLCHAIN_PREFIX}cc ${_CMAKE_TOOLCHAIN_PREFIX}gcc cl bcc xlc clang)
|
||||
endif()
|
||||
|
||||
_cmake_find_compiler(C)
|
||||
|
||||
else()
|
||||
|
||||
# we only get here if CMAKE_C_COMPILER was specified using -D or a pre-made CMakeCache.txt
|
||||
# (e.g. via ctest) or set in CMAKE_TOOLCHAIN_FILE
|
||||
# if CMAKE_C_COMPILER is a list of length 2, use the first item as
|
||||
# CMAKE_C_COMPILER and the 2nd one as CMAKE_C_COMPILER_ARG1
|
||||
|
||||
list(LENGTH CMAKE_C_COMPILER _CMAKE_C_COMPILER_LIST_LENGTH)
|
||||
if("${_CMAKE_C_COMPILER_LIST_LENGTH}" EQUAL 2)
|
||||
list(GET CMAKE_C_COMPILER 1 CMAKE_C_COMPILER_ARG1)
|
||||
list(GET CMAKE_C_COMPILER 0 CMAKE_C_COMPILER)
|
||||
endif()
|
||||
|
||||
# if a compiler was specified by the user but without path,
|
||||
# now try to find it with the full path
|
||||
# if it is found, force it into the cache,
|
||||
# if not, don't overwrite the setting (which was given by the user) with "NOTFOUND"
|
||||
# if the C compiler already had a path, reuse it for searching the CXX compiler
|
||||
get_filename_component(_CMAKE_USER_C_COMPILER_PATH "${CMAKE_C_COMPILER}" PATH)
|
||||
if(NOT _CMAKE_USER_C_COMPILER_PATH)
|
||||
find_program(CMAKE_C_COMPILER_WITH_PATH NAMES ${CMAKE_C_COMPILER})
|
||||
mark_as_advanced(CMAKE_C_COMPILER_WITH_PATH)
|
||||
if(CMAKE_C_COMPILER_WITH_PATH)
|
||||
set(CMAKE_C_COMPILER ${CMAKE_C_COMPILER_WITH_PATH} CACHE STRING "C compiler" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
mark_as_advanced(CMAKE_C_COMPILER)
|
||||
|
||||
# Each entry in this list is a set of extra flags to try
|
||||
# adding to the compile line to see if it helps produce
|
||||
|
@ -120,6 +112,11 @@ if(NOT CMAKE_C_COMPILER_ID_RUN)
|
|||
# Try enabling ANSI mode on HP.
|
||||
"-Aa"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Build a small source file to identify the compiler.
|
||||
if(NOT CMAKE_C_COMPILER_ID_RUN)
|
||||
set(CMAKE_C_COMPILER_ID_RUN 1)
|
||||
|
||||
# Try to identify the compiler.
|
||||
set(CMAKE_C_COMPILER_ID)
|
||||
|
@ -139,6 +136,10 @@ if(NOT CMAKE_C_COMPILER_ID_RUN)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
if (NOT _CMAKE_TOOLCHAIN_LOCATION)
|
||||
get_filename_component(_CMAKE_TOOLCHAIN_LOCATION "${CMAKE_C_COMPILER}" PATH)
|
||||
endif ()
|
||||
|
||||
# If we have a gcc cross compiler, they have usually some prefix, like
|
||||
# e.g. powerpc-linux-gcc, arm-elf-gcc or i586-mingw32msvc-gcc, optionally
|
||||
# with a 3-component version number at the end (e.g. arm-eabi-gcc-4.5.2).
|
||||
|
|
|
@ -38,87 +38,68 @@ if(NOT CMAKE_CXX_COMPILER_NAMES)
|
|||
set(CMAKE_CXX_COMPILER_NAMES CC)
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_CXX_COMPILER)
|
||||
set(CMAKE_CXX_COMPILER_INIT NOTFOUND)
|
||||
|
||||
# prefer the environment variable CXX
|
||||
if($ENV{CXX} MATCHES ".+")
|
||||
get_filename_component(CMAKE_CXX_COMPILER_INIT $ENV{CXX} PROGRAM PROGRAM_ARGS CMAKE_CXX_FLAGS_ENV_INIT)
|
||||
if(CMAKE_CXX_FLAGS_ENV_INIT)
|
||||
set(CMAKE_CXX_COMPILER_ARG1 "${CMAKE_CXX_FLAGS_ENV_INIT}" CACHE STRING "First argument to CXX compiler")
|
||||
endif()
|
||||
if(NOT EXISTS ${CMAKE_CXX_COMPILER_INIT})
|
||||
message(FATAL_ERROR "Could not find compiler set in environment variable CXX:\n$ENV{CXX}.\n${CMAKE_CXX_COMPILER_INIT}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# next prefer the generator specified compiler
|
||||
if(CMAKE_GENERATOR_CXX)
|
||||
if(NOT CMAKE_CXX_COMPILER_INIT)
|
||||
set(CMAKE_CXX_COMPILER_INIT ${CMAKE_GENERATOR_CXX})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# finally list compilers to try
|
||||
if(NOT CMAKE_CXX_COMPILER_INIT)
|
||||
set(CMAKE_CXX_COMPILER_LIST CC ${_CMAKE_TOOLCHAIN_PREFIX}c++ ${_CMAKE_TOOLCHAIN_PREFIX}g++ aCC cl bcc xlC clang++)
|
||||
endif()
|
||||
|
||||
_cmake_find_compiler(CXX)
|
||||
else()
|
||||
|
||||
# we only get here if CMAKE_CXX_COMPILER was specified using -D or a pre-made CMakeCache.txt
|
||||
# (e.g. via ctest) or set in CMAKE_TOOLCHAIN_FILE
|
||||
#
|
||||
# if CMAKE_CXX_COMPILER is a list of length 2, use the first item as
|
||||
# CMAKE_CXX_COMPILER and the 2nd one as CMAKE_CXX_COMPILER_ARG1
|
||||
|
||||
list(LENGTH CMAKE_CXX_COMPILER _CMAKE_CXX_COMPILER_LIST_LENGTH)
|
||||
if("${_CMAKE_CXX_COMPILER_LIST_LENGTH}" EQUAL 2)
|
||||
list(GET CMAKE_CXX_COMPILER 1 CMAKE_CXX_COMPILER_ARG1)
|
||||
list(GET CMAKE_CXX_COMPILER 0 CMAKE_CXX_COMPILER)
|
||||
endif()
|
||||
|
||||
# if a compiler was specified by the user but without path,
|
||||
# now try to find it with the full path
|
||||
# if it is found, force it into the cache,
|
||||
# if not, don't overwrite the setting (which was given by the user) with "NOTFOUND"
|
||||
# if the CXX compiler already had a path, reuse it for searching the C compiler
|
||||
get_filename_component(_CMAKE_USER_CXX_COMPILER_PATH "${CMAKE_CXX_COMPILER}" PATH)
|
||||
if(NOT _CMAKE_USER_CXX_COMPILER_PATH)
|
||||
find_program(CMAKE_CXX_COMPILER_WITH_PATH NAMES ${CMAKE_CXX_COMPILER})
|
||||
mark_as_advanced(CMAKE_CXX_COMPILER_WITH_PATH)
|
||||
if(CMAKE_CXX_COMPILER_WITH_PATH)
|
||||
set(CMAKE_CXX_COMPILER ${CMAKE_CXX_COMPILER_WITH_PATH} CACHE STRING "CXX compiler" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
mark_as_advanced(CMAKE_CXX_COMPILER)
|
||||
|
||||
if (NOT _CMAKE_TOOLCHAIN_LOCATION)
|
||||
get_filename_component(_CMAKE_TOOLCHAIN_LOCATION "${CMAKE_CXX_COMPILER}" PATH)
|
||||
endif ()
|
||||
|
||||
# This block was used before the compiler was identified by building a
|
||||
# source file. Unless g++ crashes when building a small C++
|
||||
# executable this should no longer be needed.
|
||||
#
|
||||
# The g++ that comes with BeOS 5 segfaults if you run "g++ -E"
|
||||
# ("gcc -E" is fine), which throws up a system dialog box that hangs cmake
|
||||
# until the user clicks "OK"...so for now, we just assume it's g++.
|
||||
# if(BEOS)
|
||||
# set(CMAKE_COMPILER_IS_GNUCXX 1)
|
||||
# set(CMAKE_COMPILER_IS_GNUCXX_RUN 1)
|
||||
# endif()
|
||||
|
||||
# Build a small source file to identify the compiler.
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual Studio")
|
||||
set(CMAKE_CXX_COMPILER_ID_RUN 1)
|
||||
set(CMAKE_CXX_PLATFORM_ID "Windows")
|
||||
set(CMAKE_CXX_COMPILER_ID "MSVC")
|
||||
endif()
|
||||
if(NOT CMAKE_CXX_COMPILER_ID_RUN)
|
||||
set(CMAKE_CXX_COMPILER_ID_RUN 1)
|
||||
set(CMAKE_CXX_COMPILER "${CMAKE_GENERATOR_CXX}")
|
||||
else()
|
||||
if(NOT CMAKE_CXX_COMPILER)
|
||||
set(CMAKE_CXX_COMPILER_INIT NOTFOUND)
|
||||
|
||||
# prefer the environment variable CXX
|
||||
if($ENV{CXX} MATCHES ".+")
|
||||
get_filename_component(CMAKE_CXX_COMPILER_INIT $ENV{CXX} PROGRAM PROGRAM_ARGS CMAKE_CXX_FLAGS_ENV_INIT)
|
||||
if(CMAKE_CXX_FLAGS_ENV_INIT)
|
||||
set(CMAKE_CXX_COMPILER_ARG1 "${CMAKE_CXX_FLAGS_ENV_INIT}" CACHE STRING "First argument to CXX compiler")
|
||||
endif()
|
||||
if(NOT EXISTS ${CMAKE_CXX_COMPILER_INIT})
|
||||
message(FATAL_ERROR "Could not find compiler set in environment variable CXX:\n$ENV{CXX}.\n${CMAKE_CXX_COMPILER_INIT}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# next prefer the generator specified compiler
|
||||
if(CMAKE_GENERATOR_CXX)
|
||||
if(NOT CMAKE_CXX_COMPILER_INIT)
|
||||
set(CMAKE_CXX_COMPILER_INIT ${CMAKE_GENERATOR_CXX})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# finally list compilers to try
|
||||
if(NOT CMAKE_CXX_COMPILER_INIT)
|
||||
set(CMAKE_CXX_COMPILER_LIST CC ${_CMAKE_TOOLCHAIN_PREFIX}c++ ${_CMAKE_TOOLCHAIN_PREFIX}g++ aCC cl bcc xlC clang++)
|
||||
endif()
|
||||
|
||||
_cmake_find_compiler(CXX)
|
||||
else()
|
||||
|
||||
# we only get here if CMAKE_CXX_COMPILER was specified using -D or a pre-made CMakeCache.txt
|
||||
# (e.g. via ctest) or set in CMAKE_TOOLCHAIN_FILE
|
||||
#
|
||||
# if CMAKE_CXX_COMPILER is a list of length 2, use the first item as
|
||||
# CMAKE_CXX_COMPILER and the 2nd one as CMAKE_CXX_COMPILER_ARG1
|
||||
|
||||
list(LENGTH CMAKE_CXX_COMPILER _CMAKE_CXX_COMPILER_LIST_LENGTH)
|
||||
if("${_CMAKE_CXX_COMPILER_LIST_LENGTH}" EQUAL 2)
|
||||
list(GET CMAKE_CXX_COMPILER 1 CMAKE_CXX_COMPILER_ARG1)
|
||||
list(GET CMAKE_CXX_COMPILER 0 CMAKE_CXX_COMPILER)
|
||||
endif()
|
||||
|
||||
# if a compiler was specified by the user but without path,
|
||||
# now try to find it with the full path
|
||||
# if it is found, force it into the cache,
|
||||
# if not, don't overwrite the setting (which was given by the user) with "NOTFOUND"
|
||||
# if the CXX compiler already had a path, reuse it for searching the C compiler
|
||||
get_filename_component(_CMAKE_USER_CXX_COMPILER_PATH "${CMAKE_CXX_COMPILER}" PATH)
|
||||
if(NOT _CMAKE_USER_CXX_COMPILER_PATH)
|
||||
find_program(CMAKE_CXX_COMPILER_WITH_PATH NAMES ${CMAKE_CXX_COMPILER})
|
||||
mark_as_advanced(CMAKE_CXX_COMPILER_WITH_PATH)
|
||||
if(CMAKE_CXX_COMPILER_WITH_PATH)
|
||||
set(CMAKE_CXX_COMPILER ${CMAKE_CXX_COMPILER_WITH_PATH} CACHE STRING "CXX compiler" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
mark_as_advanced(CMAKE_CXX_COMPILER)
|
||||
|
||||
# Each entry in this list is a set of extra flags to try
|
||||
# adding to the compile line to see if it helps produce
|
||||
|
@ -127,6 +108,11 @@ if(NOT CMAKE_CXX_COMPILER_ID_RUN)
|
|||
# Try compiling to an object file only.
|
||||
"-c"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Build a small source file to identify the compiler.
|
||||
if(NOT CMAKE_CXX_COMPILER_ID_RUN)
|
||||
set(CMAKE_CXX_COMPILER_ID_RUN 1)
|
||||
|
||||
# Try to identify the compiler.
|
||||
set(CMAKE_CXX_COMPILER_ID)
|
||||
|
@ -146,6 +132,10 @@ if(NOT CMAKE_CXX_COMPILER_ID_RUN)
|
|||
endif()
|
||||
endif()
|
||||
|
||||
if (NOT _CMAKE_TOOLCHAIN_LOCATION)
|
||||
get_filename_component(_CMAKE_TOOLCHAIN_LOCATION "${CMAKE_CXX_COMPILER}" PATH)
|
||||
endif ()
|
||||
|
||||
# if we have a g++ cross compiler, they have usually some prefix, like
|
||||
# e.g. powerpc-linux-g++, arm-elf-g++ or i586-mingw32msvc-g++ , optionally
|
||||
# with a 3-component version number at the end (e.g. arm-eabi-gcc-4.5.2).
|
||||
|
|
|
@ -25,105 +25,100 @@ if(NOT CMAKE_Fortran_COMPILER_NAMES)
|
|||
set(CMAKE_Fortran_COMPILER_NAMES f95)
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_Fortran_COMPILER)
|
||||
# prefer the environment variable CC
|
||||
if($ENV{FC} MATCHES ".+")
|
||||
get_filename_component(CMAKE_Fortran_COMPILER_INIT $ENV{FC} PROGRAM PROGRAM_ARGS CMAKE_Fortran_FLAGS_ENV_INIT)
|
||||
if(CMAKE_Fortran_FLAGS_ENV_INIT)
|
||||
set(CMAKE_Fortran_COMPILER_ARG1 "${CMAKE_Fortran_FLAGS_ENV_INIT}" CACHE STRING "First argument to Fortran compiler")
|
||||
endif()
|
||||
if(EXISTS ${CMAKE_Fortran_COMPILER_INIT})
|
||||
else()
|
||||
message(FATAL_ERROR "Could not find compiler set in environment variable FC:\n$ENV{FC}.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# next try prefer the compiler specified by the generator
|
||||
if(CMAKE_GENERATOR_FC)
|
||||
if(NOT CMAKE_Fortran_COMPILER_INIT)
|
||||
set(CMAKE_Fortran_COMPILER_INIT ${CMAKE_GENERATOR_FC})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# finally list compilers to try
|
||||
if(NOT CMAKE_Fortran_COMPILER_INIT)
|
||||
# Known compilers:
|
||||
# f77/f90/f95: generic compiler names
|
||||
# g77: GNU Fortran 77 compiler
|
||||
# gfortran: putative GNU Fortran 95+ compiler (in progress)
|
||||
# fort77: native F77 compiler under HP-UX (and some older Crays)
|
||||
# frt: Fujitsu F77 compiler
|
||||
# pathf90/pathf95/pathf2003: PathScale Fortran compiler
|
||||
# pgf77/pgf90/pgf95/pgfortran: Portland Group F77/F90/F95 compilers
|
||||
# xlf/xlf90/xlf95: IBM (AIX) F77/F90/F95 compilers
|
||||
# lf95: Lahey-Fujitsu F95 compiler
|
||||
# fl32: Microsoft Fortran 77 "PowerStation" compiler
|
||||
# af77: Apogee F77 compiler for Intergraph hardware running CLIX
|
||||
# epcf90: "Edinburgh Portable Compiler" F90
|
||||
# fort: Compaq (now HP) Fortran 90/95 compiler for Tru64 and Linux/Alpha
|
||||
# ifc: Intel Fortran 95 compiler for Linux/x86
|
||||
# efc: Intel Fortran 95 compiler for IA64
|
||||
#
|
||||
# The order is 95 or newer compilers first, then 90,
|
||||
# then 77 or older compilers, gnu is always last in the group,
|
||||
# so if you paid for a compiler it is picked by default.
|
||||
set(CMAKE_Fortran_COMPILER_LIST
|
||||
ifort ifc af95 af90 efc f95 pathf2003 pathf95 pgf95 pgfortran lf95 xlf95
|
||||
fort gfortran gfortran-4 g95 f90 pathf90 pgf90 xlf90 epcf90 fort77
|
||||
frt pgf77 xlf fl32 af77 g77 f77
|
||||
)
|
||||
|
||||
# Vendor-specific compiler names.
|
||||
set(_Fortran_COMPILER_NAMES_GNU gfortran gfortran-4 g95 g77)
|
||||
set(_Fortran_COMPILER_NAMES_Intel ifort ifc efc)
|
||||
set(_Fortran_COMPILER_NAMES_Absoft af95 af90 af77)
|
||||
set(_Fortran_COMPILER_NAMES_PGI pgf95 pgfortran pgf90 pgf77)
|
||||
set(_Fortran_COMPILER_NAMES_PathScale pathf2003 pathf95 pathf90)
|
||||
set(_Fortran_COMPILER_NAMES_XL xlf)
|
||||
set(_Fortran_COMPILER_NAMES_VisualAge xlf95 xlf90 xlf)
|
||||
endif()
|
||||
|
||||
_cmake_find_compiler(Fortran)
|
||||
|
||||
else()
|
||||
# we only get here if CMAKE_Fortran_COMPILER was specified using -D or a pre-made CMakeCache.txt
|
||||
# (e.g. via ctest) or set in CMAKE_TOOLCHAIN_FILE
|
||||
# if CMAKE_Fortran_COMPILER is a list of length 2, use the first item as
|
||||
# CMAKE_Fortran_COMPILER and the 2nd one as CMAKE_Fortran_COMPILER_ARG1
|
||||
|
||||
list(LENGTH CMAKE_Fortran_COMPILER _CMAKE_Fortran_COMPILER_LIST_LENGTH)
|
||||
if("${_CMAKE_Fortran_COMPILER_LIST_LENGTH}" EQUAL 2)
|
||||
list(GET CMAKE_Fortran_COMPILER 1 CMAKE_Fortran_COMPILER_ARG1)
|
||||
list(GET CMAKE_Fortran_COMPILER 0 CMAKE_Fortran_COMPILER)
|
||||
endif()
|
||||
|
||||
# if a compiler was specified by the user but without path,
|
||||
# now try to find it with the full path
|
||||
# if it is found, force it into the cache,
|
||||
# if not, don't overwrite the setting (which was given by the user) with "NOTFOUND"
|
||||
# if the C compiler already had a path, reuse it for searching the CXX compiler
|
||||
get_filename_component(_CMAKE_USER_Fortran_COMPILER_PATH "${CMAKE_Fortran_COMPILER}" PATH)
|
||||
if(NOT _CMAKE_USER_Fortran_COMPILER_PATH)
|
||||
find_program(CMAKE_Fortran_COMPILER_WITH_PATH NAMES ${CMAKE_Fortran_COMPILER})
|
||||
mark_as_advanced(CMAKE_Fortran_COMPILER_WITH_PATH)
|
||||
if(CMAKE_Fortran_COMPILER_WITH_PATH)
|
||||
set(CMAKE_Fortran_COMPILER ${CMAKE_Fortran_COMPILER_WITH_PATH}
|
||||
CACHE STRING "Fortran compiler" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
mark_as_advanced(CMAKE_Fortran_COMPILER)
|
||||
|
||||
# Build a small source file to identify the compiler.
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual Studio")
|
||||
set(CMAKE_Fortran_COMPILER_ID_RUN 1)
|
||||
set(CMAKE_Fortran_PLATFORM_ID "Windows")
|
||||
set(CMAKE_Fortran_COMPILER_ID "Intel")
|
||||
endif()
|
||||
set(CMAKE_Fortran_COMPILER "${CMAKE_GENERATOR_FC}")
|
||||
else()
|
||||
if(NOT CMAKE_Fortran_COMPILER)
|
||||
# prefer the environment variable CC
|
||||
if($ENV{FC} MATCHES ".+")
|
||||
get_filename_component(CMAKE_Fortran_COMPILER_INIT $ENV{FC} PROGRAM PROGRAM_ARGS CMAKE_Fortran_FLAGS_ENV_INIT)
|
||||
if(CMAKE_Fortran_FLAGS_ENV_INIT)
|
||||
set(CMAKE_Fortran_COMPILER_ARG1 "${CMAKE_Fortran_FLAGS_ENV_INIT}" CACHE STRING "First argument to Fortran compiler")
|
||||
endif()
|
||||
if(EXISTS ${CMAKE_Fortran_COMPILER_INIT})
|
||||
else()
|
||||
message(FATAL_ERROR "Could not find compiler set in environment variable FC:\n$ENV{FC}.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT CMAKE_Fortran_COMPILER_ID_RUN)
|
||||
set(CMAKE_Fortran_COMPILER_ID_RUN 1)
|
||||
# next try prefer the compiler specified by the generator
|
||||
if(CMAKE_GENERATOR_FC)
|
||||
if(NOT CMAKE_Fortran_COMPILER_INIT)
|
||||
set(CMAKE_Fortran_COMPILER_INIT ${CMAKE_GENERATOR_FC})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# finally list compilers to try
|
||||
if(NOT CMAKE_Fortran_COMPILER_INIT)
|
||||
# Known compilers:
|
||||
# f77/f90/f95: generic compiler names
|
||||
# g77: GNU Fortran 77 compiler
|
||||
# gfortran: putative GNU Fortran 95+ compiler (in progress)
|
||||
# fort77: native F77 compiler under HP-UX (and some older Crays)
|
||||
# frt: Fujitsu F77 compiler
|
||||
# pathf90/pathf95/pathf2003: PathScale Fortran compiler
|
||||
# pgf77/pgf90/pgf95/pgfortran: Portland Group F77/F90/F95 compilers
|
||||
# xlf/xlf90/xlf95: IBM (AIX) F77/F90/F95 compilers
|
||||
# lf95: Lahey-Fujitsu F95 compiler
|
||||
# fl32: Microsoft Fortran 77 "PowerStation" compiler
|
||||
# af77: Apogee F77 compiler for Intergraph hardware running CLIX
|
||||
# epcf90: "Edinburgh Portable Compiler" F90
|
||||
# fort: Compaq (now HP) Fortran 90/95 compiler for Tru64 and Linux/Alpha
|
||||
# ifc: Intel Fortran 95 compiler for Linux/x86
|
||||
# efc: Intel Fortran 95 compiler for IA64
|
||||
#
|
||||
# The order is 95 or newer compilers first, then 90,
|
||||
# then 77 or older compilers, gnu is always last in the group,
|
||||
# so if you paid for a compiler it is picked by default.
|
||||
set(CMAKE_Fortran_COMPILER_LIST
|
||||
ifort ifc af95 af90 efc f95 pathf2003 pathf95 pgf95 pgfortran lf95 xlf95
|
||||
fort gfortran gfortran-4 g95 f90 pathf90 pgf90 xlf90 epcf90 fort77
|
||||
frt pgf77 xlf fl32 af77 g77 f77
|
||||
)
|
||||
|
||||
# Vendor-specific compiler names.
|
||||
set(_Fortran_COMPILER_NAMES_GNU gfortran gfortran-4 g95 g77)
|
||||
set(_Fortran_COMPILER_NAMES_Intel ifort ifc efc)
|
||||
set(_Fortran_COMPILER_NAMES_Absoft af95 af90 af77)
|
||||
set(_Fortran_COMPILER_NAMES_PGI pgf95 pgfortran pgf90 pgf77)
|
||||
set(_Fortran_COMPILER_NAMES_PathScale pathf2003 pathf95 pathf90)
|
||||
set(_Fortran_COMPILER_NAMES_XL xlf)
|
||||
set(_Fortran_COMPILER_NAMES_VisualAge xlf95 xlf90 xlf)
|
||||
endif()
|
||||
|
||||
_cmake_find_compiler(Fortran)
|
||||
|
||||
else()
|
||||
# we only get here if CMAKE_Fortran_COMPILER was specified using -D or a pre-made CMakeCache.txt
|
||||
# (e.g. via ctest) or set in CMAKE_TOOLCHAIN_FILE
|
||||
# if CMAKE_Fortran_COMPILER is a list of length 2, use the first item as
|
||||
# CMAKE_Fortran_COMPILER and the 2nd one as CMAKE_Fortran_COMPILER_ARG1
|
||||
|
||||
list(LENGTH CMAKE_Fortran_COMPILER _CMAKE_Fortran_COMPILER_LIST_LENGTH)
|
||||
if("${_CMAKE_Fortran_COMPILER_LIST_LENGTH}" EQUAL 2)
|
||||
list(GET CMAKE_Fortran_COMPILER 1 CMAKE_Fortran_COMPILER_ARG1)
|
||||
list(GET CMAKE_Fortran_COMPILER 0 CMAKE_Fortran_COMPILER)
|
||||
endif()
|
||||
|
||||
# if a compiler was specified by the user but without path,
|
||||
# now try to find it with the full path
|
||||
# if it is found, force it into the cache,
|
||||
# if not, don't overwrite the setting (which was given by the user) with "NOTFOUND"
|
||||
# if the C compiler already had a path, reuse it for searching the CXX compiler
|
||||
get_filename_component(_CMAKE_USER_Fortran_COMPILER_PATH "${CMAKE_Fortran_COMPILER}" PATH)
|
||||
if(NOT _CMAKE_USER_Fortran_COMPILER_PATH)
|
||||
find_program(CMAKE_Fortran_COMPILER_WITH_PATH NAMES ${CMAKE_Fortran_COMPILER})
|
||||
mark_as_advanced(CMAKE_Fortran_COMPILER_WITH_PATH)
|
||||
if(CMAKE_Fortran_COMPILER_WITH_PATH)
|
||||
set(CMAKE_Fortran_COMPILER ${CMAKE_Fortran_COMPILER_WITH_PATH}
|
||||
CACHE STRING "Fortran compiler" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
mark_as_advanced(CMAKE_Fortran_COMPILER)
|
||||
|
||||
# Each entry in this list is a set of extra flags to try
|
||||
# adding to the compile line to see if it helps produce
|
||||
|
@ -135,6 +130,11 @@ if(NOT CMAKE_Fortran_COMPILER_ID_RUN)
|
|||
# Intel on windows does not preprocess by default.
|
||||
"-fpp"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Build a small source file to identify the compiler.
|
||||
if(NOT CMAKE_Fortran_COMPILER_ID_RUN)
|
||||
set(CMAKE_Fortran_COMPILER_ID_RUN 1)
|
||||
|
||||
# Table of per-vendor compiler id flags with expected output.
|
||||
list(APPEND CMAKE_Fortran_COMPILER_ID_VENDORS Compaq)
|
||||
|
|
Loading…
Reference in New Issue