use ExtUtils::MakeMaker; use File::Find; use strict; use warnings; # work out whether it's windows or not, and whether it is under # Cygwin. If it is, instead of g++, look for g++.exe - we'll also add # in another parameter for WriteMakefile, and note that the PATH # separator is different under windows, though not under Cygwin use constant CYGWIN => $^O =~ /cygwin/i ? 1 : 0; use constant MSWIN => $^O =~ /MSWin32|Windows_NT/i ? 1 : 0; # not clear how to portably identify what c++ compiler there is, so # we'll see if g++ exists, and if not die, indicating that they need # to hand edit the $CC variable. my $CC = 'g++'; my $WIN_CC = $CC.'.exe'; my $found = 0; # indicates whether we have found the C++ compiler my $pathseparator = ':'; if (MSWIN || CYGWIN){ $CC = $WIN_CC; } if (MSWIN){ $pathseparator = ';'; } my @directories = split($pathseparator, $ENV{"PATH"}); # they may have some garbage in their PATH, so only keep the real # directories to search my @realDirectories; foreach my $directory (@directories){ if (-e $directory && -d $directory){ push (@realDirectories, $directory); } } find(\&wanted, @realDirectories); if (!$found){ # we didn't find $CC die "\n\n******************************************************************** *** Error compiling C++ code *** Not able to locate $CC. You will have to edit native/Makefile.PL to indicate the name of the C++ compiler on your system. ******************************************************************** \n\n"; } # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. my %makeArgs = ( 'NAME' => 'GO::TermFinder::Native', 'LIBS' => ['-lm -lstdc++'], 'CC' => $CC, 'LD' => '$(CC)', 'OBJECT' => 'Distributions.o Native_wrap.o', ); if (CYGWIN){ # This is needed to make it work under Cygwin - not sure if this # is needed on Windows when not using Cygwin $makeArgs{LDDLFLAGS} = q[-shared]; } WriteMakefile(%makeArgs); sub wanted { $found = 1 if $_ eq $CC; }