Apache2.2.2 + PersistentPerl2.22 on Cygwin

Cygwin版apache2は、プログラム名がhttpd2,apxs2になっているが、PersistentPerlはhttpd,apxsだと決め打ちされているため、一発インストールができない。また、多少のコード修正が必要。

$ cpan
cpan> look PersistentPerl
$ ln -s /usr/sbin/apxs2 /usr/local/bin/apxs
$ cp src/PersistentMake.pl src/PersistentMake.pl.orig && vi src/PersistentMake.pl
$ diff -Naru src/PersistentMake.pl.orig src/PersistentMake.pl
--- src/PersistentMake.pl.orig  2006-06-21 15:14:48.309529600 -0700
+++ src/PersistentMake.pl       2006-06-21 15:25:18.425592000 -0700
@@ -381,7 +381,7 @@
 }

 sub find_httpd {
-    my $x = &apxs_query('SBINDIR') . '/httpd';
+    my $x = &apxs_query('SBINDIR') . '/httpd2';
     return -x $x ? $x : 'httpd';
 }

$ cp src/mod_persistentperl2.c src/mod_persistentperl2.c.orig && vi src/mod_persistentperl2.c
$ diff -Naru src/mod_persistentperl2.c.orig src/mod_persistentperl2.c
--- src/mod_persistentperl2.c.orig      2006-06-21 16:29:51.447729600 -0700
+++ src/mod_persistentperl2.c   2006-06-21 16:30:31.585444800 -0700
@@ -340,7 +340,9 @@
     const char *buf;
     apr_size_t len;
     apr_status_t rv;
-    APR_BRIGADE_FOREACH(e, bb) {
+    for (e = APR_BRIGADE_FIRST(bb);
+         e != APR_BRIGADE_SENTINEL(bb);
+         e = APR_BUCKET_NEXT(e)) {
         if (APR_BUCKET_IS_EOS(e)) {
             break;
         }
@@ -380,7 +382,7 @@
         return DECLINED;
     }

-    argv0 = apr_filename_of_pathname(r->filename);
+    argv0 = apr_filepath_name_get(r->filename);
     nph = !(strncmp(argv0, "nph-", 4));

     if (!(ap_allow_options(r) & OPT_EXECCGI) && !is_scriptaliased(r))
@@ -436,7 +438,7 @@
     if ((rv = default_build_command(&command, &argv, r, p)) != APR_SUCCESS) {
         ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, rv, r,
                       "don't know how to spawn child process: %s",
-                      apr_filename_of_pathname(r->filename));
+                      apr_filepath_name_get(r->filename));
         return HTTP_INTERNAL_SERVER_ERROR;
     }

@@ -445,7 +447,7 @@
                             command, argv, r, p)) != APR_SUCCESS) {
         ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, rv, r,
                       "couldn't spawn child process: %s",
-                     apr_filename_of_pathname(r->filename));
+                     apr_filepath_name_get(r->filename));
         return HTTP_INTERNAL_SERVER_ERROR;
     }

@@ -465,7 +467,9 @@
             return rv;
         }

-        APR_BRIGADE_FOREACH(bucket, bb) {
+        for (bucket = APR_BRIGADE_FIRST(bb);
+             bucket != APR_BRIGADE_SENTINEL(bb);
+             bucket = APR_BUCKET_NEXT(bucket)) {
             const char *data;
             apr_size_t len;

$ perl Makefile.PL
Compile mod_persistentperl (default no)? y
$ cp perperl_backend/xsinit.c perperl_backend/xsinit.c.orig && vi perperl_backend/xsinit.c
$ diff -Naru perperl_backend/xsinit.c.orig perperl_backend/xsinit.c
--- perperl_backend/xsinit.c.orig       2006-06-21 15:18:30.589152000 -0700
+++ perperl_backend/xsinit.c    2006-06-21 15:18:34.604926400 -0700
@@ -16,6 +16,5 @@
        {extern void perperl_xs_init(); perperl_xs_init();}
        /* DynaLoader is a special case */
        newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
-       newXS("::bootstrap", boot_, file);
        newXS("Win32CORE::bootstrap", boot_Win32CORE, file);
 }

$ rm /usr/local/bin/apxs

apr_filename_of_pathnameについて
/usr/share/doc/apr1-1.2.7/CHANGES: apr_filename_of_pathname -> apr_filepath_name_get
APR_BRIGADE_FOREACHについて
http://www.schumann.cx/docs/apr-util/group__APR__Util__Bucket__Brigades.html#a80

追記:で、動かなかったわけだこれが。