22.2. 编译和优化

Sendmail 的构建脚本默认使用一个站点配置文件,该文件对应于您的操作系统类型,以获取有关系统安装和各种编译值的定义信息。此文件位于名为devtools/OS的子目录中,如果您运行的是 Linux 系统,则该文件将被命名为Linux。我们将重建此站点配置文件以适应我们的 Linux 系统安装,并将其放在 Sendmail 源代码分发的默认devtools/OS子目录中,因为 Build 脚本将在 Sendmail 的编译期间在此目录中查找默认的站点配置文件。

移动到新的 Sendmail 目录,编辑 Linux 文件,videvtools/OS/Linux,并删除所有预定义的行,然后在此文件中添加以下行
         define(`confENVDEF', `-DPICKY_QF_NAME_CHECK -DXDEBUG=0')
         define(`confCC', `egcs')
         define(`confOPTIMIZE', `-O9 -funroll-loops -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions')
         define(`confLIBS', `-lnsl')
         define(`confLDOPTS', `-s')
         define(`confMANROOT', `/usr/man/man')
         define(`confMANOWN', `root')
         define(`confMANGRP', `root')
         define(`confMANMODE', `644')
         define(`confMAN1SRC', `1')
         define(`confMAN5SRC', `5')
         define(`confMAN8SRC', `8')
         define(`confDEPEND_TYPE', `CC-M')
         define(`confNO_HELPFILE_INSTALL)
         define(`confSBINGRP', `root')
         define(`confSBINMODE', `6755')
         define(`confUBINOWN', `root')
         define(`confUBINGRP', `root')
         define(`confEBINDIR', `/usr/sbin')
         

这告诉 Linux 文件针对此特定配置设置自身,配置为

define(`confENVDEF', `-DPICKY_QF_NAME_CHECK -DXDEBUG=0')

此宏选项主要用于指定应特别包含或排除的代码。使用-DPICKY_QF_NAME_CHECK定义后,如果qf文件的名称格式不正确,Sendmail 将记录错误,并将qf文件重命名为Qf文件。-DXDEBUG=0参数禁用编译期间的额外内部检查步骤。

define(`confCC', `egcs')

此宏选项定义用于编译 Sendmail 的 C 编译器。在我们的例子中,我们使用 egcs C 编译器以获得更好的优化。

define(`confOPTIMIZE', `-O9 -funroll-loops -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions')

此宏选项定义传递给 CC 的标志,用于与我们特定的 CPU 架构相关的优化。

define(`confLIBS', `-lnsl')

此宏选项定义传递给 ld 的 -l 标志。

define(`confLDOPTS', `-s')

此宏选项定义传递给 ld 的链接器选项。

define(`confMANROOT', `/usr/man/man')

此宏选项定义安装 Sendmail man 手册页的位置。

define(`confMANOWN', `root')

此宏选项定义所有 Sendmail 已安装 man 手册页的所有者。

define(`confMANGRP', `root')

此宏选项定义所有 Sendmail 已安装 man 手册页的组。

define(`confMANMODE', `644')

此宏选项定义所有 Sendmail 已安装 man 手册页的模式。

define(`confMAN1SRC', `1')

此宏选项定义安装在 confMAN1 中的 man 手册页的源。

define(`confMAN5SRC', `5')

此宏选项定义安装在 confMAN5 中的 man 手册页的源。

define(`confMAN8SRC', `8')

此宏选项定义安装在 confMAN8 中的 man 手册页的源。

define(`confDEPEND_TYPE', `CC-M')

此宏选项指定如何使用 Sendmail 构建依赖项。

define(`confNO_HELPFILE_INSTALL')

此宏选项指定默认情况下不安装 Sendmail 帮助文件。一些经验丰富的管理员建议这样做,以获得更好的安全性。

define(`confSBINGRP', `root')

此宏选项定义所有 Sendmail setuid 二进制文件的组。

define(`confSBINMODE', `6755')

此宏选项定义所有 Sendmail setuid 二进制文件的模式。

define(`confUBINOWN', `root')

此宏选项定义 Sendmail 二进制文件的所有者。

define(`confUBINGRP', `root')

此宏选项定义 Sendmail 二进制文件的组。

define(`confEBINDIR', `/usr/sbin')

此宏选项定义从其他二进制文件执行的二进制文件的安装位置。在 Red Hat Linux 上,路径必须设置为/usr/sbin目录。

现在我们必须在服务器中编译和安装 Sendmail
         [root@deep ]/sendmail-8.10.1# cd sendmail
         [root@deep ]/sendmail# sh Build
         [root@deep ]/sendmail# sh Build install
         [root@deep ]/sendmail# cd ..
         [root@deep ]/sendmail-8.10.1# cd mailstats
         [root@deep ]/mailstats# sh Build install
         [root@deep ]/mailstats# cd ..
         [root@deep ]/sendmail-8.10.1# cd smrsh
         [root@deep ]/smrsh# sh Build install
         [root@deep ]/smrsh# cd ..
         [root@deep ]/sendmail-8.10.1# cd makemap (1) 
         [root@deep ]/makemap# sh Build install   (2) 
         [root@deep ]/makemap# cd ..
         [root@deep ]/sendmail-8.10.1# cd praliases (3)
         [root@deep ]/praliases# sh Build install (4)
         [root@deep ]/praliases# cd ..
         [root@deep ]/sendmail-8.10.1# ln -fs /usr/sbin/sendmail /usr/lib/sendmail
         [root@deep ]/sendmail-8.10.1# chmod 511 /usr/sbin/smrsh
         [root@deep ]/sendmail-8.10.1# install -d -m 755 /var/spool/mqueue
         [root@deep ]/sendmail-8.10.1# chown root.mail /var/spool/mqueue
         [root@deep ]/sendmail-8.10.1# mkdir /etc/smrsh
         

(1)
仅邮件枢纽配置需要
(2)
仅邮件枢纽配置需要
(3)
仅邮件枢纽配置需要
(4)
仅邮件枢纽配置需要

Note: 程序 makemappraliases 只能安装在中央邮件枢纽服务器上。makemap 允许您创建数据库映射,例如/etc/mail/aliases.db/etc/mail/access.db文件,用于 Sendmail。praliases 显示系统邮件别名,即/etc/mail/aliases 文件的内容。由于最好只有一个地方(例如我们的中央邮件枢纽)来处理和管理我们网络中的所有db文件,因此没有必要在网络中的其他主机上使用 makemap 和 praliases 程序并构建db文件。