====== Build Apache 2.2.x on Windows ====== ===== Requirements ===== ==== Knowledge ==== You do not need to have previous knowledge of the tools. Basic notions about compilation and using comand line tools should be enough. ==== Development environment (software) ==== Here is a list of the tools needed to compile Apache and its dependencies under Windows: * Microsoft Visual C++ 2008 Express Edition ([[http://www.microsoft.com/express/|info]], [[http://www.microsoft.com/express/download/|download]]) * Microsoft Windows SDK v6.1 ([[http://msdn.microsoft.com/en-us/windowsserver/bb980924.aspx|info]], [[http://www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc&DisplayLang=en|download]]) * Awk ([[http://en.wikipedia.org/wiki/Awk|info]], [[http://www.cs.princeton.edu/~bwk/btl.mirror/|download]]) * Perl ([[http://win32.perl.org/|info]], [[http://www.activestate.com/store/activeperl/download/|download]]) You will need to take certain actions in order to simplify the rest of the procedure: === Microsoft Windows SDK v6.1 === In the folder C:\Program Files\Microsoft SDKs\Windows\v6.1\Include, copy the **WinResrc.h** file to **winres.h**. Note: This modification is not required to compile Apache but it solves frequent compilation problems due to the evolution of development environments and the SDKs provided by Microsoft. === Awk === The binary needs to be called **awk.exe** and available through the **PATH**. Copy it under the Visual C++ binaries folder, ie. C:\Program Files\Microsoft Visual Studio 9.0\VC\bin ==== Source files ==== Here is the list of the sources for Apache and its dependencies: * Apache 2.2.9 ([[http://httpd.apache.org/|info]], [[http://httpd.apache.org/download.cgi|download]]) * zlib 1.2.3 ([[http://www.zlib.net/|info]], [[http://www.zlib.net/|download]]) * OpenSSL 0.9.8h ([[http://www.openssl.org/|info]], [[http://www.openssl.org/source/|download]]) Note: I would recommend that you always download source files (as with any tool, software //etc//.) from the official website. ===== Awk ===== ==== Preparation ==== The zlib library is used to compile **mod_deflate** and **OpenSSL**. Its compilation is simple and looks more like a formality than anything. Say we are working with a folder C:\httpd_build created for the occasion: let's uncompress zlib into C:\httpd_build\zlib ==== Compilation ==== Open a Visual Studio 2008 command prompt and go to the folder we just talked about. To start the compilation, do the following: nmake -f win32\Makefile.msc Compilation finishes relatively fast. Execute the following line to check that everything went fine: nmake -f win32\Makefile.msc test This command should return someting like: zlib version 1.2.3 = 0x1230, compile flags = 0x55 uncompress(): hello, hello! gzread(): hello, hello! gzgets() after gzseek: hello! inflate(): hello, hello! large_inflate(): OK after inflateSync(): hello, hello! inflate with dictionary: hello, hello! echo hello world | minigzip | minigzip -d hello world ===== OpenSSL ===== ==== Preparation ==== OpenSSL is used to compile mod_ssl as well as ApacheBench/SSL. Let's uncompress the source archive in another folder than the working folder, for instance C:\httpd_build\OpenSSL. Then go to the folder C:\httpd_build\OpenSSL\crypto\sha\asm and edit the sha1-586.pl file: on line 152, you need to remove the second declaration argument so as to end up with the following code: &function_begin("sha1_block_data_order"); Once the file is modified, let's move on to compilation configuration. From the command line, go to C:\httpd_build\OpenSSL and execute: perl Configure no-mdc2 no-rc5 no-idea enable-zlib VC-WIN32 -I../zlib This command allows us to deactivate portions of the code that are under patent, to say that we will be using MS Visual C++ for a 32 bits platform and to give the path to the zlib we just compiled. If you intend to compile PHP (with SSL) afterwards, you may want to check that the options are the same. A standard PHP compilation with OpenSSL does not deactivate patented code. ==== Assembly code (ASM) compilation ==== OpenSSL source code has multiple versions of at least two languages: **assembly** and **C**. Here we will follow Apache documentation's guidelines and we will compile the functions using assembly code. The versions coded in C will not be included in the resulting binaries. ==== Preparation (again) ==== The makefile ([[http://www.gnu.org/software/make/manual/make.html#Introduction|info]]) generated with the previous step needs to be modified so that the operation can be a success. Open the **ntdll.mak** located under the **ms** folder, look for the line containing "zlib1.lib" and replace by "C:/httpd_build/zlib/zdll.lib" (watch out, those are forward slashes) so as to get something like: $(SHLIB_EX_OBJ) $(CRYPTOOBJ) wsock32.lib gdi32.lib advapi32.lib user32.lib C:/httpd_build/zlib/zdll.lib If you deactivated patented code, you now need to modify the testsuite so that it does not fail. Remove the following lines from **test.bat**: echo ideatest ideatest if errorlevel 1 goto done ==== Compilation ==== Let's compile the functions that are coded only in C. From the command line, go to C:\httpd_build\OpenSSL and execute: nmake -f ms\ntdll.mak This step is quite long but it should finish without any error message. Once compilation is done, start the tests to check OpenSSL works fine: nmake -f ms\ntdll.mak test All the tests will execute. If everything goes well, the last line will be: passed all tests ===== Apache ===== ==== Preparation ==== We near the end. Uncompress the apache sources under a new folder of our workspace, for instance C:\httpd_build\httpd. While compiling, Apache will automatically detect zlib and OpenSSL if they are located under **srclib** in the Apache folder and if they are named "zlib" and "OpenSSL". Then let's copy the folders at the right place but do not "move" them so that you can reuse them when you need to compile Apache's next version ;) Our working folder should look like this: C:\httpd_build\ --- zlib\ ... |- OpenSSL\ ... |- httpd\ --- ... |- srclib\ --- ... |- zlib\ ... |- OpenSSL\ ... ==== Compilation ==== Various commands and compilation options are available, and the command line will vary depending on your needs. Compilation command syntax: nmake -f Makefile.win option1=value options2=value ... command Compilation commands: _apacher compile Apache as Release _apached compile Apache as Debug installr compile and install Apache as Release installd compile and install Apache as Debug clean delete (as many as possible) generated files _cleanr delete (as many as possible) files generated by a Release compilation _cleand delete (as many as possible) files generated by Debug compilation _browse browses the compilation information file Compilation options: Option Default value INSTDIR \Apache22 PORT 80 SSLPORT 443 DOMAINNAME example.com SERVERNAME www.example.com SERVERNAME admin@example.com The following command is built to instruct Apache to be installed under C:\httpd_build\Apache22. From the command line prompt, go to C:\httpd_build\httpd and run: nmake /f Makefile.win INSTDIR="C:\httpd_build\Apache22" installr Like with OpenSSL, compilation takes some time but it should end without errors.