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