Reposoup: 標準ライブラリの消し込み

一般的にパッケージは /usr/include
以下にインストールされることが多い(Linuxがそういう習慣になっている)。このため、あるパッケージが提供するAPIのヘッダ と OSの標準ライブラリのヘッダは include
ディレクトリ内に混在することになり、何らかの方法で識別が必要になる。
消し込み
パッケージマネージャーに問合せるといった方法もあるけど、汎用的な手法として消し込みを試す。つまり、
#include <stdio.h>
のようなコードを標準ライブラリのヘッダの数だけ生成し、それらが #include
しているファイルは全て標準ライブラリに所属する内部ヘッダと見做す。そうすることで、消されなかった(標準ライブラリのincludeでは使用されなかった)ヘッダが追加インストールされたヘッダとなる。

ヘッダリストを準備
varargs.h
とか Issue 6 で早々と無くなってるんだな。。
UNIXとC言語、C言語とC++言語の関係性の都合でヘッダの多くは被っている。あと、C++でコンパイルするときとCでコンパイルするとき、また、それらの言語バージョンでも依存ヘッダが異なる可能性はある。

C と C++ で見つかるヘッダが違う
/usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/math.h
とか /usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/stdlib.h
が見つかる。これらは、Cでコンパイルしたときは include_next
するように書かれているが、実体が別々にあるという意味ではちゃんと別々に扱えるように工夫する必要がありそうだ。
C++で使えないヘッダ
stdatomic.h
は C++で使うとエラーになる。 <atomic>
があるので不要って事だと思うが、逆に言えば、C/C++ polygotなコードではatomicが使えないということになる。
/usr/lib/gcc/x86_64-pc-cygwin/11/include/stdatomic.h:40:9: error: ‘_Atomic’ does not name a type
40 | typedef _Atomic _Bool atomic_bool;
| ^~~~~~~

使えないヘッダ
存在するが #include
するとエラーになるヘッダとして varargs.h
がある。
/usr/lib/gcc/x86_64-pc-cygwin/11/include/varargs.h:4:2: error: #error "GCC no longer implements <varargs.h>."
4 | #error "GCC no longer implements <varargs.h>."
| ^~~~~
/usr/lib/gcc/x86_64-pc-cygwin/11/include/varargs.h:5:2: error: #error "Revise your code to use <stdarg.h>."
5 | #error "Revise your code to use <stdarg.h>."
| ^~~~~
また、 -fcoroutine
なしでは <coroutine>
は使えない。
/usr/lib/gcc/x86_64-pc-cygwin/11/include/c++/coroutine:334:2: error: #error "the coroutine header requires -fcoroutines"
334 | #error "the coroutine header requires -fcoroutines"
| ^~~~~

単体で使えないヘッダ
<netinet/tcp.h>
は単体でincludeできない。これはnewlibのバグな気がする。。もっとも、このヘッダは socket
のオプションを定義するため、単体で使う必要はない。newlibは伝統的なBSDを引いているので、たぶん <sys/types.h>
が必要。
/usr/include/netinet/tcp.h:38:9: error: ‘u_int32_t’ does not name a type
38 | typedef u_int32_t tcp_seq;
| ^~~~~~~~~