CrayPrgEnv.cmake 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # Guard against multiple inclusions
  2. if(__craylinux_crayprgenv)
  3. return()
  4. endif()
  5. set(__craylinux_crayprgenv 1)
  6. macro(__cray_extract_args cmd tag_regex out_var make_absolute)
  7. string(REGEX MATCHALL "${tag_regex}" args "${cmd}")
  8. foreach(arg IN LISTS args)
  9. string(REGEX REPLACE "^${tag_regex}$" "\\2" param "${arg}")
  10. if(make_absolute)
  11. get_filename_component(param "${param}" ABSOLUTE)
  12. endif()
  13. list(APPEND ${out_var} ${param})
  14. endforeach()
  15. endmacro()
  16. function(__cray_extract_implicit src compiler_cmd link_cmd lang include_dirs_var link_dirs_var link_libs_var)
  17. set(BIN "${CMAKE_PLATFORM_INFO_DIR}/CrayExtractImplicit_${lang}.bin")
  18. execute_process(
  19. COMMAND ${CMAKE_${lang}_COMPILER} ${CMAKE_${lang}_VERBOSE_FLAG} -o ${BIN}
  20. RESULT_VARIABLE result
  21. OUTPUT_VARIABLE output
  22. ERROR_VARIABLE error
  23. )
  24. if(EXISTS "${BIN}")
  25. file(REMOVE "${BIN}")
  26. endif()
  27. set(include_dirs)
  28. set(link_dirs)
  29. set(link_libs)
  30. string(REGEX REPLACE "\r?\n" ";" output_lines "${output}\n${error}")
  31. foreach(line IN LISTS output_lines)
  32. if("${line}" MATCHES "${compiler_cmd}")
  33. __cray_extract_args("${line}" " -(I ?|isystem )([^ ]*)" include_dirs 1)
  34. set(processed_include 1)
  35. endif()
  36. if("${line}" MATCHES "${link_cmd}")
  37. __cray_extract_args("${line}" " -(L ?)([^ ]*)" link_dirs 1)
  38. __cray_extract_args("${line}" " -(l ?)([^ ]*)" link_libs 0)
  39. set(processed_link 1)
  40. endif()
  41. if(processed_include AND processed_link)
  42. break()
  43. endif()
  44. endforeach()
  45. set(${include_dirs_var} "${include_dirs}" PARENT_SCOPE)
  46. set(${link_dirs_var} "${link_dirs}" PARENT_SCOPE)
  47. set(${link_libs_var} "${link_libs}" PARENT_SCOPE)
  48. set(CRAY_${lang}_EXTRACTED_IMPLICIT 1 CACHE INTERNAL "" FORCE)
  49. endfunction()
  50. macro(__CrayPrgEnv_setup lang test_src compiler_cmd link_cmd)
  51. if(DEFINED ENV{CRAYPE_VERSION})
  52. message(STATUS "Cray Programming Environment $ENV{CRAYPE_VERSION} ${lang}")
  53. elseif(DEFINED ENV{ASYNCPE_VERSION})
  54. message(STATUS "Cray XT Programming Environment $ENV{ASYNCPE_VERSION} ${lang}")
  55. else()
  56. message(STATUS "Cray Programming Environment (unknown version) ${lang}")
  57. endif()
  58. # Flags for the Cray wrappers
  59. set(CMAKE_STATIC_LIBRARY_LINK_${lang}_FLAGS "-static")
  60. set(CMAKE_SHARED_LIBRARY_${lang}_FLAGS "")
  61. set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-shared")
  62. set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-dynamic")
  63. # If the link type is not explicitly specified in the environment then
  64. # the Cray wrappers assume that the code will be built staticly so
  65. # we check the following condition(s) are NOT met
  66. # Compiler flags are explicitly dynamic
  67. # Env var is dynamic and compiler flags are not explicitly static
  68. if(NOT (((CMAKE_${lang}_FLAGS MATCHES "(^| )-dynamic($| )") OR
  69. (CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-dynamic($| )"))
  70. OR
  71. (("$ENV{CRAYPE_LINK_TYPE}" STREQUAL "dynamic") AND
  72. NOT ((CMAKE_${lang}_FLAGS MATCHES "(^| )-static($| )") OR
  73. (CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-static($| )")))))
  74. set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
  75. set(BUILD_SHARED_LIBS FALSE CACHE BOOL "")
  76. set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
  77. set(CMAKE_LINK_SEARCH_START_STATIC TRUE)
  78. endif()
  79. if(NOT CRAY_${lang}_EXTRACTED_IMPLICIT)
  80. __cray_extract_implicit(
  81. ${test_src} ${compiler_cmd} ${link_cmd} ${lang}
  82. CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES
  83. CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES
  84. CMAKE_${lang}_IMPLICIT_LINK_LIBRARIES
  85. )
  86. endif()
  87. endmacro()