LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: 聚焦深空

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

[复制链接]
发表于 2008-6-25 17:54:24 | 显示全部楼层
这个问题难道大家不屑于指正么?

是GNU for GNU's Not Unix
而不是GUN
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 18:07:20 | 显示全部楼层
Post by zhllg;1867374
这个问题难道大家不屑于指正么?

是GNU for GNU's Not Unix
而不是GUN

笔误,笔误,低级错误,已修正,多谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-6-25 18:37:47 | 显示全部楼层
Post by 地球发动机;1867353
工具链和临时系统的fakeroot方式在调试、维护、升级的时候也非常有用。比方说,你已经写好一个glibc2.7的脚本,现在要升级glibc 3.0,那么只要直接使用原有binutils pass1 和 gcc static (可能要加上gmp/mpfr)这几个包,就OK了。这样的优点是你调试脚本的时候可能未必能一次完成,如果每次都要从头开始要浪费不少时间。

用我的脚本,满足你想法的命令如下
  1. #toolchain
  2. /auto.sh toolchain check_mark \
  3.         source_tree \
  4.         fakeroot \
  5.         source_config \
  6.         source_build \
  7.         tarball \
  8.          "ROOTFS=${TOOLS}" \
  9.         install_package \
  10.         mark
  11. /auto.sh toolchain unmark
  12. #cross_system
  13. /auto.sh cross_system check_mark \
  14.         source_tree \
  15.         fakeroot \
  16.         source_config \
  17.         source_build \
  18.         tarball \
  19.         "ROOTFS=${NEW_OS_DIR}/rootfs" \
  20.         install_package \
  21.         mark
  22. /auto.sh cross_system unmark
复制代码

我自己验证时,使用的命令只是没有打包而已。
  1. #toolchain
  2. /auto.sh toolchain check_mark \
  3.          source_tree \
  4.         source_config \
  5.          source_build \
  6.         mark
  7. /auto.sh toolchain unmark
  8. #cross_system
  9. /auto.sh cross_system check_mark \
  10.         source_tree \
  11.         source_config \
  12.         source_build \
  13.         mark
  14. /auto.sh cross_system unmark
复制代码

使用这种格式,中途某个软件包编译失败,自动退出(此时可以修正脚本),
重新执行相同的命令,自动跳过有标记的软件包,从失败的软件包处继续进行。
回复 支持 反对

使用道具 举报

发表于 2008-7-6 17:37:50 | 显示全部楼层
GCC-static部分:经过试验,在正确添加--build --host --target参数之后,可以不必沿用过去的模式来build GCC,无须设置CC_FOR_TARGET。现在的build模式如下:
1.照常config
2. make all-target-libgcc
3. make install-target-libgcc
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-6 20:46:32 | 显示全部楼层
Post by 地球发动机;1871680
GCC-static部分:经过试验,在正确添加--build --host --target参数之后,可以不必沿用过去的模式来build GCC,无须设置CC_FOR_TARGET。现在的build模式如下:
1.照常config
2. make all-target-libgcc
3. make install-target-libgcc

工具链gcc静态编译部分
如果只是编译安装裸编译器
make all-gcc
make install-gcc
是不需要设置CC_FOR_TARGET的;
编译安装libgcc
make all-target-libgcc
make install-target-libgcc
我这里还是需要设置CC_FOR_TARGET=${NEW_OS_TARGET}-gcc,否则make all-target-libgcc过程中会出错,提示找不到${NEW_OS_TARGET}-cc

如果真正交叉编译,设置NEW_OS_HOST=${MACHTYPE},重新安装宿主binutils,使在shell搜索路径中可以找到${NEW_OS_HOST}-ar,AR是不需要设置的,但为了支持伪交叉编译,还是现在设置变量的方式好些。

我的方法,用最小安装干净宿主验证过不止一次,所有参数是在建立工具链过程中逐渐添加的,是错误、除错的结果。
我可以肯定的说,你严格按照我的方式做,这些参数是必须的。
我没有故意参考你以前帖子中的过程,正是为了确定所有必须的步骤,而不受任何人,包括自己的影响。
和你原来的方法类似,正说明那些步骤是必须的。


如果你真的做到你所说的,最好说明一下你宿主的情况,你系统变量定义与我不同的地方,以及其他不同的地方,我们好进一步简化步骤。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-6 21:11:22 | 显示全部楼层
Post by 地球发动机;1871680
GCC-static部分:经过试验,在正确添加--build --host --target参数之后,可以不必沿用过去的模式来build GCC,无须设置CC_FOR_TARGET。现在的build模式如下:
1.照常config
2. make all-target-libgcc
3. make install-target-libgcc

确定一下,你是不是用的干净宿主?
是不是用之前留下来的工具链,升级到gcc-4.3.1?
是不是伪交叉编译?

我只验证过
i486-pc-linux-gnu -> i686-pc-linux-gnu
i486-pc-linux-gnu -> x86_64-unknown-linux-gnu
都是真正的交叉编译。
正如我之前说的,伪交叉编译方式,在真正交叉编译验证之前不可靠。
我的方法,已经用交叉编译方式验证过,所以进行伪交叉编译也没问题。

如果是伪交叉编译,出现你的情况,
可能是宿主在建立工具链之前,已经存在${NEW_OS_TARGET}-cc
make all-target-libgcc 时调用的是宿主的 ${NEW_OS_TARGET}-cc,而我们应该用的是新编译出来的${NEW_OS_TARGET}-gcc
如果真是这样,不会影响使用,但工具链纯度有点问题。
回复 支持 反对

使用道具 举报

发表于 2008-7-7 10:58:47 | 显示全部楼层
从编译过程看,实验中的CC_FOR_TARGET是自动采用了刚编译的xgcc,所用的参数跟本机编译bootstrap时差不多。

因此,纯度上应该没有问题。

可能这仅能用于伪交叉编译也就是--build和--host相同的情况。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-7 13:00:12 | 显示全部楼层
Post by 地球发动机;1871884
从编译过程看,实验中的CC_FOR_TARGET是自动采用了刚编译的xgcc,所用的参数跟本机编译bootstrap时差不多。

因此,纯度上应该没有问题。

可能这仅能用于伪交叉编译也就是--build和--host相同的情况。

我刚刚参考你的意见,用伪交叉编译方式验证,是你说的情况。
看来是gcc-4.3系列开发者对伪交叉编译、交叉编译没有平等对待。
回复 支持 反对

使用道具 举报

发表于 2008-7-10 08:18:49 | 显示全部楼层
让我们解决这个问题。GCC配置脚本的输出中,最后一部分内容非常重要,一般是形如

i686-pc-linux-gnu-cc : pre-installed

这样的形式。对于本机交叉编译即build=host的情况,CC和GCC相应项的输出应该是

i686-pc-linux-gnu-cc : just compiled

如果这里不对,就会出现你所说的问题。请贴出来共同研究一下。不需要Make, configure一下即可
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-10 09:25:06 | 显示全部楼层
伪交叉编译方式,我的机器,不管是宿主还是工具链,都不存在${NEW_OS_TARGET}-cc,但是存在${NEW_OS_TARGET}-c++,不存在just compiled的必要。

PS:我不准备对伪交叉编译方式单独优化:一是自己几乎不使用伪交叉编译方式,二是自己相信给出的方法同样适用伪交叉编译。

PS:一个同时适用交叉编译、伪交叉编译方式,不需要设置CC_FOR_TARGET、CXX_FOR_TARGET,并且比较完美的解决方案是,安装${NEW_OS_TARGET}-gcc之后,手工硬连接一份为${NEW_OS_TARGET}-cc,或者把这种修正合并到相应gcc源码相应Makefile.in。这样可以做到和${NEW_OS_TARGET}-c++对称。
回复 支持 反对

使用道具 举报

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

本版积分规则

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