summaryrefslogtreecommitdiff
path: root/Modules/Compiler/CrayPrgEnv.cmake
blob: 05e3fc763410a9e995f7cfe06cbf75b2d43495af (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
# Guard against multiple inclusions
if(__craylinux_crayprgenv)
  return()
endif()
set(__craylinux_crayprgenv 1)

macro(__cray_extract_args cmd tag_regex out_var make_absolute)
  string(REGEX MATCHALL "${tag_regex}" args "${cmd}")
  foreach(arg IN LISTS args)
    string(REGEX REPLACE "^${tag_regex}$" "\\2" param "${arg}")
    if(make_absolute)
      get_filename_component(param "${param}" ABSOLUTE)
    endif()
    list(APPEND ${out_var} ${param})
  endforeach()
endmacro()

function(__cray_extract_implicit src compiler_cmd link_cmd lang include_dirs_var link_dirs_var link_libs_var)
  set(BIN "${CMAKE_PLATFORM_INFO_DIR}/CrayExtractImplicit_${lang}.bin")
  execute_process(
    COMMAND ${CMAKE_${lang}_COMPILER} ${CMAKE_${lang}_VERBOSE_FLAG} -o ${BIN}
    RESULT_VARIABLE result
    OUTPUT_VARIABLE output
    ERROR_VARIABLE error
    )
  if(EXISTS "${BIN}")
    file(REMOVE "${BIN}")
  endif()
  set(include_dirs)
  set(link_dirs)
  set(link_libs)
  string(REGEX REPLACE "\r?\n" ";" output_lines "${output}\n${error}")
  foreach(line IN LISTS output_lines)
    if("${line}" MATCHES "${compiler_cmd}")
      __cray_extract_args("${line}" " -(I ?|isystem )([^ ]*)" include_dirs 1)
      set(processed_include 1)
    endif()
    if("${line}" MATCHES "${link_cmd}")
      __cray_extract_args("${line}" " -(L ?)([^ ]*)" link_dirs 1)
      __cray_extract_args("${line}" " -(l ?)([^ ]*)" link_libs 0)
      set(processed_link 1)
    endif()
    if(processed_include AND processed_link)
      break()
    endif()
  endforeach()

  set(${include_dirs_var} "${include_dirs}" PARENT_SCOPE)
  set(${link_dirs_var}    "${link_dirs}" PARENT_SCOPE)
  set(${link_libs_var}    "${link_libs}" PARENT_SCOPE)
  set(CRAY_${lang}_EXTRACTED_IMPLICIT 1 CACHE INTERNAL "" FORCE)
endfunction()

macro(__CrayPrgEnv_setup lang test_src compiler_cmd link_cmd)
  if(DEFINED ENV{CRAYPE_VERSION})
    message(STATUS "Cray Programming Environment $ENV{CRAYPE_VERSION} ${lang}")
  elseif(DEFINED ENV{ASYNCPE_VERSION})
    message(STATUS "Cray XT Programming Environment $ENV{ASYNCPE_VERSION} ${lang}")
  else()
    message(STATUS "Cray Programming Environment (unknown version) ${lang}")
  endif()

  # Flags for the Cray wrappers
  set(CMAKE_STATIC_LIBRARY_LINK_${lang}_FLAGS "-static")
  set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-shared")
  set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-dynamic")

  # If the link type is not explicitly specified in the environment then
  # the Cray wrappers assume that the code will be built statically 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_${lang}_FLAGS MATCHES "(^| )-dynamic($| )") OR
         (CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-dynamic($| )"))
         OR
         (("$ENV{CRAYPE_LINK_TYPE}" STREQUAL "dynamic") AND
          NOT ((CMAKE_${lang}_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()
  if(NOT CRAY_${lang}_EXTRACTED_IMPLICIT)
    __cray_extract_implicit(
      ${test_src} ${compiler_cmd} ${link_cmd} ${lang}
      CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES
      CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES
      CMAKE_${lang}_IMPLICIT_LINK_LIBRARIES
      )
  endif()
endmacro()