summaryrefslogtreecommitdiffstats
path: root/Modules/Compiler
diff options
context:
space:
mode:
authorChuck Atkins <chuck.atkins@kitware.com>2015-12-02 16:00:44 (GMT)
committerBrad King <brad.king@kitware.com>2015-12-09 13:35:19 (GMT)
commita7ef02253bf8ef33d4ffdd761802ea30ef289b8a (patch)
treea1029eb1d5bec221148e3bb7341994599ac91aaf /Modules/Compiler
parent0763a8365528166747746e3b94e74ca98d0d705f (diff)
downloadCMake-a7ef02253bf8ef33d4ffdd761802ea30ef289b8a.zip
CMake-a7ef02253bf8ef33d4ffdd761802ea30ef289b8a.tar.gz
CMake-a7ef02253bf8ef33d4ffdd761802ea30ef289b8a.tar.bz2
Cray: Refactor the Cray platform files to use compiler wrapper checks
This is an extensive refactoring of the Cray compiler wrapper usage. Using the new compiler wrapper checks, the CrayPrgEnv info files have been moved from Platform/ to Compiler/. The adjusted naming convention allows the compiler-wrapper information files to be loaded for both the CrayLinuxEnvironment platform when cross-compiling and the Linux platform if building natively on the Cray compute nodes. It also creates a separation of common arguments for compiler id and language information used to perform the appropriate introspection of implicit arguments and libraries used by the compiler wrappers based on the loaded module environment.
Diffstat (limited to 'Modules/Compiler')
-rw-r--r--Modules/Compiler/CrayPrgEnv-C.cmake11
-rw-r--r--Modules/Compiler/CrayPrgEnv-CXX.cmake11
-rw-r--r--Modules/Compiler/CrayPrgEnv-Cray-C.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-Cray-CXX.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-Cray-Fortran.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-Fortran.cmake11
-rw-r--r--Modules/Compiler/CrayPrgEnv-GNU-C.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-GNU-CXX.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-GNU-Fortran.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-Intel-C.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-Intel-CXX.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-Intel-Fortran.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-PGI-C.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-PGI-CXX.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv-PGI-Fortran.cmake7
-rw-r--r--Modules/Compiler/CrayPrgEnv.cmake83
16 files changed, 200 insertions, 0 deletions
diff --git a/Modules/Compiler/CrayPrgEnv-C.cmake b/Modules/Compiler/CrayPrgEnv-C.cmake
new file mode 100644
index 0000000..6b461ce
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-C.cmake
@@ -0,0 +1,11 @@
+if(__craylinux_crayprgenv_c)
+ return()
+endif()
+set(__craylinux_crayprgenv_c 1)
+
+include(Compiler/CrayPrgEnv)
+macro(__CrayPrgEnv_setup_C compiler_cmd link_cmd)
+ __CrayPrgEnv_setup(C
+ ${CMAKE_ROOT}/Modules/CMakeCCompilerABI.c
+ ${compiler_cmd} ${link_cmd})
+endmacro()
diff --git a/Modules/Compiler/CrayPrgEnv-CXX.cmake b/Modules/Compiler/CrayPrgEnv-CXX.cmake
new file mode 100644
index 0000000..aad85b6
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-CXX.cmake
@@ -0,0 +1,11 @@
+if(__craylinux_crayprgenv_cxx)
+ return()
+endif()
+set(__craylinux_crayprgenv_cxx 1)
+
+include(Compiler/CrayPrgEnv)
+macro(__CrayPrgEnv_setup_CXX compiler_cmd link_cmd)
+ __CrayPrgEnv_setup(CXX
+ ${CMAKE_ROOT}/Modules/CMakeCXXCompilerABI.cpp
+ ${compiler_cmd} ${link_cmd})
+endmacro()
diff --git a/Modules/Compiler/CrayPrgEnv-Cray-C.cmake b/Modules/Compiler/CrayPrgEnv-Cray-C.cmake
new file mode 100644
index 0000000..547a4b4
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-Cray-C.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_cray_c)
+ return()
+endif()
+set(__craylinux_crayprgenv_cray_c 1)
+
+include(Compiler/CrayPrgEnv-C)
+__CrayPrgEnv_setup_C("/opt/cray/cce/.*/ccfe" "/opt/cray/cce/.*/ld")
diff --git a/Modules/Compiler/CrayPrgEnv-Cray-CXX.cmake b/Modules/Compiler/CrayPrgEnv-Cray-CXX.cmake
new file mode 100644
index 0000000..df8452c
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-Cray-CXX.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_cray_cxx)
+ return()
+endif()
+set(__craylinux_crayprgenv_cray_cxx 1)
+
+include(Compiler/CrayPrgEnv-CXX)
+__CrayPrgEnv_setup_CXX("/opt/cray/cce/.*/ccfe" "/opt/cray/cce/.*/ld")
diff --git a/Modules/Compiler/CrayPrgEnv-Cray-Fortran.cmake b/Modules/Compiler/CrayPrgEnv-Cray-Fortran.cmake
new file mode 100644
index 0000000..9f46a04
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-Cray-Fortran.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_cray_fortran)
+ return()
+endif()
+set(__craylinux_crayprgenv_cray_fortran 1)
+
+include(Compiler/CrayPrgEnv-Fortran)
+__CrayPrgEnv_setup_Fortran("/opt/cray/cce/.*/ftnfe" "/opt/cray/cce/.*/ld")
diff --git a/Modules/Compiler/CrayPrgEnv-Fortran.cmake b/Modules/Compiler/CrayPrgEnv-Fortran.cmake
new file mode 100644
index 0000000..9c4d269
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-Fortran.cmake
@@ -0,0 +1,11 @@
+if(__craylinux_crayprgenv_fortran)
+ return()
+endif()
+set(__craylinux_crayprgenv_fortran 1)
+
+include(Compiler/CrayPrgEnv)
+macro(__CrayPrgEnv_setup_Fortran compiler_cmd link_cmd)
+ __CrayPrgEnv_setup(Fortran
+ ${CMAKE_ROOT}/Modules/CMakeFortranCompilerABI.F
+ ${compiler_cmd} ${link_cmd})
+endmacro()
diff --git a/Modules/Compiler/CrayPrgEnv-GNU-C.cmake b/Modules/Compiler/CrayPrgEnv-GNU-C.cmake
new file mode 100644
index 0000000..248081b
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-GNU-C.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_gnu_c)
+ return()
+endif()
+set(__craylinux_crayprgenv_gnu_c 1)
+
+include(Compiler/CrayPrgEnv-C)
+__CrayPrgEnv_setup_C("/opt/gcc/.*/cc1" "/opt/gcc/.*/collect2")
diff --git a/Modules/Compiler/CrayPrgEnv-GNU-CXX.cmake b/Modules/Compiler/CrayPrgEnv-GNU-CXX.cmake
new file mode 100644
index 0000000..be4eb6d
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-GNU-CXX.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_gnu_cxx)
+ return()
+endif()
+set(__craylinux_crayprgenv_gnu_cxx 1)
+
+include(Compiler/CrayPrgEnv-CXX)
+__CrayPrgEnv_setup_CXX("/opt/gcc/.*/cc1plus" "/opt/gcc/.*/collect2")
diff --git a/Modules/Compiler/CrayPrgEnv-GNU-Fortran.cmake b/Modules/Compiler/CrayPrgEnv-GNU-Fortran.cmake
new file mode 100644
index 0000000..8bd23ff
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-GNU-Fortran.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_gnu_fortran)
+ return()
+endif()
+set(__craylinux_crayprgenv_gnu_fortran 1)
+
+include(Compiler/CrayPrgEnv-Fortran)
+__CrayPrgEnv_setup_Fortran("/opt/gcc/.*/f951" "/opt/gcc/.*/collect2")
diff --git a/Modules/Compiler/CrayPrgEnv-Intel-C.cmake b/Modules/Compiler/CrayPrgEnv-Intel-C.cmake
new file mode 100644
index 0000000..83c4e38
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-Intel-C.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_intel_c)
+ return()
+endif()
+set(__craylinux_crayprgenv_intel_c 1)
+
+include(Compiler/CrayPrgEnv-C)
+__CrayPrgEnv_setup_C("/opt/intel/.*/mcpcom" "^ld ")
diff --git a/Modules/Compiler/CrayPrgEnv-Intel-CXX.cmake b/Modules/Compiler/CrayPrgEnv-Intel-CXX.cmake
new file mode 100644
index 0000000..3c3c3e6
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-Intel-CXX.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_intel_cxx)
+ return()
+endif()
+set(__craylinux_crayprgenv_intel_cxx 1)
+
+include(Compiler/CrayPrgEnv-CXX)
+__CrayPrgEnv_setup_CXX("/opt/intel/.*/mcpcom" "^ld ")
diff --git a/Modules/Compiler/CrayPrgEnv-Intel-Fortran.cmake b/Modules/Compiler/CrayPrgEnv-Intel-Fortran.cmake
new file mode 100644
index 0000000..08a316d
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-Intel-Fortran.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_intel_fortran)
+ return()
+endif()
+set(__craylinux_crayprgenv_intel_fortran 1)
+
+include(Compiler/CrayPrgEnv-Fortran)
+__CrayPrgEnv_setup_Fortran("/opt/intel/.*/fortcom" "^ld ")
diff --git a/Modules/Compiler/CrayPrgEnv-PGI-C.cmake b/Modules/Compiler/CrayPrgEnv-PGI-C.cmake
new file mode 100644
index 0000000..f45767c
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-PGI-C.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_pgi_c)
+ return()
+endif()
+set(__craylinux_crayprgenv_pgi_c 1)
+
+include(Compiler/CrayPrgEnv-C)
+__CrayPrgEnv_setup_C("/opt/pgi/[^ ]*/pgc" "/usr/bin/ld")
diff --git a/Modules/Compiler/CrayPrgEnv-PGI-CXX.cmake b/Modules/Compiler/CrayPrgEnv-PGI-CXX.cmake
new file mode 100644
index 0000000..a2a286f
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-PGI-CXX.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_pgi_cxx)
+ return()
+endif()
+set(__craylinux_crayprgenv_pgi_cxx 1)
+
+include(Compiler/CrayPrgEnv-CXX)
+__CrayPrgEnv_setup_CXX("/opt/pgi/[^ ]*/pgcpp" "/usr/bin/ld")
diff --git a/Modules/Compiler/CrayPrgEnv-PGI-Fortran.cmake b/Modules/Compiler/CrayPrgEnv-PGI-Fortran.cmake
new file mode 100644
index 0000000..f6ba7c0
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv-PGI-Fortran.cmake
@@ -0,0 +1,7 @@
+if(__craylinux_crayprgenv_pgi_fortran)
+ return()
+endif()
+set(__craylinux_crayprgenv_pgi_fortran 1)
+
+include(Compiler/CrayPrgEnv-Fortran)
+__CrayPrgEnv_setup_Fortran("/opt/pgi/[^ ]*/pgf" "/usr/bin/ld")
diff --git a/Modules/Compiler/CrayPrgEnv.cmake b/Modules/Compiler/CrayPrgEnv.cmake
new file mode 100644
index 0000000..c3e7b73
--- /dev/null
+++ b/Modules/Compiler/CrayPrgEnv.cmake
@@ -0,0 +1,83 @@
+# Guard against multiple inclusions
+if(__craylinux_crayprgenv)
+ return()
+endif()
+set(__craylinux_crayprgenv 1)
+
+macro(__cray_extract_args cmd tag_regex out_var)
+ string(REGEX MATCHALL "${tag_regex}" args "${cmd}")
+ foreach(arg IN LISTS args)
+ string(REGEX REPLACE "^${tag_regex}$" "\\2" param "${arg}")
+ get_filename_component(param_abs "${param}" ABSOLUTE)
+ list(APPEND ${out_var} ${param_abs})
+ endforeach()
+endmacro()
+
+function(__cray_extract_implicit src compiler_cmd link_cmd lang include_dirs_var link_dirs_var link_libs_var)
+ execute_process(
+ COMMAND ${CMAKE_${lang}_COMPILER}
+ ${CMAKE_${lang}_VERBOSE_FLAG} -o cray_extract_implicit_${lang} ${src}
+ RESULT_VARIABLE result
+ OUTPUT_VARIABLE output
+ ERROR_VARIABLE error
+ )
+ 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)
+ set(processed_include 1)
+ endif()
+ if("${line}" MATCHES "${link_cmd}")
+ __cray_extract_args("${line}" " -(L ?)([^ ]*)" link_dirs)
+ __cray_extract_args("${line}" " -(l ?)([^ ]*)" link_libs)
+ 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}")
+ endif()
+
+ # Flags for the Cray wrappers
+ 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")
+
+ # 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_${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()