Browse Source

Merge topic 'add-cray-linux-platform'

743fcf1e Cray: Fix static / dynamic detection logic and parse more driver flags
Brad King 10 years ago
parent
commit
e45e503f14
1 changed files with 88 additions and 66 deletions
  1. 88 66
      Modules/Platform/CrayPrgEnv.cmake

+ 88 - 66
Modules/Platform/CrayPrgEnv.cmake

@@ -26,73 +26,53 @@ foreach(__lang C CXX Fortran)
 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")))
+# 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()
 
-# 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})
+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()
-  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()
+  set(${OUTPUT} ${${OUTPUT}} PARENT_SCOPE)
+endfunction()
+macro(__cray_parse_flags OUTPUT FLAG_TAG INPUT)
+  __cray_parse_flags_with_sep(${OUTPUT} ${FLAG_TAG} " " "${INPUT}")
+endmacro()
 
-  # 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)
+# Remove duplicates in a list
+macro(__cray_list_remove_duplicates VAR)
+  if(${VAR})
+    list(REMOVE_DUPLICATES ${VAR})
   endif()
-endforeach()
+endmacro()
 
 # Compute the intersection of several lists
-macro(__list_intersection L_OUT L0)
+function(__cray_list_intersect OUTPUT INPUT0)
   if(ARGC EQUAL 2)
-    list(APPEND ${L_OUT} ${${L0}})
+    list(APPEND ${OUTPUT} ${${INPUT0}})
   else()
-    foreach(I IN LISTS ${L0})
+    foreach(I IN LISTS ${INPUT0})
       set(__is_common 1)
       foreach(L IN LISTS ARGN)
         list(FIND ${L} "${I}" __idx)
@@ -102,26 +82,68 @@ macro(__list_intersection L_OUT L0)
         endif()
       endforeach()
       if(__is_common)
-        list(APPEND ${L_OUT}  "${I}")
+        list(APPEND ${OUTPUT}  "${I}")
       endif()
     endforeach()
   endif()
-  if(${L_OUT})
-    list(REMOVE_DUPLICATES ${L_OUT})
+  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()
-endmacro()
+
+  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_include_path_vars)
-set(__cray_library_path_vars)
+set(__cray_inc_path_vars)
+set(__cray_lib_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)
+  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_include_path_vars)
-  __list_intersection(CMAKE_SYSTEM_INCLUDE_PATH ${__cray_include_path_vars})
+if(__cray_inc_path_vars)
+  __cray_list_intersect(CMAKE_SYSTEM_INCLUDE_PATH ${__cray_inc_path_vars})
 endif()
-if(__cray_library_path_vars)
-  __list_intersection(CMAKE_SYSTEM_LIBRARY_PATH ${__cray_library_path_vars})
+if(__cray_lib_path_vars)
+  __cray_list_intersect(CMAKE_SYSTEM_LIBRARY_PATH ${__cray_lib_path_vars})
 endif()