The source code for sendmail is available via anonymous FTP from ftp.sendmail.org, where it is stored in the pub/sendmail directory. sendmail is updated constantly. The following examples are based on sendmail 8.11.3. Remember that things will change for future releases. Always read the README files and installation documents that come with new software before beginning an installation.
To compile the sendmail program, download the compressed tar file as a binary file, and then uncompress and extract it with the tar command, shown below:
$ ftp ftp.sendmail.org Connected to ftp.sendmail.org. 220 pub2.pa.vix.com FTP server ready. Name (ftp.sendmail.org:craig): anonymous 331 Guest login ok, send your e-mail address as password. Password: 230 Guest login ok, access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd pub/sendmail ftp> get sendmail.8.11.3.tar.gz local: sendmail.8.11.3.tar.gz remote: sendmail.8.11.3.tar.gz 200 PORT command successful. 150 Opening BINARY mode data connection for sendmail.8.11.3.tar.gz (1347756 bytes). 226 Transfer complete. 1347756 bytes received in 18.68 Seconds (72.42 Kbytes/sec) ftp> quit 221-You have transferred 1347756 bytes in 1 files. 221-Thank you for using the FTP service on pub2.pa.vix.com. 221 Goodbye. $ cd /usr/local/src $ tar -zxvf /home/craig/sendmail.8.11.3.tar.gz
Next, change to the sendmail-8.11.3 directory created by the tar file, and use the Build script to compile the new sendmail program, as shown below:
$ cd sendmail-8.11.3 $ ./Build Making all in: /usr/local/src/sendmail-8.11.3/libsmutil Configuration: pfx=, os=Linux, rel=2.2.10, rbase=2, rroot=2.2, arch=i586, sfx=, variant=optimized Using M4=/usr/bin/m4 Creating ../obj.Linux.2.2.10.i586/libsmutil using ../devtools/OS/Linux Making dependencies in ../obj.Linux.2.2.10.i586/libsmutil make[1]: Entering directory `/usr/local/src/sendmail-8.11.3/obj.Linux.2.2.10.i586/libsmutil' cc -M -I. -I../../sendmail -I../../include -DNEWDB -DNOT_SENDMAIL debug.c errstring.c lockfile.c safefile.c snprintf.c strl.c >> Makefile make[1]: Leaving directory `/usr/local/src/sendmail-8.11.3/obj.Linux.2.2.10.i586/libsmutil' Making in ../obj.Linux.2.2.10.i586/libsmutil make[1]: Entering directory `/usr/local/src/sendmail-8.11.3/obj.Linux.2.2.10.i586/libsmutil' cc -O -I. -I../../sendmail -I../../include -DNEWDB -DNOT_SENDMAIL -c debug.c -o debug.o cc -O -I. -I../../sendmail -I../../include -DNEWDB -DNOT_SENDMAIL -c errstring.c -o errstring.o ... Many, many, many lines deleted... cc -O -I. -I../../sendmail -I../../include -DNEWDB -DNOT_SENDMAIL -c vacation.c -o vacation.o cc -o vacation vacation.o ../libsmdb/libsmdb.a ../libsmutil/libsmutil.a -ldb -lresolv -lcrypt -lnsl -ldl groff -Tascii -man vacation.1 > vacation.0 || cp vacation.0.dist vacation.0 make[1]: Leaving directory `/usr/local/src/sendmail-8.11.3/obj.Linux.2.2.10.i586/vacation'
Build detects the architecture of the system and builds the correct Makefile for your system. It then compiles sendmail using the newly created Makefile.
According to the documentation, running Build is all you need to do on most systems to compile sendmail. It works on Red Hat Linux and Solaris 8 systems. However, there are no guarantees. Your system may use nonstandard directories or lack certain libraries. You may need to provide compiler flags that are customized for your system.
If you have experience with compiling sendmail, you may be tempted to look for the compiler options in the Makefile in the sendmail distribution's source code directory. You may even remember setting compiler options in the Makefile at some time in the past, but that has changed. Now, compiler options are set in the files located in the devtools directory of the sendmail source code distribution.
The default compiler options are normally set in an operating system-specific file in the devtools/OS directory and changed in files you create specially for your server in the devtools/Site directory. The files in the devtools/OS directory are identified by operating system name; for example, the configuration file for Solaris 8 is named SunOS5.8. If your Solaris 8 system varies from the norm, create your own file in devtools/Site named site.SunOS5.8.m4 that contains the corrected setting. Additionally, you can create a file named site.config.m4 in the devtools/Site directory if the compiler options you wish to set relate more to the peculiarities of your site than they do to corrections of operating system settings. Build looks for and uses files with either of these names.
As the .m4 file extension in these filenames implies, the commands that are used to define compiler options are m4 macros, not simple compiler options. Table E-1 lists the m4 commands that are used with sendmail 8.11.3 to control the compile process.
Command |
Purpose |
---|---|
confBEFORE |
Identifies files that must be created before the compile. |
confBLDVARIANT |
Requests OPTIMIZED, DEBUG, or PURIFY build variants. |
confBUILDBIN |
The path of the build support binaries. |
confCC |
The name of the C compiler. |
confCCOPTS |
Options to pass to the compiler. |
confCOPY |
The name of a program that copies files. |
confDEPEND_TYPE |
Name of a file in devtools/M4/depend that defines how to build dependencies. |
confDEPLIBS |
Dependent libraries for shared objects. |
confEBINDIR |
The path of the program executed by other programs. |
confENVDEF |
The -D flags passed to the compiler. |
confFORCE_RMAIL |
Forces installation of rmail. |
confHFDIR |
Path of the sendmail helpfile. |
confHFFILE |
Name of the helpfile. |
confINCDIRS |
The -I flags passed to the compiler. |
confINCGRP |
The group ID used for include files. |
confINCMODE |
The file permissions used for include files. |
confINCOWN |
The user ID used for include files. |
confINCLUDEDIR |
The path where include files are installed. |
confINSTALL |
The install program. |
confINSTALL_RAWMAN |
Install the unformatted manual pages. |
confLDOPTS |
Options for the linker. |
confLIBDIR |
Path to the install library files. |
confLIBDIRS |
The -L flags for the linker. |
confLIBGRP |
The group ID used for libraries. |
confLIBMODE |
The file permissions used for libraries. |
confLIBOWN |
The user ID used for libraries. |
confLIBS |
The -l flags passed to linker. |
confLIBSEARCH |
Names of the libraries searched during linking. |
confLIBSEARCHPATH |
Path of the libraries searched during linking. |
confLINKS |
Names of logical links to sendmail, e.g., newaliases. |
confLN |
The command used to create logical links. |
confMAN1 |
The path of man1 files. |
confMAN1EXT |
The filename extension used for man1 files. |
confMAN1SRC |
The source for man1 pages. |
confMAN3 |
The path of man3 files. |
confMAN3EXT |
The filename extension used for man3 files. |
confMAN3SRC |
The source for man3 pages. |
confMAN4 |
The path of man4 files. |
confMAN4EXT |
The filename extension for man4 files. |
confMAN4SRC |
The source for man4 pages. |
confMAN5 |
The path of man5 files. |
confMAN5EXT |
The filename extension used for man5 files. |
confMAN5SRC |
The source for man5 pages. |
confMAN8 |
The path of man8 files. |
confMAN8EXT |
The filename extension used for man8 files. |
confMAN8SRC |
The source for man8 pages. |
confMANDOC |
The macros used to format manpages. |
confMANGRP |
The group ID used for manpage files. |
confMANMODE |
The file permission for manpages. |
confMANOWN |
The user ID used for manpage files. |
confMANROOT |
The root path of the various directories that contain formatted manpages. |
confMANROOTMAN |
The root path of the various directories that contain unformatted manpages. |
confMAPDEF |
Identifies the types of database support that should be compiled into sendmail. |
confMBINDIR |
The path in which the sendmail program is installed. |
confNO_HELPFILE_INSTALL |
If defined, no helpfile is installed. |
confNO_MAN_BUILD |
If defined, manpages are not created. |
confNO_MAN_INSTALL |
If defined, manpages are not installed. |
confNO_STATISTICS_INSTALL |
If defined, no statistics file is installed. |
confNROFF |
Identifies the command used to format manpages. |
confOBJADD |
Identifies objects that should be linked in to sendmail. |
confOPTIMIZE |
Flags passed to the compiler as ${O}. |
confRANLIB |
The path to the ranlib program. |
confRANLIBOPTS |
Options passed to ranlib. |
confSBINDIR |
The path of the directory in which commands such as makemap are stored. |
confSBINGRP |
The group ID used for setuid binaries. |
confSBINMODE |
The file permissions for setuid binaries. |
confSBINOWN |
The user ID used for setuid binaries. |
confSHAREDLIB_EXT |
The filename extension for shared libraries. |
confSHAREDLIB_SUFFIX |
The suffix used for shared objects. |
confSHAREDLIBDIR |
The path of the directory in which shared libraries are installed. |
confSHELL |
The pathname of the shell used inside make. |
confSMOBJADD |
Objects that should be linked in to sendmail. |
confSMSRCADD |
The C source files for the objects identified by confSMOBJADD. |
confSMSRCDIR |
The directory that contains the sendmail source code. |
confSRCADD |
The C source files for the objects identified by confOBJADD. |
confSRCDIR |
The root path of the source directories. |
confSONAME |
Linker flag for recording the shared object name. |
confSTDIO_TYPE |
Identifies the buffered file implementation used, i.e., portable or torek. |
confSTDIR |
The path where the statistics file is stored. |
confSTFILE |
The name of the statistics file. |
confSTRIP |
Identifies the program used to strip executables. |
confSTRIPOPTS |
Options passed to the strip program. |
confUBINDIR |
The path for user-executable programs. |
confUBINGRP |
The group ID used for user-executable binaries. |
confUBINMODE |
The file permissions used for user-executable binaries. |
confUBINOWN |
The user ID used for user-executable binaries. |
Once sendmail compiles, it is installed by using the Build command with the install option, as shown here:
# ./Build install
Making all in:
/usr/local/src/sendmail-8.11.3/libsmutil
Configuration: pfx=, os=Linux, rel=2.2.10, rbase=2, rroot=2.2,
arch=i586, sfx=, variant=optimized
Making in ../obj.Linux.2.2.10.i586/libsmutil
make[1]: Entering directory
`/usr/local/src/sendmail-8.11.3/obj.Linux.2.2.10.i586/libsmutil'
... Many, many, many lines deleted...
Making in ../obj.Linux.2.2.10.i586/vacation
make[1]: Entering directory
`/usr/local/src/sendmail-8.11.3/obj.Linux.2.2.10.i586/vacation'
install -c -o bin -g bin -m 555 vacation /usr/bin
install -c -o bin -g bin -m 444 vacation.0 /usr/man/man1/vacation.1
make[1]: Leaving directory
`/usr/local/src/sendmail-8.11.3/obj.Linux.2.2.10.i586/vacation'
The Build command installs the manpages, the executables, the help file, and the status file in the correct directories for your system.
sendmail is now ready to run. The next section describes the syntax of the sendmail command.