I. Introduction▲
I-A. Préambule▲
Ce tutoriel vous explique comment compiler Apache 2.2.9 sous Windows. Nous allons, pour ce faire, utiliser les outils de développement de Microsoft dans leur version Express, ainsi que Perl et Awk. Ce tutoriel est basé sur la documentation Apache et se veut un peu plus détaillé et moins théorique.
I-B. Prérequis▲
I-B-1. Connaissances▲
Aucune connaissance spécifique à ces outils ne sera cependant nécessaire, les notions de base en compilation et en utilisation de la ligne de commande devraient suffire.
I-B-2. Environnement de développement▲
La liste suivante vous présente les outils nécessaires à la compilation d'Apache et de ses dépendances sous Windows :
- Microsoft Visual C++ 2008 Express Edition (info, télécharger) ;
- Microsoft Windows SDK v6.1 (info, télécharger) ;
- Awk (info, télécharger) ;
- Perl (info, télécharger).
Certaines attentions sont à apporter afin de faciliter la suite de ce tutoriel :
- Microsoft Windows SDK v6.1
Dans le dossier C:\Program Files\Microsoft SDKs\Windows\v6.1\Include, dupliquez le fichier WinResrc.h et nommez-le winres.h.
Note : cette modification est inutile pour la compilation d'Apache, mais résout des problèmes de compilation récurrents, dus aux évolutions des environnements de développement et des SDK fournis par Microsoft ; - Awk
L'exécutable doit être nommé awk.exe et disponible dans le PATH.
À copier dans le dossier des binaires de Visual C++, par exemple C:\Program Files\Microsoft Visual Studio 9.0\VC\bin.
I-B-3. Sources▲
Cette liste vous propose des liens vers les codes sources d'Apache et de ses dépendances. Je vous recommande de toujours télécharger les codes sources (comme n'importe quels outil, logiciel, etc.) depuis le site de l'éditeur.
- Apache 2.2.9 (info, télécharger)
- zlib 1.2.3 (info, télécharger)
- OpenSSL 0.9.8h (info, télécharger)
II. zlib▲
II-A. Préparation▲
La zlib est utilisée pour la compilation du module mod_deflate ainsi que pour OpenSSL. La compilation de la zlib est relativement simple et ressemble plus à une formalité qu'autre chose. Admettons que nous travaillons dans un dossier C:\httpd_build fraîchement créé pour l'occasion, nous décompresserons l'archive de la zlib dans C:\httpd_build\zlib.
II-B. Compilation▲
Ouvrez une 'Invite de commandes de Visual Studio 2008' et rendez-vous dans le dossier précédemment cité. Pour lancer la compilation, entrez la commande suivante :
nmake -f win32\Makefile.msc
La compilation est relativement rapide. Exécutez la commande suivante pour vérifier que la compilation a produit un code correct :
nmake -f win32\Makefile.msc test
La commande doit retourner quelque chose comme suit :
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
III. OpenSSL▲
III-A. Préparation▲
OpenSSL est utilisé pour la compilation du module mod_ssl ainsi que pour ApacheBench/SSL. Décompressons tout d'abord l'archive des sources dans un autre sous-dossier de notre répertoire de travail, prenons C:\httpd_build\OpenSSL. Rendons-nous dans le dossier C:\httpd_build\OpenSSL\crypto\sha\asm et éditons le fichier sha1-586.pl : en ligne 152, il faut retirer le second argument de la déclaration pour obtenir le code suivant :
&
amp;function_begin
(
"sha1_block_data_order"
);
Ce fichier modifié, nous pouvons passer à la configuration de la compilation. En ligne de commandes depuis le dossier C:\httpd_build\OpenSSL, entrez la commande suivante :
perl Configure no-mdc2 no-rc5 no-idea enable-zlib VC-WIN32 -I../zlib
Cette commande nous permet de désactiver les pans de code qui sont brevetés, d'indiquer que nous souhaitons compiler avec Microsoft Visual C++ pour une plateforme 32bits et de donner le chemin vers la zlib précédemment compilée.
III-B. Compilation du code assembleur (ASM)▲
Le code source d'OpenSSL comporte de multiples versions des mêmes fonctions codées en (au moins) deux langages : l'assembleur et le C. Nous suivrons ici les conseils de la documentation d'Apache et nous réaliserons la compilation des fonctions codées en assembleur. Les versions codées en C ne seront pas incluses dans les binaires résultants.
ms\do_masm.bat
III-C. Préparation, le retour▲
Le makefile (info) a été généré à l'étape précédente et doit être modifié pour que la compilation soit un succès. Ouvrir le fichier ntdll.mak qui se trouve dans le dossier ms, chercher la ligne contenant zlib1.lib et remplacer par C:/httpd_build/zlib/zdll.lib (attention, ce sont bien des slashes : / ) afin d'obtenir quelque chose comme suit :
$
(
SHLIB_EX_OBJ) $
(
CRYPTOOBJ) wsock32.lib gdi32.lib advapi32.lib user32.lib C:/httpd_build/zlib/zdll.lib
Nous reste à modifier le fichier qui commande la suite de tests pour enlever les parties relatives aux pans de code désactivés. Ouvrir le fichier test.bat et enlever les trois lignes suivantes :
echo ideatest
ideatest
if
errorlevel 1
goto done
III-D. Compilation▲
Attaquons-nous à la compilation des fonctions qui sont uniquement présentes en C. Depuis la ligne de commandes dans le dossier C:\httpd_build\OpenSSL, entrez la commande suivante :
nmake -f ms\ntdll.mak
Cette étape est relativement longue, mais doit se terminer sans message d'erreur. Une fois la compilation terminée, passons les tests pour vérifier le bon fonctionnement de nos binaires OpenSSL en entrant la commande suivante :
nmake -f ms\ntdll.mak test
Tous les tests vont défiler et si tout va bien, la dernière ligne sera :
passed all tests
IV. Apache▲
IV-A. Préparation▲
Nous approchons du but. Décompressons l'archive des sources d'Apache dans un nouveau sous-dossier de notre répertoire de travail, admettons C:\httpd_build\httpd. Apache détectera automatiquement lors de sa compilation la présence de la zlib et d'OpenSSL à condition que ceux-ci se trouvent dans le sous-dossier srclib d'Apache et qu'ils soient bien nommés zlib et OpenSSL. Copions donc les dossiers au bon endroit, sans faire un simple déplacement, afin de pouvoir les réutiliser lors de la sortie de la prochaine version d'Apache ;)
Notre répertoire de travail et ses sous-dossiers devraient donc ressembler à ceci :
C:\httpd_build\ --- zlib\ ...
|- OpenSSL\ ...
|- httpd\ --- ...
|- srclib\ --- ...
|- zlib\ ...
|- OpenSSL\ ...
IV-B. Compilation▲
Diverses commandes et options de compilation sont disponibles et la ligne de commandes à adopter va différer selon vos besoins.
nmake -f Makefile.win option1=valeur options2=valeur ... commande
_apacher compile Apache en Release
_apached compile Apache en Debug
installr compile et installe Apache en Release
installd compile et installe Apache en Debug
clean supprime (le plus possible) de fichiers générés
_cleanr supprime (le plus possible) de fichiers générés par une compilation Release
_cleand supprime (le plus possible) de fichiers générés par une compilation Debug
_browse parcourt le fichier d'informations de compilation
Option Valeur par défaut
INSTDIR \Apache22
PORT 80
SSLPORT 443
DOMAINNAME example.com
SERVERNAME www.example.com
SERVERNAME admin@example.com
Nous partirons du principe que nous souhaitons installer notre Apache dans le dossier C:\httpd_build\Apache22.
Depuis la ligne de commandes, dans le dossier C:\httpd_build\httpd, entrer la commande suivante :
nmake /f Makefile.win INSTDIR
=
"C:\httpd_build\Apache22"
installr
Comme pour OpenSSL, la compilation est relativement longue, mais devrait se terminer sans encombre.
V. Conclusion▲
V-A. Épilogue▲
Nous sommes finalement arrivés à la fin de ce petit tutoriel. Vous disposez à présent d'un Apache qui présentera certainement des performances légèrement supérieures au binaire livré sur le site et ce, uniquement en faisant appel à des outils gratuits. Vous pouvez par ailleurs utiliser ces binaires pour compiler d'autres projets liés comme PHP.
V-B. Remerciements▲
Une spéciale dédicace à Guillaume RossoliniTutoriels Web qui guide, conseille, relit, etc. Merci à l'équipe Developpez.com qui m'accueille pour ce premier tuto sur leur site. Un p'tit clin d'œil à l'équipe php-dev-win et plus particulièrement à Pierre qui a motivé ces lignes.