CMake/Modules/Platform/CrayPrgEnv.cmake

150 lines
5.3 KiB
CMake

# Guard against multiple inclusions
if(__CrayPrgEnv)
return()
endif()
set(__CrayPrgEnv 1)
if(DEFINED ENV{CRAYPE_VERSION})
message(STATUS "Cray Programming Environment $ENV{CRAYPE_VERSION}")
set(__verbose_flag "-craype-verbose")
elseif(DEFINED ENV{ASYNCPE_VERSION})
message(STATUS "Cray Programming Environment $ENV{ASYNCPE_VERSION}")
set(__verbose_flag "-v")
else()
message(STATUS "Cray Programming Environment")
endif()
if(NOT __CrayLinuxEnvironment)
message(FATAL_ERROR "The CrayPrgEnv platform file must not be used on its own and is intented to be included by the CrayLinuxEnvironment platform file")
endif()
# Flags for the Cray wrappers
foreach(__lang C CXX Fortran)
set(CMAKE_STATIC_LIBRARY_LINK_${__lang}_FLAGS "-static")
set(CMAKE_SHARED_LIBRARY_${__lang}_FLAGS "")
set(CMAKE_SHARED_LIBRARY_CREATE_${__lang}_FLAGS "-shared")
set(CMAKE_SHARED_LIBRARY_LINK_${__lang}_FLAGS "-dynamic")
endforeach()
# If the link type is not explicitly specified in the environment then
# the Cray wrappers assume that the code will be built staticly so
# we check the following condition(s) are NOT met
# Compiler flags are explicitly dynamic
# Env var is dynamic and compiler flags are not explicitly static
if(NOT (((CMAKE_C_FLAGS MATCHES "(^| )-dynamic($| )") OR
(CMAKE_CXX_FLAGS MATCHES "(^| )-dynamic($| )") OR
(CMAKE_Fortran_FLAGS MATCHES "(^| )-dynamic($| )") OR
(CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-dynamic($| )"))
OR
(("$ENV{CRAYPE_LINK_TYPE}" STREQUAL "dynamic") AND
NOT ((CMAKE_C_FLAGS MATCHES "(^| )-static($| )") OR
(CMAKE_CXX_FLAGS MATCHES "(^| )-static($| )") OR
(CMAKE_Fortran_FLAGS MATCHES "(^| )-static($| )") OR
(CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-static($| )")))))
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
set(BUILD_SHARED_LIBS FALSE CACHE BOOL "")
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
set(CMAKE_LINK_SEARCH_START_STATIC TRUE)
endif()
function(__cray_parse_flags_with_sep OUTPUT FLAG_TAG SEP INPUT)
string(REGEX MATCHALL "${SEP}${FLAG_TAG}([^${SEP}]+)" FLAG_ARGS "${INPUT}")
foreach(FLAG_ARG IN LISTS FLAG_ARGS)
string(REGEX REPLACE
"^${SEP}${FLAG_TAG}([^${SEP}]+)" "\\1" FLAG_VALUE
"${FLAG_ARG}")
list(APPEND ${OUTPUT} ${FLAG_VALUE})
endforeach()
set(${OUTPUT} ${${OUTPUT}} PARENT_SCOPE)
endfunction()
macro(__cray_parse_flags OUTPUT FLAG_TAG INPUT)
__cray_parse_flags_with_sep(${OUTPUT} ${FLAG_TAG} " " "${INPUT}")
endmacro()
# Remove duplicates in a list
macro(__cray_list_remove_duplicates VAR)
if(${VAR})
list(REMOVE_DUPLICATES ${VAR})
endif()
endmacro()
# Compute the intersection of several lists
function(__cray_list_intersect OUTPUT INPUT0)
if(ARGC EQUAL 2)
list(APPEND ${OUTPUT} ${${INPUT0}})
else()
foreach(I IN LISTS ${INPUT0})
set(__is_common 1)
foreach(L IN LISTS ARGN)
list(FIND ${L} "${I}" __idx)
if(__idx EQUAL -1)
set(__is_common 0)
break()
endif()
endforeach()
if(__is_common)
list(APPEND ${OUTPUT} "${I}")
endif()
endforeach()
endif()
set(${OUTPUT} ${${OUTPUT}} PARENT_SCOPE)
endfunction()
# Parse the implicit directories used by the wrappers
get_property(__langs GLOBAL PROPERTY ENABLED_LANGUAGES)
foreach(__lang IN LISTS __langs)
if(__lang STREQUAL "C")
set(__empty empty.c)
elseif(__lang STREQUAL CXX)
set(__empty empty.cxx)
elseif(__lang STREQUAL Fortran)
set(__empty empty.f90)
else()
continue()
endif()
execute_process(
COMMAND ${CMAKE_${__lang}_COMPILER} ${__verbose_flag} ${__empty}
OUTPUT_VARIABLE __cmd_out
ERROR_QUIET
)
string(REGEX MATCH "(^|\n)[^\n]*${__empty}[^\n]*" __driver "${__cmd_out}")
# Parse include paths
set(__cray_flag_args)
__cray_parse_flags(__cray_flag_args "-I" "${__driver}")
__cray_parse_flags(__cray_flag_args "-isystem " "${__driver}")
list(APPEND CMAKE_${__lang}_IMPLICIT_INCLUDE_DIRECTORIES ${__cray_flag_args})
__cray_list_remove_duplicates(CMAKE_${__lang}_IMPLICIT_INCLUDE_DIRECTORIES)
# Parse library paths
set(__cray_flag_args)
__cray_parse_flags(__cray_flag_args "-L" "${__driver}")
list(APPEND CMAKE_${__lang}_IMPLICIT_LINK_DIRECTORIES ${__cray_flag_args})
__cray_list_remove_duplicates(CMAKE_${__lang}_IMPLICIT_LINK_DIRECTORIES)
# Parse libraries
set(__cray_flag_args)
__cray_parse_flags(__cray_flag_args "-l" "${__driver}")
__cray_parse_flags(__cray_linker_flags "-Wl" "${__driver}")
foreach(F IN LISTS __cray_linker_flags)
__cray_parse_flags_with_sep(__cray_flag_args "-l" "," "${F}")
endforeach()
list(APPEND CMAKE_${__lang}_IMPLICIT_LINK_LIBRARIES ${__cray_flag_args})
__cray_list_remove_duplicates(CMAKE_${__lang}_IMPLICIT_LINK_LIBRARIES)
endforeach()
# Determine the common directories between all languages and add them
# as system search paths
set(__cray_inc_path_vars)
set(__cray_lib_path_vars)
foreach(__lang IN LISTS __langs)
list(APPEND __cray_inc_path_vars CMAKE_${__lang}_IMPLICIT_INCLUDE_DIRECTORIES)
list(APPEND __cray_lib_path_vars CMAKE_${__lang}_IMPLICIT_LINK_DIRECTORIES)
endforeach()
if(__cray_inc_path_vars)
__cray_list_intersect(CMAKE_SYSTEM_INCLUDE_PATH ${__cray_inc_path_vars})
endif()
if(__cray_lib_path_vars)
__cray_list_intersect(CMAKE_SYSTEM_LIBRARY_PATH ${__cray_lib_path_vars})
endif()