在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 ,用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

    注意Developer Studio集成开发环境只能在Tools - Options菜单中的Directories页上列出的可执行文件搜索路径列表中查找 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_sslab.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 ,只需要简单地使用下列命令之一就可以编译releasedebug版本,分别是:

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_sslmod_deflate , 对编译DebugRelease版本都是。 仅当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项目文件:

  1. srclib\apr\apr.dsp
  2. srclib\apr\libapr.dsp
  3. srclib\apr-util\uri\gen_uri_delims.dsp
  4. srclib\apr-util\xml\expat\lib\xml.dsp
  5. srclib\apr-util\aprutil.dsp
  6. srclib\apr-util\libaprutil.dsp
  7. srclib\pcre\dftables.dsp
  8. srclib\pcre\pcre.dsp
  9. srclib\pcre\pcreposix.dsp
  10. server\gen_test_char.dsp
  11. libhttpd.dsp
  12. Apache.dsp

此外,modules\子目录树包含了大多数模块的项目文件。

support\子目录包含了一些附加程序的项目文件,它们运行时不是Apache的一部分, 但是管理员要使用它们来测试Apache和维护密码与日志文件。 Windows平台特有的支持项目在support\win32\目录下。

  1. support\ab.dsp
  2. support\htdigest.dsp
  3. support\htpasswd.dsp
  4. support\logresolve.dsp
  5. support\rotatelogs.dsp
  6. support\win32\ApacheMonitor.dsp
  7. support\win32\wintty.dsp

一旦编译了Apache,它需要被安装在服务器根目录,缺省是在同一个盘符下的\Apache2目录。

要自动编译和安装所有文件到指定的目录dir ,使用下列nmake命令之一:

nmake /f Makefile.win installr INSTDIR=_dir_

nmake /f Makefile.win installd INSTDIR=_dir_

INSTDIRdir参数给出了安装目录;如果要安装到\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.hsys\time.h要同时列出)。 在发布的.mak文件中包含一个本地安装路径将使编译完全失败,所以不要忘了运行srclib/apr/build/fixwin32mak.pl来修正.mak文件中的绝对路径。