libgccのためのインクルードパス

クロスでlibgccを作っているとき、手違いでホスト用のヘッダが使われているんじゃないかと不安になりました。
そこでglibcなしでlibgccをビルドしてエラーを起こさせて、configureに与えるオプションがどう使われているのかを見てみることにしました。

とりあえずbinutilsをビルドします。
ビルド環境はx64_64のLinuxでターゲットはi686-pc-linux-gnuです。

> export PATH=\$HOME/prefix/bin:\$PATH
> mkdir \$HOME/src/
> cd \$HOME/src/
> wget --no-clobber http://ftp.gnu.org/gnu/binutils/binutils-2.28.tar.bz2
> rm -rf binutils-2.28/
> tar xf binutils-2.28.tar.bz2
> cd binutils-2.28/
> mkdir build
> cd build/
> ../configure \
>     --target=i686-pc-linux-gnu \
>     --prefix=$HOME/prefix
> make
> make install

そしてgccにmpcとgmpとmpfrを入れて

> cd $HOME/src/
> wget --no-clobber http://www.multiprecision.org/mpc/download/mpc-1.0.3.tar.gz
> rm -rf mpc-1.0.3/
> tar xf mpc-1.0.3.tar.gz
> wget --no-clobber http://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.xz
> rm -rf gmp-6.1.2/
> tar xf gmp-6.1.2.tar.xz
> wget --no-clobber http://www.mpfr.org/mpfr-3.1.5/mpfr-3.1.5.tar.xz
> rm -rf mpfr-3.1.5/
> tar xf mpfr-3.1.5.tar.xz
> wget --no-clobber http://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.bz2
> rm -rf gcc-6.3.0/
> tar xf gcc-6.3.0.tar.bz2
> cd gcc-6.3.0/
> ln -s ../mpc-1.0.3 mpc
> ln -s ../gmp-6.1.2 gmp
> ln -s ../mpfr-3.1.5 mpfr

面倒そうなものは全部disableして、思いつく限りディレクトリを指定してみます。
区別できるようにディレクトリはすべて別にしました。

> mkdir build
> cd build/
> ../configure \
>     --target=i686-pc-linux-gnu \
>     --prefix=\$HOME/prefix \
>     --exec-prefix=\$HOME/exec-prefix \
>     --includedir=\$HOME/includedir \
>     --with-headers=\$HOME/headers \
>     --with-local-prefix=\$HOME/local-prefix \
>     --with-native-system-header-dir=\$HOME/native-system-header-dir \
>     --with-sysroot=\$HOME/sysroot \
>     --disable-shared \
>     --disable-threads \
>     --disable-libatomic \
>     --disable-libgomp \
>     --disable-libmpx \
>     --disable-libquadmath \
>     --disable-libssp \
>     --disable-libstdcxx \
>     --disable-libvtv \
>     --enable-languages=c,c++
> make all-target-libgcc

stdio.hが無いと言われるつもりだったのですが、その前にコケます。

> The directory that should contain system headers does not exist:
>   /home/tshibata/sysroot/home/tshibata/native-system-header-dir

ははあ、native-system-header-dirはsysrootの下に置かれるもののようです。

> mkdir -p /home/tshibata/sysroot/home/tshibata/native-system-header-dir

とりあえずそれを作って再開すると

> stdio.h: そのようなファイルやディレクトリはありません

来ました。

> /home/tshibata/src/gcc-6.3.0/build/./gcc/xgcc -B/home/tshibata/src/gcc-6.3.0/build/./gcc/ -B/home/tshibata/exec-prefix/i686-pc-linux-gnu/bin/ -B/home/tshibata/exec-prefix/i686-pc-linux-gnu/lib/ -isystem /home/tshibata/exec-prefix/i686-pc-linux-gnu/include -isystem /home/tshibata/exec-prefix/i686-pc-linux-gnu/sys-include    -g -O2 -O2  -g -O2 -DIN_GCC  -DCROSS_DIRECTORY_STRUCTURE  -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include   -fpic -mlong-double-80 -DUSE_ELF_SYMVER -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector   -fpic -mlong-double-80 -DUSE_ELF_SYMVER -I. -I. -I../.././gcc -I../../../libgcc -I../../../libgcc/. -I../../../libgcc/../gcc -I../../../libgcc/../include  -DHAVE_CC_TLS  -DUSE_TLS -o _muldi3.o -MT _muldi3.o -MD -MP -MF _muldi3.dep -DL_muldi3 -c ../../../libgcc/libgcc2.c -fvisibility=hidden -DHIDE_EXPORTS

というコマンドの結果です。
同じディレクトリで同じコマンドに-v付けて実行すると

> ignoring nonexistent directory "/home/tshibata/exec-prefix/i686-pc-linux-gnu/include"
> ignoring nonexistent directory "./include"
> ignoring nonexistent directory "/home/tshibata/src/gcc-6.3.0/build/gcc/../lib/gcc/i686-pc-linux-gnu/6.3.0/include"
> ignoring nonexistent directory "/home/tshibata/src/gcc-6.3.0/build/gcc/../lib/gcc/i686-pc-linux-gnu/6.3.0/include-fixed"
> ignoring nonexistent directory "/home/tshibata/src/gcc-6.3.0/build/gcc/../lib/gcc/i686-pc-linux-gnu/6.3.0/../../../../../../../i686-pc-linux-gnu/include"
> ignoring nonexistent directory "/home/tshibata/exec-prefix/lib/gcc/i686-pc-linux-gnu/6.3.0/include"
> ignoring nonexistent directory "/home/tshibata/sysroot/home/tshibata/local-prefix/include"
> ignoring nonexistent directory "/home/tshibata/exec-prefix/lib/gcc/i686-pc-linux-gnu/6.3.0/include-fixed"
> ignoring nonexistent directory "/home/tshibata/exec-prefix/../../../i686-pc-linux-gnu/include"
> ignoring duplicate directory "."
> ignoring duplicate directory "../../../libgcc/."
> \#include "..." search starts here:
> \#include <...> search starts here:
>  .
>  ../.././gcc
>  ../../../libgcc
>  ../../../libgcc/../gcc
>  ../../../libgcc/../include
>  /home/tshibata/src/gcc-6.3.0/build/./gcc/include
>  /home/tshibata/src/gcc-6.3.0/build/./gcc/include-fixed
>  /home/tshibata/exec-prefix/i686-pc-linux-gnu/sys-include
>  /home/tshibata/sysroot/home/tshibata/native-system-header-dir

#まとめ
configureに与えられたディレクトリはlibgccをコンパイルするときのインクルードパスとして
--prefix: 使われないようです。
--includedir: 使われないようです。
--with-headers: 使われないようです。
--exec-prefix: 使われますが、後にi686-pc-linux-gnuが付くのでターゲット用に生成されたものでしょう。
--with-sysroot: 直接は使われないようです。
--with-local-prefix: sysroot/local-prefix/includeからヘッダファイルがインクルードされます。
--with-native-system-header-dir: sysroot/native-system-header-dirからヘッダファイルがインクルードされます。

---

たぶんsysroot/local-prefix/includeがターゲット用ヘッダの基本的な置き場で、カーネルのヘッダを別の場所に置きたい場合はsysroot/native-system-header-dirなのだと思います。