이 패키지에 관한 자세한 정보는 6.25.2절. “GCC의 내용.”에서 찾을 수 있다.
GCC 패키지는 C, C++ 컴파일러가 들어있는 GNU 컴파일러 컬렉션을 포함하고 있다.
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의 내용.”에서 찾을 수 있다.