/usr/local/CPAN/PLJava/Makefile.PL
#!/usr/bin/perl -w
use strict qw(vars) ;
require 5.006 ;
use ExtUtils::MakeMaker ;
use ExtUtils::Embed ;
use Config ;
use File::Copy ;
no warnings ;
BEGIN
{
eval { require File::Spec::Functions ; File::Spec::Functions->import() } ;
if ($@)
{
*catfile = sub { return "$_[0]/$_[1]" }
}
}
if ( $ARGV[0] =~ /renametree/i ) {
renametree( $ARGV[1] , $ARGV[2] ) ;
exit;
}
########
# NAME #
########
my $NAME = 'PLJava' ;
my $VERSION = '0.04' ;
my $JAVA_PACKAGE = 'perl5' ;
#######
# EXT #
#######
my $dll = ".$Config{so}" ;
my $o = $Config{_o};
my $LIBNAME = ($dll =~ /\.(?:so|o)$/) ? "lib$NAME" : $NAME ;
#########
# FILES #
#########
my $C_FILES = "$NAME.c ${NAME}_wrap.c" ;
my $O_FILES = "$NAME$o ${NAME}_wrap$o" ;
my $INTERFACE = "$NAME.i" ;
my $CLEAN_FILES = "$LIBNAME$dll" ;
my $CLEAN_SWIG_FILES = "$NAME.java ${NAME}_wrap.c ${NAME}JNI.java" ;
my $JAVA_FILES = '' ;
#opendir (DIRLOG, '.');
#while (my $filename = readdir DIRLOG) { $JAVA_FILES .= " $filename" if $filename =~ /\.java$/ ;}
#closedir (DIRLOG);
#############
# CHECK ENV #
#############
{
if ( -d $ENV{JAVA_HOME} ) {
$ENV{JAVA_BIN} = $ENV{JAVA_HOME} . "/bin" if !defined $ENV{JAVA_BIN} ;
$ENV{JAVA_INCLUDE} = $ENV{JAVA_HOME} . "/include" if !defined $ENV{JAVA_INCLUDE} ;
}
my $error ;
foreach my $envs_i ( qw(JAVA_HOME JAVA_BIN JAVA_INCLUDE) ) {
if ( !-d $ENV{$envs_i} ) { warn("Can't find $envs_i!\n") ; $error = 1 ;}
}
die "\n** Can't create Makefile, please set right the JAVA enverioment variables!\n" if $error ;
}
########
# VARS #
########
my $debug = 0;
my $pccflags = ccopts;
my $pldflags = ldopts;
my $ld = $Config{ld};
my $cc = $Config{cc};
my $javac = $ENV{JAVA_BIN} ? $ENV{JAVA_BIN} . "/javac" : "javac" ;
my $javabin = $ENV{JAVA_BIN} ? $ENV{JAVA_BIN} . "/java" : "java" ;
chomp($pldflags) ;
if ( $^O =~ /(?:win32|dos)/i ) {
$javac =~ s/\//\\/g ;
$javabin =~ s/\//\\/g ;
}
my( $out, $ccdebug, $lddebug , $ldlnk , $warn, $rm, $mv );
my $is_MSVC = $cc =~ m/^cl/;
if( $is_MSVC ) {
$out = '-out:';
$ccdebug = $debug ? '-Zi ' : '';
$lddebug = $debug ? '-debug ' : '-release ';
$warn = '-W3';
$ldlnk = '' ;
} else {
$out = '-o ';
$ccdebug = $debug ? '-g ' : '';
$lddebug = $debug ? '' : '-s ';
$warn = '-Wall -Wno-comments ';
$ldlnk = ' -shared' ;
}
$rm = $^O eq 'MSWin32' ? '$(PERL) -MExtUtils::Command -e rm_f' : 'rm';
$mv = $^O eq 'MSWin32' ? '$(PERL) -MExtUtils::Command -e mv' : 'mv';
my $cflags = "$ccdebug$warn$pccflags";
my $ldflags = "$lddebug$pldflags$ldlnk";
my $includes = $ENV{JAVA_INCLUDE} ? qq`-I"$ENV{JAVA_INCLUDE}"` : '' ;
for my $os ( qw(win32 linux) ) {
my $dir = "$ENV{JAVA_INCLUDE}/$os" ;
$includes .= qq` -I"$dir"` if -d $dir ;
}
##################
# CREATE LIB DIR #
##################
#################
# WRITEMAKEFILE #
#################
print "Writing Makefile for $NAME\n";
open OUT, "> Makefile" or die "open 'Makefile': $!";
print OUT <<EOT;
# AUTOGENERATED, DO NOT EDIT, RERUN Makefile.PL
PERL=$^X
RM=$rm
MV=$mv
RM_RF = \$(PERL) -MExtUtils::Command -e rm_rf
LD=$ld
CC=$cc
CFLAGS=$cflags
LDFLAGS=$ldflags
INC = $includes
C_FILES = $C_FILES
O_FILES = $O_FILES
INTERFACE = $INTERFACE
OBJECTS= \$(O_FILES)
DISTNAME = $NAME
VERSION = $VERSION
SUFFIX = .gz
DISTVNAME = \$(DISTNAME)-\$(VERSION)
.c$o:
\$(CC) -c \$(INC) \$(CFLAGS) \$<
all: $LIBNAME$dll built
clean: cleanbuilt cleanjavaclass
-\$(RM) *$o *.exp *.lib
-\$(RM) *.opt *.pdb *.class
-\$(RM) $CLEAN_FILES
\$(MV) Makefile Makefile.old
cleanswig:
-\$(RM) $CLEAN_SWIG_FILES
realclean: clean
-\$(RM) $LIBNAME$dll
-\$(RM) Makefile Makefile.old
cleanjavaclass :
\$(RM_RF) $JAVA_PACKAGE
-\$(RM) *.class
javaclass:
$javac -d ./ $JAVA_FILES *.java
swig: cleanswig
swig -java -package $JAVA_PACKAGE \$(INTERFACE)
$LIBNAME$dll: \$(OBJECTS) javaclass
\$(LD) \$(OBJECTS) \$(LDFLAGS) -dll $out\$@
test:
$javabin test
dist : \$(DISTVNAME).tar\$(SUFFIX)
\$(DISTVNAME).tar\$(SUFFIX) : distdir
tar cvf \$(DISTVNAME).tar \$(DISTVNAME)
\$(RM_RF) \$(DISTVNAME)
gzip --best \$(DISTVNAME).tar
distdir :
\$(RM_RF) \$(DISTVNAME)
\$(PERL) -MExtUtils::Manifest=manicopy,maniread -e "manicopy(maniread(),'\$(DISTVNAME)');"
cleanbuilt :
\$(PERL) MakeFile.PL renametree basiclib txt
\$(RM_RF) lib
\$(RM_RF) built
movelib :
\$(PERL) MakeFile.PL renametree basiclib .
\$(PERL) -MExtUtils::Manifest=manicopy,maniread -e "chdir('basiclib') ; manicopy( { \%{ maniread('MANIFEST-LIB') } } ,'../lib');"
built : cleanbuilt movelib
\$(PERL) -MExtUtils::Manifest=manicopy,maniread -e "manicopy( { '$LIBNAME$dll' => '' , \%{ maniread('MANIFEST-BUILT') } } ,'built');"
.SUFFIXES: $o
EOT
##############
# RENAMETREE #
##############
sub renametree {
my $basedir = $_[0] || './basiclib' ;
my $ext = exists $_[1] ? $_[1] : 'txt' ;
$ext =~ s/\W//gs ;
$ext = "-$ext" if $ext ;
my @dir = catdir($basedir , 0,1,1) ;
foreach my $dir_i ( @dir ) {
my $new_file = $dir_i ;
$new_file =~ s/\.(\w+)(?:-\w+)?$/.$1$ext/ ;
rename($dir_i , $new_file) ;
##print "$dir_i >> $new_file\n" ;
}
}
##########
# CATDIR # (DIR , CUT_BASE , RECURSIVE , ONLY_FILES)
##########
sub catdir {
my ( $dir , $cut , $r , $f ) = @_ ;
my @files ;
my @DIR = $dir ;
foreach my $DIR ( @DIR ) {
my $DH ;
opendir ($DH, $DIR);
while (my $filename = readdir $DH) {
if ($filename ne "\." && $filename ne "\.\.") {
my $file = "$DIR/$filename" ;
if ($r && -d $file) { push(@DIR , $file) ;}
else {
if (!$f || !-d $file) {
$file =~ s/^\Q$dir\E\/?//s if $cut ;
push(@files , $file) ;
}
}
}
}
closedir ($DH) ;
}
return( @files ) ;
}
#######
# END #
#######