FreeBSD系统make.conf文件详解

FreeBSD系统make.conf文件详解

make.conf的主要功能

make.conf是 FreeBSD 中 make(1) 的配置文件。如果不了解改变这些配置可能带来的副作用,则不应修改其中的任何配置。

通过修改 make.conf 可以达到下面这些目的:

优化系统:设定系统的处理器类型、编译参数、优化级别。
配置系统的升级服务器以及升级内容:告诉系统去哪里下载kernel和userland的源代码和ports的代码树、去哪里下载ports编译时使用源代码包。
不过,许多时候可能会希望使用另外一些配置文件来达到类似的目的。由于 make.conf 是全局的 FreeBSD make(1) 配置,对其进行不适当的改动,特别是添加优化选项,非常容易导致各种各样的问题,因此一般情况下不需要修改这个文件。

其他一些与 make.conf 起类似作用,但范围受限的 make(1) 配置文件,包括 src.conf(5) 和 ports.conf,关于如何使用这些文件的具体介绍,请参见本文末尾的“参阅”部分。

make.conf的主要文档

make.conf(5)[URL:http://www.freebsd.org/cgi/man.cgi?query=make.conf&sektion=5&format=html]
src.conf(5)[URL:http://www.freebsd.org/cgi/man.cgi?query=src.conf&sektion=5&format=html]
/usr/share/examples/etc/make.conf

make.conf的基本原理

FreeBSD 的 make(1) 在执行联编操作的时候会引用 /usr/share/mk/sys.mk。如果 make(1) 不是以完全 POSIX 模式运行,则后者会引入 /etc/make.conf (或由 make 变量 MAKE_CONF 所定义的其他文件,例如,如果需要在某一次联编过程中临时禁用 make.conf,可以在 make 时指定 MAKE_CONF=/dev/null)。

希望在联编过程中传递给 make 程序本身,或作为环境传递给编译器等其他程序的参数,可以通过 make.conf 来指定。再次强调, make.conf 是一个全局的配置,在增加配置时,其内容会影响 所有 使用 FreeBSD make(1) 的联编过程。添加任何配置一定要慎重。

下面以 vim 举例。使用 ports 套件默认的编译选项编译出来的vim中的gvim是使用gtk1图形库的,但是我很喜欢gtk2,因为gtk2更加的漂亮。为了使用 gtk2,有两个选择:

1.编译的时候手工把这个选项加进去:cd /usr/ports/editor/vim; make WITH_GTK2=yes install clean,但是这样似乎比较麻烦。
2.使用make.conf:直接把WITH_GTK2=yes这句写到make.conf里面,这样系统在编译vim的时候会把这个选项自动地包含进去。

注意:后一种方法中,直接将 WITH_GTK2=yes 加入到 make.conf 将影响所有port的编译过程,这很可能不是希望的结果,因此比较保险的做法是使用下面这样的配置:

.if ${.CURDIR} == “/usr/ports/editors/vim”
WITH_GTK2=yes
.endif

这样,只有在执行 make 的当前目录是 /usr/ports/editors/vim 时,才会定义 WITH_GTK2=yes。

很明显,如此定义 make.conf 十分繁琐,为了解决这个问题,可以通过 Ports 套件安装 ports-mgmt/portconf 并配置 ports.conf。

提示

在FreeBSD系统安装以后的默认设置中,/etc/make.conf这个文件并不存在,你可以自己建立一个,如果系统安装了perl,那么perl会替你建立这个文件,这就是为什么几乎每个人的/etc/make.conf都有一行是关于perl的版本的内容。建立这个文件的命令很简单,因为make.conf本身就是一个纯文本文件,但是,显然你需要root权限来创建或者修改这个文件。

# touch /etc/make.conf

我的make.conf详解:

make.conf的语法非常的简单,其中:#代表注释,在#之后的内容都会被忽略;除注释外,每一行是内容格式如下:一个变量,一个赋值运算符=,一个具体值。

# cpu type
CPUTYPE=athlon64

指定系统的处理器类型,告诉gcc在编译软件的时候针对这个处理器进行优化,从FreeBSD官方论坛的相关讨论来看,这个参数对于提升系统性能比较重要。具体的可以参考/usr/share/examples/etc/make.conf来决定自己的处理器类型。

# ports compilation flag
CFLAGS= -O2 -fno-strict-aliasing -pipe
CXXFLAGS+= -fconserve-space

告诉系统在编译ports的时候使用哪些编译参数,就是优化的级别,推荐使用-O2,不要使用-O3,优化级别越高需要的编译时间越长,并且可能导致某些不可预知的问题。

# shell
MAKE_SHELL=sh

告诉系统在编译过程中使用哪个shell。

# kernel compilation flag
COPTFLAGS= -O2 -pipe

告诉系统编译内核时使用什么优化参数,这个需要单独的指定,并不是使用ports的编译参数,但是编译内核的时候所使用的处理器类型并不需要单独指定。

# kernel config
KERNCONF=MYKERNEL

告诉系统你/sys/amd64/conf目录下面哪个文件是你的kernel配置文件,这样在/usr/src下面直接make buildkernel就可以了,就是说编译内核的时候,不需要手工告诉系统内核的配置文件是哪个。

# install command
INSTALL=install -C

告诉系统安装编译完的软件时使用的安装命令。

# do not build modules with the kernel
NO_MODULES=true

告诉系统编译内核的时候只编译内核的配置文件(就是上面的MYKERNEL)里面包含的东西,这样就不会对配置文件以外的任何东西进行编译了。FreeBSD系统在编译内核的时候,会把配置文件里面的东西以二进制的形式之间编译到生成的内核中,其他的在配置文件里面没有指定的就编译成模块,这一行的作用在于,不编译那些模块,配合ccache可以在1分钟左右完成内核的编译,详细的情况可以看这里http://blog.chinaunix.net/u2/74710/showart_1191786.html。

# avoid compiling profiled libraries
NO_PROFILE=true

告诉系统在编译userland的时候不编译用于性能分析的函数库。

# for update
SUP_UPDATE=true
SUP=/usr/bin/csup
SUPFLAGS=-L 2
SUPHOST=cvsup5.cn.FreeBSD.org
SUPFILE=/usr/share/examples/cvsup/standard-supfile
PORTSSUPFILE=/usr/share/examples/cvsup/ports-supfile
DOCSUPFILE=/usr/share/examples/cvsup/doc-supfile

告诉系统在进入/usr/src目录以后执行make update时升级kernel、userland、ports以及文档系统的代码树,并且指定升级时使用的程序(/usr/bin/csup)、使用的参数(-g -L 2)、使用的服务器(cvsup5.cn.FreeBSD.org)以及升级时分别使用相应的supfile。

# documentation language
DOC_LANG=en_US.ISO8859-1

告诉系统,我在/usr/doc目录下运行make install clean时只生成英文的文档,生成的文档在/usr/share/doc下面,包含FreeBSD的各种文档。

# for textproc/docproj
WITH_JADETEX=yes

编译文档需要安装docproj这个port,并且这个port总是提问题,于是我就直接把答案写在这里了,这样就不用我每次回答了。

# for vim
.if ${.CURDIR} == “/usr/ports/editors/vim”
WITH_GTK2=”yes”
.endif

告诉系统使用gtk2图形库,看上面我举的那个vim的例子。

# for gnome
WITH_GECKO=libxul

告诉系统屏蔽掉firefox,很多人都喜欢firefox,我一直使用gnome的epiphany,不喜欢firefox,但是epiphany在编译的时候需要一个下层的渲染引擎,默认是使用和firefox一样的引擎,所以默认会安装firefox,通过这个选项可以改变这个倚赖关系。

# set server for distfiles
#MASTER_SITE_OVERRIDE?=http://ports.hshh.org/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?=ftp://ftp8.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/

告诉系统去哪里下载ports里面软件的源代码,这个不用多说了,语法也很简单,http、ftp代表的是协议或者说是服务类型,需要注意的不是每个http或者ftp都使用相同的目录结构。你可以去FreeBSD的handbook上找一下有那些服务器,我比较喜欢台湾的ftp8,就是在教育网那个,因为我也在教育网上。我虽然写了两个,但是屏蔽掉了的一个,如果ftp8宕机了,我就注释掉ftp8,用上面的那个,如果不写这个的话,编译port的时候会从prot的Makefile里面指定的下载地址下载,可能会比较慢,当然也可能会比较快(这个可能性比较小)。

# for ccache
.if (!empty(.CURDIR:M/usr/src*) || !empty(.CURDIR:M/usr/obj*)) && !defined(NOCCACHE)
CC=/usr/local/libexec/ccache/world-cc
CXX=/usr/local/libexec/ccache/world-c++
.endif

这个是针对于ccache的设置,如果要使用ccache必须添加这个。ccache能大幅度的缩短编译时间,所以它能能帮你省很多时间,能帮全人类省很多电。我个人觉得应该给ccache的作者颁发一个“诺贝尔绿色和平奖”,虽然我不知道有没有这个奖。

我的make.conf的全部内容:

################################################################################
# cpu type
CPUTYPE=athlon64

# ports compilation flag
CFLAGS=-O2 -fno-strict-aliasing -pipe
CXXFLAGS+=-fconserve-space

# shell
MAKE_SHELL=sh

# kernle compilation flag
COPTFLAGS=-O2 -pipe

# kernel config
KERNCONF=MYKERNEL

# install command
INSTALL=install -C

# do not build modules with the kernel
NO_MODULES=true

# avoid compiling profiled libraries
NO_PROFILE=true

################################################################################
# for update
SUP_UPDATE=true
SUP=/usr/bin/csup
SUPFLAGS=-L 2
SUPHOST=cvsup5.cn.FreeBSD.org
SUPFILE=/usr/share/examples/cvsup/standard-supfile
PORTSSUPFILE=/usr/share/examples/cvsup/ports-supfile
DOCSUPFILE=/usr/share/examples/cvsup/doc-supfile

# documentation language
DOC_LANG=en_US.ISO8859-1

# for textproc/docproj
WITH_JADETEX=yes

################################################################################
# for vim
.if ${.CURDIR} == “/usr/ports/editors/vim”
WITH_GTK2=”yes”
.endif

# for gnome
WITH_GECKO=libxul

################################################################################
# set server for distfiles
#MASTER_SITE_OVERRIDE?=http://ports.hshh.org/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?=ftp://ftp8.tw.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/

################################################################################
# for ccache
.if (!empty(.CURDIR:M/usr/src*) || !empty(.CURDIR:M/usr/obj*)) && !defined(NOCCACHE)
CC=/usr/local/libexec/ccache/world-cc
CXX=/usr/local/libexec/ccache/world-c++
.endif

################################################################################
# added by use.perl 2009-05-05 08:38:03
PERL_VERSION=5.8.9

后记:

现在,你可以:

进入/usr/src目录使用make update升级系统的kernel、userland、doc、ports树的源代码了。
进入/usr/doc目录使用make install clean来编译安装最新的文档了。

欢迎补充。

原文链接:http://wiki.freebsdchina.org/doc/m/make.conf_usage

Ports的make参数说明

FreeBSD::ports::make参数说明,哈哈,很多地方都用到哦

make fetch # 只抓取软件包
make extract # 只解开软件包
make patch # 解开软件包并补上官方的patch
make install # 安装一个新port
make clean # 清除中间生成的文件
make package # 将安装完的软件做成package
make distclean # 全部删除,包括/usr/ports/distfiles下的源码包
make all-depends-list  # 显示所有相关的依赖
make pretty-print-build-depends-list  # 显示编译期间所需要的依赖
make pretty-print-run-depends-list  # 显示执行时需要的依赖
make deinstall # 删除软件
make deinstall-depends # 连同依赖一起删除
pkg_version -c # 列出所有可升级的ports
make PREFIX=/usr/local/XXX # 指定一个安装路径
make showconfig make rmconfig
make search key=XXXX # 查找ports
make index # 更新index
make fetchindex # 更新index
make readmes # 网页的方式察看

原文链接:http://ray.bsdart.org/archives/166.raymond