xref: /llvm-project/libcxx/utils/generate_libcxx_cppm_in.py (revision d6e714b10e102eb32e64e04bf177226dbe16d0e7)
1600462a2SMark de Wever# ===----------------------------------------------------------------------===##
2600462a2SMark de Wever#
3600462a2SMark de Wever# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4600462a2SMark de Wever# See https://llvm.org/LICENSE.txt for license information.
5600462a2SMark de Wever# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6600462a2SMark de Wever#
7600462a2SMark de Wever# ===----------------------------------------------------------------------===##
8600462a2SMark de Wever
9600462a2SMark de Weverimport os.path
10600462a2SMark de Weverimport sys
11600462a2SMark de Wever
12*d6e714b1SLouis Dionnefrom libcxx.header_information import module_c_headers, module_headers, header_restrictions, headers_not_available, libcxx_root
13600462a2SMark de Wever
14600462a2SMark de Wever
15600462a2SMark de Weverdef write_file(module):
16*d6e714b1SLouis Dionne    with open(libcxx_root / "modules" / f"{module}.cppm.in", "w") as module_cpp_in:
17600462a2SMark de Wever        module_cpp_in.write(
18600462a2SMark de Wever            """\
19600462a2SMark de Wever// -*- C++ -*-
20600462a2SMark de Wever//===----------------------------------------------------------------------===//
21600462a2SMark de Wever//
22600462a2SMark de Wever// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
23600462a2SMark de Wever// See https://llvm.org/LICENSE.txt for license information.
24600462a2SMark de Wever// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
25600462a2SMark de Wever//
26600462a2SMark de Wever//===----------------------------------------------------------------------===//
27600462a2SMark de Wever
28600462a2SMark de Wever// WARNING, this entire header is generated by
29600462a2SMark de Wever// utils/generate_libcxx_cppm_in.py
30600462a2SMark de Wever// DO NOT MODIFY!
31600462a2SMark de Wever
32600462a2SMark de Wevermodule;
33600462a2SMark de Wever
34600462a2SMark de Wever#include <__config>
35600462a2SMark de Wever
36600462a2SMark de Wever// The headers of Table 24: C++ library headers [tab:headers.cpp]
37600462a2SMark de Wever// and the headers of Table 25: C++ headers for C library facilities [tab:headers.cpp.c]
38600462a2SMark de Wever"""
39600462a2SMark de Wever        )
40*d6e714b1SLouis Dionne        for header in sorted(module_headers if module == "std" else module_c_headers):
41600462a2SMark de Wever            if header in header_restrictions:
42600462a2SMark de Wever                module_cpp_in.write(
43600462a2SMark de Wever                    f"""\
44600462a2SMark de Wever#if {header_restrictions[header]}
45600462a2SMark de Wever#  include <{header}>
46600462a2SMark de Wever#endif
47600462a2SMark de Wever"""
48600462a2SMark de Wever                )
49600462a2SMark de Wever            else:
50600462a2SMark de Wever                module_cpp_in.write(f"#include <{header}>\n")
51600462a2SMark de Wever
524bf9fa5fSMark de Wever        module_cpp_in.write(
534bf9fa5fSMark de Wever            """
544bf9fa5fSMark de Wever// *** Headers not yet available ***
554bf9fa5fSMark de Wever//
564bf9fa5fSMark de Wever// This validation is mainly to catch when a new header is added but adding the
574bf9fa5fSMark de Wever// corresponding .inc file is forgotten. However, the check based on __has_include
584bf9fa5fSMark de Wever// alone doesn't work on Windows because the Windows SDK is on the include path,
594bf9fa5fSMark de Wever// and that means the MSVC STL headers can be found as well, tricking __has_include
604bf9fa5fSMark de Wever// into thinking that libc++ provides the header.
614bf9fa5fSMark de Wever//
624bf9fa5fSMark de Wever#ifndef _WIN32
634bf9fa5fSMark de Wever"""
644bf9fa5fSMark de Wever        )
65600462a2SMark de Wever        for header in sorted(headers_not_available):
66600462a2SMark de Wever            module_cpp_in.write(
67600462a2SMark de Wever                f"""\
68600462a2SMark de Wever#  if __has_include(<{header}>)
69600462a2SMark de Wever#    error "please update the header information for <{header}> in headers_not_available in utils/libcxx/header_information.py"
70600462a2SMark de Wever#  endif // __has_include(<{header}>)
71600462a2SMark de Wever"""
72600462a2SMark de Wever            )
73600462a2SMark de Wever
74600462a2SMark de Wever        module_cpp_in.write(
754bf9fa5fSMark de Wever            f"""#endif // _WIN32
764bf9fa5fSMark de Wever
77600462a2SMark de Weverexport module {module};
7804757337SMark de Wever{'export import std;' if module == 'std.compat' else ''}
79600462a2SMark de Wever
8004757337SMark de Wever{'@LIBCXX_MODULE_STD_INCLUDE_SOURCES@' if module == 'std' else ''}
81600462a2SMark de Wever{'@LIBCXX_MODULE_STD_COMPAT_INCLUDE_SOURCES@' if module == 'std.compat' else ''}"""
82600462a2SMark de Wever        )
83600462a2SMark de Wever
84600462a2SMark de Wever
85600462a2SMark de Weverif __name__ == "__main__":
86600462a2SMark de Wever    if len(sys.argv) != 2 or (sys.argv[1] != "std" and sys.argv[1] != "std.compat"):
87600462a2SMark de Wever        sys.stderr.write(
88600462a2SMark de Wever            f"""\
89600462a2SMark de WeverUsage:
90600462a2SMark de Wever{os.path.basename(__file__)} (std|std.compat)
91600462a2SMark de Wever"""
92600462a2SMark de Wever        )
93600462a2SMark de Wever        sys.exit(1)
94600462a2SMark de Wever
95600462a2SMark de Wever    write_file(sys.argv[1])
96