# 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()