CrayPrgEnv.cmake 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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_CREATE_${lang}_FLAGS "-shared")
  61. set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-dynamic")
  62. # If the link type is not explicitly specified in the environment then
  63. # the Cray wrappers assume that the code will be built statically so
  64. # we check the following condition(s) are NOT met
  65. # Compiler flags are explicitly dynamic
  66. # Env var is dynamic and compiler flags are not explicitly static
  67. if(NOT (((CMAKE_${lang}_FLAGS MATCHES "(^| )-dynamic($| )") OR
  68. (CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-dynamic($| )"))
  69. OR
  70. (("$ENV{CRAYPE_LINK_TYPE}" STREQUAL "dynamic") AND
  71. NOT ((CMAKE_${lang}_FLAGS MATCHES "(^| )-static($| )") OR
  72. (CMAKE_EXE_LINKER_FLAGS MATCHES "(^| )-static($| )")))))
  73. set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
  74. set(BUILD_SHARED_LIBS FALSE CACHE BOOL "")
  75. set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
  76. set(CMAKE_LINK_SEARCH_START_STATIC TRUE)
  77. endif()
  78. if(NOT CRAY_${lang}_EXTRACTED_IMPLICIT)
  79. __cray_extract_implicit(
  80. ${test_src} ${compiler_cmd} ${link_cmd} ${lang}
  81. CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES
  82. CMAKE_${lang}_IMPLICIT_LINK_DIRECTORIES
  83. CMAKE_${lang}_IMPLICIT_LINK_LIBRARIES
  84. )
  85. endif()
  86. endmacro()