use ExtUtils::MakeMaker; if (shift(@ARGV) =~ /CCLIENT_DIR=(.*)/) { $CCLIENT_DIR = $1; } else { die "You need to specify the CCLIENT_DIR directory--read README\n"; } if (! -r "$CCLIENT_DIR/c-client.a") { die "CCLIENT_DIR $CCLIENT_DIR does not contain c-client.a\n"; } # # We want to turn Cclient.o (ours) plus the object files in the # $CCLIENT_DIR/c-client.a archive into a shared object. Simply # including both in the MakeMaker OBJECT list works fine for Linux # but under Digital UNIX, the combination of its ar and "ld -shared" # can't cope with simply "ar cr tmp.a Cclient.o .../c-client.a". # To get around that look at the contents of the c-client.a archive # and extract all .o files from it into the current directory. Then # we set OBJECT to be our Cclient.o plus all of those. Blech. # print "Examining archive file $CCLIENT_DIR/c-client.a...\n"; chomp(@contents = `ar t $CCLIENT_DIR/c-client.a`); @objects = grep(/\.o$/, @contents); print "Extracting object files from archive: ", join(", ", @objects), "\n"; system("ar", "x", "$CCLIENT_DIR/c-client.a", @objects); my $err = $? >> 8; if ($err) { print "Extraction failed: ar returned exit code $err\n", "Please extract them manually into the current directory\n", "edit Makefile.PL to remove this section of code and then rerun\n", " perl Makefile.PL\n"; exit 1; } print "Extraction was apparently successful\n"; WriteMakefile( NAME => "Mail::Cclient", VERSION_FROM => "Cclient.pm", INC => "-I$CCLIENT_DIR", LIBS => ["-lc"], OBJECT => "Cclient.o @objects" );