You do not need to have previous knowledge of the tools. Basic notions about compilation and using comand line tools should be enough.
Here is a list of the tools needed to compile Apache and its dependencies under Windows:
You will need to take certain actions in order to simplify the rest of the procedure:
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.
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
Here is the list of the sources for Apache and its dependencies:
Note: I would recommend that you always download source files (as with any tool, software etc.) from the official website.
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
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 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.
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.
The makefile (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
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
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\ ...
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.