クロスで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なのだと思います。