94 lines
3.5 KiB
CMake
94 lines
3.5 KiB
CMake
# 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_${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()
|