How to Build & Install PerlMapScript

Once you compile MapServer itself and can successfully run './mapserv' and get back:

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


        cd mapscript/perl 
        perl Makefile.PL 
        make install 

Changing the Perl Module Name

The default module name is "mapscript". However, you may want to use something version specific, especially if you have multiple versions installed. To do this:

    1) edit mapscript.i and change the line "%module mapscript" to "%module yourname", ie. "mapscript563".
    2) in plmodule.i. Look for lines of the form: "mapscript::RFC24_ADD_PARENT_REF(..." and change mapscript to "mapscript563::...".
    3) remove if it's present. SWIG will create and the presence of will confuse the install. 
    4) re-SWIG it (install SWIG and the type swig -shadow -perl5 mapscript.i) 
    5) edit Makefile.PL and change the line "'NAME' => 'mapscript'," to "'NAME' => 'yourname'," 
    6) build as normal 

You should now be able to do "use yourname" in your perl scripts.

What to Check When Encountering Build Issues

/sbin/ldconfig -v

will give information concerning the shared libraries present on your system.

ldd mapserv

Look for the path that is listed. Then make sure this path is part of your runtime library path, for this you have two options, assuming you're running Linux:

1- add the path to /etc/ and run 'ldconfig' as root


2- Use SetEnv LD_LIBRARY_PATH to specify this path in your apache httpd.conf


Will give information on the library path traversed when linking.

locate <library_name_ie._gd.h>

Will give location(s) of the specified filename.

Does the above information show a mixture of include files (different revisions of the same library).

If when running ./mapserv you receive the error message:

    mapserv:error while loading cannot open shared object file : No such file or directory. 

Run '/sbin/ldconfig -v | grep libproj'.

Which should return something similar to "" If not try reinstalling proj.4

If when running ./mapserv you recieve the error message:

    error while loading shared libraries :/usr/ undefined symbol: HTZlib_inflate 

Check /usr/lib and /usr/local/lib for a copy of w3c-libwww. If both have a copy then remove the copy in /usr/lib. The cleanest way to remove, is to 'rpm -q -a | grep w3c-libwww' & do 'rpm -e w3c-libwww-<version_number>'.

If when compiling you get an error:

    mapscript_wrap.c: In function `SWIG_GetPtr?': 
    mapscript_wrap.c:292: `sv_undef' undeclared (first use in this function) 

(followed by many more errors)

Find the DEFINE line in Makefile and add -DPERL_POLLUTE at the end.

Instead of compiling

(or at least as a starting point) install .

To Compile w/ Perl 5.8

(submitted by Joe Bussell) you must make a hand hack to the generated SWIG code in mapscript_wrap.c Specifically, the macro XS(boot_mapscript) must be declared if the PERL object is not declared. In my world line 431 which reads SWIGEXPORT(void) boot_mapscript(CV* cv); should be replaced with XS(boot_mapscript);

3.6.4 Compiles but Does NOT Run

Bails with Can't load '/usr/local/lib/perl5/site_perl/5.6.1/sun4-solaris-64int/auto/mapscript/' ...

(submitted by unknown user) Apparently, the flag "-lgd" isn't being placed in ../../perlvars and this is causing the problem. A rather simple, though barbaric, solution is to add this line:

    $libs .= " -lgd"; 

right before this in Makefile.PL:

    print $inc."\n"; 
    print $libs."\n"; 

Building Private MapScript (Shared ISP Machine)

When you are installing a private version of mapscript, there is a perl Makefile bug (at least on perl 5.6.1 and maybe later versions) that must be manually fixed to avoid conflict with installed version of libraries on the machine (in /usr/lib or /usr/local/lib)

In the the mapserver/mapscript/perl directory,

perl Makefile.PL PREFIX=/usr/home/myhomedir LIB=/usr/home/myhomedir/usr/local/lib
  • note: the PREFIX and LIB are needed to create your private version

and where /usr/home/myhomedir is my homedir and my privatedir are is built in /usr/home/myhomedir/usr/local

perl MakeMaker will create a canned Makefile template... and if you inspect the file, you will see:

    LDDLFLAGS = -shared -L/usr/local/lib 
    LDFLAGS = -Wl,-E -L/usr/local/lib 

and when change to:

    LDDLFLAGS = -shared -L/usr/home/myhomedir/usr/local/lib 
    LDFLAGS = -Wl,-E -L/usr/home/myhomedir/usr/local/lib 

and then

make make install

Mapscript *should* find your private copy of libgd (and other packages) and link to them. I learn this lesson the hard way, and I thought I'd better stick it in the wiki.

Private Perl Module Usage: When you try to "use mapserver;" in perl, you will have to add a "use lib ..." preceding that line.

    use lib("/usr/home/myhomedir/lib/site_perl"); 
    use mapscript; 

-mapsurfer 06/04/2003

Ways to Change the Perl @INC Path

As usual there are many ways to do it. You need to alter the default @INC array. You can use on first line of your script:

  1. !/usr/bin/perl -I/installs # puts /installs at front of @INC.

or: push @INC, '/installs'; # puts it at the end of @INC.

or: use lib '/installs/'; # not sure where this puts it.

But the order is important, if the two modules have identical names.

You might also try: require '/installs/gd-2.0.15';

Of course, to get mapserver to use the new GD you'll need to recompile it.


Last modified 13 years ago Last modified on May 19, 2010, 5:34:24 AM
Note: See TracWiki for help on using the wiki.