<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/86193>86193</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [libc++] [cxxmodules] Per-header header modules
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++,
            clang:modules
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          vgvassilev
      </td>
    </tr>
</table>

<pre>
    Commit 571178a21a8bc105bf86cf4bf92f842e07792e1a introduces per header file module with a main motivation to enable detection of cyclic includes. This means that now, instead of having a single binary artifact `std.pcm` or similar we get hundreds of pcm files for the same content. That's problematic for us due to several reasons:
  * Makes modules redistribution harder -- we carry build artifacts across nodes and it makes it difficult to enumerate all stl-related modules including private ones.
  * Efficiency -- we care about binary size and in-memory footprint. Going for a many pcm files has an overhead. Consider we have several textual files (such as cassert). The textual content becomes duplicated in every `pcm` file and in all dependent `pcm` files too.

If the motivation is only to be able to diagnose cyclic includes we can do that as part of the build process of libc++. For example, `echo "#include <libcxx/header>" | clang -xc++ -fsyntax-only -` will be a sufficient check ensuring header consistency. Alternatively, we could have a "debug" modulemap with that structure.

If there is more motivation to the one I understood, I'd like to suggest having a separate modulemap, called `std.modulemap` which keeps the headers into a single pcm file and clients like us can use it instead. Note that the `module std [system] {  header "__std_clang_module"  export * }` does not work for us because it triggers building of all gazillion pcms.

@ian-twilightcoder, @ldionne, depending on the direction we get in this issue, I can work on creating the `std.modulemap` and opening a pull request.

cc: @hahnjo, @dpiparo, @ChuanqiXu9.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJxsVUuTuzgO_zTORZUUcUIehxz6Mb3Vh93awx721mVsAZ42NmOJdDKffkuGfvxn5xIqgOTfS8IQ-S4iXlT9qOrnlZm4T_ly7a7yJOB11SR3vzylYfAM9XG7PZ6M3ppTY7dV3bSng233TXvW7WmvsToezxq3BnzknNxkkWDEDD0ahxlaHxCG5KaA8OG5BwOD8RGGxP5q2KcInACjaQKCQ0Zb7qUW7N0Gb8FHGyaHtIH_9J5gQBMJuDcMMX0o_QQ-EqNxUtKbq48dGCAfu4DQ-GjyHUxm3xrLoA4VsduMdlCHClIG8oMPJsMHQocM_RRdRkfSa7RDAU_QpgzcI5AZEGyKjJEFjWGljwRjTk3AwbC35dWJwE0orAivmE2AjIZSJLV7UNWzqh4AlH6Af5p3pEUagozOE2ffTIV_b7Kot14LNGtyvkMz-eC-uBAYmxMRxOSQwEQHnmEoPT2D823r7RR4VncaMBtGMCEAcVhnDIbRfZ0-iyzajVlsQUgRafMT7m_S0GO0929UCKZJE3_qTP5PnJHE9YBDyndoU-IxexHsH0n6i0ISgXj_oXBvhAGkK2aJzQaeUiQvAnygmIpfUjLeeDJhqVP6RJPtwRBYQ4SZlT6LNfj14uIXNGjTgGLNGLwt5H0E6XqXWCyRKGmdGRStHI4YndT_-g4Bp7TIM_--tiUjP2LtCVIMdzGgEaFCyYTzpouJ8K_xnhWN4NIcbkMwmsySROk7mz_mZJFKPINvrNKPSj9u4CVlwJsZxoAyEOpQoe0TKK2V3i0HgNo9Sc3tpvTLPJtq95vSGtTxCWwwsYP1bWkJ65bukc1tXRishfaHD6EQAZqWKDDYHu07YKQpi7nLzFtxj1iysoGHwJijYX_FcBd4QjRNwc3GGoHpsJk6wTLncTDjvCuKEsR5sjxl_Bu9M4rMQ8r4l4UimqWI8ApTdJiJU3Jy-KvSRwfBv88DOnUdEv_YGziaMihfQKTImhDQfW6P70eiSu9tD--II5UzZwVkoDh976HPpJdo2SDS0QxiouL6RChTu6yyDfwrMc7spak6VMsGJXag6ke6E-Og6mdQx0f4lF1p_fZG7N6Km29ziagKeBtT5jLG6vgsuF1CWR0MHym_f66tBq1ZkHD2XSdESvBEnNSWiejMnz4EUXm0A_1iidpX3sQ1f_jgu55tkoxJHvdVcD7FWNI5j1TpGAs75_Oy9Jct7OW-J_BEUyl5LRoVpCmCzWhY6hdp_s8TETmNGGdLxynIBv5jQuJf4Fqrdg8Crjd9_D0tSN3oR5M__z31k4l_-P9O583KXXbuvDubFV62x-22qnW93a_6y1mfbb0zbX2qsTJGH066wrbC0645nA_1aeUvutL7aqe3utLber_ReD5sW93Ue7e3J3dS-woH48MmhOuwSblbFeqX02F73q2CaTBQ-Vhr_T32ZbqflNbFbbV7WHa53K-fV_kizdbN1JHo74npuz17DuXz_6OdhKl-tLfbZ5_6Gf6Neb2Ea7ksD1dTDpeeeSwfNf2i9EvnuZ-ajU2D0i9y0nJZjzn9jpaVfimsSOmXQux_AQAA___2F-UQ">