summaryrefslogtreecommitdiffstats
path: root/Modules/Platform/CrayPrgEnv.cmake
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()