LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 6962|回复: 37

[原创]从源码构建本地编译GNU/Linux系统(gcc-4.3.1)

[复制链接]
发表于 2008-6-23 21:11:46 | 显示全部楼层 |阅读模式
从源码构建本地编译GNU/Linux系统(gcc-4.3.1)

2008.07.16 更新 交叉编译工具链 创建方法,升级一个相关软件包file-4.25
2008.06.23 创建

本文解决如下问题:

  • 以 Sysroot 方式,从源码构建本地编译的 GNU/Linux 系统。
  • 官方 CLFS-Sysroot x86 方法中 Basic System 为交叉编译产物,本文方法中 Basic System 本地编译生成。
  • 官方 CLFS-Sysroot 无 x86_64 系统构建方法,本文提供 CLFS-Sysroot x86_64-Pure64 方法,并且 Basic System 本地编译生成。
  • 理论上,本文提供的方法亦适用其它平台架构。不具备本地编译条件的嵌入式平台请使用官方方法。
  • 升级到 gcc-4.3.1 。
本文为 Sysroot 方式从源码构建完全本地编译的 GNU/Linux 系统 升级姊妹篇

宿主系统需求:

  • Bash-2.05a
  • Binutils-2.12
  • Bison-1.26a
  • Bzip2-1.0.2
  • Coreutils-5.0
  • Diffutils-2.8
  • Findutils-4.1.20
  • Gawk-3.0
  • Gcc-2.95.3
  • Glibc-2.2.5
  • Grep-2.5
  • Gzip-1.2.4
  • Make-3.79.1
  • Patch-2.5.4
  • Sed-3.0.2
  • Tar-1.14
  • Texinfo
  • file-4.21
  • perl
  • gmp-4.2.2

  • mpfr-2.3.1
具体过程如下:(适用于x86/x86_64,摘自笔者编译脚本)

〇、root用户准备工作

  • 全局设置
    1. NEW_OS=x86_64-linux-gnu [color=Orange]#自定义,用于工作目录、用户名[/color]
    2. NEW_OS_ARCH=x86_64 [color=Orange]#处理器架构,x86系统请修改为i386[/color]
    3. NEW_OS_TARGET=x86_64-unknown-linux-gnu [color=Orange]#目标系统类型,x86系统请根据自己需要修改,如i686-pc-linux-gnu[/color]
    4. NEW_OS_HOST=$(echo ${MACHTYPE} | sed -e "s@$(echo ${MACHTYPE} | cut -d- -f2)@cross@")
    5. NEW_OS_MARCH=$(echo ${NEW_OS_TARGET} | cut -d- -f1)
    6. NEW_OS_DIR=/${NEW_OS}
    7. SOURCE=${NEW_OS_DIR}/source
    8. TOOLS=${NEW_OS_DIR}/tools
    9. PACKAGE=${NEW_OS_DIR}/package
    10. MARK=${NEW_OS_DIR}/mark
    11. ROOTFS=${NEW_OS_DIR}/rootfs
    12. FAKEROOT=${NEW_OS_DIR}/fakeroot
    13. NEW_OS_NO_LIB64_DIR=yes
    14. NEW_OS_USER=${NEW_OS}
    15. NEW_OS_ID=1000
    复制代码
  • 建立工作目录、用户、用户环境
    1. mkdir -pv ${NEW_OS_DIR}/bin \
    2.     ${SOURCE} \
    3.     ${TOOLS} \
    4.     ${PACKAGE} \
    5.     ${MARK} \
    6.     ${ROOTFS} \
    7.     ${FAKEROOT}
    8. touch ${NEW_OS_DIR}/${NEW_OS_TARGET}
    9. cp -a ${NEW_OS_SCRIPT_DIR} ${NEW_OS_DIR}/bin
    10. groupadd -o -g ${NEW_OS_ID} ${NEW_OS_USER}
    11. useradd -o -d ${NEW_OS_DIR} -u ${NEW_OS_ID} -g ${NEW_OS_ID} -s /bin/bash ${NEW_OS_USER}
    12. passwd ${NEW_OS_USER}
    13. cat > ${NEW_OS_DIR}/.bash_profile << eof
    14. exec env -i HOME=\${HOME} TERM=\${TERM} PS1='\u@\h:\w\\$ ' /bin/bash
    15. eof
    16. cat > ${NEW_OS_DIR}/.bashrc << eof
    17. set +h
    18. umask 022
    19. export LC_ALL=POSIX
    20. export PATH=${TOOLS}/bin:/usr/bin:/bin
    21. eof
    22. echo "export NEW_OS=${NEW_OS}" >> ${NEW_OS_DIR}/.bashrc
    23. echo "export NEW_OS_ARCH=${NEW_OS_ARCH}" >> ${NEW_OS_DIR}/.bashrc
    24. echo "export NEW_OS_TARGET=${NEW_OS_TARGET}" >> ${NEW_OS_DIR}/.bashrc
    25. echo "export NEW_OS_HOST=${NEW_OS_HOST}" >> ${NEW_OS_DIR}/.bashrc
    26. echo "export NEW_OS_MARCH=${NEW_OS_MARCH}" >> ${NEW_OS_DIR}/.bashrc
    27. echo "export NEW_OS_DIR=${NEW_OS_DIR}" >> ${NEW_OS_DIR}/.bashrc
    28. echo "export SOURCE=${SOURCE}" >> ${NEW_OS_DIR}/.bashrc
    29. echo "export TOOLS=${TOOLS}" >> ${NEW_OS_DIR}/.bashrc
    30. echo "export PACKAGE=${PACKAGE}" >> ${NEW_OS_DIR}/.bashrc
    31. echo "export MARK=${MARK}" >> ${NEW_OS_DIR}/.bashrc
    32. echo "export ROOTFS=${ROOTFS}" >> ${NEW_OS_DIR}/.bashrc
    33. echo "export FAKEROOT=${FAKEROOT}" >> ${NEW_OS_DIR}/.bashrc
    34. echo "unset CFLAGS" >> ${NEW_OS_DIR}/.bashrc
    35. echo "unset CXXFLAGS" >> ${NEW_OS_DIR}/.bashrc
    36. chown -R ${NEW_OS_ID}.${NEW_OS_ID} ${NEW_OS_DIR}
    复制代码
  • 建立目标系统目录结构
    1.     mkdir -pv ${ROOTFS}/{bin,boot,dev,etc/{ramdisk,opt},home,initrd,lib,media,mnt,opt,proc,root,sbin,srv,sys,tmp,usr,var}
    2.     mkdir -pv ${ROOTFS}/usr{,/local}/{bin,include,lib,sbin,share,src}
    3.     mkdir -pv ${ROOTFS}/usr{,/local}/share/{doc,info,locale,man,misc,terminfo,zoneinfo}
    4.     ln -sfv share/{doc,info,man} ${ROOTFS}/usr
    5.     ln -sfv share/{doc,info,man} ${ROOTFS}/usr/local
    6.     mkdir -pv ${ROOTFS}/usr{,/local}/share/man/man{1,2,3,4,5,6,7,8}
    7.     mkdir -pv ${ROOTFS}/var/{cache,lib/{misc,locate},local,lock,log,mail,opt,run,spool,tmp}
    8.     chmod 0750 ${ROOTFS}/root
    9.     chmod 1777 ${ROOTFS}/{,var/}tmp
    复制代码
  • 宿主安装gmp-4.2.2
    1.      ./configure --prefix=/usr \
    2.         --enable-cxx \
    3.         --enable-mpbsd
    4.     make
    5.     make install
    复制代码
  • 宿主安装mpfr-2.3.1
    1.     ./configure --prefix=/usr \
    2.         --enable-shared
    3.     make
    4.     make install
    复制代码
一、${NEW_OS_USER} 用户建立交叉工具链

  • linux-header-2.6.25.7
    1. HOMEPAGE="http://www.kernel.org/"
    2. SOURCE_URL="http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.7.tar.bz2
    3.             http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.25.7.tar.bz2.sign"
    4. SOURCE_MD5=""
    5. PACKAGE_NAME=linux-header
    6. PACKAGE_VERSION=2.6.25.7
    7. SOURCE_DIR=${SOURCE}/linux-${PACKAGE_VERSION}
    8. BUILD_DIR=
    9. source_tree()
    10. {
    11.     cd ${SOURCE}
    12.     tar -xvf linux-${PACKAGE_VERSION}.tar.bz2
    13.     cd ${SOURCE_DIR}
    14.     make mrproper
    15. }
    16. source_config()
    17. {
    18.     echo "source_config"
    19. }
    20. source_build()
    21. {
    22.     cd ${SOURCE_DIR}
    23.     make ARCH=${NEW_OS_ARCH} INSTALL_HDR_PATH=header_dir headers_install
    24.     mkdir -pv ${ROOTFS}/usr
    25.     cp -av header_dir/include ${ROOTFS}/usr/
    26. }
    复制代码
  • glibc-header-2.7
    1. HOMEPAGE="http://www.gnu.org/software/libc/"
    2. SOURCE_URL="http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2
    3.             http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2.sig
    4.         http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2
    5.         http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2.sig"
    6. SOURCE_MD5=""
    7. SOURCE_DIR=${SOURCE}/glibc-${PACKAGE_VERSION}
    8. BUILD_DIR=${SOURCE}/glibc-build
    9. source_tree()
    10. {
    11.     cd ${SOURCE}
    12.     tar -xvf glibc-${PACKAGE_VERSION}.tar.bz2
    13.     tar -xvf glibc-ports-${PACKAGE_VERSION}.tar.bz2
    14.     mv -v glibc-ports-${PACKAGE_VERSION} ${SOURCE_DIR}/ports
    15.     cd ${SOURCE_DIR}
    16.     sed -i -e "s@/etc/mtab@/etc/ramdisk/mtab@" sysdeps/unix/sysv/linux/paths.h
    17.     mkdir -pv ${BUILD_DIR}
    18. }
    19. source_config()
    20. {
    21.     cd ${BUILD_DIR}
    22.     echo "libc_cv_forced_unwind=yes" >> config.cache
    23.     echo "libc_cv_c_cleanup=yes" >> config.cache
    24.     echo "libc_cv_${NEW_OS_ARCH}_tls=yes" >> config.cache
    25.     if [ "${NEW_OS_ARCH}" = "i386" ]; then
    26.         echo "libc_cv_386_tls=yes" >> config.cache
    27.         echo "CFLAGS+=-march=${NEW_OS_MARCH}" >> configparms
    28.     fi
    29.     echo "install_root=${ROOTFS}" >> configparms
    30.     echo "slibdir=/lib" >> configparms
    31.     CC=gcc ${SOURCE_DIR}/configure --prefix=/usr \
    32.         --host=${NEW_OS_TARGET} \
    33.         --build=${NEW_OS_HOST} \
    34.         --with-headers=${ROOTFS}/usr/include \
    35.         --cache-file=config.cache
    36. }
    37. source_build()
    38. {
    39.     cd ${BUILD_DIR}
    40.     make install-headers
    41.     mkdir -pv ${ROOTFS}/usr/include/bits
    42.     cp -v bits/stdio_lim.h ${ROOTFS}/usr/include/bits/
    43.     mkdir -pv ${ROOTFS}/usr/include/gnu
    44.     touch ${ROOTFS}/usr/include/gnu/stubs{,-32,-64}.h
    45. }
    复制代码
  • binutils-2.18
    1. HOMEPAGE="http://www.gnu.org/software/binutils/"
    2. SOURCE_URL="http://ftp.gnu.org/gnu/binutils/binutils-2.18.tar.bz2
    3.             http://ftp.gnu.org/gnu/binutils/binutils-2.18.tar.bz2.sig"
    4. SOURCE_MD5=""
    5. SOURCE_DIR=${SOURCE}/${PACKAGE_NAME}-${PACKAGE_VERSION}
    6. BUILD_DIR=${SOURCE}/${PACKAGE_NAME}-build
    7. source_tree()
    8. {
    9.     cd ${SOURCE}
    10.     tar -xvf ${PACKAGE_NAME}-${PACKAGE_VERSION}.tar.bz2
    11.     cd ${SOURCE_DIR}
    12.     #posix
    13.     sed -i -e "s@tail +16c@tail -c +16@g" $(grep -lr "tail +16c" *)
    14.     sed -i -e "s@tail +140@tail -n +140@g" $(grep -lr "tail +140" *)
    15.     sed -i -e "s@head -1@head -n 1@g" $(grep -lr "head -1" *)
    16.     #support texinfo 4.11
    17.     sed -i -e "s@4\\\.\[4-9\]@&|4\\\.11@" configure
    18.     #--disable-multilib /lib64->/lib
    19.     if [ "${NEW_OS_NO_LIB64_DIR}" = "yes" ]; then
    20.         sed -i -e "s@/lib64/ld@/lib/ld@g" ld/configure.host
    21.     fi
    22.     mkdir -pv ${BUILD_DIR}
    23. }
    24. source_config()
    25. {
    26.     cd ${BUILD_DIR}
    27.     if [ "${NEW_OS_ARCH}" = "x86_64" ]; then
    28.         CONFPARMS=--enable-64-bit-bfd
    29.     else
    30.         CONFPARMS=
    31.     fi
    32.     AR=ar AS=as ${SOURCE_DIR}/configure --prefix=${TOOLS} \
    33.         [color=Red]--build=${NEW_OS_HOST} \[/color]
    34.         --host=${NEW_OS_HOST} \
    35.         --target=${NEW_OS_TARGET} \
    36.         --with-sysroot=${ROOTFS} \
    37.         --disable-nls \
    38.         --enable-shared \
    39.         --disable-multilib ${CONFPARMS}
    40. }
    41. source_build()
    42. {
    43.     cd ${BUILD_DIR}
    44.     make configure-host
    45.     make
    46.     make install
    47.     mkdir -pv ${ROOTFS}/usr/include
    48.     cp -v ${SOURCE_DIR}/include/libiberty.h ${ROOTFS}/usr/include/
    49. }
    复制代码
  • gcc-static-4.3.1
    1. HOMEPAGE="http://gcc.gnu.org/"
    2. SOURCE_URL="http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2
    3.             http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2.sig"
    4. SOURCE_MD5=""
    5. SOURCE_DIR=${SOURCE}/gcc-${PACKAGE_VERSION}
    6. BUILD_DIR=${SOURCE}/gcc-build
    7. source_tree()
    8. {
    9.     cd ${SOURCE}
    10.     tar -xvf gcc-${PACKAGE_VERSION}.tar.bz2
    11.     cd ${SOURCE_DIR}
    12.     #posix
    13.     sed -i -e "s@tail -1@tail -n 1@g" $(grep -lr "tail -1" *)
    14.     sed -i -e "s@tail -3@tail -n 3@g" $(grep -lr "tail -3" *)
    15.     sed -i -e "s@head -1@head -n 1@g" $(grep -lr "head -1" *)
    16.     #--disable-multilib /lib64->/lib
    17.     if [ "${NEW_OS_NO_LIB64_DIR}" = "yes" ]; then
    18.         sed -i -e "s@/lib64/ld@/lib/ld@g" gcc/config/*/linux64.h
    19.         sed -i -e "s@../lib32 ../lib ../lib64@../lib32 ../lib ../lib@g" \
    20.             -e "s@../lib64 ../lib@../lib ../lib@g" \
    21.             -e "s@../lib64@../lib@g" gcc/config/*/t-linux64
    22.     fi
    23.     #cross hacking
    24.     sed -i -e "s@/usr/libexec/gcc/@@g" -e "s@/usr/lib/gcc/@@g" gcc/gcc.c
    25.     mkdir -pv ${BUILD_DIR}
    26. }
    27. source_config()
    28. {
    29.     cd ${BUILD_DIR}
    30.     [color=Red]AR=ar \[/color]
    31.     ${SOURCE_DIR}/configure --prefix=${TOOLS} \
    32.         [color=Red]--build=${NEW_OS_HOST} \[/color]
    33.         --host=${NEW_OS_HOST} \
    34.         --target=${NEW_OS_TARGET} \
    35.         --with-sysroot=${ROOTFS} \
    36.         --disable-nls \
    37.         --disable-shared \
    38.         --enable-languages=c \
    39.         --disable-multilib
    40. }
    41. source_build()
    42. {
    43.     cd ${BUILD_DIR}
    44.     make all-gcc
    45.      [color=Red]make all-target-libgcc[/color]
    46.     make install-gcc[color=Red]
    47.     make install-target-libgcc[/color]
    48. }
    复制代码
    1. [color=Silver]  HOMEPAGE="http://gcc.gnu.org/"
    2. SOURCE_URL="http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2
    3.             http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2.sig"
    4. SOURCE_MD5=""
    5. SOURCE_DIR=${SOURCE}/gcc-${PACKAGE_VERSION}
    6. BUILD_DIR=${SOURCE}/gcc-build
    7. source_tree()
    8. {
    9.     cd ${SOURCE}
    10.     tar -xvf gcc-${PACKAGE_VERSION}.tar.bz2
    11.     cd ${SOURCE_DIR}
    12.     #posix
    13.     sed -i -e "s@tail -1@tail -n 1@g" $(grep -lr "tail -1" *)
    14.     sed -i -e "s@tail -3@tail -n 3@g" $(grep -lr "tail -3" *)
    15.     sed -i -e "s@head -1@head -n 1@g" $(grep -lr "head -1" *)
    16.     #--disable-multilib /lib64->/lib
    17.     if [ "${NEW_OS_NO_LIB64_DIR}" = "yes" ]; then
    18.         sed -i -e "s@/lib64/ld@/lib/ld@g" gcc/config/*/linux64.h
    19.         sed -i -e "s@../lib32 ../lib ../lib64@../lib32 ../lib ../lib@g" \
    20.             -e "s@../lib64 ../lib@../lib ../lib@g" \
    21.             -e "s@../lib64@../lib@g" gcc/config/*/t-linux64
    22.     fi
    23.     #cross hacking
    24.     sed -i -e "s@/usr/libexec/gcc/@@g" -e "s@/usr/lib/gcc/@@g" gcc/gcc.c
    25.     #cross hacking
    26.     sed -i 's@$(GCC_FOR_TARGET) -dumpspecs@echo -n@' gcc/Makefile.in
    27.     mkdir -pv ${BUILD_DIR}
    28. }
    29. source_config()
    30. {
    31.     cd ${BUILD_DIR}
    32.       AR=ar \
    33.     CC_FOR_TARGET=${NEW_OS_TARGET}-gcc \
    34.     ${SOURCE_DIR}/configure --prefix=${TOOLS} \
    35.         --build=${NEW_OS_HOST} \
    36.         --host=${NEW_OS_HOST} \
    37.         --target=${NEW_OS_TARGET} \
    38.         --with-sysroot=${ROOTFS} \
    39.         --disable-nls \
    40.         --disable-shared \
    41.         --enable-languages=c \
    42.         --disable-multilib
    43. }
    44. source_build()
    45. {
    46.     cd ${BUILD_DIR}
    47.     make all-gcc
    48.     make install-gcc
    49.      make all-target-libgcc
    50.     make install-target-libgcc
    51. }[/color]         
    复制代码
    注意:
    这里用补丁建立空spec文件,否则交叉编译会出错,伪交叉编译会引人宿主gcc spec。(2008.07.16已废弃)

  • glibc-2.7
    1. HOMEPAGE="http://www.gnu.org/software/libc/"
    2. SOURCE_URL="http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2
    3.             http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2.sig
    4.         http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2
    5.         http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2.sig"
    6. SOURCE_MD5=""
    7. SOURCE_DIR=${SOURCE}/${PACKAGE_NAME}-${PACKAGE_VERSION}
    8. BUILD_DIR=${SOURCE}/${PACKAGE_NAME}-build
    9. source_tree()
    10. {
    11.     cd ${SOURCE}
    12.     tar -xvf ${PACKAGE_NAME}-${PACKAGE_VERSION}.tar.bz2
    13.     tar -xvf ${PACKAGE_NAME}-ports-${PACKAGE_VERSION}.tar.bz2
    14.     mv -v ${PACKAGE_NAME}-ports-${PACKAGE_VERSION} ${SOURCE_DIR}/ports
    15.     cd ${SOURCE_DIR}
    16.     sed -i -e "s@/etc/mtab@/etc/ramdisk/mtab@" sysdeps/unix/sysv/linux/paths.h
    17.     #libgcc_eh cross hacking
    18.     sed -i -e "s@-lgcc_eh@@g" Makeconfig
    19. [color=Red]    #for gcc-4.3.1
    20.     sed -i 's@-nostdinc -isystem $ccheaders@& -isystem $ccheaders-fixed@' configure
    21. [/color]
    22.     mkdir -pv ${BUILD_DIR}
    23. }
    24. source_config()
    25. {
    26.     cd ${BUILD_DIR}
    27.     echo "libc_cv_forced_unwind=yes" >> config.cache
    28.     echo "libc_cv_c_cleanup=yes" >> config.cache
    29.     echo "libc_cv_${NEW_OS_ARCH}_tls=yes" >> config.cache
    30.     if [ "${NEW_OS_ARCH}" = "i386" ]; then
    31.         echo "libc_cv_386_tls=yes" >> config.cache
    32.         echo "CFLAGS+=-march=${NEW_OS_MARCH}" >> configparms
    33.     fi
    34.     echo "install_root=${ROOTFS}" >> configparms
    35.     echo "slibdir=/lib" >> configparms
    36.     BUILD_CC=gcc \
    37.     CC=${NEW_OS_TARGET}-gcc \
    38.     AR=${NEW_OS_TARGET}-ar \
    39.     RANLIB=${NEW_OS_TARGET}-ranlib \
    40.     CFLAGS="-mtune=generic -g -O2" \
    41.     ${SOURCE_DIR}/configure --prefix=/usr \
    42.         [color=Red]--build=${NEW_OS_HOST} \[/color]
    43.         --host=${NEW_OS_TARGET} \
    44.         --target=${NEW_OS_TARGET} \
    45.         --with-headers=${ROOTFS}/usr/include \
    46.         --libdir=/usr/lib \
    47.         --libexecdir=/usr/lib/glibc \
    48.         --disable-profile \
    49.         --enable-add-ons \
    50.         --with-tls \
    51.         --enable-kernel=2.6.0 \
    52.         --with-__thread \
    53.         --with-binutils=${TOOLS}/bin \
    54.         --cache-file=config.cache
    55. }
    56. source_build()
    57. {
    58.     cd ${BUILD_DIR}
    59.     make
    60.     #--disable-multilib /lib64->/lib
    61.     if [ "${NEW_OS_NO_LIB64_DIR}" = "yes" ]; then
    62.         sed -i -e "s@/lib64/ld@/lib/ld@" elf/ldd
    63.     fi
    64.     make install
    65.     mkdir -pv ${ROOTFS}/etc/ramdisk
    66.     ln -sfv ramdisk/mtab ${ROOTFS}/etc/mtab
    67.     ln -sfv ramdisk/resolv.conf ${ROOTFS}/etc/resolv.conf
    68.     mkdir -pv ${ROOTFS}/lib
    69.     ln -sfv libcrypt-2.7.so ${ROOTFS}/lib/libcrypt.so
    70.     cat > ${ROOTFS}/etc/nsswitch.conf << eof
    71. #begin    /etc/nsswitch.conf
    72. passwd:        files
    73. group:        files
    74. shadow:        files
    75. hosts:        files dns
    76. networks:    files
    77. protocols:    files
    78. services:    files
    79. ethers:        files
    80. rpc:        files
    81. #end    /etc/nsswitch.conf
    82. eof
    83.     cat > ${ROOTFS}/etc/ld.so.conf << eof
    84. #begin    /etc/ld.so.conf
    85. #end    /etc/ld.so.conf
    86. eof
    87. }
    复制代码
  • gcc-4.3.1
    1. HOMEPAGE="http://gcc.gnu.org/"
    2. SOURCE_URL="http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2
    3.             http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2.sig"
    4. SOURCE_MD5=""
    5. SOURCE_DIR=${SOURCE}/${PACKAGE_NAME}-${PACKAGE_VERSION}
    6. BUILD_DIR=${SOURCE}/${PACKAGE_NAME}-build
    7. source_tree()
    8. {
    9.     cd ${SOURCE}
    10.     tar -xvf ${PACKAGE_NAME}-${PACKAGE_VERSION}.tar.bz2
    11.     cd ${SOURCE_DIR}
    12.     #posix
    13.     sed -i -e "s@tail -1@tail -n 1@g" $(grep -lr "tail -1" *)
    14.     sed -i -e "s@tail -3@tail -n 3@g" $(grep -lr "tail -3" *)
    15.     sed -i -e "s@head -1@head -n 1@g" $(grep -lr "head -1" *)
    16.     #--disable-multilib /lib64->/lib
    17.     if [ "${NEW_OS_NO_LIB64_DIR}" = "yes" ]; then
    18.         sed -i -e "s@/lib64/ld@/lib/ld@g" gcc/config/*/linux64.h
    19.         sed -i -e "s@../lib32 ../lib ../lib64@../lib32 ../lib ../lib@g" \
    20.             -e "s@../lib64 ../lib@../lib ../lib@g" \
    21.             -e "s@../lib64@../lib@g" gcc/config/*/t-linux64
    22.     fi
    23.     #cross hacking
    24.     sed -i -e "s@/usr/libexec/gcc/@@g" -e "s@/usr/lib/gcc/@@g" gcc/gcc.c
    25.     mkdir -pv ${BUILD_DIR}
    26. }
    27. source_config()
    28. {
    29.     cd ${BUILD_DIR}
    30.     [color=Red]AR=ar \[/color]
    31.     ${SOURCE_DIR}/configure --prefix=${TOOLS} \
    32.         [color=Red]--build=${NEW_OS_HOST} \[/color]
    33.         --host=${NEW_OS_HOST} \
    34.         --target=${NEW_OS_TARGET} \
    35.         --with-sysroot=${ROOTFS} \
    36.         --disable-nls \
    37.         --enable-shared \
    38.         --enable-languages=c,c++ \
    39.         --enable-__cxa_atexit \
    40.         --enable-c99 \
    41.         --enable-long-long \
    42.         --enable-threads=posix \
    43.         --disable-multilib
    44. }
    45. source_build()
    46. {
    47.     cd ${BUILD_DIR}
    48.     [color=Red]make
    49.     make install[/color]
    50. }
    复制代码

    注意:
    建立工具链时,这里特别添加了--build=${NEW_OS_HOST},这是gcc-4.3系列与之前版本的区别,之前版本gcc配置时探测到 --host --target 不同,会自动设置--build与--host相同,但gcc-4.3会根据系统信息配置。
    所以伪交叉编译时会出问题,具体见
    用GCC 4.3-20040810构造SYSROOT工具链 ,特别说明,这个不是bug,添加--build后可以正常编译不需额外补丁。
    为统一,建立交叉工具链时均加上--build=${NEW_OS_HOST}。
    1. [color=Silver]  HOMEPAGE="http://gcc.gnu.org/"
    2. SOURCE_URL="http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2
    3.             http://ftp.gnu.org/gnu/gcc/gcc-4.3.1/gcc-4.3.1.tar.bz2.sig"
    4. SOURCE_MD5=""
    5. SOURCE_DIR=${SOURCE}/${PACKAGE_NAME}-${PACKAGE_VERSION}
    6. BUILD_DIR=${SOURCE}/${PACKAGE_NAME}-build
    7. source_tree()
    8. {
    9.     cd ${SOURCE}
    10.     tar -xvf ${PACKAGE_NAME}-${PACKAGE_VERSION}.tar.bz2
    11.     cd ${SOURCE_DIR}
    12.     #posix
    13.     sed -i -e "s@tail -1@tail -n 1@g" $(grep -lr "tail -1" *)
    14.     sed -i -e "s@tail -3@tail -n 3@g" $(grep -lr "tail -3" *)
    15.     sed -i -e "s@head -1@head -n 1@g" $(grep -lr "head -1" *)
    16.     #--disable-multilib /lib64->/lib
    17.     if [ "${NEW_OS_NO_LIB64_DIR}" = "yes" ]; then
    18.         sed -i -e "s@/lib64/ld@/lib/ld@g" gcc/config/*/linux64.h
    19.         sed -i -e "s@../lib32 ../lib ../lib64@../lib32 ../lib ../lib@g" \
    20.             -e "s@../lib64 ../lib@../lib ../lib@g" \
    21.             -e "s@../lib64@../lib@g" gcc/config/*/t-linux64
    22.     fi
    23.     #cross hacking
    24.     sed -i -e "s@/usr/libexec/gcc/@@g" -e "s@/usr/lib/gcc/@@g" gcc/gcc.c
    25.     mkdir -pv ${BUILD_DIR}
    26. }
    27. source_config()
    28. {
    29.     cd ${BUILD_DIR}
    30.     AR=ar \
    31.     CC_FOR_TARGET=${NEW_OS_TARGET}-gcc \
    32.     CXX_FOR_TARGET=${NEW_OS_TARGET}-g++ \
    33.     ${SOURCE_DIR}/configure --prefix=${TOOLS} \
    34.         --build=${NEW_OS_HOST} \
    35.         --host=${NEW_OS_HOST} \
    36.         --target=${NEW_OS_TARGET} \
    37.         --with-sysroot=${ROOTFS} \
    38.         --disable-nls \
    39.         --enable-shared \
    40.         --enable-languages=c,c++ \
    41.         --enable-__cxa_atexit \
    42.         --enable-c99 \
    43.         --enable-long-long \
    44.         --enable-threads=posix \
    45.         --disable-multilib
    46. }
    47. source_build()
    48. {
    49.     cd ${BUILD_DIR}
    50.      make
    51.     make install
    52. }
    53. [/color]
    复制代码
    (2008.07.16已废弃)
二、${NEW_OS_USER} 用户交叉编译临时系统
注意:
为统一,与建立交叉工具链类似,1-4编译时特别添加 --target=${NEW_OS_TARGET}。
交叉编译
mpfr-2.3.1时,需要使用--with-gmp-build指明gmp交叉编译目录,否则有恼人的错误引用问题,伪交叉编译时则会连接到宿主libgmp.so。

  • binutils-2.18
  • gmp-4.2.2
  • mpfr-2.3.1
  • gcc-4.3.1
  • ncurses-5.6
  • bash-3.2
  • bzip2-1.0.4
  • coreutils-6.9
  • diffutils-2.8.7
  • findutils-4.2.33
  • zlib-1.2.3
  • file-4.25
  • gawk-3.1.6
  • gettext-0.17
  • grep-2.5.3
  • gzip-1.3.12
  • make-3.81
  • patch-2.5.9
  • sed-4.1.5
  • tar-1.20
  • texinfo-4.11
  • e2fsprogs-1.40.2
  • sysvinit-2.86
  • module-init-tools-3.2.2
  • util-linux-ng-2.13.1
  • udev-118
  • shadow-4.1.1
  • linux-2.6.25.7
三、root 用户处理交叉编译临时系统

  • 现在更改临时系统用户、用户组为root
  • 创建启动必须的设备文件
  • 安装到新分区或按需定制
  • 安装一个bootloader(可选)
四、boot/chroot进入交叉编译临时系统,安装本地编译临时perl,测试工具

  • perl-5.10.0(这里使用正式安装perl时相同编译配置,方便维护)
  • m4-1.4.10(这里使用正式安装m4时相同编译配置,方便维护,gmp本地编译时需要)
  • 测试工具(可选)
五、boot/chroot进入交叉编译临时系统,建立本地编译基本系统

  • base-filesystem-0
  • linux-header-2.6.25.7
  • glibc-2.7
  • binutils-2.18
  • gmp-4.2.2
  • mpfr-2.3.1
  • gcc-4.3.1
  • man-pages-3.00
  • sed-4.1.5
  • e2fsprogs-1.40.2
  • coreutils-6.9
  • iana-etc-2.20
  • m4-1.4.10
  • bison-2.3
  • ncurses-5.6
  • procps-3.2.7
  • libtool-1.5.26
  • flex-2.5.35
  • iproute2-2.6.23
  • perl-5.10.0
  • readline-5.2
  • zlib-1.2.3
  • autoconf-2.61
  • automake-1.10.1
  • bash-3.2
  • bzip2-1.0.4
  • diffutils-2.8.7
  • file-4.25
  • findutils-4.2.33
  • gawk-3.1.6
  • gettext-0.17
  • grep-2.5.3
  • groff-1.19.2
  • gzip-1.3.12
  • inetutils-1.5
  • kbd-1.12
  • less-418
  • make-3.81
  • man-1.6f
  • mktemp-1.5
  • module-init-tools-3.2.2
  • patch-2.5.9
  • psmisc-22.6
  • Linux-PAM-0.99.10.0
  • shadow-4.1.1
  • sysklogd-1.5
  • sysvinit-2.86
  • tar-1.20
  • texinfo-4.11
  • udev-118
  • util-linux-ng-2.13.1
  • vim-7.1
  • linux-2.6.25.7
  • iptables-1.4.0
  • gpm-1.20.5
  • net-tools-1.60
  • dhcp-4.0.0
  • libgpg-error-1.6
  • libgcrypt-1.4.0
  • gnutls-2.3.1
  • openssl-0.9.8g
  • wget-1.11
  • lynx2-8-6
  • openssh-4.7p1
  • pkg-config-0.23
本文使用的简化编译脚本已附,命名以自解释为原则。
回头看看,自己改的东西太多,一点一点贴上来太麻烦。
使用帮助,请执行./new_os.sh。
不显式挂载分区,重写的简化启动脚本,完全自定制(也就是说不一定适合每个人),请有选择的参考。
另,请不要与官方alfs比较,用途不同。


与gcc-4.3.1不兼容软件包列表:
tar-1.19,升级到tar-1.20解决。
scim-pinyin-0.5.91,添加#include <string.h>解决。
scim-fcitx-3.1.1,添加#include <string.h>解决。
kvm-68,升级到kvm-70解决,使用kernel自带模块代码,不再需要gcc-3.3支持。
qemu-0.9.1,暂未解决,可能是内核头文件引起的,gcc-3.3.6也不行

alsa-tools-1.0.16,升级到alsa-*-1.0.17rc2解决。

下面部分源自xorg-7.3,不影响自己使用,暂不深究。
xf86-input-acecad-1.2.0
xf86-input-calcomp-1.1.0
xf86-input-citron-2.2.0
xf86-input-dmc-1.1.0
xf86-input-dynapro-1.1.0
xf86-input-elo2300-1.1.0
xf86-input-evdev-1.1.2
xf86-input-magellan-1.1.0
xf86-input-microtouch-1.1.0
xf86-input-penmount-1.2.0
xf86-input-spaceorb-1.1.0
xf86-input-vmmouse-12.4.1
xf86-input-void-1.1.0
xf86-video-glide-1.0.0


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2008-6-24 09:11:06 | 显示全部楼层
不错,不错,顶一下。
回复 支持 反对

使用道具 举报

发表于 2008-6-24 22:45:23 | 显示全部楼层
刚刚把你的脚本下载看了一下,你不是说你有采用Fakeroot方式Build的脚本么?好像还是老一套的LFS。

我前段时间试验了一下,所有的安装命令都用make DESTDIR=的方式安装到空目录,然后tar打包保存备份。这样检查依赖性非常方便:只要从空目录开始,把需要的包解开,然后你就可以检查依赖性是否满足了。万一缺少什么,如果有建好的包就用,否则build一遍。

我觉得这种方法应该可以推广开去。这样差不多就是用SLACKWARE的tgz包管理方法了,虽然原始,但非常简单。
回复 支持 反对

使用道具 举报

发表于 2008-6-25 07:54:04 | 显示全部楼层
基本上发行版的包都是用 DESTDIR 类似的东西做出来的吧?
不过有些不太一样,比如 glibc, 用的就是 install_root, 我记得还有个什么包用的是 INSTALL_ROOT, 具体要看 Makefile 了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 14:18:28 | 显示全部楼层
刚刚把你的脚本下载看了一下,你不是说你有采用Fakeroot方式Build的脚本么?好像还是老一套的LFS。

我前段时间试验了一下,所有的安装命令都用make DESTDIR=的方式安装到空目录,然后tar打包保存备份。这样检查依赖性非常方便:只要从空目录开始,把需要的包解开,然后你就可以检查依赖性是否满足了。万一缺少什么,如果有建好的包就用,否则build一遍。

前面几步,建立工具链、交叉编译临时系统、临时perl、安装测试工具,我已经用fakeroot方式验证过,这里提供的是简化脚本,所以略去,剩下的自然和官方方法类似了;
从建立基本系统开始,默认使用fakeroot方式打包备份,然后真正安装;
工具链、临时系统,可以整体打包备份,不过我一般不保留,习惯了过河拆桥。
我觉得这种方法应该可以推广开去。这样差不多就是用SLACKWARE的tgz包管理方法了,虽然原始,但非常简单。

fakeroot方式是标准的软件包维护方法,debian dpkg rules、redhat rpm spec一直在用的方法,我也只是觉得好才拿过来用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 14:26:27 | 显示全部楼层
基本上发行版的包都是用 DESTDIR 类似的东西做出来的吧?

并不是所有的软件包都支持DESTDIR的安装方式,这是fakeroot方式稍显麻烦的地方。当你完成第一遍后,这就是优点了,维护很方便的。

arch的包管理工具好像不是这样运行的,不了解,不多言。
不过有些不太一样,比如 glibc, 用的就是 install_root, 我记得还有个什么包用的是 INSTALL_ROOT, 具体要看 Makefile 了

glibc交叉编译阶段是这样,系统自举后,一样可以使用标准的fakeroot方式重新安装。
回复 支持 反对

使用道具 举报

发表于 2008-6-25 14:56:16 | 显示全部楼层
glibc我没交叉编译,不过也还是用的 make install_root=xxx install 安装的- -U

arch 的包管理还真不知道是什么样的,没用过 arch

DESTDIR 就是 fakeroot 的方式吧,还有我说的那个 glibc 的 install_root, 内核头文件的 INSTALL_HDR_PATH 应该都可以看作是 fakeroot 吧,只不过指定方式不同而已, 不过你用的是 sysroot 的方式,也许指定的方式不同,没玩过 CLFS
回复 支持 反对

使用道具 举报

发表于 2008-6-25 14:59:17 | 显示全部楼层
刚看了一下别人写的 arch 的 PKGBUILD 文件,似乎也用 DESTDIR 这一类方式的,也就是楼主说的 fakeroot
回复 支持 反对

使用道具 举报

发表于 2008-6-25 17:04:39 | 显示全部楼层
Post by 聚焦深空;1867276
前面几步,建立工具链、交叉编译临时系统、临时perl、安装测试工具,我已经用fakeroot方式验证过,这里提供的是简化脚本,所以略去,剩下的自然和官方方法类似了;
从建立基本系统开始,默认使用fakeroot方式打包备份,然后真正安装;
工具链、临时系统,可以整体打包备份,不过我一般不保留,习惯了过河拆桥。


工具链和临时系统的fakeroot方式在调试、维护、升级的时候也非常有用。比方说,你已经写好一个glibc2.7的脚本,现在要升级glibc 3.0,那么只要直接使用原有binutils pass1 和 gcc static (可能要加上gmp/mpfr)这几个包,就OK了。这样的优点是你调试脚本的时候可能未必能一次完成,如果每次都要从头开始要浪费不少时间。

fakeroot方式是标准的软件包维护方法,debian dpkg rules、redhat rpm spec一直在用的方法,我也只是觉得好才拿过来用。


我当然知道这是标准方法。不然那些软件包是如何产生的呢?不过我的意思是,单纯的fakeroot出来的包,不含有任何附加功能,跟这最类似的是SLACKWARE的TGZ。要是附加上其它功能,就可以变成RPM或则DEB了。要是做一个网站放这些包,就变成YUM/APT了……
回复 支持 反对

使用道具 举报

发表于 2008-6-25 17:08:28 | 显示全部楼层
fakeroot 出来的包再配上个脚本,就能做简单的包管理了,对于 LFS 来说,应该是很不错的做法了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表