Compiler sous Win32

Author:Pericles Nacionales
Contact:pnaciona at gmail.com

Avertissement

This part of the documentation is outdated. nmake is no longer used. cmake is used also for Win32.

Introduction

Ce document fournit un simple jeu de procédures de compilation pour MapServer sur les plateformes Win32.

Si vous êtes allé aussi loin, il y a des chances que vous connaissiez déjà MapServer et et que vous soyez au moins tentéd’essayer de le compiler vous-même. Les binaires précompilés pour MapServer sont disponibles depuis une variété de sources différentes. Référez-vous à Windows. Compiler MapServer pour les plateformes win32 peut être une tâche ardue, ainsi si des binaires existants sont suffisants pour vos besoins, il est fortement recommandé de les utiliser de préférence plutôt que d’essayer de compiler tout depuis les sources.

Cependant, il y a plusieurs raison de vouloir compiler MapServer à partir des sources sous win32. Ces raisons inclues la nécessité d’activer des options spécifiques, de le compiler avec des versions différentes de bibliothèques (comme GDAL), la volonté de la gestion de MapScript qui ne fait partie du coeur de la compilation, le besoin de débuguer et de corriger des bugs ou même d’implémenter de nouvelles fonctionnalités dans MapServer. Pour faciliter cela pour les utilisateurs et les développeurs, j’ai réalisé une liste d’étapes, accompagné d’exemples. Chaque exemple est une poursuite du précédent et se terminera par des programmes utilitaires, le programme CGI (mapserv.exe), le DLL MapServer (libmap.dll).

Avertissement

Ce document peut se référer à des versions de bibliothèques un peu anciennes. Vous voudrez peut être essayer d’utiliser des versions plus récentes des bibliothèques pour votre compilation.

Compiler

Si vous êtes nouveau à la programmation Windows, s’il vous plaît suivez ce document soigneusement. Les étapes de compilation sont assez simples mais j’ai ajouté quelques textes de présentation à chaque étape pour vous aider à comprendre comment MapServer compile. Pour les programmeurs expérimentés, peut être que la lecture du fichier README.Win32 qui accompagne le code source MapServer sera plus utile. Pour ceux qui sont impatients, compiler MapServer implique le téléchargement et le désarchivage du code source, éditer les fichiers make et invoquer le compiler Visual C++ de Microsoft à partir de la ligne de commande. Le mapserver.exe résultant est le programme CGI qui s’installe dans le répertoire cgi-bin de votre serveur web.

Pour ceux qui veulent prendre le temps, les étapes de compilation suivent

Définir un répertoire de projet

Avant que vous commenciez à compiler MapServer, nous vous recommandons de créer un répertoire nommé “projets” où vous pouvez mettre le code source pour MapServer et ses bibliothèques de support. Comme, vous allez travailler avec des commandes en style DOS, vous devriez également vous habituer à la ligne de commande Windows. Pour les utilisateurs Windows 95/98, le processeur de commande devrait s’appeler command.com. Pour Windows NT/2000/XP, ce serait plutôt cmd.exe. Ainsi, lancez la vieille ligne de commande et allez sur le lecteur disque où vous voulez créer le répertoire du projet.

Voici un exemple de comment créer un répertoire appelé projects sur le lecteur disque C: :

C:\Users> mkdir C:\Projects

Allez à ce répertoire

C:\Users> cd \Projects
C:\Projects>

Depuis le répertoire projects, vous pouvez extraire les codes sources de MapServer et ses bibliothèques associées. Maintenant, vous êtes prêts à télécharger les codes sources.

Télécharger le code source de Mapserver et les bibliothèques associées

Après la création d’un répertoire de projet, téléchargez le code source MapServer, les codes pour les bibliothèques support et sauvez les paquets de code source dans le nouveau répertoire créé “projets”. Ces codes source sont habituellement fournis sous forme de fichiers ZIP, ou TAR et GZIP UNIX. Vous aurez besoin d’un logiciel pour les décompresser. 7-Zip est un exemple de logiciel qui peut gérer ces fichiers.

Cygwin est un logiciel libre, open-source qui qui est un portage de ces outils sur Windows. Vous pouvez utiliser les utilitaires gzip et tar de cette collection d’outils. Cygwin est disponible depuis le site http://www.cygwin.com.

Dans le but de compiler le programme CGI de MapServer, vous devez télécharger quelques bibliothèques requises ou optionnelles. Dans sa configuration la plus simple, MapServer nécessite seulement les bibliothèques GD (pour fournir l’image en sortie) et REGEX (pour fournir la gestion des expressions régulières). Cette configuration permet aux développeurs/fournisseur de données d’utiliser des shapefiles comme entré et, en fonction de la version la bibliothèque GD utilisée, des images GIF ou PNG en sortie. Des bibliothèques supplémentaires sont nécessaires pour les données en entrée dans des formats alternatives. Les bibliothèques qui fonctionnent avec MapServer sont listées ci-dessous.

Le code source de Mapserver

The MapServer source code can be downloaded from the download page. If you’d like to get the current development version of the software, following the nightly snapshot link under the Interim Builds title. The absolute latest copy of the source code can be obtained from GitHub; however, the GitHub repository does not contain several important source files (maplexer.c, mapparser.c and mapparser.h) normally generated on unix, so if possible, using a nightly snaphot is substantially easier than working directly from GitHub.

Bibliothèques nécessaires

Bibliothèque GD:

MapServer utilise la bibliothèque graphique GD pour le rendu des images cartographiques au format GIF, PNG et JPEG. Ces images cartographiques sont affichées dans les navigateurs web clients en utilisant le CGI de MapServer. La version officielle actuelle de GD est la 2.0.33. Le Makefiles distribué est définie pour utiliser les binaires DLL précompilés de GD de Win32 qui inclut GD, libjpeg, libpng, libz et FreeType 2 dans une seule DLL. Ce paquet est généralement listé comme “Windows DLL .zip” et la dernière version est normalement disponible sur http://www.boutell.com/gd/http/gdwin32.zip.

Regex :

Regex est une bibliothèque pour les expressions régulières utilisées par MapServer. Elle peut être téléchargée à l’adresse http://ftp.gnu.org/old-gnu/regex/regex-0.12.tar.gz

Bibliothèques optionnelles

Bibliothèque JPEG:

Cette bibliothèque est nécessaire par GD pour le rendu des images JPEG, siGD est compilé à partir des sources. Vous pouvez télécharger cette bibliothèque sur http://www.ijg.org/files/jpegsrc.v6b.tar.gz

PNG library:

Cette bibliothèque est nécessaire par GD pour le rendu des images PNG, si GD est compilé à partir des sources. Vous pouvez télécharger cette bibliothèque sur http://sourceforge.net/projects/libpng/

Zlib:

Cette bibliothèque est nécessaire par libpng pour fournir la gestion de la compression graphique. Elle peut être téléchargé avec la bibliothèque PNG ou sur http://www.gzip.org/zlib.zip .

FreeType 2:
FreeType provides TrueType support in MapServer via GD. We only need to build FreeType separately if building GD from source. It can be downloaded at http://gnuwin32.sourceforge.net/packages/freetype.htm .
PROJ.4:
PROJ.4 provides on-the-fly projection support to MapServer. Users whose data are in different projection systems can use this library to reproject into a common projection. It is also required for WMS, WFS or WCS services.
GDAL/OGR:

La bibliothèque GDAL/OGR permet à MapServer de lire une variété de formats géospatiales raster (GDAL) et des formats vectoriels (OGR). Il peut être téléchargé à http://www.gdal.org/.

ArcSDE:

ArcSDE est le moteur de base de données spatiale propriétaire d’ESRI. La plupart des utilisateurs n’y auront pas accès mais si vous possédez une licence ArcSDE, vous pouvez utiliser ces bibliothèques pour permettre à MapServer d’accéder aux bases de données SDE.

EPPL7:

Cette bibliothèque permet à MapServer de lire les jeux de données EPPL7, ainsi que les fichiers plus vieux Erdas LAN/GIS. Cette bibliothèque est définie comme une par défaut dans MapServer, il n’y a donc pas de code source spécifique à télécharger.

Maintenant que vous avez vue les bibliothèques qui apporte des fonctionnalités à MapServer, il est temps de décider laquelle compiler et utiliser. Nous travaillerons avec la version précompilée de GD distribuée sur Boutell.com avec PNG, GIF, JPEG et FreeType inclues. Si vous désirez fournir des services web OGC (ie. WMS, WFS) ou réaliser la reprojection à la volée alors la bibliothèque Proj.4 sera nécessaire. Si vous désirez des sources de données raster et vecteur supplémentaires considérez l’inclusion de la gestion de GDAL/OGR. GDAL est aussi nécessaire pour les services WCS.

Our example calls for the required libraries and on-the-fly projection support so we need to download GD, regex, and PROJ.4 libraries. Go ahead and get those libraries.

Définir les options de compilation

MapServer, comme la plupart de ses dépendances, vient avec un makefile Visual C++ appelé Makefile.vc. Il inclut le fichier nmake.opt qui contient de nombreux définitions spécifiques au site. Nous aurons seulement besoin d’éditer le fichier nmake.opt pour configurer la compilation pour nos options de site local, et nos bibliothèques de dépendances. Le Makefile.vc, et le fichier de template nmake.opt ont été fournis par Assefa Yewondwossen et les gens de DM Solutions.

A partir de MapServer 4.4, les options de compilation par défaut de MapServer incluent seulement GD, et regex. MapServer est compilé en utilisant l’option /MD (ce qui signifie que MSVCRT.DLL doit être utilisé), ainsi à partir du moment où les dépendances sont compilées statiquement (plutôt que comme des DLLs), nous avons besoin d’utiliser /MD quand on les compile également. Par défaut, les versions récentes de PROJ.4 utilisent /MD, ainsi nous devrions être capable d’utiliser les sources par défaut de PROJ.4 build sans ajustement.

L’exemple sera compilé aussi bien avec la DLL précompilée GDWin32 que regex-0.12, et PROJ.4. Le support de PROJ.4 assurera que nous puvons activé la compatibilité avec les services OGC-WMS MapServer. Utilisez notepad ou un autre éditeur de texte pour ouvrir le fichier nmake.opt et faites les changements suivants.

Commentaires

Utiliser le signe dièse ( # ) pour commenter les lignes que vous souhaitez désactiver, ou enlever le signe dièse pour activer une option pour NMAKE.

A. Enable PROJ.4 support, and update the path to the PROJ.4 directory. Uncomment the PROJ= line, and the PROJ_DIR= line as follows, and update the PROJ_DIR path to point to your PROJ build.

# Reprojecting.
# If you would like mapserver to be able to reproject data from one
# geographic projection to another, uncomment the following flag
# PROJ.4 distribution (cartographic projection routines).  PROJ.4 is
# also required for all OGC services (WMS, WFS, and WCS).
#
# For PROJ_DIR use full path to PROJ.4 distribution
PROJ=-DUSE_PROJ -DUSE_PROJ_API_H
PROJ_DIR=c:\projects\proj-4.4.9

Si vous regardez plus bas dans le fichier, vous pouvez voir qu’une fois que PROJ est activé, MapServer sera lié avec proj_i.lib, la bibliothèque bouchon PROJ.4, signifiant que MapServer utilisera PROJ.DLL à l’opposé d’un lien statique dans PROJ.4.

  1. Décommenter l’option WMS

# Use this flag to compile with WMS Server support.
# To find out more about the OpenGIS Web Map Server Specification go to
# http://www.opengis.org/
WMS=-DUSE_WMS_SVR
  1. Mise à jour pour utiliser GD. Voici ce à quoi il devrait ressembler dans notre exemple.

GD_DIR=c:/projects/gdwin32
GD_LIB=$(GD_DIR)/bgd.lib

Note: Comme il distribué, le binaire GDWin32 n’inclut pas la bibliothèque bouchon bgd.lib. Il est nécessaire en premier de lancer le script makemsvcimport.bat dans le répertoire gdwin32.

D. Make sure the regex path is set correctly. In order for the “delete” command in the “nmake /f makefile.vc clean” target to work properly it is necessary to use backslashes in the REGEX_DIR definition.

# REGEX Library
#
# VC++ does not include the REGEX library... so we must provide our one.
# The following definitions will try to build GNU regex-0.12 located in the
# regex-0.12 sub-directory.
# If it was not included in the source distribution, then you can get it from:

#    ftp://ftp.gnu.org/pub/gnu/regex/regex-0.12.tar.gz
# Provide the full path to the REGEX project directory
# You do not need this library if you are compiling for PHP mapscript.
# In that case the PHP regex library will be used instead
!IFNDEF PHP
REGEX_DIR=c:\projects\regex-0.12
!ENDIF

Votre Makefile est maintenant défini.

Compiler les bibliothèques

Avant de compiler MapServer, vous devez en premier compiler les librairies de dépendances. La manière dont cela s’effectue varie selon chaque bibliothèque. Pour la bibliothèque PROJ.4, une commande nmake /f makefile.vc dans le répertoire proj-4.4.9src devrait être suffisant . Le code de regex-0.12 est actuellement compilé lors du processus de compilation de MapServer, donc vous n’avez rien besoin de faire ici.

Compiler libcurl

Auparavant, les bibliothèques curl pouvaient être compilées en utilisant la commande suivante:

nmake /f makefile.vc6 CFG=release

Cela crée une bibliothèque statique, libcurl.lib, contre laquelle vous allez compiler. Les versions plus récentes que la version 7.10.x devraient être compilées comme bibliothèque dynamique. Cela se fait en utilisant la commande:

nmake /f makefile.vc6 CFG=release-dll

Vous aurez besoin d’éditer le nmake.opt de MapServer pour remplacer la variable CURL_LIB avec cette ligne:

CURL_LIB = $(CURL_DIR)/lib/libcurl_imp.lib

Compiler Mapserver

Un fois que vous avez compilé les librairies de dépendances avec succès, vous êtes prêts à passer à l’étape finale de compilation. Si vous ne l’avez pas encore fait, ouvrez une invite de commande et définissez les variables d’environnement VC++ en lançant vcvars32.bat habituellement situé dans C:Program FilesMicrosoft Visual StudioVC98binvcvars32.bat.

C:\Users> cd \projects\mapserver
C:\Projects\mapserver&> C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat"
C:\Projects\mapserver>

Setting environment for using Microsoft Visual C++ tool.
C:\Projects\mapserver>

Maintenant exécuter la commande: nmake /f Makefile.vc et attendez qu’elle finisse de compiler. Si elle compile avec succès, vous devriez obtenir les fichiers mapserver.lib, libmap.dll, mapserv.exe, et d’autres .EXE. C’est tout pour le processus de compilation. Si vous rencontrez des problèmes, lisez la section 4 sur les erreurs de compilation. Vous pouvez aussi demander de l’aide aux sympathiques abonnés de la liste de diffusion MapServer-dev.

Compiler MapServer avec le support de PostGIS

Pour compiler le support de PostGIS dans MapServer, voici ce que vous aurez besoin de faire:

  1. télécharger les sources de PostgreSQL 8.0.1 (ou plus récent) depuis: ftp://ftp.heanet.ie/pub/postgresql/source/

  2. Je les ai extrait dans C:projectspostgresql-8.0.1

  3. télécharger le SDK de la plateforme Microsoft sinon vous aurez des erreurs de liens sur shfolder.lib.

  4. compiler libpq sous C:projectspostgresql-8.0.1srcinterfaceslibpq en utilisant le makefile win32.mak

  5. copier tout de C:projectspostgresql-8.0.1srcinterfaceslibpqrelease vers C:projectspostgresql-8.0.1srcinterfaceslibpq comme le makefile de MapServer cherchera à le trouver ici

  6. Définir ce qui suit dans le fichier nmake.opt pour MapServer: POSTGIS =-DUSE_POSTGIS POSTGIS_DIR =c:/projects/postgresql-8.0.1/src

  7. nmake /f makefile.vc
  8. n’oubliez pas de copier libpq.dll (depuis C:projectspostgresql-8.0.1srcinterfaceslibpqrelease) dans un emplacement où MapServer pourra le trouver.

Erreurs de compilation communes

Ce qui suit donne quelques unes des erreur courantes que vous êts susceptibles de rencontrer en essayant de compiler MapServer.

  • Outils de Visual C++ incorrectement initialisés

    C:\projects\mapserver> nmake -f /makefile.vc
    'nmake' is not recognized as an internal or external command,
    operable program or batch file.
    

    Cela a lieu si vous n’avez pas correctement défini le chemin et les autres variables d’environnement requises pour utiliser MS VisualC++ depuis la ligne de commande. Invoquez le script VCVARS32.BAT, habituellement avec la commande C:Program FilesMicrosoft Visual StudioVC98binvcvars32.bat ou quelque chose de similaire si visual studio est installé dans un emplacement alternatif. Pour tester si VC++ est disponible, tapez juste “nmake” ou “cl” dans la ligne de commande et assurez-vous qu’il est trouvé.

  • Problèmes de compilation des Regex

    regex.obj : error LNK2001: unresolved external symbol _printchar
    libmap.dll : fatal error LNK1120: 1 unresolved externals
    NMAKE : fatal error U1077: 'link' : return code '0x460'
    Stop.
    

    Cela a lieu si vous utilisez le regex-0.12 que nous avons référencé. J’ai contourné ça en commentant la déclaration “extern” pour la fonction printchar(), et en la remplaçant par l’implémentation d’un bouchon dans regex-0.12regex.c.

    //extern void printchar ();
    void printchar( int i ) {}
    
  • Import de la bibliothèque GD manquant:

    LINK : fatal error LNK1104: cannot open file 'c:/projects/gdwin32/bgd.lib'
    NMAKE : fatal error U1077: 'link' : return code '0x450'
    Stop.
    

    Si vous utilisez les binaires précompilés de GD, vous aurez toujours besoin de lancer le script makemsvcimport.bat dans le répertoire gdwin32 pour créer une bibliothèque bouchon compatible avec VC++ (bgd.lib).

Installation

Le fichier qui nous intérese le plus est mapserv.exe. Les autres fichiers exécutables sont les programmes utilitaires MapServer.

pour en savoir plus sur ces utilitaires

Pour tester que votre programme CGI fonctionne, tapez mapserv.exe dans la ligne de commande. Vous devriez voir le message suivant:

This script can only be used to decode form results and
should be initiated as a CGI process via a httpd server.

Vous aurez peut être à la place une popup indiquant qu’une DLL(comme bgd.dll) est manquante. Vous devrez copier toutes les DLLS requises (c’est à dire bgd.dll, et proj.dll) dans le même répertoire que le programme mapserv.exe.

Maintenant, tapez mapserv -v dans la ligne de commande pour avoir ce message:

MapServer version 4.4.0-beta3 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP
SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER INPUT=SHAPEFILE
DEBUG=MSDEBUG

Cela nous dit quels formats de données et autres opions sont supportées par mapserv.exe. En assumant que vous avez un serveur web configuré, copiez mapserv.exe, libmap.dll, bgd.dll, proj.dll et les autres DLLs requises dans votre répertoire cgi-bin.

Vous êtes maintenant prêts à télécharger l’application de démo et à essayer votre propre programme CGI MapServer. Si vous le souhaitez, vous pouvez aussi créer un répertoire pour stocker les programmes utilitaires. Je vous suggérerait de créer un sous-répertoire appelé “bin” sous le dossier “projects” et de copier les exécutables dans ce répertoire. Vous trouverez peut être ces programmes utiles lors du développement d’applications MapServer.

Autres Informations utiles

Les HOWTO de l’installation et de la compilation Unix donnent de bonnes descriptions de quelqu’unes des options de compilation de MapServer et ses problèmes de bibliothèques. J’écrirais plus sur ces options et problèmes dans une nouvelle révision de ce HOWTO.

Les documents README de chaque bibliothèque supportée fournissent les instructions de compilation pour Windows.

La communauté d’utilisateurs de MapServer a une connaissance collective des nuances de la compilation sous MapServer. Cherchez leur conseils à bon escient.

Remerciements

Merci à Assefa Yewondwossen pour avoir fourni le fichier Makefile.vc. Je n’aurais pas été capable d’écrire ce HOWTO sans cela.

Merci à Bart van den Eijnden pour les informations de compilation de libcurl et PostGIS.

Merci à Steve Lime pour le développement de MapServer et aux nombreux développeurs qui contribuent par leur temps et leurs efforts à faire du projet MapServer une réussite.