#******************************************************************************* # Copyright (c) 1997-2004, Perforce Software, Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL PERFORCE SOFTWARE, INC. BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #******************************************************************************* use ExtUtils::MakeMaker; use English; use Cwd; use Cwd 'abs_path'; use strict; #$ExtUtils::MakeMaker::Verbose = 1; # # Check the Perforce API version and convert it into an integer that # we can pass to the compiler as a #define. # sub get_api_version { my $path = shift; my $cwd = getcwd(); if( chdir( $path ) ) { return undef unless ( -e "Version" ); if( ! open( VF, "Version" ) ) { warn( "API Version file missing." ); chdir( $cwd ); return undef; } while( <VF> ) { if( /^RELEASE = (\d+)\.(\d+)/ ) { my $v = ( $1 << 8 ) | $2; close( FH ); chdir( $cwd ); return $v; } } close( FH ); chdir( $cwd ); return undef; } warn( "API directory not found" ); return undef; } # # This sub adds the Perforce API path to the header includes and libs # used by the compiler. It's called by WriteMakefile. # sub config_sub { my $class = shift; my $href = shift; # First warn them about potential build problems print <<EOF; Warning: This extension uses C++ and requires that you use the C++ compiler to compile the XSUB file ( normally just a C compiler is required ). If your build fails with a plethora of errors, then check two things: 1. That you have defined the correct OS_xxxxx macro for your platform ( see the Perforce API documentation for more info ) 2. That the correct compilers are being used. 3. That you're using the correct build of the Perforce API. See hints/linux.pl to see how it should be done. EOF # Now find that API! my $flags = {}; print <<EOF; This extension requires the Perforce API in order to be built. If you do not yet have the API files, then download them from ftp://ftp.perforce.com before continuing. EOF # Get the path to the Perforce API my $apipath = ""; print( "Where is the Perforce API to be found: " ); $apipath = <STDIN>; $apipath =~ s/\n//; # Filthy support for ~/ type paths ( NOT ~user/ though! ) $apipath =~ s#\~/#$ENV{HOME}/#; $apipath = abs_path( $apipath ); # Get the API version and add it to the defines. my $apiver = get_api_version( $apipath ); if( defined( $apiver ) ) { $href->{ 'DEFINE' } .= " -DP4API_VERSION=$apiver"; } # These two aren't in the hints file because some variant of them is # needed on every OS so it's better to have it visible. $flags->{'LIBS'} = []; if( defined( $href->{LIBS} ) ) { my $libs = $href->{LIBS}; foreach my $libset (@$libs ) { push( @{$flags->{LIBS}}, "-L$apipath -lclient -lrpc -lsupp $libset" ); print("Added P4 libs to $libset\n" ); } } else { push( @{$flags->{LIBS}}, "-L$apipath -lclient -lrpc -lsupp" ); } $flags->{ 'INC' } = "-I$apipath -Ilib"; # Last thing to do is to get the address of their perforce # server for the tests print <<EOF; The test suite needs to know where your Perforce server is. The tests are non-invasive and no new data will be added to your depot during the tests EOF print( "Enter the address of your Perforce server: [localhost:1666]: "); my $p4port = <STDIN>; $p4port =~ s/\n//; $p4port = "localhost:1666" if ( $p4port =~ /^$/ ); open( IN, "test.pl.skel" ) or die( "Can't open test.pl.skel! "); open( OUT, ">test.pl" ) or die( "Can't create test.pl" ); my $line; while ( $line = <IN> ) { $line =~ s/__P4PORT__/$p4port/g; print( OUT $line ); } close( IN ); close( OUT ); return $flags; } # Ensure that the clientuserperl interface gets built. sub MY::postamble { ' $(MYEXTLIB): lib/Makefile cd lib && $(MAKE) $(PASSTHRU) '; } #******************************************************************************* #* START OF MAIN SCRIPT #******************************************************************************* my %flags = ( 'NAME' => 'P4', 'VERSION_FROM' => 'P4.pm', # finds $VERSION 'PREREQ_PM' => {}, # e.g., Module::Name => 1.1 'MYEXTLIB' => 'lib/libp4$(LIB_EXT)', 'XSOPT' => '-C++ -prototypes', 'CONFIGURE' => \&config_sub, 'clean' => { FILES => 'test.pl' }, ); WriteMakefile( %flags );
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 4669 | Raymond Danks | Create a branch of P4-3.4608. | ||
//guest/tony_smith/perforce/API/Perl/P4/Makefile.PL | |||||
#4 | 4585 | Tony Smith |
Make the new P4Perl work with older versions of the Perforce API (i.e those without ClientApi::SetProg() defined ). This also introduces automatic determination of the API version being used so we can selectively exclude functionality that isn't available. No functional change. |
||
#3 | 4579 | Tony Smith |
Rewrite P4Perl to be more like P4Ruby. This change does away with the old P4/P4::Client split and pulls all the functionality of P4::Client into P4. Hence P4::Client is now deprecated. There are a few gotcha's - see the Changes file, and documentation for the details, but in general it's backwards compatible. As part of this change, I'm also releasing the previous current versions of P4 and P4::Client as released versions - for posterity. P4 now gets a v3.x version number so the old versions will stand out clearly. Hopefully it's all working - works fine for me - but people should consider this a beta build, for now at least. |
||
#2 | 2003 | Tony Smith |
MakeMaker tweaks to cheer up the CPAN folks. Just guessing with the PPD file, but it's better than nothing (I'm told). |
||
#1 | 1011 | Tony Smith |
Moved Perl API stuff one level down to make way for upcoming Ruby interface. |
||
//guest/tony_smith/perforce/API/P4/Makefile.PL | |||||
#1 | 922 | Tony Smith |
First crack at a much simpler perl interface. Just wraps up the P4::Client and P4::UI classes in an easier to use interface returning the output to the caller in Array or Scalar context as they request it. |