用户工具

站点工具


doc:g:gccbuildports

改用 lang/gcc 来编译 Ports

作者:zeissoctopus

我为怎什么改用 lang/gcc 来编译 Ports 呢?

简单答案是:为了在 FreeBSD 9.x 使用 GNUStep ports。

原因详解:

  1. FreeBSD 9.x base 中的 gcc 4.2.1 已删除了 objective c 支援
  2. Ports 中的 devel/gnustep 的 Mk/bsd.gnustep.mk 仍然倚赖 gcc,并未支援 FreeBSD 9.x base clang。
  3. 因此 ports 的 lang/gnustep-base 在 FreeBSD 9.x 或 FreeBSD 10.x 目前被设为 .ignore,即不能编译。

对应方法:

  1. 修改 /usr/ports/Mk/bsd.gnustep.mk 及所有 GNUstep 有关 ports,使它们可以用 base clang 来编译 objective C。
  2. 改用 gcc 作为 ports 的编译器,使 Ports 中的 GNUstep 在 FreeBSD 9.0 里重生。

我的选择:

  • 因为我没有足够技能处理 /usr/ports/Mk/bsd.gnustep.mk、其他 GNUstep Ports 之 Makefile 修改,所以我选择改用 lang/gcc 作为 Ports 的编译器。

参考资料:

  • 本文主要依从 FreeBSD Handbook 步骤完成 ,再加上我个人使用时遇到问题和心得。

使用 ports/lang/gcc 注意事项

  1. 用 make world 昇级 base 的话,不要使用 ports/lang/gcc。
  2. 在 ports 中不要交差使用 base 的 gcc 4.2.1 和 ports/lang/gcc
  3. 若跨代升级 ports/lang/gcc,例如:gcc42 → gcc46,必需用新的 gcc46 重新编译一次 ports/devel/libtool

动手安装 GCC

第 0 步:开始之前

为了避免在 ports 中交差使用 base gcc 4.2.1 和 ports/lang/gcc,我决定重新最小安装 FreeBSD,由头开始制定:

  1. 最小安装 FreeBSD 9.0-RC3
  2. 更新 ports tree

第 1 步:安装 ports-mgmt/portmaster

安装 portmaster 是为了方便稍后更新工作

% cd /usr/ports/ports-mgmt/portmaster
% su root
# make install
# make clean
# exit

第 2 步:安装 devel/binutils

% cd /usr/ports/devel/binutils
% su root
# make install
# make clean
# exit

安装 binutils 时的选项

WITH_NLStrue

第 3 步:安装 lang/gcc

% cd /usr/ports/lang/gcc
% su root
# make install
# make clean
# exit

安装 gcc 时的选项

WITH_JAVAtrue

第 4 步:配置 /etc/make.conf

加入以下数行,当编译 Ports 时便用 lang/gcc,当 make world 时用回 base 的 gcc 4.2.1

.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc46)
CC=gcc46
CXX=g++46
CPP=cpp46
.endif

至 2011 年 12 月 19 日,lang/gcc 版本是 GCC 4.6.2

以下是我的 /etc/make.conf

make.conf
#===============================================================================
# Using GCC4.6 from port
#===============================================================================
.if !empty(.CURDIR:M/usr/ports/*) && exists(/usr/local/bin/gcc46)
CC=gcc46
CXX=g++46
CPP=cpp46
CFLAGS+=-mssse3
.endif
 
#===============================================================================
# user land Dtrace
#===============================================================================
STRIP=
CFLAGS+=-fno-omit-frame-pointer
WITH_CTF=1
 
#===============================================================================
# build world options
#===============================================================================
NO_PROFILE=yes
 
#===============================================================================
# ports build options
#===============================================================================
WRKDIRPREFIX=/usr/obj
 
#===============================================================================
# ports make config options
#===============================================================================
WITHOUT_NOUVEAU=yes
WITH_CUPS=yes
WITH_OPENSSL_PORT=yes
 
# added by use.perl 2011-12-14 16:31:21
PERL_VERSION=5.12.4

第 5 步:配设 /etc/libmap.conf

引导链接器指向 lang/gcc 需要产生和配设 /etc/libmap.conf

我的 /etc/libmap.conf 如下:

libmap.conf
libgcc_s.so.1       gcc46/libgcc_s.so.1
libgfortran.so.3    gcc46/libgfortran.so.3
libgomp.so.1       gcc46/libgomp.so.1
libmudflap.so.0    gcc46/libmudflap.so.0
libmudflapth.so.0 gcc46/libmudflapth.so.0
libobjc.so.3         gcc46/libobjc.so.3
libquadmath.so.0 gcc46/libquadmath.so.0
libssp.so.0          gcc46/libssp.so.0
libstdc++.so.6     gcc46/libstdc++.so.6

第 6 步:鸡先还是蛋先的问题?

由第一步安装 devel/binutils 和 lang/gcc (安装过程中,会一并安装其他软件如 libiconv, getext, perl …. 等等), 它们都是由 base gcc 4.2.1 来编译的。

我的愚蠢想法是:需要用新的 lang/gcc 重头编译所有用 base gcc 4.2.1 编译的东西,才能把 ports 中倚赖 base gcc 4.2.1 的东西撵走!

於是,我用 portmaster 从头把所有已安装的软件,包括 lang/gcc 自己,用新安装的 lang/gcc 再编译一次,确保所有 Ports 都是倚赖 lang/gcc 来编译的。

第 7 步:完成

经过以上 6 个步骤,所有 Ports 软体皆是由 lang/gcc 来编译了。现在可以正式用 ports 安装自己需要的 GNUstep 了。

/data/vhosts/wiki-data/pages/doc/g/gccbuildports.txt · 最后更改: 2011/12/18 05:14 由 zeissoctopus