Mapserver in der fgs-dev Umgebung kompilieren

Aus kvwmap
Wechseln zu: Navigation, Suche

--Markus Hentschel 09:00, 14. Sep 2007 (CEST)
Mit FGS kann man sehr schnell und sehr komfortabel einen Mapserver mit allen dazugehörigen Modulen aufbauen. Da FGS auf Mapserver zugeschnitten ist, kann man alle notwendigen Komponenten in eine einmal aufgebaute Umgebung modular einbinden. Die einzelnen Module kann man sich bei maptools.org downloaden und mit einem einzigen Befehl installieren. Dabei ist zu beachten, dass alle Module mit den Standardeinstellungen kompiliert werden. Das ist manchmal nicht ausreichend. So muss der Mapserver z.B. für die ZV-Aut-konforme Darstellung der ALK mehr als die defaultmäßigen 250 Symbole laden. Oder: Damit Ausdrucke größer als DIN A4 möglich sind, muss die maximale mögliche Größe der vom Mapserver gerenderten Bilder geändert werden.

fgs-dev kann da Abhilfe schaffen. Mit fgs-dev kann man fgs selber kompilieren und dabei bestimmte Komponenten mit eigenen Einstellungen nutzen. Mit dieser Entwicklungsumgebung können fgs-Module selbst erzeugt werden, z.B. mapserver-php. Ein Modul besteht aus mehreren Paketen, eben genau den notwendigen Softwarekomponenten. Aus den einzelnen Modulen kann man dann seine eigene fgs-Umgebung aufbauen. fgs-dev ist so konfiguriert, dass es sich die Paketquellen aus dem Internet holt, man kann jedoch auch eigene Quellen verwenden. Dieser Umstand erlaubt es, diese eigenen Quellen zu modifizieren.

Offizielle Beschreibungen im Netz:
maptools.org
osgeo.org

Jeder Klügere ist hiermit eingeladen, untenstehende Beschreibung zu verbessern.

Hoffe, es nutzt.




Für die ganz Schnellen:
Nach folgendem schematischen Ablauf werden fgs-Module (z.B. mapserver-php) erzeugt:

  • fgs-dev installieren
  • . setenv.sh (im fgs-dev-Verzeichnis)
  • fgsdev custom_build_list create <modulname>
  • fgsdev build_all
  • fgsdev installer <modulname>
  • . setenv.sh (im fgs-Verzeichnis)
  • fgs start




fgs-dev downloaden und installieren (das macht man natürlich nur einmal)

A.1 Über die Konsole ausführen:

cvs -d :pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot login
(Kein Passwort, d.h. Passwort-Abfrage mit ENTER übergehen)
       

A.2 Ausführen:

cvs -d :pserver:cvsanon@cvs.maptools.org:/cvs/maptools/cvsroot checkout fgs-dev
(lädt fgs-dev runter)
       

B. Verzeichnis fgs-dev an einen geeigneten Ort verschieben, für diese Anleitung: /home/fgs/fgs-dev

C. Rechte ändern, am bequemsten:

chmod -R 777 fgs-dev




1. In die fgs-dev Umgebung wechseln

cd /home/fgs/fgs-dev

2. setenv.sh editieren, wenn nötig, sonst einfach alles lassen:

### Zitat: ###
FGS_DEV_HOME	this is the path where FGS-Dev is installed. By default,
               the pwd command returns the current path, which is ok if
               you are in the FGS-Dev directory when source the 
               setenv.sh file.
FGS_CACHE	this is the path where downloaded files are cached. If
               you have one FGS-Dev instance, you can use the default
               path. ($FGS_HOME_DEV/cache). If you have multiple FGS-Dev
               environments, this option permits you to share the cache
               directory.
### Zitat Ende ###
  

3. Ausführen:

. setenv.sh
(setzt die fgs-dev Umgebungsvariablen)
(man beachte den Punkt!)
(muss bei jedem neuen Sessionstart ausgeführt werden!)
       

4. Ausführen:

fgsdev custom_build_list create <modulname>
z.B. also:
fgsdev custom_build_list create mapserver-php

erzeugt eine Datei namens build.list im fgs-dev-Verzeichnis, in der alle zu kompilierenden Pakete des Moduls aufgeführt werden. (fgs-dev/build.list = CUSTOM_BUILD_FILE, nicht verwechseln mit STANDARD_BUILD_FILE, siehe 5.1!)

5. build.list anpassen, wenn nötig

5.1 Welche Modul-Versionen per default installiert werden und in welcher Reihenfolge, steht in der Datei fgs-dev/pkg_def/build.list (= STANDARD_BUILD_FILE, nicht verwechseln mit CUSTOM_BUILD_FILE!) Von dort werden die Einträge in fgs-dev/build.list erzeugt.

In der Datei fgs-dev/build.list (= CUSTOM_BUILD_FILE) stehen zunächst nur die Namen der einzelnen Pakete des Moduls, also z.B.:

jpeg:::
tiff:::
pdflib_lite:::
und so weiter

für jedes Paket also 4 "Spalten", getrennt durch den Doppelpunkt.

5.2 Möchte man, dass ein anderes als das default-packege installiert wird, notiert man die Versionsnummer des zu installierenden Pakets in fgs-dev/build.list beim entsprechenden Paket in der zweiten Spalte, Beispiel:

postgresql:7.4.7::
   

5.3 Möchte man, dass beim Built eines Pakets andere Parameter verwendet werden als standardmäßig vorgesehen (z.B. beim configure), dann kann man das unter fgs-dev/pkg_dev/<paketname> in der jeweiligen Datei fgs_build ändern.

5.4 Wenn man ein Paket aus den eigenen Quellen installieren möchte, geht man wie folgt vor:

5.4.1 - Download des tar.gz und laden in das Verzeichnis fgs-dev/src

5.4.2 - Entpacken, z.B. so:

gunzip -c mapserver-4.10.2 | tar xvf -
        

5.4.3 - optional: cd <sourcename> und editieren, was editiert werden muss (siehe Hinweise bei 7.)

5.4.4 - cd /home/fgs/fgs-dev und build.list editieren:

5.4.5 - beim entsprechenden Paket ein 'manual' (2. Spalte) und den Pfad zur Source (4. Spalte) angeben, für Mapserver z.B. so:

mapserver:manual::/home/fgs/fgs-dev/src/mapserver-4.10.2

5.5 Funktioniert aus irgendeinem Grund der automatische Download einer Quelle nicht, hat man zwei Möglichkeiten:

5.5.1 entweder (wenn die richtige www-Adresse bekannt ist):

  • in der Datei fgs-def/pkg_dev/<paketname>/def.sh den Parameter ARCHIVE_SITE aktualisieren

5.5.2 oder (genau wie bei 5.4 bereits beschrieben):

  • Quelle selber downloaden
  • Quelle in fgs-dev/src entpacken
  • 'manual' und Pfad zur Source in fgs-dev/build.list beim Paketnamen eintragen

Pakete können z.B. hier runtergeladen werden (nicht immer die jeweils aktuellste Version!):
maptools.org Genausogut können die Quellen aber auch von den Originaladressen gezogen werden.

6. Zum Testen, ob einzelne Pakete funzen, kann man folgenden Befehl abschicken:

fgsdev build_pkg <paketname>
z.B. also:
fgsdev build_pkg php

7. Befehl zum Kompilieren aller Pakete des Moduls:

fgsdev build_all
   
Hinweis: wenn das Kompilieren eines Pakets innerhalb des Moduls fehlerfrei abgeschlossen wurde, schreibt fgs-dev Versionsnummer und Pfad zum Paket in fgs-dev/build.list. Bei Abbrüchen kann man also sehr schnell erkennen, welche Pakete kompiliert werden konnten und bei welchem Paket der Abbruch erfolgte. Diese Eintragungen müssen vor späteren Durchläufen nicht gelöscht werden.
Hinweis: Wenn 7. nicht funktioniert, liegt es meistens an 5.5: Dann erst 5.5.1 oder 5.5.2, dann 6. und dann 7. nochmal.


Meine fertige fgs-dev/build.list für das Modul mapserver-php:

jpeg::6b:/home/fgs/fgs-dev/src/jpeg-6b
tiff::3.8.2:/home/fgs/fgs-dev/src/tiff-3.8.2
pdflib_lite::6.0.3:/home/fgs/fgs-dev/src/PDFlib-Lite-6.0.3
libpng::1.2.8:/home/fgs/fgs-dev/src/libpng-1.2.8
freetype:manual::/home/fgs/fgs-dev/src/freetype-2.1.10
libiconv::1.9.1:/home/fgs/fgs-dev/src/libiconv-1.9.1
gd::2.0.33:/home/fgs/fgs-dev/src/gd-2.0.33
openssl::0.9.8a:/home/fgs/fgs-dev/src/openssl-0.9.8a
netcdf:manual::/home/fgs/fgs-dev/src/netcdf-3.6.0
curl:manual::/home/fgs/fgs-dev/src/curl-7.14.0
proj::4.5.0:/home/fgs/fgs-dev/src/proj-4.5.0
libgeotiff:manual::/home/fgs/fgs-dev/src/libgeotiff-1.2.3
postgresql::8.0.7:/home/fgs/fgs-dev/src/postgresql-8.0.7
unixODBC::2.2.10:/home/fgs/fgs-dev/src/unixODBC-2.2.10
xerces_c::2_6_0:/home/fgs/fgs-dev/src/xerces-c-src_2_6_0
libungif::4.1.3:/home/fgs/fgs-dev/src/libungif-4.1.3
gdal::1.4.2:/home/fgs/fgs-dev/src/gdal-1.4.2
expat::1.95.8:/home/fgs/fgs-dev/src/expat-1.95.8
apache::1.3.34:/home/fgs/fgs-dev/src/apache_1.3.34
libxml2::2.6.19:/home/fgs/fgs-dev/src/libxml2-2.6.19
sablotron:manual::/home/fgs/fgs-dev/src/Sablot-1.0.1
php:manual::/home/fgs/fgs-dev/src/php-4.4.2
mapserver:manual::/home/fgs/fgs-dev/src/mapserver-4.10.2
  

Alle Pakete, die ich 'manuell' aus den Quellen kompiliert habe, ließen sich im automatischen Download nicht laden. Ich habe sie z.B. von maptools.org geladen. Ausnahmen: GD, PHP und Mapserver wurden 'manuell' kompiliert, weil: GD, weil sonst PHP nicht durchlief (Meldung: "autoconf: command not found"), siehe unten. PHP, weil die GD-Unterstützung aus PHP kommen soll, siehe unten. Mapserver, um eigene Einstellungen in map.h und mapsymbol.h zu setzen, siehe unten.

Bei der Kompilierung von GD bin ich so vorgegangen:

  • in fgs-dev/pkg_def/gd/fgs_build folgende Zeilen auskommentiert:
##if [ `grep -c "CPPFLAGS=\"\$libpng_CPPFLAGS \$CPPFLAGS\"" configure.ac` -eq 0 ] ; then
##    sed -e "s|AC_CHECK_HEADERS(png.h,,|CPPFLAGS=\"\$libpng_CPPFLAGS \$CPPFLAGS\"\n AC_CHECK_HEADERS(png.h,,|g" configure.ac > $TMP_FILE
##    on_error_abort
##    mv $TMP_FILE configure.ac
##
##    autoconf
##    on_error_abort
##fi
   

Bei der Kompilierung von PHP bin ich so vorgegangen:

  • PHP-Source runtergeladen und wie bei 5.5.1 beschrieben zur Verfügung gestellt
  • in fgs-dev/pkg_def/php/fgs_build folgende Zeilen geändert:
aus --with-gd=$FGS_BUILD_HOME/gd \  wurde  --with-gd \
(Änderung --with-gd wegen der Rotationsfunktion im Druck von kvwmap)
Man beachte das "\" am Zeilenende! Auskommentieren von Zeilen im configure geht nicht!
       

Bei der Kompilierung von Mapserver bin ich so vorgegangen:

  • Mapserver-Source runtergeladen und wie bei 5.5.1 beschrieben zur Verfügung gestellt
  • in den Quellen fgs-dev/src/mapserver-4.10.2/ folgende Änderungen vorgenommen:
  • map.h:
#define MS_MAXCLASSES 1000
#define MS_MAXSTYLES 10
#define MS_MAXLAYERS 1000
#define MS_MAXIMAGESIZE_DEFAULT 4096
  • mapsymbol.h:
#define MS_MAXSYMBOLS 500
                
Hinweis: Für PHP musste ich "flex" per yast nachinstallieren
Hinweis: Für php-4.4.2 konnte ich nicht curl-7.16.4 (= die neueste Version) verwenden, Meldung: "Fatal error returned, exiting..." Deshalb habe ich curl-7.14.0 genommen.
Hinweis: Für Mapserver musste ich aus unbekannten Gründen eine Version ungleich curl-7.15.0 verwenden. mapserver-4.10.2 brachte bei Verwendung des Standard-Pakets curl-7.15.0 die Meldung:
found libcurl version 7.15.0 -- ERROR:  libcurl version 7.10.1 or more recent is required. (???)
   
Hinweis: Die Befehle fgsdev build_pkg (siehe 6.) und fgsdev build_all (siehe 9.) lassen sich beliebig oft wiederholen. Auf die bereits vorhandenen Einträge in fgs-dev/build.list hat das keinen Einfluss.
Hinweis: Wie man sieht, werden (bei mir) eine Menge Pakete 'manuell' installiert. Es führt vermutlich schneller ans Ziel, wenn man vor Beginn schon alle Quellen wie bei 5.5 beschrieben im Verzeichnis fgs-dev/src bereit hält und erst dann ein fgsdev build_all durchführt. Ansonsten kommen immer wieder Abbrüche, wenn die URLs zum automatischen Download nicht mehr stimmen oder gerade nicht funktionieren - was man um so später merkt, je weiter unten in fgs-dev/build.list das Paket steht. Das fehlerfrei funktionierende fgsdev build_all benötigt bei mir rund 30 Minuten.

8. Weitere Module sind z.T. wesentlich leichter zu erstellen, z.B. geos-lib:

8.1 - fgsdev custom_build_list create geos-lib 8.2 - fgsdev build_all

9. Abschließendes Erzeugen einer fgs-Umgebung:

Alle fertigen Module werden als tar.gz in fgs-dev/modules gesammelt. Wenn alle notwendigen Module erstellt sind, wird eine Basis fgs-Umgebung mit folgendem Befehl erstellt:

9.1 fgsdev installer

Das zu erstellende Verzeichnis heißt in diesem Fall /home/fgs/fgs/. Es kann aber auch anders genannt werden.

Um gleich Module mit zu installieren, sollte der Befehl erweitert werden:

fgsdev installer mapserver-php
   

9.2 Mit dem Installieren der fgs-Umgebung wird der Apache gestartet. Der sollte gleich wieder gestoppt werden, denn es sind noch einige Änderungen vorzunehmen:

cd ..
cd fgs
fgs stop

10. Um eine kvwmap-lauffähige fgs-Umgebung zu bekommen, sind noch Nacharbeiten zu leisten.

10.1 Das Nachinstallieren von Modulen, die mit fgsdev installer <modulname> nicht mit installiert wurden, aber trotzdem im Ordner fgs-dev/modules entstanden sind, kann mit folgendem Befehl erfolgen:

fgs install module-name:version from-where
    

Ich habe folgende Module nachinstalliert:

fgs install php_mysql-module:4.4.2 /home/fgs/fgs-dev/modules
fgs install php_pgsql-module:4.4.2 /home/fgs/fgs-dev/modules
fgs install postgresql-server:8.0.7 /home/fgs/fgs-dev/modules
fgs install php_curl-module:4.4.2 /home/fgs/fgs-dev/modules

10.2 PostGIS-Unterstützung habe ich bekommen, indem ich das Modul postgis-base mit geos-2.2.3 und postgis-1.3.1 erzeugt habe:

- cd /home/fgs/fgs_dev

- . setenv.sh

- fgsdev custom_build_list create postgis-lib
- postgis-Quellen und geos-Quellen manuell installiert
- in fgs-dev/pkg_def/postgis/fgs_build folgendes geändert:
     statt 
       --with-pgsql-src=`grep "^postgresql:" $FGS_CUSTOM_BUILD_FILE | cut -d: -f4`
     das:
       --with-pgsql=$FGS_BUILD_HOME/postgresql/bin/pg_config

- fgsdev build_all

- cd /home/fgs/fgs
- fgs install postgis-lib:1.0.6 /home/fgs/fgs-dev/modules
  (das Modul wird merkwürdigerweise 1.0.6 genannt)
            
Hinweis: Für das Modul postgis-lib habe ich postgis-1.3.1 und die von Stefan Rahn geänderte shp2pgsql.c genommen.
Hinweis: Mit postgis-1.2.1 gab es einen Fehler. Die Datenbanken wurden mit USE_PROJ = 0 angelegt. Deswegen musste auf postgis-1.3.1 gegangen werden.
Hinweis: Für das Paket postgis im Modul postgis-lib musste ich byacc nachinstallieren.
Hinweis: Das Modul postgis-lib funktionierte nicht mit der standardmäßig angebotenen geos-3.0.0rc4.

10.3 Die php-Datei wird (bei mir) merkwürdigerweise (?) nicht ins cgi-bin-Verzeichnis kopiert. Ich habe sie aus fgs-dev/built/php/bin in fgs/www/cgi-bin kopiert.

10.4 Der Ordner fgs/www/lib/php musste in php4 umbenannt werden.

10.5 Das Verzeichnis fgs/www/libexec wird (bei mir) nicht angelegt und die Datei libphp4.so nicht dorthin kopiert. Ich habe das Verzeichnis angelegt und die Datei aus fgs-dev/built/apache/libexec kopiert.

10.6 Änderungen in fgs/www/conf.d/php.conf: Ich habe folgendes nachgetragen:

LoadModule php4_module        libexec/libphp4.so
      

10.7 In der Datei fgs/www/conf/php4.ini.template musste ich die Extensions extension=mysql.so und extension=pgsql.so nachträglich eintragen. Achtung: In der php4.ini.template ist der extension_dir relativ von FGS_HOME angegeben. Damit das klappt, muss vor jedem Start von FGS sichergestellt werden, dass die Systemvariablen gesetzt sind. Dazu muss im fgs-Verzeichnis ". setenv.sh" ausgeführt werden. Sonst kommt folgende Fehlermeldung bei phpinfo():

Unable to load dynamic library \
'/home/fgs/fgs-dev/built/php/lib/php/extensions/no-debug-non-zts-20020429/php_mapscript.so' 

10.8 Änderungen in weiteren üblichen Verdächtigen, z.B.:

  • fgs/apps/pgsql/data/pg_hba.conf
  • fgs/apps/pgsql/data/postgresql.conf
(listen_addresses = '*')
  • fgs/www/conf/httpd.conf
(LoadModule mysql_auth_module /home/fgs/fgs/www/lib/mod_auth_mysql.so)
  • fgs/www/conf/php.ini.template
(magic_quotes_gpc = Off)
(max_execution_time = 3600)


10. Um die fgs-Umgebung zu starten, werden folgende Befehle ausgeführt:

. setenv.sh
 (setzt die fgs-Umgebungsvariablen, sehr wichtig!)
       
fgs start
 (startet apache und postgresql)
Hinweis: fgs stoppt man mit
fgs stop
Man kann auch nur den Apache oder nur die Postgresql stoppen/starten:
fgs stop pgsql
fgs start pgsql
fgs stop apache
fgs start apache

Jeder Klügere ist hiermit eingeladen, obenstehende Beschreibung zu verbessern.