blob: a78846d591cd9ffb2bbba90596f41e328d4350be (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
# 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
if(NOT ((CMAKE_C_FLAGS MATCHES "(^| )-dynamic($| )") OR
(CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-dynamic($| )") OR
("$ENV{CRAYPE_LINK_TYPE}" STREQUAL "dynamic")))
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()
# 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_fname empty.c)
elseif(__lang STREQUAL CXX)
set(__empty_fname empty.cxx)
elseif(__lang STREQUAL Fortran)
set(__empty_fname empty.f90)
else()
continue()
endif()
execute_process(
COMMAND ${CMAKE_${__lang}_COMPILER} ${__verbose_flag} ${__empty_fname}
OUTPUT_VARIABLE __cray_output
ERROR_QUIET
)
string(REGEX MATCH "(^|\n)[^\n]*${__empty_fname}[^\n]*" __cray_driver_cmd "${__cray_output}")
# Parse include paths
string(REGEX MATCHALL " -I([^ ]+)" __cray_include_flags "${__cray_driver_cmd}")
foreach(_flag IN LISTS __cray_include_flags)
string(REGEX REPLACE "^ -I([^ ]+)" "\\1" _dir "${_flag}")
list(APPEND CMAKE_${__lang}_IMPLICIT_INCLUDE_DIRECTORIES ${_dir})
endforeach()
if(CMAKE_${__lang}_IMPLICIT_INCLUDE_DIRECTORIES)
list(REMOVE_DUPLICATES CMAKE_${__lang}_IMPLICIT_INCLUDE_DIRECTORIES)
endif()
# Parse library paths
string(REGEX MATCHALL " -L([^ ]+)" __cray_library_dir_flags "${__cray_driver_cmd}")
foreach(_flag IN LISTS __cray_library_dir_flags)
string(REGEX REPLACE "^ -L([^ ]+)" "\\1" _dir "${_flag}")
list(APPEND CMAKE_${__lang}_IMPLICIT_LINK_DIRECTORIES ${_dir})
endforeach()
if(CMAKE_${__lang}_IMPLICIT_LINK_DIRECTORIES)
list(REMOVE_DUPLICATES CMAKE_${__lang}_IMPLICIT_LINK_DIRECTORIES)
endif()
# Parse library paths
string(REGEX MATCHALL " -l([^ ]+)" __cray_library_flags "${__cray_driver_cmd}")
foreach(_flag IN LISTS __cray_library_flags)
string(REGEX REPLACE "^ -l([^ ]+)" "\\1" _dir "${_flag}")
list(APPEND CMAKE_${__lang}_IMPLICIT_LINK_LIBRARIES ${_dir})
endforeach()
if(CMAKE_${__lang}_IMPLICIT_LINK_DIRECTORIES)
list(REMOVE_DUPLICATES CMAKE_${__lang}_IMPLICIT_LINK_LIBRARIES)
endif()
endforeach()
# Compute the intersection of several lists
macro(__list_intersection L_OUT L0)
if(ARGC EQUAL 2)
list(APPEND ${L_OUT} ${${L0}})
else()
foreach(I IN LISTS ${L0})
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 ${L_OUT} "${I}")
endif()
endforeach()
endif()
if(${L_OUT})
list(REMOVE_DUPLICATES ${L_OUT})
endif()
endmacro()
# Determine the common directories between all languages and add them
# as system search paths
set(__cray_include_path_vars)
set(__cray_library_path_vars)
foreach(__lang IN LISTS __langs)
list(APPEND __cray_include_path_vars CMAKE_${__lang}_IMPLICIT_INCLUDE_DIRECTORIES)
list(APPEND __cray_library_path_vars CMAKE_${__lang}_IMPLICIT_LINK_DIRECTORIES)
endforeach()
if(__cray_include_path_vars)
__list_intersection(CMAKE_SYSTEM_INCLUDE_PATH ${__cray_include_path_vars})
endif()
if(__cray_library_path_vars)
__list_intersection(CMAKE_SYSTEM_LIBRARY_PATH ${__cray_library_path_vars})
endif()
|