File: GNU-CXX-CXXImportStd.cmake

package info (click to toggle)
cmake 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 147,284 kB
  • sloc: ansic: 403,915; cpp: 290,772; sh: 4,102; python: 3,357; yacc: 3,106; lex: 1,189; f90: 532; asm: 471; lisp: 375; cs: 270; java: 266; fortran: 230; perl: 217; objc: 215; xml: 198; makefile: 97; javascript: 83; pascal: 63; tcl: 55; php: 25; ruby: 22
file content (134 lines) | stat: -rw-r--r-- 6,130 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
function (_cmake_cxx_import_std std variable)
  if (NOT CMAKE_CXX_STANDARD_LIBRARY STREQUAL "libstdc++")
    set("${variable}"
      "set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"Only `libstdc++` is supported\")\n"
      PARENT_SCOPE)
    return ()
  endif ()

  execute_process(
    COMMAND
      "${CMAKE_CXX_COMPILER}"
      ${CMAKE_CXX_COMPILER_ID_ARG1}
      -print-file-name=libstdc++.modules.json
    OUTPUT_VARIABLE _gnu_libstdcxx_modules_json_file
    ERROR_VARIABLE _gnu_libstdcxx_modules_json_file_err
    RESULT_VARIABLE _gnu_libstdcxx_modules_json_file_res
    OUTPUT_STRIP_TRAILING_WHITESPACE
    ERROR_STRIP_TRAILING_WHITESPACE)
  if (_gnu_libstdcxx_modules_json_file_res)
    set("${variable}"
      "set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"Could not find `libstdc++.modules.json` resource\")\n"
      PARENT_SCOPE)
    return ()
  endif ()

  # Without this file, we do not have modules installed.
  if (NOT EXISTS "${_gnu_libstdcxx_modules_json_file}")
    set("${variable}"
      "set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"`libstdc++.modules.json` resource does not exist\")\n"
      PARENT_SCOPE)
    return ()
  endif ()

  file(READ "${_gnu_libstdcxx_modules_json_file}" _gnu_libstdcxx_modules_json)
  string(JSON _gnu_modules_json_version GET "${_gnu_libstdcxx_modules_json}" "version")
  string(JSON _gnu_modules_json_revision GET "${_gnu_libstdcxx_modules_json}" "revision")
  # Require version 1.
  if (NOT _gnu_modules_json_version EQUAL "1")
    set("${variable}"
      "set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"`libstdc++.modules.json` version ${_gnu_modules_json_version}.${_gnu_modules_json_revision} is not recognized\")\n"
      PARENT_SCOPE)
    return ()
  endif ()

  string(JSON _gnu_modules_json_nmodules LENGTH "${_gnu_libstdcxx_modules_json}" "modules")
  # Don't declare the target without any modules.
  if (NOT _gnu_modules_json_nmodules)
    set("${variable}"
      "set(CMAKE_CXX${std}_COMPILER_IMPORT_STD_NOT_FOUND_MESSAGE \"`libstdc++.modules.json` does not list any available modules\")\n"
      PARENT_SCOPE)
    return ()
  endif ()

  # Declare the target.
  set(_gnu_libstdcxx_target "")
  string(APPEND _gnu_libstdcxx_target
    "add_library(__CMAKE::CXX${std} IMPORTED INTERFACE)\n")
  string(APPEND _gnu_libstdcxx_target
    "target_compile_features(__CMAKE::CXX${std} INTERFACE cxx_std_${std})\n")

  set(_gnu_modules_is_stdlib 0)
  set(_gnu_modules_include_dirs_list "")
  set(_gnu_modules_module_paths "")
  get_filename_component(_gnu_modules_dir "${_gnu_libstdcxx_modules_json_file}" DIRECTORY)

  # Add module sources.
  math(EXPR _gnu_modules_json_nmodules_range "${_gnu_modules_json_nmodules} - 1")
  foreach (_gnu_modules_json_modules_idx RANGE 0 "${_gnu_modules_json_nmodules_range}")
    string(JSON _gnu_modules_json_module GET "${_gnu_libstdcxx_modules_json}" "modules" "${_gnu_modules_json_modules_idx}")

    string(JSON _gnu_modules_json_module_source GET "${_gnu_modules_json_module}" "source-path")
    string(JSON _gnu_modules_json_module_is_stdlib GET "${_gnu_modules_json_module}" "is-std-library")
    string(JSON _gnu_modules_json_module_local_arguments ERROR_VARIABLE _gnu_modules_json_module_local_arguments_error GET "${_gnu_modules_json_module}" "local-arguments")
    string(JSON _gnu_modules_json_module_nsystem_include_directories ERROR_VARIABLE _gnu_modules_json_module_nsystem_include_directories_error LENGTH "${_gnu_modules_json_module_local_arguments}" "system-include-directories")

    if (_gnu_modules_json_module_local_arguments_error STREQUAL "NOTFOUND")
      set(_gnu_modules_json_module_local_arguments "")
    endif ()
    if (_gnu_modules_json_module_nsystem_include_directories_error STREQUAL "NOTFOUND")
      set(_gnu_modules_json_module_nsystem_include_directories 0)
    endif ()

    if (NOT IS_ABSOLUTE "${_gnu_modules_json_module_source}")
      string(PREPEND _gnu_modules_json_module_source "${_gnu_modules_dir}/")
    endif ()
    list(APPEND _gnu_modules_module_paths
      "${_gnu_modules_json_module_source}")

    if (_gnu_modules_json_module_is_stdlib)
      set(_gnu_modules_is_stdlib 1)
    endif ()

    if (_gnu_modules_json_module_nsystem_include_directories)
      math(EXPR _gnu_modules_json_module_nsystem_include_directories_range "${_gnu_modules_json_module_nsystem_include_directories} - 1")
      foreach (_gnu_modules_json_modules_system_include_directories_idx RANGE 0 "${_gnu_modules_json_module_nsystem_include_directories_range}")
        string(JSON _gnu_modules_json_module_system_include_directory GET "${_gnu_modules_json_module_local_arguments}" "system-include-directories" "${_gnu_modules_json_modules_system_include_directories_idx}")

        if (NOT IS_ABSOLUTE "${_gnu_modules_json_module_system_include_directory}")
          string(PREPEND _gnu_modules_json_module_system_include_directory "${_gnu_modules_dir}/")
        endif ()
        list(APPEND _gnu_modules_include_dirs_list
          "${_gnu_modules_json_module_system_include_directory}")
      endforeach ()
    endif ()
  endforeach ()

  # Split the paths into basedirs and module paths.
  set(_gnu_modules_base_dirs_list "")
  set(_gnu_modules_files "")
  foreach (_gnu_modules_module_path IN LISTS _gnu_modules_module_paths)
    get_filename_component(_gnu_module_dir "${_gnu_modules_module_path}" DIRECTORY)

    list(APPEND _gnu_modules_base_dirs_list
      "${_gnu_module_dir}")
    string(APPEND _gnu_modules_files
      " \"${_gnu_modules_module_path}\"")
  endforeach ()
  list(REMOVE_DUPLICATES _gnu_modules_base_dirs_list)
  set(_gnu_modules_base_dirs "")
  foreach (_gnu_modules_base_dir IN LISTS _gnu_modules_base_dirs_list)
    string(APPEND _gnu_modules_base_dirs
      " \"${_gnu_modules_base_dir}\"")
  endforeach ()

  # Create the file set for the modules.
  string(APPEND _gnu_libstdcxx_target
    "target_sources(__CMAKE::CXX${std}
  INTERFACE
  FILE_SET std TYPE CXX_MODULES
    BASE_DIRS ${_gnu_modules_base_dirs}
    FILES ${_gnu_modules_files})\n")

  set("${variable}" "${_gnu_libstdcxx_target}" PARENT_SCOPE)
endfunction ()