Compiler Apache httpd 2.2.x sous Windows

Fabien Faille

Comment compiler Apache httpd 2.2.9 sous Windows. Ce tutoriel est basé sur la documentation officielle et se veut un peu plus détaillé et moins théorique. ♪

- Titre : Compiler Apache httpd 2.2.x sous Windows

- Auteur : Fabien Faille

- Parution : 3 juillet 2008

- Licence : Copyright ® 2008 Fabien Faille. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- I-A. Préambule

- I-B. Prérequis

- I-B-1. Connaissances

- I-B-2. Environnement de développement

- I-B-3. Sources

- II. zlib

- II-A. Préparation

- II-B. Compilation

- III. OpenSSL

- III-A. Préparation

- III-B. Compilation du code assembleur (ASM)

- III-C. Préparation, le retour

- III-D. Compilation

- IV. Apache

- IV-A. Préparation

- IV-B. Compilation

- V. Conclusion

- V-A. Épilogue

- V-B. Remerciements

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.

Syntaxe de la commande de compilation

nmake -f Makefile.win option1=valeur options2=valeur ... commande

Les commandes de compilation

_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

Les options 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 Rossolini 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.