在Microsoft Windows上编译Apache
在你开始编译Apache之前有许多重要问题需要注意。开始之前请先看看在Microsoft Windows上使用Apache 。
系统要求
编译Apache需要正确安装以下环境:
磁盘空间
确保至少有50MB空闲磁盘空间可用。安装以后Apache使用大约10MB磁盘空间,再加上会快速增长的日志和缓存文件需要的空间。 实际需要的空间大小会在相当大程度上取决于你选择的配置以及使用的第三方模块和库。
Microsoft Visual C++ 5.0 或更高版本
可以使用命令行工具,也可以在Visual Studio集成开发环境内编译Apache。使用命令行工具要求环境变量中包含
PATH
,INCLUDE
,LIB
和其他一些变量,这些环境变量可以用vcvars32
批处理文件来设置:"c:\Program Files\DevStudio\VC\Bin\vcvars32.bat"
Windows Platform SDK
Visual C++ 5.0 编译需要一套新版的Microsoft Windows Platform SDK来允许Apache的某些特性。 对于命令行编译,用
setenv
批处理文件来设置环境变量:"c:\Program Files\Platform SDK\setenv.bat"
随Visual C++ 6.0 及以后版本发布的Platform SDK文件足以满足要求,所以新版本的用户可以略过这个要求。
注意,需要新版的Windows Platform SDK来使得Apache支持的全部mod_isapi
特性可用。没有新版SDK的话,在 MSVC++ 5.0 下编译Apache会出现某些mod_isapi
特性将被禁止的警告。在http://msdn.microsoft.com/downloads/sdks/platform/platform.asp可以找到新版的Microsoft Winodws Platform SDK。awk工具(awk, gawk或类似软件)
为了在编译系统内安装Apache ,用
注意Developer Studio集成开发环境只能在Tools - Options菜单中的Directories页上列出的可执行文件搜索路径列表中查找awk.exe
工具修改了几个文件。选择awk是因为它很小,易于下载(与Perl或者WSH/VB相比),而且能够完成生成文件的任务。Brian Kernighan的http://cm.bell-labs.com/cm/cs/who/bwk/站点有一个编译好的本地Win32代码版本,这个文件http://cm.bell-labs.com/cm/cs/who/bwk/awk95.exe你必须将它名字保存为awk.exe
而不是awk95.exe
。awk.exe
(对于Developer Studio 7.0 是在the Projects - VC++ Directories 面板)。 把awk.exe
的路径加入到列表中,并按要求加入到系统PATH
环境变量里。 如果你用的是Cygwin (http://www.cygwin.com/)需要注意,awk工具的文件名是gawk.exe
而文件awk.exe
实际上是gawk.exe
的一个符号连接。 而Windows命令行解释程序不认识符号连接,因此编译二进制安装文件会失败。可行的变通办法是从cygwin安装目录删除文件awk.exe
并把gawk.exe
改名为awk.exe
。[可选] OpenSSL库(因为
mod_ssl
和ab.exe
用到ssl支持)警告:在整个世界范围使用和发布高强度密码体系与专利知识产权都有相当大的限制和严格的禁令。OpenSSL包括了在美国及其他国家和地区受到出口条例、国内法律以及受专利保护的知识产权所限制的高强度密码体系。对于OpenSSL项目提供的代码,不管是Apache软件基金会还是OpenSSL项目都不能提供关于拥有、使用和发布该代码的法律建议。向你自己的法律顾问咨询,你需要为你自己的行为负责。
为了编译
mod_ssl
或abs项目(ab.exe
用到SSL支持),OpenSSL必须安装到srclib
目录下名为openssl
的子目录中,openSSL可以从http://www.openssl.org/source/获得。要是准备既编译release
版本又编译debug
版本,而且要禁止 0.9.7 版中受专利保护的特性,你应该使用下列编译命令:perl Configure VC-WIN32
perl util\mkfiles.pl >MINFO
perl util\mk1mf.pl dll no-asm no-mdc2 no-rc5 no-idea VC-WIN32 >makefile
perl util\mk1mf.pl dll debug no-asm no-mdc2 no-rc5 no-idea VC-WIN32 >makefile.dbg
perl util\mkdef.pl 32 libeay no-asm no-mdc2 no-rc5 no-idea >ms\libeay32.def
perl util\mkdef.pl 32 ssleay no-asm no-mdc2 no-rc5 no-idea >ms\ssleay32.def
nmake
nmake -f makefile.dbg[可选] zlib源码 (用于
mod_deflate
)Zlib必须安装到
srclib
目录下的zlib
子目录,但是你不需要去编译那些源码。编译系统会直接把压缩源码编译到mod_deflate
模块中去。 Zlib可以从http://www.gzip.org/zlib/获得 --mod_deflate
已经经过验证可以使用版本 1.1.4 正确编译。
命令行编译
首先,将Apache源码包解压到合适的目录。打开一个命令提示符窗口并用cd
切换到那个目录。
主要的Apache make文件命令都包含在文件Makefile.win
中。要在Windows NT上编译Apache ,只需要简单地使用下列命令之一就可以编译release
或debug
版本,分别是:
nmake /f Makefile.win _apacher nmake /f Makefile.win _apached
两条命令都可以编译Apache 。后者会在编译结果文件中包含调试信息,使发现bugs和跟踪问题更容易。
Developer Studio集成开发环境的工作区编译
Apache也能够用VC++的Visual Studio集成开发环境编译。为了简化过程,提供了一个Visual Studio工作区文件:Apache.dsw
。 它阐述了完整的Apache二进制发行版需要的全部.dsp
项目列表。 它包含了项目之间的依存关系来保证编译按合适的顺序进行。
打开 Apache.dsw
工作区文件,选择 InstallBin
(根据需要选择编译Release
或者Debug
版本) 为活动项目。InstallBin
会引发编译相关的项目并调用 Makefile.win
移动编译后的可执行文件和动态链接库。你可以改变InstallBin
项目的设置来定制 INSTDIR=
选项,修改设置中General页里面的Build Command line条目。INSTDIR
的缺省值是 /Apache2
目录。如果你只是想要测试编译(不安装),就用 BuildBin
项目代替。
.dsp
项目文件使用Visual C++ 6.0格式发行。Visual C++ 5.0 (97)也能识别这种格式。而Visual C++ 7.0 (.net)必须把Apache.dsw
和.dsp
文件转换成Apache.sln
和.msproj
文件, 如果有任何一个.dsp
源文件改变了,必须重新转换相应的.msproj
文件! 这很容易,只需要在VC++ 7.0 集成开发环境中重新打开 Apache.dsw
文件。
Visual C++ 7.0 (.net)的用户还应该使用Build 菜单下的Configuration Manager对话框来不选中模块abs ,mod_ssl
和mod_deflate
, 对编译Debug
和Release
版本都是。 仅当srclib
目录下至少存在openssl
或者zlib
子目录二者之一, 才能调用nmake
或者明白地使用BinBuild
目标直接从集成开发环境来编译这几个模块。
导出的那些.mak
文件造成很大的争议,但对于 Visual C++ 5.0 的用户它们是编译mod_ssl
、abs(带SSL支持的ab)和mod_deflate
是必需的。 VC++ 7.0 (.net)的用户也能从中受益,用nmake
编译比用 binenv
要快。 从VC++ 5.0 或 6.0 集成开发环境编译所有项目,再使用Project菜单 - Export导出所有make文件。 为了创建全部自动产生的动态目标你必须首先编译项目,以便互相之间的依存关系可以被正确解析。运行下面命令修正路径使之能编译到任何位置:
perl srclib\apr\build\fixwin32mak.pl
你必须在httpd
源码树的顶层目录输入这个命令。 当前目录及其子目录下所有的.mak
和 .dep
项目文件都将被改正,并且时间戳被调节到与.dsp
一致。
如果你贡献修正项目文件的补丁,我们必须以Visual Studio 6.0 格式来确认项目文件。 改动应该简单而且只带有最少的编译和连接标记以便能够被从VC++ 5.0 到 7.0 的所有环境识别。
项目组件
Apache.dsw
工作区文件和makefile.win
nmake
脚本都是以下列顺序编译Apache服务器的.dsp
项目文件:
srclib\apr\apr.dsp
srclib\apr\libapr.dsp
srclib\apr-util\uri\gen_uri_delims.dsp
srclib\apr-util\xml\expat\lib\xml.dsp
srclib\apr-util\aprutil.dsp
srclib\apr-util\libaprutil.dsp
srclib\pcre\dftables.dsp
srclib\pcre\pcre.dsp
srclib\pcre\pcreposix.dsp
server\gen_test_char.dsp
libhttpd.dsp
Apache.dsp
此外,modules\
子目录树包含了大多数模块的项目文件。
support\
子目录包含了一些附加程序的项目文件,它们运行时不是Apache的一部分, 但是管理员要使用它们来测试Apache和维护密码与日志文件。 Windows平台特有的支持项目在support\win32\
目录下。
support\ab.dsp
support\htdigest.dsp
support\htpasswd.dsp
support\logresolve.dsp
support\rotatelogs.dsp
support\win32\ApacheMonitor.dsp
support\win32\wintty.dsp
一旦编译了Apache,它需要被安装在服务器根目录,缺省是在同一个盘符下的\Apache2
目录。
要自动编译和安装所有文件到指定的目录dir ,使用下列nmake
命令之一:
nmake /f Makefile.win installr INSTDIR=dir nmake /f Makefile.win installd INSTDIR=dir
INSTDIR
的dir参数给出了安装目录;如果要安装到\Apache2
目录可以省略。
安装结果如下列:
dir\bin\Apache.exe
- Apache可执行文件dir\bin\ApacheMonitor.exe
- 服务监视器托盘图表工具dir\bin\htdigest.exe
- 摘要授权密码文件工具(Digest auth password file utility)dir\bin\htdbm.exe
- SDBM授权数据库密码文件工具(SDBM auth database password file utility)dir\bin\htpasswd.exe
- 基本授权密码文件工具(Basic auth password file utility)dir\bin\logresolve.exe
- 日志文件dns名称查找工具dir\bin\rotatelogs.exe
- 日志文件遍历工具dir\bin\wintty.exe
- 控制台窗口工具dir\bin\libapr.dll
- Apache可移植运行时共享库dir\bin\libaprutil.dll
- Apache运行时共享库工具dir\bin\libhttpd.dll
- Apache核心库dir\modules\mod_*.so
- Apache可装载模块dir\conf
- 配置目录dir\logs
- 空日志目录dir\include
- C语言头文件dir\lib
- 连接库文件
关于从开发树编译Apache的警告
在每次发布发行
版本之间,只有.dsp
文件被维护。 考虑到会对审阅者的时间造成巨大浪费,并不重新产生.mak
文件。 因此,你不能依靠上述的NMAKE
命令来编译修订过的.dsp
项目文件,除非你自己从项目中导出全部.mak
文件。如果你在Microsoft Developer Studio环境中编译这样做是不必要的。 同时注意在导出make文件之前编译BuildBin
目标项目是非常值得的(或者用命令行目标 _apacher
或 _apached
)。 许多文件在编译过程中自动产生。只有一次完全编译才提供为正确的编译行为编译正确的依存关系树所需要的全部依赖文件。为创建供发布的.mak
文件,一定要检查.mak
(或.dep
)中Platform SDK和其他头文件的依存性。 DevStudio\SharedIDE\bin\
(VC5)或者DevStudio\Common\MSDev98\bin\
(VC6) 目录包含了sysincl.dat
文件,其中列出了所有的例外情况来告诉VC++创建依存关系时不扫描列表中的文件, 更新此文件以包含这些头文件 (同时包括正斜杠和反斜杠路径,比如sys/time.h
和sys\time.h
要同时列出)。 在发布的.mak
文件中包含一个本地安装路径将使编译完全失败,所以不要忘了运行srclib/apr/build/fixwin32mak.pl
来修正.mak
文件中的绝对路径。