読者です 読者をやめる 読者になる 読者になる

めもぶろぐ

お勉強したこと、趣味なんかを適当に書いてます。。。

LFS | Fling From Scratch ④

今回はココから

MPCのインストール
cd /sources/
tar xvf mpc-1.0.3.tar.gz 
cd mpc-1.0.3
./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/mpc-1.0.3
make -j4
make -j4 html
make -j4 check
make install
make install-html
GCCのインストール
cd /sources/
rm -rf gcc-6.3.0
tar xvf gcc-6.3.0.tar.bz2
cd gcc-6.3.0
case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
  ;;
esac
mkdir -v build
cd       build
SED=sed                               \
../configure --prefix=/usr            \
             --enable-languages=c,c++ \
             --disable-multilib       \
             --disable-bootstrap      \
             --with-system-zlib
make -j1
ulimit -s 32768
make -k check
#エラーはばしばし出るが無視。ちなみに、make -j4とかで調子乗ってるとこれ以降うまくいかないことも有る。
../contrib/test_summary
make install
ln -sv ../usr/bin/cpp /lib
ln -sn gcc /usr/bin/cc
install -v -dm755 /usr/lib/bfd-plugins
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/6.3.0/liblto_plugin.so \
        /usr/lib/bfd-plugins/
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log


readelf -l a.out | grep ': /lib'
#[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]


grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
#/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/../../../../lib/crt1.o succeeded
#/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/../../../../lib/crti.o succeeded
#/usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/../../../../lib/crtn.o succeeded


grep -B4 '^ /usr/include' dummy.log
##include <...> search starts here:
# /usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/include
# /usr/local/include
# /usr/lib/gcc/x86_64-pc-linux-gnu/6.3.0/include-fixed
# /usr/include


grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
#SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
#SEARCH_DIR("/usr/local/lib64")
#SEARCH_DIR("/lib64")
#SEARCH_DIR("/usr/lib64")
#SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
#SEARCH_DIR("/usr/local/lib")
#SEARCH_DIR("/lib")
#SEARCH_DIR("/usr/lib");

grep "/lib.*/libc.so.6 " dummy.log
#attempt to open /lib/libc.so.6 succeeded

grep found dummy.log
#found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2

rm -v dummy.c a.out dummy.log
mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib

Bzip2のインストール

cd /sources
rm -rf bzip2-1.0.6
tar xvf bzip2-1.0.6.tar.gz 
cd bzip2-1.0.6
patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch
sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
make -f Makefile-libbz2_so
make clean
make -j4
make PREFIX=/usr install
cp -v bzip2-shared /bin/bzip2
cp -av libbz2.so* /lib
ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
rm -v /usr/bin/{bunzip2,bzcat,bzip2}
ln -sv bzip2 /bin/bunzip2
ln -sv bzip2 /bin/bzcat

Pkg-configの構成

cd /sources/
tar xvf pkg-config-0.29.1.tar.gz 
./configure --prefix=/usr              \
            --with-internal-glib       \
            --disable-compile-warnings \
            --disable-host-tool        \
            --docdir=/usr/share/doc/pkg-config-0.29.1
make -j4
make check/
make check
make install

Ncursesのインストール

cd /sources/
rm -rf ncurses-6.0
tar xvf ncurses-6.0.tar.gz 
cd ncurses-6.0
sed -i '/LIBTOOL_INSTALL/d' c++/Makefile.in
./configure --prefix=/usr           \
            --mandir=/usr/share/man \
            --with-shared           \
            --without-debug         \
            --without-normal        \
            --enable-pc-files       \
            --enable-widec

make install
mv -v /usr/lib/libncursesw.so.6* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.so
for lib in ncurses form panel menu ; do     rm -vf                    /usr/lib/lib${lib}.so;  
 "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so;     ln -sfv ${lib}w.pc        /usr/lib/pkgconfig/
pc; done
rm -vf                     /usr/lib/libcursesw.so
echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so
ln -sfv libncurses.so      /usr/lib/libcurses.so
mkdir -v       /usr/share/doc/ncurses-6.0
cp -v -R doc/* /usr/share/doc/ncurses-6.0

Attrのインストール

cd /sources/
tar xvf attr-2.4.47.src.tar.gz 
cd attr-2.4.47
sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
sed -i -e "/SUBDIRS/s|man[25]||g" man/Makefile
./configure --prefix=/usr \
            --bindir=/bin \
            --disable-static
make
make -j1 tests root-tests
make install install-dev install-lib
chmod -v 755 /usr/lib/libattr.so
mv -v /usr/lib/libattr.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libattr.so) /usr/lib/libattr.so
history | tain -n 30
history | tail -n 30

Aclのインストール

cd /sources/
tar xvf acl-2.2.52.src.tar.gz 
cd acl-2.2.52
sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
sed -i "s:| sed.*::g" test/{sbits-restore,cp,misc}.test
sed -i -e "/TABS-1;/a if (x > (TABS-1)) x = (TABS-1);"     libacl/__acl_to_any_text.c
./configure --prefix=/usr    \
            --bindir=/bin    \
            --disable-static \
            --libexecdir=/usr/lib
libexecdir=/usr/lib
make
make install install-dev install-lib
chmod -v 755 /usr/lib/libacl.so
mv -v /usr/lib/libacl.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libacl.so) /usr/lib/libacl.so

Libcapのインストール

cd /sources/
tar xvf libcap-2.25.tar.xz 
cd libcap-2.25
sed -i '/install.*STALIBNAME/d' libcap/Makefile
make
make RAISE_SETFCAP=no lib=lib prefix=/usr install
chmod -v 755 /usr/lib/libcap.so
mv -v /usr/lib/libcap.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libcap.so) /usr/lib/libcap.so
history | tail -n 20

Sedのインストール

cd /sources/
rm -rf sed-4.4
tar xvf sed-4.4.tar.xz 
cd sed-4.4
sed -i 's/usr/tools/'       build-aux/help2man
sed -i 's/panic-tests.sh//' Makefile.in
./configure --prefix=/usr --bindir=/bin
make
make html
make check
make install
install -d -m755           /usr/share/doc/sed-4.4
install -m644 doc/sed.html /usr/share/doc/sed-4.4

Shadowのインストール

sed -i 's/groups$(EXEEXT) //' src/Makefile.in
find man -name Makefile.in -exec sed -i 's/groups\.1 / /'   {} \;
find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \;
find man -name Makefile.in -exec sed -i 's/passwd\.5 / /'   {} \;
sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \
       -e 's@/var/spool/mail@/var/mail@' etc/login.defs
echo '--- src/useradd.c   (old)
+++ src/useradd.c   (new)
@@ -2027,6 +2027,8 @@
        is_shadow_grp = sgr_file_present ();
 #endif

+       get_defaults ();
+
        process_flags (argc, argv);

 #ifdef ENABLE_SUBIDS
@@ -2036,8 +2038,6 @@
            (!user_id || (user_id <= uid_max && user_id >= uid_min));
 #endif                         /* ENABLE_SUBIDS */

-       get_defaults ();
-
 #ifdef ACCT_TOOLS_SETUID
 #ifdef USE_PAM
        {' | patch -p0 -l
sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' etc/login.defs
sed -i 's/1000/999/' etc/useradd
sed -i -e '47 d' -e '60,65 d' libmisc/myname.c
./configure --sysconfdir=/etc --with-group-name-max-length=32
make
make install
mv -v /usr/bin/passwd /bin
pwconv
grpconv
sed -i 's/yes/no/' /etc/default/useradd
passwd root

Psmiscのインストール

./configure --prefix=/usr
make
make install
mv -v /usr/bin/fuser   /bin
mv -v /usr/bin/killall /bin

Iana-Etcのインストール

cd /sources/
tar xvf iana-etc-2.30.tar.bz2 
cd iana-etc-2.30
make
make install

M4のインストール

cd /sources/
rm -rf m4-1.4.18
tar xvf m4-1.4.18.tar.xz 
cd m4-1.4.18
./configure --prefix=/usr
make
make check
make install

Bisonのインストール

cd /sources/
rm -rf bison-3.0.4
tar xvf bison-3.0.4.tar.xz 
cd bison-3.0.4
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.0.4
make
make install

Flexのインストール

cd /sources/
tar xvf flex-2.6.3.tar.gz 
cd flex-2.6.3
HELP2MAN=/tools/bin/true ./configure --prefix=/usr --docdir=/usr/share/doc/flex-2.6.3
make
make check
make install
ln -sv flex /usr/bin/lex

Grepのインストール

cd /sources/
rm -rf grep-3.0
tar xvf grep-3.0.tar.xz 
cd grep-3.0
./configure --prefix=/usr --bindir=/bin
make
make check
make install

Readlineのインストール

cd /sources/
tar xvf readline-7.0.tar.gz 
cd readline-7.0
sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install
./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/readline-7.0
make SHLIB_LIBS=-lncurses
make SHLIB_LIBS=-lncurses install
mv -v /usr/lib/lib{readline,history}.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libreadline.so) /usr/lib/libreadline.so
ln -sfv ../../lib/$(readlink /usr/lib/libhistory.so ) /usr/lib/libhistory.so
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-7.0

Bashのインストール

cd /sources/
rm -rf bash-4.4
tar xvf bash-4.4.tar.gz 
cd bash-4.4
patch -Np1 -i ../bash-4.4-upstream_fixes-1.patch
./configure --prefix=/usr                       \
            --docdir=/usr/share/doc/bash-4.4 \
            --without-bash-malloc               \
            --with-installed-readline
make
chown -Rv nobody .
su nobody -s /bin/bash -c "PATH=$PATH make tests"
make install
mv -vf /usr/bin/bash /bin
exec /bin/bash --login +h

Bcのインストール

cd /sources/
tar xvf bc-1.06.95.tar.bz2 
cd bc-1.06.95
patch -Np1 -i ../bc-1.06.95-memory_leak-1.patch
./configure --prefix=/usr           \
            --with-readline         \
            --mandir=/usr/share/man \
            --infodir=/usr/share/info
make
echo "quit" | ./bc/bc -l Test/checklib.b > /tmp/a
make install

Libtoolのインストール

ここいらで、ちょっくら解凍済みディレクトリを削除して、展開し直しておきます。

find ./* -maxdepth 1 -type d -exec rm -rf {} \;
for each in *.*; do tar xvf $each; done
cd /sources/libtool-2.4.6
./configure --prefix=/usr
make
make check
make install

GDBMのインストール

cd /sources/gdbm-1.12
./configure --prefix=/usr --disable-static --enable-libgdbm-compat
make
make check
make install

Gperfのインストール

cd /sources/gperf-3.0.4
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.0.4
make
make -j1 check
make install

Expatのインストール

cd /sources/expat-2.2.0
./configure --prefix=/usr --disable-static
make
make check
make install
install -v -dm755 /usr/share/doc/expat-2.2.0
install -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.2.0

Inetutilsのインストール

./configure --prefix=/usr        \
            --localstatedir=/var \
            --disable-logger     \
            --disable-whois      \
            --disable-rcp        \
            --disable-rexec      \
            --disable-rlogin     \
            --disable-rsh        \
            --disable-servers
make
## ここらでifconfigがだけエラーになっている。。。

make check
## 当然テストでもifconfigがエラーになる。

make install
mv -v /usr/bin/{hostname,ping,ping6,traceroute} /bin
mv -v /usr/bin/ifconfig /sbin

Perlのインストール

echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
export BUILD_ZLIB=False
export BUILD_BZIP2=0
sh Configure -des -Dprefix=/usr                 \
                  -Dvendorprefix=/usr           \
                  -Dman1dir=/usr/share/man/man1 \
                  -Dman3dir=/usr/share/man/man3 \
                  -Dpager="/usr/bin/less -isR"  \
                  -Duseshrplib
make
make -k test
make install
unset BUILD_ZLIB BUILD_BZIP2

XML::Parserのインストール

cd /sources/XML-Parser-2.44
perl Makefile.PL 
make
make test
make install

Intltoolのインストール

cd /sources/intltool-0.51.0
sed -i 's:\\\${:\\\$\\{:' intltool-update.in
./configure --prefix=/usr
make
make check
make install
install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO

Autoconfのインストール

cd /sources/autoconf-2.69
./configure --prefix=/usr
make
make check
make install

Automakeのインストール

cd /sources/automake-1.15
sed -i 's:/\\\${:/\\\$\\{:' bin/automake.in
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.15
make
sed -i "s:./configure:LEXLIB=/usr/lib/libfl.a &:" t/lex-{clean,depend}-cxx.sh
make -j4 check
make install
XZのインストール
cd /sources/xz-5.2.3
./configure --prefix=/usr --disable-static --docdir=/usr/share/doc/xz-5.2.3
make
make check
make install
mv -v   /usr/bin/{lzma,unlzma,lzcat,xz,unxz,xzcat} /bin
mv -v /usr/lib/liblzma.so.* /lib
ln -svf ../../lib/$(readlink /usr/lib/liblzma.so) /usr/lib/liblzma.so

LFS | Fling From Scratch ③

GMPのインストール

echo hello
tar xvf gmp-6.1.2.tar.xz
cd gmp-6.1.2
./configure --prefix=/usr    \
            --enable-cxx     \
            --disable-static \
            --docdir=/usr/share/doc/gmp-6.1.2
make -j4
make -j4 html
make check 2>&1 | tee gmp-check-log
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log
make install
make install-html

MPFRのインストール

cd /sources/
tar xvf mpfr-3.1.5.tar.xz
cd mpfr-3.1.5

./configure --prefix=/usr        \
            --disable-static     \
            --enable-thread-safe \
            --docdir=/usr/share/doc/mpfr-3.1.5
make -j4
make -j4 html
make -j4 check
make install
make install-html

markdown記法で書いてみたけどシンタックスの表示がいまいち?

おわり

LFS | Fling From Scratch ②

Linux From Scratch

ということで、下記サイトを参考に地道に進めていきます。
なれるまで、参考サイトがわかりにくいのでメモです。

目次

ホストシステム要件

cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
MYSH=$(readlink -f /bin/sh)
echo "/bin/sh -> $MYSH"
echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash"
unset MYSH

echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1

if [ -h /usr/bin/yacc ]; then
  echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
  echo yacc is `/usr/bin/yacc --version | head -n1`
else
  echo "yacc not found"
fi

bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1

if [ -h /usr/bin/awk ]; then
  echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
  echo awk is `/usr/bin/awk --version | head -n1`
else
  echo "awk not found"
fi

gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2-  # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1
echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
  then echo "g++ compilation OK";
  else echo "g++ compilation failed"; fi
rm -f dummy.c dummy
EOF

bash version-check.sh


cat > library-check.sh << "EOF"
#!/bin/bash
for lib in lib{gmp,mpfr,mpc}.la; do
  echo $lib: $(if find /usr/lib* -name $lib|
               grep -q $lib;then :;else echo not;fi) found
done
unset lib
EOF

bash library-check.sh

事前設定

/mnt/lfsパーティションを一つ割り当てます。
頑張ってディスクを作成して、マウントしてください。

パッケージ準備

mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
wget http://lfsbookja.osdn.jp/8.0-ja/wget-list
wget http://lfsbookja.osdn.jp/8.0-ja/md5sums
cp -a md5sums $LFS/sources/

wget --input-file=wget-list --continue --directory-prefix=$LFS/sources
pushd $LFS/sources
md5sum -c md5sums
popd

$LFS/toolsディレクトリ作成

mkdir -v $LFS/tools

ln -sv $LFS/tools /

環境変数設定

  1. rootユーザに$LFSを設定
echo "export LFS=/mnt/lfs" >> /root/.bash_profile
  1. 設定したプロファイルを現在のbashに反映
source ~/.bash_profile

ディスクマウント

echo "/dev/lfsvg/lfslv /mnt/lfs ext4 defaults 0 0" >> /etc/fstab

mkdir /mnt/lfs

mount /mnt/lfs

LFSユーザ追加

groupadd lfs

useradd -s /bin/bash -g lfs -m -k /dev/null lfs

passwd lfs

chown -v lfs $LFS/tools

chown -v lfs $LFS/sources

su - lfs

LFSユーザ環境設定

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
alias ll='ls -lh --color=auto'
EOF

source ~/.bash_profile ~/.bashrc

ロスコンパイル版 Binutils のインストール

su - lfs
cd $LFS/sources
tar xvf binutils-2.27.tar.bz2
cd binutils-2.27
mkdir -v build
cd build

../configure --prefix=/tools            \
             --with-sysroot=$LFS        \
             --with-lib-path=/tools/lib \
             --target=$LFS_TGT          \
             --disable-nls              \
             --disable-werror
make -j4

case $(uname -m) in
  x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac

make install

ロスコンパイル版 GCC のインストール

su - lfs
cd $LFS/sources
tar xvf gcc-6.3.0.tar.bz2
cd gcc-6.3.0
tar -xvf ../mpfr-3.1.5.tar.xz
mv -v mpfr-3.1.5 mpfr
tar -xvf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar -xvf ../mpc-1.0.3.tar.gz
mv -v mpc-1.0.3 mpc
for file in \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done
mkdir -v build
cd build
../configure                                       \
    --target=$LFS_TGT                              \
    --prefix=/tools                                \
    --with-glibc-version=2.11                      \
    --with-sysroot=$LFS                            \
    --with-newlib                                  \
    --without-headers                              \
    --with-local-prefix=/tools                     \
    --with-native-system-header-dir=/tools/include \
    --disable-nls                                  \
    --disable-shared                               \
    --disable-multilib                             \
    --disable-decimal-float                        \
    --disable-threads                              \
    --disable-libatomic                            \
    --disable-libgomp                              \
    --disable-libmpx                               \
    --disable-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --disable-libstdcxx                            \
    --enable-languages=c,c++

make -j4 && make install

Linux APIヘッダーのインストール

tar xvf linux-4.9.9.tar.xz
cd linux-4.9.9
make -j4 mrproper
make -j4 INSTALL_HDR_PATH=dest headers_install
mkdir /tools/include
cp -rv dest/include/* /tools/include

Glibcのインストール

tar xvf glibc-2.25.tar.xz
cd glibc-2.25
mkdir build
cd build
../configure                             \
      --prefix=/tools                    \
      --host=$LFS_TGT                    \
      --build=$(../scripts/config.guess) \
      --enable-kernel=2.6.32             \
      --with-headers=/tools/include      \
      libc_cv_forced_unwind=yes          \
      libc_cv_c_cleanup=yes

make -j1 && make install
echo 'int main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools'
#	以下が出力されること
#      [Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]
rm -v dummy.c a.out 

Libstdc++のインストール

cd gcc-6.3.0
cd build
../libstdc++-v3/configure           \
    --host=$LFS_TGT                 \
    --prefix=/tools                 \
    --disable-multilib              \
    --disable-nls                   \
    --disable-libstdcxx-threads     \
    --disable-libstdcxx-pch         \
    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/6.3.0
make -j4 && make install

Binutilsのインストール

cd $LFS/sources/binutils-2.27
rm -rf build
mkdir build
cd build
CC=$LFS_TGT-gcc                \
AR=$LFS_TGT-ar                 \
RANLIB=$LFS_TGT-ranlib         \
../configure                   \
    --prefix=/tools            \
    --disable-nls              \
    --disable-werror           \
    --with-lib-path=/tools/lib \
    --with-sysroot
make -j4 && make install
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

GCCのインストール

cd $LFS/sources/gcc-6.3.0
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

for file in gcc/config/{linux,i386/linux{,64}}.h
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done


case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
  ;;
esac

tar -xf ../mpfr-3.1.5.tar.xz
mv -v mpfr-3.1.5 mpfr
tar -xf ../gmp-6.1.2.tar.xz
mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.0.3.tar.gz
mv -v mpc-1.0.3 mpc

yum -y install texinfo

rm -rf build
mkdir -v build
cd       build

CC=$LFS_TGT-gcc                                    \
CXX=$LFS_TGT-g++                                   \
AR=$LFS_TGT-ar                                     \
RANLIB=$LFS_TGT-ranlib                             \
../configure                                       \
    --prefix=/tools                                \
    --with-local-prefix=/tools                     \
    --with-native-system-header-dir=/tools/include \
    --enable-languages=c,c++                       \
    --disable-libstdcxx-pch                        \
    --disable-multilib                             \
    --disable-bootstrap                            \
    --disable-libgomp

make -j4 && make install
ln -sv gcc /tools/bin/cc
echo 'int main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'
#	以下が出力されること
#      [Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]
rm -v dummy.c a.out 
rm -rf build

TCL-coreインストール

cd $LFS/sources
tar xvf tcl-core8.6.6-src.tar.gz
cd tcl8.6.6
cd unix
./configure --prefix=/tools
make -j4
TZ=UTC make -j4 test
make -j4 install
chmod -v u+w /tools/lib/libtcl8.6.so
make install-private-headers
ln -sv tclsh8.6 /tools/bin/tclsh

Expectのインストール

cd $LFS/sources	
tar xvf expect5.45.tar.gz 
cd expect5.45
cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure
./configure --prefix=/tools       \
            --with-tcl=/tools/lib \
            --with-tclinclude=/tools/include
make -j4
make test
make SCRIPTS="" install

DejaGNUのインストール

cd $LFS/sources
tar xvf dejagnu-1.6.tar.gz
cd dejagnu-1.6
./configure --prefix=/tools
make installmake check

Checkのインストール

cd $LFS/sources
tar xvf check-0.11.0.tar.gz 
cd check-0.11.0
PKG_CONFIG= ./configure --prefix=/tools
make -j4 && make check && make install

Ncursesのインストール

cd $LFS/sources
tar xvf ncurses-6.0.tar.gz
cd ncurses-6.0
sed -i s/mawk// configure
./configure --prefix=/tools \
            --with-shared   \
            --without-debug \
            --without-ada   \
            --enable-widec  \
            --enable-overwrite

make -j4 && make install

Bashインストール

cd $LFS/sources
tar xvf bash-4.4.tar.gz 
cd bash-4.4
./configure --prefix=/tools --without-bash-malloc
make -j4
make tests
make install
ln -sv bash /tools/bin/sh

Bisonのインストール

tar xvf bison-3.0.4.tar.xz
cd bison-3.0.4
./configure --prefix=/tools
make -j4 && make check && make install

Bzip2のインストール

cd $LFS/sources
tar xvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make -j4 && make PREFIX=/tools install

coreutilsのインストール

cd $LFS/sources
tar xvf coreutils-8.26.tar.xz 
cd coreutils-8.26
./configure --prefix=/tools --enable-install-program=hostname
make -j4
#make -j4 RUN_EXPENSIVE_TESTS=yes check
make install

Diffutilsのインストール

cd $LFS/sources
tar xvf diffutils-3.5.tar.xz
cd diffutils-3.5
./configure --prefix=/tools
make -j4 && make install

fileのインストール

cd $LFS/sources
tar xvf file-5.30.tar.gz
cd file-5.30
./configure --prefix=/tools
make -j4 && make install

findutilsのインストール

cd $LFS/sources
tar xvf findutils-4.6.0.tar.gz
cd findutils-4.6.0
./configure --prefix=/tools
make -j4 && make install

gawkのインストール

cd $LFS/sources
tar xvf gawk-4.1.4.tar.xz
cd gawk-4.1.4
./configure --prefix=/tools
make -j4 && make install

gettextのインストール

cd $LFS/sources
tar xvf gettext-0.19.8.1.tar.xz
cd gettext-0.19.8.1
cd gettext-tools
EMACS="no" ./configure --prefix=/tools --disable-shared
make -j4 -C gnulib-lib
make -j4 -C intl pluralx.c
make -j4 -C src msgfmt
make -j4 -C src msgmerge
make -j4 -C src xgettext
cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin

grepのインストール

cd $LFS/sources
tar xvf grep-3.0.tar.xz 
cd grep-3.0
./configure --prefix=/tools
make -j4 && make install

gzipのインストール

cd $LFS/sources
tar xvf gzip-1.8.tar.xz 
cd gzip-1.8
./configure --prefix=/tools
make -j4 && make install

M4のインストール

cd $LFS/sources
tar xvf m4-1.4.18.tar.xz 
cd m4-1.4.18
./configure --prefix=/tools
make -j4 && make install

makeのインストール

cd $LFS/sources
tar xvf make-4.2.1.tar.bz2
cd make-4.2.1
./configure --prefix=/tools --without-guile
make -j4 && make install

patchのインストール

cd $LFS/sources
tar xvf patch-2.7.5.tar.xz 
cd patch-2.7.5
./configure --prefix=/tools
make -j4 && make install

perlのインストール

cd $LFS/sources
tar xvf perl-5.24.1.tar.bz2
cd perl-5.24.1
sh Configure -des -Dprefix=/tools -Dlibs=-lm
make -j4
cp -v perl cpan/podlators/scripts/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.24.1
cp -Rv lib/* /tools/lib/perl5/5.24.1

sedのインストール

cd $LFS/sources
tar xvf sed-4.4.tar.xz
cd sed-4.4
./configure --prefix=/tools
make -j4 && make install

tarのインストール

cd $LFS/sources
tar xvf tar-1.29.tar.xz
cd tar-1.29
./configure --prefix=/tools
make -j4 && make install

texinfoのインストール

cd $LFS/sources
tar xvf texinfo-6.3.tar.xz
cd texinfo-6.3
./configure --prefix=/tools
make -j4 && make install

util-linuxのインストール

cd $LFS/sources
tar xvf util-linux-2.29.1.tar.xz 
cd util-linux-2.29.1
./configure --prefix=/tools                   \
            --without-python                  \
            --disable-makeinstall-chown       \
            --without-systemdsystemunitdir    \
            --enable-libmount-force-mountinfo \
            PKG_CONFIG=""
make -j4 && make install

xzのインストール

cd $LFS/sources
tar xvf xz-5.2.3.tar.xz 
cd xz-5.2.3
./configure --prefix=/tools
make -j4 && make install

Chroot環境でのLFS

所有者の変更

chown -R root:root $LFS/tools

仮想カーネルファイルシステムの準備

mkdir -pv $LFS/{dev,proc,sys,run}
mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
if [ -h $LFS/dev/shm ]; then
mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi

chroot環境への移行

# 作業をする際は必ずchrootすること。
chroot "$LFS" /tools/bin/env -i \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1='\u:\w\$ '              \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
    /tools/bin/bash --login +h

ディレクトリ作成

mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -v  /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -v  /usr/libexec
mkdir -pv /usr/{,local/}share/man/man{1..8}

case $(uname -m) in
 x86_64) mkdir -v /lib64 ;;
esac

mkdir -v /var/{log,mail,spool}
ln -sv /run /var/run
ln -sv /run/lock /var/lock
mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}

シンボリックリンクの作成

ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la
ln -sv bash /bin/sh
ln -sv /proc/self/mounts /etc/mtab

ユーザとグループ

cat > /etc/passwd << "EOF"
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/dev/null:/bin/false
daemon:x:6:6:Daemon User:/dev/null:/bin/false
messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false
systemd-bus-proxy:x:72:72:systemd Bus Proxy:/:/bin/false
systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/bin/false
systemd-journal-remote:x:74:74:systemd Journal Remote:/:/bin/false
systemd-journal-upload:x:75:75:systemd Journal Upload:/:/bin/false
systemd-network:x:76:76:systemd Network Management:/:/bin/false
systemd-resolve:x:77:77:systemd Resolver:/:/bin/false
systemd-timesync:x:78:78:systemd Time Synchronization:/:/bin/false
systemd-coredump:x:79:79:systemd Core Dumper:/:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF


cat > /etc/group << "EOF"
root:x:0:
bin:x:1:daemon
sys:x:2:
kmem:x:3:
tape:x:4:
tty:x:5:
daemon:x:6:
floppy:x:7:
disk:x:8:
lp:x:9:
dialout:x:10:
audio:x:11:
video:x:12:
utmp:x:13:
usb:x:14:
cdrom:x:15:
adm:x:16:
messagebus:x:18:
systemd-journal:x:23:
input:x:24:
mail:x:34:
systemd-bus-proxy:x:72:
systemd-journal-gateway:x:73:
systemd-journal-remote:x:74:
systemd-journal-upload:x:75:
systemd-network:x:76:
systemd-resolve:x:77:
systemd-timesync:x:78:
systemd-coredump:x:79:
nogroup:x:99:
users:x:999:
EOF

exec /tools/bin/bash --login +h

touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664  /var/log/lastlog
chmod -v 600  /var/log/btmp

Linux APIヘッダーのインストール

cd /sources/linux-4.9.9
make mrproper
make INSTALL_HDR_PATH=dest headers_install
find dest/include \( -name .install -o -name ..install.cmd \) -delete
cp -rv dest/include/* /usr/include

Man-pagesのインストール

cd /sources
tar xvf man-pages-4.09.tar.xz 
cd man-pages-4.09
make install

Glibcのインストール

cd /sources/glibc-2.25
patch -Np1 -i ../glibc-2.25-fhs-1.patch
case $(uname -m) in
    x86) ln -s ld-linux.so.2 /lib/ld-lsb.so.3
    ;;
    x86_64) ln -s ../lib/ld-linux-x86-64.so.2 /lib64
            ln -s ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
    ;;
esac
rm -rf build 
mkdir build
cd build
../configure --prefix=/usr                   \
             --enable-kernel=2.6.32          \
             --enable-obsolete-rpc           \
             --enable-stack-protector=strong \
             libc_cv_slibdir=/lib
make -j4
make -j4 check
touch /etc/ld.so.conf
make install
cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd
install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../nscd/nscd.service /lib/systemd/system/nscd.service
mkdir -pv /usr/lib/locale
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
make localedata/install-locales

Glibcの設定

nsswitch.confの追加
cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF
タイムゾーンの追加
tar -xf ../../tzdata2016j.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward pacificnew systemv; do
    zic -L /dev/null   -d $ZONEINFO       -y "sh yearistype.sh" ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz}
    zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz}
done

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO
tzselect
ln -svf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
ダイナミックローダーの設定
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib

EOF


cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf

EOF
mkdir -pv /etc/ld.so.conf.d

ツールチェーンの調整

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld
gcc -dumpspecs | sed -e 's@/tools@@g'                   \
    -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
    -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' >      \
    `dirname $(gcc --print-libgcc-file-name)`/specs
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'
#[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
grep -B1 '^ /usr/include' dummy.log
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
grep "/lib.*/libc.so.6 " dummy.log
grep found dummy.log
rm -v dummy.c a.out dummy.log

zlibのインストール

chroot "$LFS" /tools/bin/env -i \
    HOME=/root                  \
    TERM="$TERM"                \
    PS1='\u:\w\$ '              \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
    /tools/bin/bash --login +h

tar xvf zlib-1.2.11.tar.xz 
cd zlib-1.2.11
./configure --prefix=/usr
make -j4
make -j4 check
make install
mv -v /usr/lib/libz.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so

fileのインストール

cd /sources/
tar xvf file-5.30.tar.gz 
cd file-5.30
./configure --prefix=/usr
make -j4
make -j4 check
make install

Binutilsのインストール

cd /sources/
rm -rf binutils-2.27
tar xvf binutils-2.27.tar.bz2
cd binutils-2.27
mkdir build
cd build
../configure --prefix=/usr       \
             --enable-gold       \
             --enable-ld=default \
             --enable-plugins    \
             --enable-shared     \
             --disable-werror    \
             --with-system-zlib
make -j4 tooldir=/usr
make -k check
make -j4 tooldir=/usr install

長くなったのでココまで

おわり