La version très attendue de mod_perl 2.0.9 fonctionnera avec pratiquement toutes les versions du serveur http 2.0.x, 2.2.x et 2.4.x d'Apache. C'est le support de 2.4.x qui est attendu depuis des années ! Ceci est d'autant plus important que CentOS 7 n'existe qu'en 64 bits et ne fournit que Apache 2.4. Pour utiliser mod_perl2 il fallait rester à Centos 6.x :-(
[ UPDATE: La version officielle de mod_perl 2.0.9 est disponible depuis le 18/juin/2015 ]
[ Mais en attendant les packages officiels la procédure ci-dessous reste valide ]
Steve Hay, le principal développer de mod_perl2, affirme que l'on est en phase de test ...
En attendant un package voici pour les impatients comment tester sous Linux (dans mon cas Centos 7) cette version bêta de mod_perl 2.0.9 (il y a encore quelques problèmes sous Windows, et Perl 5.22 n'est pas supporté).
# Il faut avoir de quoi compiler et bien-sur apache et ses fichiers de développement
yum group install "Development Tools"
yum install httpd httpd-devel
# Depuis le 19/juin/2015 on peut récupérer les sources ici
http://apache.org/dist/perl/
# Sinon on peut récupérer les source via SVN
svn checkout https://svn.apache.org/repos/asf/perl/modperl/trunk/ mod_perl-2.0.9
# Il ne faut pas etre root sinon le 'make test' echoue
# On prepare un Makefile, on compile, on teste
# Vérifier que /usr/bin/apxs existe (il vient du package httpd-devel)
# MP_TRACE=1 permet ensuite d'utiliser dans httpd.conf la directive PerlTrace
cd mod_perl-2.0.9
perl Makefile.PL MP_APXS=/usr/bin/apxs MP_TRACE=1
make
make test
# Si tout se passe bien on doit avoir une fin qui ressemble à
All tests successful.
Result: PASS
# Pour cette dernière commande il faut être root
su
make install
La commande suivante indique où sont les modules (mod_xxxxx.so) que Apache charge
/usr/bin/apxs -q LIBEXECDIR
C’est là que doit se trouver le nouveau module mod_perl.so qui est chargé dans la config du serveur web avec
LoadModule perl_module modules/mod_perl.so
Voir ce précédent ce post pour la configuration,
Affichage des articles dont le libellé est mod_perl. Afficher tous les articles
Affichage des articles dont le libellé est mod_perl. Afficher tous les articles
01 octobre 2014
mod_perl startup
Une fois que l'on a un couple {Apache2 + mod_perl2} adapté il faut faire une peu de configuration. Voici comment mettre en place mod_perl2 et verifier que tout marche.
Rappel: il faut au minimum mod_perl 2.0.9 pour Apache 2.4.x
1) Configurer Apache normalement pour qu'il affiche le fichier index.html de votre répertoire htdocs. Ceci est toujours utile de pouvoir servir des pages statiques sans faire appel à Perl.
NB: Inutile de configurer la partie cgi-bin, ou php ;-)
2) Quand l’étape #1 fonctionne ajouter cette simple ligne à la fin du fichier de configuration principale de apache (httpd.conf)
Include conf/mod_perl2.conf
Ainsi on ne touchera plus au fichier de configuration principal, on travaillera sur mod_perl2.conf, dont voici le contenu de départ :
LoadModule perl_module modules/mod_perl.so
# la ligne suivante n'est utile que si on a installé le module
# Apache2::Request qui utilise APR::Request qui utilise libapreq2
# yum install libapreq2
# cpanm APR::Request
# cpanm Apache2::Request
# (le but étant de ne plus utiliser CGI.pm)
LoadModule apreq_module modules/mod_apreq2.so
PerlPostConfigRequire /path/to/myCode/startup.pl
PerlOptions -SetupEnv
<Location /hello>
SetHandler perl-script
PerlResponseHandler Hello
PerlOptions +ParseHeaders
</Location>
a) On charge le module mod_perl (c'est lui qui importe Perl dans Apache)
b) On désigne un script Perl à exécuter au démarrage de Perl (voir plus bas)
c) On désactive l'importation de l'environnement dans le contexte de chaque requête (plus sûr et plus rapide)
d) On annonce que l'url /hello sera traitée par le module Perl Hello.pm
Ce module gèrera lui-même les headers et il sera exécuté en tant que "perl-script" (bien que ce soit forcement un module)
3) Le module Hello.pm est très simple à écrire et à comprendre :
package Hello;
use strict;
use warnings;
sub handler { # Le nom de la fonction est imposé
print "Content-type: text/plain\n\n";
print "Hello at : ". localtime . "\n";
return Apache2::Const::OK;
}
1;
On le stocke dans /path/to/myCode/Hello.pm
4) Le script startup.pl ressemble à ceci
use lib qw(/path/to/myCode); # voir "Attention #2" plus bas
use ModPerl::Util ();
use ModPerl::Registry ();
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::RequestUtil ();
use Apache2::ServerRec ();
use Apache2::ServerUtil ();
use Apache2::Connection ();
use Apache2::Log ();
use Apache2::Const -compile => ':common';
use APR::Table ();
use APR::Const -compile => ':common';
1;
Le plus important dans ce fichier est la première ligne car elle indique où seront vos modules Perl chargés de réponde aux requêtes. Les autres "use" préchargent des modules d'usage courant ce qui evitera de répéter ces "use" dans chaque module Perl.
Si vous devez ouvrir un accès à une base de donnée ce sera aussi dans ce script en utilisant Apache::DBI Exemple pour Postgresql
use Apache::DBI;
Apache::DBI->connect_on_init("dbi:Pg:dbname=myDB",
"myUSR",
"myPASS",
{AutoCommit => 1, RaiseError => 1, PrintError => 1}
);
Apache::DBI->setPingTimeOut("dbi:Pg:dbname=myDB", 30);
ATTENTION #1: Pour accéder à la base de donnée dans un module (handler) il faudra utiliser le classique $dbh = DBI->connect(...) Mais il faudra que tous les paramètres de connect() soit exactement les mêmes que ceux passé à connect_on_init();
ATTENTION #2: Dans le contexte de mod_perl2 "use FindBin;" ne marche pas comme espéré.
A la place il faudra faire ce genre de gymnastique:
use File::Basename;
our $PERLBASE;
BEGIN {
$PERLBASE = dirname( __FILE__ );
}
use lib $PERLBASE;
Dans tous les modules (handlers) vous pourrez accéder simplement à $::PERLBASE
Rappel: il faut au minimum mod_perl 2.0.9 pour Apache 2.4.x
1) Configurer Apache normalement pour qu'il affiche le fichier index.html de votre répertoire htdocs. Ceci est toujours utile de pouvoir servir des pages statiques sans faire appel à Perl.
NB: Inutile de configurer la partie cgi-bin, ou php ;-)
2) Quand l’étape #1 fonctionne ajouter cette simple ligne à la fin du fichier de configuration principale de apache (httpd.conf)
Include conf/mod_perl2.conf
Ainsi on ne touchera plus au fichier de configuration principal, on travaillera sur mod_perl2.conf, dont voici le contenu de départ :
LoadModule perl_module modules/mod_perl.so
# la ligne suivante n'est utile que si on a installé le module
# Apache2::Request qui utilise APR::Request qui utilise libapreq2
# yum install libapreq2
# cpanm APR::Request
# cpanm Apache2::Request
# (le but étant de ne plus utiliser CGI.pm)
LoadModule apreq_module modules/mod_apreq2.so
PerlPostConfigRequire /path/to/myCode/startup.pl
PerlOptions -SetupEnv
<Location /hello>
SetHandler perl-script
PerlResponseHandler Hello
PerlOptions +ParseHeaders
</Location>
a) On charge le module mod_perl (c'est lui qui importe Perl dans Apache)
b) On désigne un script Perl à exécuter au démarrage de Perl (voir plus bas)
c) On désactive l'importation de l'environnement dans le contexte de chaque requête (plus sûr et plus rapide)
d) On annonce que l'url /hello sera traitée par le module Perl Hello.pm
Ce module gèrera lui-même les headers et il sera exécuté en tant que "perl-script" (bien que ce soit forcement un module)
3) Le module Hello.pm est très simple à écrire et à comprendre :
package Hello;
use strict;
use warnings;
sub handler { # Le nom de la fonction est imposé
print "Content-type: text/plain\n\n";
print "Hello at : ". localtime . "\n";
return Apache2::Const::OK;
}
1;
On le stocke dans /path/to/myCode/Hello.pm
4) Le script startup.pl ressemble à ceci
use lib qw(/path/to/myCode); # voir "Attention #2" plus bas
use ModPerl::Util ();
use ModPerl::Registry ();
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::RequestUtil ();
use Apache2::ServerRec ();
use Apache2::ServerUtil ();
use Apache2::Connection ();
use Apache2::Log ();
use Apache2::Const -compile => ':common';
use APR::Table ();
use APR::Const -compile => ':common';
1;
Le plus important dans ce fichier est la première ligne car elle indique où seront vos modules Perl chargés de réponde aux requêtes. Les autres "use" préchargent des modules d'usage courant ce qui evitera de répéter ces "use" dans chaque module Perl.
Si vous devez ouvrir un accès à une base de donnée ce sera aussi dans ce script en utilisant Apache::DBI Exemple pour Postgresql
use Apache::DBI;
Apache::DBI->connect_on_init("dbi:Pg:dbname=myDB",
"myUSR",
"myPASS",
{AutoCommit => 1, RaiseError => 1, PrintError => 1}
);
Apache::DBI->setPingTimeOut("dbi:Pg:dbname=myDB", 30);
ATTENTION #1: Pour accéder à la base de donnée dans un module (handler) il faudra utiliser le classique $dbh = DBI->connect(...) Mais il faudra que tous les paramètres de connect() soit exactement les mêmes que ceux passé à connect_on_init();
ATTENTION #2: Dans le contexte de mod_perl2 "use FindBin;" ne marche pas comme espéré.
En effet $FindBin::Bin donne le point de démarrage du serveur Apache, pas celui de startup.pl.
A la place il faudra faire ce genre de gymnastique:
use File::Basename;
our $PERLBASE;
BEGIN {
$PERLBASE = dirname( __FILE__ );
}
use lib $PERLBASE;
Dans tous les modules (handlers) vous pourrez accéder simplement à $::PERLBASE
12 septembre 2014
APACHE 2.2 et Centos 7
Il y a de nombreuses raisons pour vouloir encore utiliser Apache 2.2 et de ne pas migrer vers Apache 2.4. L'une d'entre elles est l'utilisation de mod_perl2 qui ne fonctionne toujours pas correctement avec Apache 2.4.
Malheureusement l’installation d’Apache 2.2 sur centos 7 ne peut pas se faire avec yum car seule la version 2.4 est disponible. Voici comment procéder pour compiler Apache 2.2 et mod_perl2 sur centos 7 et mettre en place les fichiers nécessaires au démarrage de httpd 2.2 avec systemctl (aka systemd).
1) Il faut avoir les outils de développements
yum group install "Development Tools"
2) Puis on va sur http://www.us.apache.org/dist/httpd/ et on repère la version la plus récente de httpd-2.2
puis on la télécharge et on la décompresse :
wget http://www.us.apache.org/dist/httpd/httpd-2.2.29.tar.gz
tar xvf httpd-2.2.29.tar.gz
On compile et installe apache 2.2.x
On utilise --prefix pour ne pas installer apache par dessus l’éventuelle version 'officielle'.
cd httpd-2.2.29
./configure --prefix=/path/to/apache22
make
make install
On démarre apache (risque de conflit si une autre version utilise le port 80)
/path/to/apache22/bin/apachectl -k start
Et avec le browser ont doit avoir le classique « It works »
3) Pour compiler mod_perl et tester il y a plus de préparatifs ET une correction de bug:
(peut être certains des packages ci-dessous sont déjà sur votre machine)
yum install perl-ExtUtils-Embed
yum install perl-libwww-perl
yum install perl-CGI
yum install perl-Test-Simple
yum install perl-Linux-Pid
yum install expat
cd /usr/lib64
ln -s libexpat.so.1.x.0 libexpat.so.0
(Adaptez le version de libexpat à votre cas. Pour moi c'est 1.6.0)
4) On va sur http://apache.org/dist/perl/ repérer la dernière version de mod_perl2
puis on la télécharge et on la décompresse :
wget http://apache.org/dist/perl/mod_perl-2.0.8.tar.gz
tar xvf mod_perl-2.0.8.tar.gz
cd mod_perl-2.0.8
ATTENTION #1: Dans le fichier t/api/err_headers_out.t il faut remplacer à deux endroits:
if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION==6.00;
par
if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION>=6.00;
Enfin on peut exécuter la séquence standard :
perl Makefile.PL MP_APXS=/path/to/apache22/bin/apxs
make
make test
make install
NB: Le fait d'avoir installé apache 2.2.x dans un répertoire spécifique n'implique pas que toute la partie mod_perl aille aussi dans ce répertoire. Une partie ira dans apache/include et apache/module mais les modules perl iront dans /usr/local/lib64/perl5
5) Quand on compile soit même Apache on ne bénéficie pas des petits plus apportés par un package comme par exemple la mise en place du script de démarrage. Voici donc comment installer cela avec un Linux, comme centos os 7, qui utilise systemd (sytemctrl) à la place les scripts init.d. On va créer deux fichiers :
a) Le premier est /etc/sysconfig/httpd22
Il sert à configurer l’environnement et les paramètres à passer au daemon httpd.
OPTIONS="-f /path/to/conf/httpd22.conf"
LANG=C
b) Le second /etc/systemd/system/httpd22.service
Il est utilisé par systemd pour exécuter les commandes start/reload/stop et il fait référence au fichier créé ci-dessus.
[Unit]
Description=The Apache HTTP Server 2.2.x
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=simple
KillMode=none
PIDFile=/path/to/apache22/logs/httpd.pid
EnvironmentFile=/etc/sysconfig/httpd22
ExecStart=/path/to/apache22/bin/httpd -DFOREGROUND $OPTIONS
ExecStop=/path/to/apache22/bin/httpd -k stop $OPTIONS
ExecReload=/path/to/apache22/bin/httpd -k restart $OPTIONS
[Install]
WantedBy=multi-user.target
NB: C'est apache qui gère le fichier .pid. Par défaut il est avec les logs de apache, mais on peut changer sa position avec la directive PidFile. Dans ce cas il faut adapter le PIDFile=... dans notre fichier httpd22.service
Après avoir créé ces deux fichiers (et avoir un fichier httpd.conf correct) faire
systemctl daemon-reload
systemctl start httpd22
systemctl status httpd22
Si tout est ok rendre le démarrage automatique
systemctl enable httpd22
Ces 2 fichiers cohabitent très bien avec ceux de httpd 2.4. Si les eux doivent s’exécuter en même temps il faut faire en sorte qu'ils n'utilisent pas le même port en changeant le paramètre "listen 80" dans la config de l'un ou de l'autre.
/path/to/apache22/lib
Après quoi on exécute ldconfig pour que ce nouveau chemin soit pris en compte.
Enjoy 2.2 ;-)
Malheureusement l’installation d’Apache 2.2 sur centos 7 ne peut pas se faire avec yum car seule la version 2.4 est disponible. Voici comment procéder pour compiler Apache 2.2 et mod_perl2 sur centos 7 et mettre en place les fichiers nécessaires au démarrage de httpd 2.2 avec systemctl (aka systemd).
1) Il faut avoir les outils de développements
yum group install "Development Tools"
2) Puis on va sur http://www.us.apache.org/dist/httpd/ et on repère la version la plus récente de httpd-2.2
puis on la télécharge et on la décompresse :
wget http://www.us.apache.org/dist/httpd/httpd-2.2.29.tar.gz
tar xvf httpd-2.2.29.tar.gz
On compile et installe apache 2.2.x
On utilise --prefix pour ne pas installer apache par dessus l’éventuelle version 'officielle'.
cd httpd-2.2.29
./configure --prefix=/path/to/apache22
make
make install
On démarre apache (risque de conflit si une autre version utilise le port 80)
/path/to/apache22/bin/apachectl -k start
Et avec le browser ont doit avoir le classique « It works »
3) Pour compiler mod_perl et tester il y a plus de préparatifs ET une correction de bug:
(peut être certains des packages ci-dessous sont déjà sur votre machine)
yum install perl-ExtUtils-Embed
yum install perl-libwww-perl
yum install perl-CGI
yum install perl-Test-Simple
yum install perl-Linux-Pid
yum install expat
cd /usr/lib64
ln -s libexpat.so.1.x.0 libexpat.so.0
(Adaptez le version de libexpat à votre cas. Pour moi c'est 1.6.0)
4) On va sur http://apache.org/dist/perl/ repérer la dernière version de mod_perl2
puis on la télécharge et on la décompresse :
wget http://apache.org/dist/perl/mod_perl-2.0.8.tar.gz
tar xvf mod_perl-2.0.8.tar.gz
cd mod_perl-2.0.8
ATTENTION #1: Dans le fichier t/api/err_headers_out.t il faut remplacer à deux endroits:
if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION==6.00;
par
if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION>=6.00;
Enfin on peut exécuter la séquence standard :
perl Makefile.PL MP_APXS=/path/to/apache22/bin/apxs
make
make test
make install
NB: Le fait d'avoir installé apache 2.2.x dans un répertoire spécifique n'implique pas que toute la partie mod_perl aille aussi dans ce répertoire. Une partie ira dans apache/include et apache/module mais les modules perl iront dans /usr/local/lib64/perl5
5) Quand on compile soit même Apache on ne bénéficie pas des petits plus apportés par un package comme par exemple la mise en place du script de démarrage. Voici donc comment installer cela avec un Linux, comme centos os 7, qui utilise systemd (sytemctrl) à la place les scripts init.d. On va créer deux fichiers :
a) Le premier est /etc/sysconfig/httpd22
Il sert à configurer l’environnement et les paramètres à passer au daemon httpd.
OPTIONS="-f /path/to/conf/httpd22.conf"
LANG=C
b) Le second /etc/systemd/system/httpd22.service
Il est utilisé par systemd pour exécuter les commandes start/reload/stop et il fait référence au fichier créé ci-dessus.
[Unit]
Description=The Apache HTTP Server 2.2.x
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=simple
KillMode=none
PIDFile=/path/to/apache22/logs/httpd.pid
EnvironmentFile=/etc/sysconfig/httpd22
ExecStart=/path/to/apache22/bin/httpd -DFOREGROUND $OPTIONS
ExecStop=/path/to/apache22/bin/httpd -k stop $OPTIONS
ExecReload=/path/to/apache22/bin/httpd -k restart $OPTIONS
[Install]
WantedBy=multi-user.target
NB: C'est apache qui gère le fichier .pid. Par défaut il est avec les logs de apache, mais on peut changer sa position avec la directive PidFile. Dans ce cas il faut adapter le PIDFile=... dans notre fichier httpd22.service
Après avoir créé ces deux fichiers (et avoir un fichier httpd.conf correct) faire
systemctl daemon-reload
systemctl start httpd22
systemctl status httpd22
Si tout est ok rendre le démarrage automatique
systemctl enable httpd22
Ces 2 fichiers cohabitent très bien avec ceux de httpd 2.4. Si les eux doivent s’exécuter en même temps il faut faire en sorte qu'ils n'utilisent pas le même port en changeant le paramètre "listen 80" dans la config de l'un ou de l'autre.
ATTENTION #2: Quand on se compile un programme (comme ici Apache 2.2) avec ses propres répertoires d'installation on se retrouve avec des fichiers .h ou des librairies à des endroits non standards. Ceci peut poser problèmes par la suite.
Par exemple, si pour utiliser mod_perl on veut installer la librairies Apache2::Request, qui utilise APR::Request, qui est une interface avec la librairie C libapreq2.so, il faudra que le programme d'installation de APR::Request trouve libapreq2.so dans le répertoire ou on a installé notre version d'Apache.
La solution la plus élégante est d'ajouter un fichier apache22.conf dans le répertoire /etc/ld.so.conf.d/ . Ce fichier contiendra juste une ligne du type:
/path/to/apache22/lib
Après quoi on exécute ldconfig pour que ce nouveau chemin soit pris en compte.
Enjoy 2.2 ;-)
01 août 2014
DBD-pg ActiveState & MSVC2013
Dernière étape de notre périple : compiler le driver DBI pour postgresql 9.3 sous Windows.
On suppose que sont déjà installés ces 3 logiciels :
- Visual C/C++ (MSVC 2013) (la version gratuite dite 'express' est suffisante)
- Perl d’ActiveState 5.16 (vous devez pouvoir l’exécuter depuis la ligne de commande)
- PostgreSQL 9.3.x (vous devez pouvoir vous y connecter en local)
(les versions sont données à titre indicatif. Il peut y avoir de variations)
puis décompacter les sources de DBD-pg 3.x
Ouvrir une ligne de commande (cmd.exe) à la racine des sources de DBD-pg
et taper ces 3 commandes:(à adapter suivant les versions de Postgres et de VC)
NB: Si vous utilisez Postgresql 9.0 ou + récent, il faut que ce rôle ai les droits de superviseur sur la base ‘test’.
Adaptez si nécessaire et taper ces 3 commandes :
Failed test 'Dollar quotes with invalid characters are not parsed as identifier
C’est parce que les messages d’erreurs de postgresql ne sont pas en Anglais !
Le test attend « syntax error » et il trouve « erreur de syntaxe », et ça lui va pas...
Pour passer les messages du serveur postgresql en anglais :
Éditer le fichier postgresql.conf (il est dans le répertoire data) et remplacer
lc_messages = 'French_France.1252'
par
lc_messages = 'en_EN.utf8'
Truc : Pour passer la console Windows en UTF8 taper la commande
chcp 65001
Pour que le changement dans postgresql.conf prenne effet arrêter/redémarrer le serveur postgresql depuis une console en admin :
* Que faire si vous avez l’erreur suivante ?
error: permission denied for relation pg_largeobject
Depuis PostgreSQL 9.0 il faut être superuser de la base pour accéder à pg_largeobject.
L’erreur est donc normale si le user ‘test’ n’est pas superuser ET si c'est au moins posgres 9. Vous pouvez lui donner ce droit, refaire les tests.
* Si tout se passe bien ça finit par
Partez pas !
Il reste à supprimer la base de donnée et le rôle utilisé pour les tests.
On suppose que sont déjà installés ces 3 logiciels :
- Visual C/C++ (MSVC 2013) (la version gratuite dite 'express' est suffisante)
- Perl d’ActiveState 5.16 (vous devez pouvoir l’exécuter depuis la ligne de commande)
- PostgreSQL 9.3.x (vous devez pouvoir vous y connecter en local)
(les versions sont données à titre indicatif. Il peut y avoir de variations)
1) Préparer le Makefile de DBD-pg
Télécharger ici : http://search.cpan.org/~turnstep/DBD-Pg/puis décompacter les sources de DBD-pg 3.x
Ouvrir une ligne de commande (cmd.exe) à la racine des sources de DBD-pg
et taper ces 3 commandes:(à adapter suivant les versions de Postgres et de VC)
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"Si les environnements VC, Perl et PostgreSQL sont corrects tout se passe bien.
"C:\Program Files (x86)\PostgreSQL\9.3\pg_env.bat"
perl Makefile.PL
2) Compilation de DBD-pg
Taper la commandenmakeSi vous avez l’erreur 'C:\Program' is not recognized as an internal or external command, operable program or batch file. Voir dans l’article sur la compilation de mod_perl comment le corriger.
3) Tests de DBD-pg
Avant de lancer les tests il faut créer un rôle de connexion ‘test’ et une base de donnée ‘test’ appartenant au rôle ‘test’NB: Si vous utilisez Postgresql 9.0 ou + récent, il faut que ce rôle ai les droits de superviseur sur la base ‘test’.
Adaptez si nécessaire et taper ces 3 commandes :
Set DBI_DSN=dbi:Pg:dbname=testPuis lancer les tests :
Set DBI_USER=test
Set DBI_PASS=xxxx
nmake test* Si vous avez des caractères ou des texte bizarres et/ou si vous avez des erreurs du type
Failed test 'Dollar quotes with invalid characters are not parsed as identifier
C’est parce que les messages d’erreurs de postgresql ne sont pas en Anglais !
Le test attend « syntax error » et il trouve « erreur de syntaxe », et ça lui va pas...
Pour passer les messages du serveur postgresql en anglais :
Éditer le fichier postgresql.conf (il est dans le répertoire data) et remplacer
lc_messages = 'French_France.1252'
par
lc_messages = 'en_EN.utf8'
Truc : Pour passer la console Windows en UTF8 taper la commande
chcp 65001
Pour que le changement dans postgresql.conf prenne effet arrêter/redémarrer le serveur postgresql depuis une console en admin :
sc stop postgresql-9.3
sc start postgresql-9.3
* Que faire si vous avez l’erreur suivante ?
error: permission denied for relation pg_largeobject
Depuis PostgreSQL 9.0 il faut être superuser de la base pour accéder à pg_largeobject.
L’erreur est donc normale si le user ‘test’ n’est pas superuser ET si c'est au moins posgres 9. Vous pouvez lui donner ce droit, refaire les tests.
* Si tout se passe bien ça finit par
...
t/99cleanup.t ....... 1/1 Removing test database directory
t/99cleanup.t ....... ok
All tests successful.
Files=16, Tests=2089, 21 wallclock secs
Result: PASS
4) Installation de DBD-pg
Dernière commande:nmake installIl s’agit juste de copier des fichiers donc pas de problèmes attendus.
Partez pas !
Il reste à supprimer la base de donnée et le rôle utilisé pour les tests.
31 juillet 2014
mod_perl ActiveState & MSVC 2013
Après ce mémo sur compilation de Apache 2.2.x avec MSCV 2013 voici la compilation de mod_perl 2.0.x en utilisant le perl de ActiveState. (Avec Strawberry c’est encore plus compliqué car il utilise le compilateur gcc de MinGW)
Le Perl utilisé doit être au minimum 5.8.2 et être compilé avec les options usethreads , useithreads et usemultiplicity. Pour le vérifier taper: perl –V:uses.+
En théorie il suffit de 4 commandes pour installer mod_perl
1) Première étape, premier bug
Télécharger les sources de mod_perl 2.0.x ici : http://apache.org/dist/perl/
Assurez vous d’avoir le Perl et le bin de msvc dans le PATH puis, depuis la racine des sources de mod_perl, tapez ces 3 commandes:
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
set MP_USE_MY_EXTUTILS_EMBED=1
perl Makefile.PL MP_AP_PREFIX=\Path\to\Apache2.2.x
Premier problèmes; Vous n’avez pas la librairie apxs.
Il propose de la télécharger, mais l’url est invalide.
Install apxs now? [yes]
Download of http://perl.apache.org/dist/win32-bin/apxs_win32.tar.gz failed
La bonne url est: https://archive.apache.org/dist/perl/win32-bin/apxs_win32.tar.gz
Il faut éditer le fichier build\win32_fetch_apxs et remplacer
my $remote = 'http://perl.apache.org/dist/win32-bin/' . $file;
par
my $remote = 'https://archive.apache.org/dist/perl/win32-bin/' . $file;
Cette fois le commande perl Makefile.PL MP_AP_PREFIX=\Path\to\Apache2.2.x doit aboutir.
2) Deuxième étape (compilation), deuxième bug
L'étape suivante consiste à exécuter (toujours depuis la racine des sources de mod_perl)
'C:\Program' is not recognized as an internal or external command, operable program or batch file.
NMAKE : fatal error U1077: 'cd' : return code '0x1'
Stop.
Il faudrait éditer le fichier Makefile et ajouter les quotes au path de MAKE.
MAKE = “C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\nmake.exe”
mais ce bug est dans tous les Makefile des sous répertoires. Au total cela en fait plus de 60 !
La solution que j’utilise est d'éditer le module \Perl\lib\ActivePerl\Config.pm et d’ajouter des quotes autour de $prog
3) Troisième étape (tests), troisième bug
Solution: Dans le fichier t\api\err_headers_out.t il faut remplacer à deux endroits:
if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION==6.00;
par
if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION>=6.00;
Avec ces 2 modifs on peut exécuter nmake test sans avoir d'erreurs.
4) Dernière étape
Le Perl utilisé doit être au minimum 5.8.2 et être compilé avec les options usethreads , useithreads et usemultiplicity. Pour le vérifier taper: perl –V:uses.+
En théorie il suffit de 4 commandes pour installer mod_perl
perl Makefile.PL MP_AP_PREFIX=\Path\to\Apache2.2.xMalheureusement il y a quelques bugs…
nmake
nmake test
nmake install
1) Première étape, premier bug
Télécharger les sources de mod_perl 2.0.x ici : http://apache.org/dist/perl/
Assurez vous d’avoir le Perl et le bin de msvc dans le PATH puis, depuis la racine des sources de mod_perl, tapez ces 3 commandes:
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
set MP_USE_MY_EXTUTILS_EMBED=1
perl Makefile.PL MP_AP_PREFIX=\Path\to\Apache2.2.x
Premier problèmes; Vous n’avez pas la librairie apxs.
Il propose de la télécharger, mais l’url est invalide.
Install apxs now? [yes]
Download of http://perl.apache.org/dist/win32-bin/apxs_win32.tar.gz failed
La bonne url est: https://archive.apache.org/dist/perl/win32-bin/apxs_win32.tar.gz
Il faut éditer le fichier build\win32_fetch_apxs et remplacer
my $remote = 'http://perl.apache.org/dist/win32-bin/' . $file;
par
my $remote = 'https://archive.apache.org/dist/perl/win32-bin/' . $file;
Cette fois le commande perl Makefile.PL MP_AP_PREFIX=\Path\to\Apache2.2.x doit aboutir.
2) Deuxième étape (compilation), deuxième bug
L'étape suivante consiste à exécuter (toujours depuis la racine des sources de mod_perl)
nmakeMais ça ne marche pas car on obtient :
'C:\Program' is not recognized as an internal or external command, operable program or batch file.
NMAKE : fatal error U1077: 'cd' : return code '0x1'
Stop.
Il faudrait éditer le fichier Makefile et ajouter les quotes au path de MAKE.
MAKE = “C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\nmake.exe”
mais ce bug est dans tous les Makefile des sous répertoires. Au total cela en fait plus de 60 !
La solution que j’utilise est d'éditer le module \Perl\lib\ActivePerl\Config.pm et d’ajouter des quotes autour de $prog
for (@make) {Mais en ajoutant ces quotes on rend une expression régulière invalide. Il faut éditer \Perl\lib\ExtUtils\MM_Win32.pm et corriger la fonction is_make_type() en supprimant le $ de la fin de l’expression régulière
if (my $prog = _find_prog($_)) {
$_[0] = $OVERRIDE{$key} = "\"$prog\"";
sub is_make_type {Avec ces 2 modifs on peut exécuter nmake sans avoir d'erreurs.
my($self, $type) = @_;
return !! ($self->make =~ /\b$type(?:\.exe)?$/);
}
3) Troisième étape (tests), troisième bug
nmake testLe daemon httpd.exe va être exécuté, certains tests ne sont pas exécutés s’il manque des dépendances mais certains vont échouer (en tout cas avec la version mod_perl 2.0.8) !
t/api/err_headers_out.t (Wstat: 0 Tests: 6 Failed: 3)
Failed tests: 2-3, 5
Files=1, Tests=6, 2
Result: FAIL
Failed 1/1 test programs. 3/6 subtests failed.
Solution: Dans le fichier t\api\err_headers_out.t il faut remplacer à deux endroits:
if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION==6.00;
par
if defined HTTP::Headers->VERSION and HTTP::Headers->VERSION>=6.00;
Avec ces 2 modifs on peut exécuter nmake test sans avoir d'erreurs.
4) Dernière étape
nmake installet ça marche (enfin) !
28 juillet 2014
Apache 2.2 & MSVC 2013

La branche 2.2.x du serveur http d’Apache a une importance particulière car mod_perl y fonctionne correctement ce qui n’est pas le cas avec la nouvelle branche 2.4. Apache 2.2, bien qu'encore supporté, commence à dater. La version 2.2.0 date de décembre 2005. Depuis, les compilateurs ont évolués et des problèmes commencent à apparaitre. C’est le cas avec Visual Studio 2013 et sa « Plateform Toolset v120 ».
Voici ce qu’il faut corriger pour pouvoir compiler le serveur http 2.2 d'Apache avec MSVC 2013.
1) Télécharger
- Les sources du serveur http 2.2.xx d’Apache depuis : http://www.apache.org/dist/httpd/
- Les sources de APR-iconv. Les librairies pcre, APR et AP-utils sont incluses avec les sources de Apache mais pas APR-iconv car les systèmes Unix fournissent déjà iconv() . Pour Windows ce n’est pas le cas, il faut donc télécharger cette librairie et la mettre dans le répertoire srclib sous le nom apr-iconv (sans aucun numéro de version). On trouve cette librairie ici : https://apr.apache.org/download.cgi
- awk est utilisé pour générer la configuration du serveur (httpd.conf). On peut le télécharger ici http://sourceforge.net/projects/gnuwin32/files/gawk/ sous le nom de gawk.
2) Environnement
Le PATH doit inclure un chemin sur awk.exe et sur les binaires de MSVCC:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin.
Ouvrir une console (cmd) dans le répertoire contenant les sources d'Apache.
Exécuter le script "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
3) Compiler
Normalement il suffirait de taper la commandenmake -f Makefile.win
mais ça ne marche pas car on obtient 5 erreurs du type:
pr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedXxxx referenced in function _apr_atomic_inc32@xx
Les 5 erreurs sont:
Creating library .\Release\libapr-1.lib and object .\Release\libapr-1.exp
apr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedIncrement referenced in function _apr_atomic_inc32@4
apr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedExchangeAdd referenced in function _apr_atomic_add32@8
apr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedExchange referenced in function _apr_atomic_set32@8
apr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedDecrement referenced in function _apr_atomic_dec32@4
apr_atomic.obj : error LNK2019: unresolved external symbol __InterlockedCompareExchange referenced in function _apr_atomic_cas32@12
.\Release\libapr-1.dll : fatal error LNK1120: 5 unresolved externals
NB; Ce problème n’apparait pas si on génère une version 64 bits d’apache.
4) Error LNK2019
Pour corriger cette erreur il faut éditer le fichier srclib\apr\atomic\win32\apr_atomic.c et mettre en commentaire (ou supprimer) tous les casts tel que celui-ci (il y en a 9 en tout) :#else
return ( /*(apr_atomic_win32_ptr_ptr_ptr_fn)*/ InterlockedCompareExchange)(mem, with, cmp);
#endif
(apr_atomic_win32_xxxx) est mis en commentaire 10 fois.
NB: Ceci supprimera les erreurs mais en échange on aura 7 warnings C4047 et 5 warnings C4024 à la compilation.
5) Error LNK2011
A ce stade, si on tentait à nouveau de compiler on obtiendrait cette nouvelle erreur :adobe-stdenc.obj : error LNK2011: precompiled object not linked in; image may not run
..\Release\iconv\adobe-stdenc.so : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\link.EXE"' : return code '0x460'
Stop.
Cette erreur, de manière générale, vient du fait que
1. un fichier xxxx.c est compilé pour créer un fichier xxxx.pch,
2. ce fichier xxxx.pch est utilisé pour compiler d’autres fichiers .c
3. au moment de l’édition de lien xxxx.obj n’est pas utilisé
(Détail ici: http://msdn.microsoft.com/en-us/library/3ay26wa2.aspx)
La solution générique a cette erreur consiste donc à ajouter xxxx.obj à la liste des fichiers obj au moment de l’édition des liens.
Dans le cas de Apache 2.2.x, éditer le fichier srclib\apr-iconv\build\modules.mk.win, localiser cette règle et y ajouter la partie surlignée en vert.
.c{$(OUTPUT_DIR)}.so:
$(SILENT)cl $(ALL_CFLAGS) /Fo$*.obj /Yuiconv.h /c $<
$(SILENT)link $(ALL_LDFLAGS) $(MODRES).obj $*.obj $(API_LIBS) /out:$@ \
/base:@"..\build\BaseAddr.ref",$(@F)
Pour comprendre il faut bien voir que $(ALL_CFLAGS) utilisé à chaque compilation contient ... /Fd$(MODRES).pdb /Fp$(MODRES).pch ...
6) Compiler (pour de bon)
Une fois ces erreurs corrigées on peut lancer depuis la racine des sourcesnmake -f Makefile.win (pour seulement compiler)
ou
nmake –f Makefile.win installr (pour compiler et installer dans C:\Apache22)
Le répertoire d’installation peut être spécifié avec le paramètre INSTDIR
nmake -f Makefile.win INSTDIR="D:\my\Path\Apache" installr
Regardez les commentaires au début du fichier Makefile.win pour découvrir les différents paramètres pouvant être utilisés pour customiser la compilation et/ou l’installation.



