Open5

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

okuokuokuoku

一般的にパッケージは /usr/include 以下にインストールされることが多い(Linuxがそういう習慣になっている)。このため、あるパッケージが提供するAPIのヘッダ と OSの標準ライブラリのヘッダは include ディレクトリ内に混在することになり、何らかの方法で識別が必要になる。

消し込み

パッケージマネージャーに問合せるといった方法もあるけど、汎用的な手法として消し込みを試す。つまり、

#include <stdio.h>

のようなコードを標準ライブラリのヘッダの数だけ生成し、それらが #include しているファイルは全て標準ライブラリに所属する内部ヘッダと見做す。そうすることで、消されなかった(標準ライブラリのincludeでは使用されなかった)ヘッダが追加インストールされたヘッダとなる。

okuokuokuoku

ヘッダリストを準備

https://github.com/okuoku/rs-checker-proto/commit/df21180402b1a28ae84825d2b3fc98741ec07530

varargs.h とか Issue 6 で早々と無くなってるんだな。。

UNIXとC言語、C言語とC++言語の関係性の都合でヘッダの多くは被っている。あと、C++でコンパイルするときとCでコンパイルするとき、また、それらの言語バージョンでも依存ヘッダが異なる可能性はある。

okuokuokuoku

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;
      |         ^~~~~~~
okuokuokuoku

使えないヘッダ

存在するが #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"
      |  ^~~~~
okuokuokuoku

単体で使えないヘッダ

<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;
      |         ^~~~~~~~~