5.5. GCC-9.2.0 - 1단계

GCC 패키지는 C, C++ 컴파일러가 들어있는 GNU 컴파일러 컬렉션을 포함하고 있다.

예상 빌드 시간: 10 SBU
필요 디스크 공간: 3.1 GB

5.5.1. Cross GCC 설치

GCC는 이제 GMP, MPFR 그리고 MPC 패키지를 필요로 한다. 이러한 패키지들은 호스트 배포판에 포함되어 있지 않을 수 있으므로 GCC로 빌드될 것이다. GCC 빌드 과정에 쓰일 수 있도록 각 패키지를 GCC 소스 디렉토리에 압축을 풀고 생성된 디렉토리의 이름을 변경하라:

[참고]

참고

이 장에 대해서 오해가 빈번하다. 이 절차들은 앞서 설명했듯이 다른 모든 장과 동일하다(패키지 빌드 절차). 먼저 sources 디렉토리에서 GCC tarball을 추출한 다음 생성된 디렉토리로 이동하라. 그래야만 아래 지침을 따를 수 있다.

tar -xf ../mpfr-4.0.2.tar.xz
mv -v mpfr-4.0.2 mpfr
tar -xf ../gmp-6.2.0.tar.xz
mv -v gmp-6.2.0 gmp
tar -xf ../mpc-1.1.0.tar.gz
mv -v mpc-1.1.0 mpc

다음 명령은 GCC의 기본 동적 링커 위치를 /tools에 설치된 링커로 변경한다. GCC의 포함 검색 경로에서도 /usr/include를 제거한다:

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

위의 내용이 어려워 보이면 조금 더 살펴보자. 먼저 gcc/config/linux.h, gcc/config/i386/linux.h 그리고 gcc/config/i368/linux64.h 파일들을, 파일명은 같고 접미사(확장자)가 .orig인 파일로 복사한다. 첫 번째 sed 표현식은 /lib/ld, /lib64/ld 또는 /lib32/ld의 모든 인스턴스 앞에 /tools를 붙이며, 두 번째 표현식은 /usr의 하드 코딩된 인스턴스를 대체한다. 그리고나서, 기본 시작파일 접두사를 파일 끝으로 변경하는 define 문을 추가한다. /tools/lib/의 끝에 /가 필요하다는 점에 유의하라. 마지막으로, touch를 사용하여, 복사된 파일의 타임 스탬프를 업데이트한다. cp -u와 함께 사용하면 명령이 실수로 두 번 실행되더라도 원본 파일이 예기치 않게 변경되지 않는다.

마지막으로, x86_64 호스트에서 64비트 라이브러리의 기본 디렉토리 이름을 lib로 설정한다:

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

GCC 문서는 전용 빌드 디렉토리에 GCC를 구축할 것을 권장한다:

mkdir -v build
cd       build

GCC 컴파일을 준비한다:

../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-libquadmath                          \
    --disable-libssp                               \
    --disable-libvtv                               \
    --disable-libstdcxx                            \
    --enable-languages=c,c++

Configure 옵션들의 의미:

--with-glibc-version=2.11

패키지가 호스트의 Glibc 버전과 호환되도록 지정한다. 호스트 시스템 요구사항에 명시된 최소 Glibc 버전으로 지정한다.

--with-newlib

아직 C 라이브러리를 사용할 수 없으므로 libgcc를 빌드할 때 inhibit_libc 상수가 정의되도록 한다. 이 상수는 libc가 필요한 어떤 코드도 컴파일되지 않게 한다.

--without-headers

완전한 크로스 컴파일러를 만들 때 GCC는 대상 시스템과 호환되는 표준 헤더가 필요하다. 우리의 목표를 위해선 이 헤더가 필요하지 않다. 이 옵션은 GCC가 그 헤더들을 찾지 않도록 한다.

--with-local-prefix=/tools

'local prefix'란 GCC가 로컬로 설치된 include 파일들을 검색하는 위치이다. 기본값은 /usr/local이다. 이 위치를 /tools로 설정하면 GCC의 검색 경로에 /usr/local이 포함되지 않는다.

--with-native-system-header-dir=/tools/include

기본적으로 GCC는 /usr/include에서 시스템 헤더를 검색한다. 보통 sysroot 변경과 함께 검색 위치가 $LFS/usr/include로 이동한다. 그러나 다음 두 절에서 설치될 헤더들은 $LFS/tools/include에 설치된다. 이 옵션은 GCC가 그들을 정확하게 찾을 수 있도록 한다. GCC의 두 번째 단계에서도 호스트 시스템의 헤더를 찾지 않도록 하기 위해 이 옵션이 그대로 쓰인다.

--disable-shared

GCC가 내부 라이브러리를 정적으로 링크하도록 강제한다. 호스트 시스템에 발생할 수 있는 문제를 방지하고자 함이다.

--disable-decimal-float, --disable-threads, --disable-libatomic, --disable-libgomp, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx

이 옵션들은 각각 십진 부동소수점 확장, 스레딩, libatomic, libquadmath, libssp, libvtv 및 C++ 표준 라이브러리를 비활성화한다. 이러한 기능들은 크로스 컴파일러를 빌드할 때 컴파일에 실패하며 임시 libc를 크로스 컴파일하는 데에는 필요하지 않다.

--disable-multilib

x86_64에서 LFS는 아직 multilib 구성을 지원하지 않는다. 이 옵션은 x86에선 아무 영향이 없다.

--enable-languages=c,c++

C와 C++ 컴파일러만 빌드되도록 한다. 당장 필요한 언어는 이 둘 뿐이다.

다음으로 GCC를 컴파일하라:

make

이제 컴파일이 끝났다. 이 시점에서 보통 테스트 스위트를 실행하지만, 앞서 언급했듯 테스트 스위트 프레임워크는 아직 구현되어 있지 않다. 이 첫 단계의 프로그램은 곧 교체될 것이기 때문에 지금 테스트를 실행해봤자 얻을 수 있는 이점은 거의 없다.

패키지를 설치한다:

make install

이 패키지에 관한 자세한 정보는 6.25.2절. “GCC의 내용.”에서 찾을 수 있다.