The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/local/bin/perl -sw
# $Id: Makefile.PL,v 1.27 1995/08/26 17:39:01 timbo Rel $

use ExtUtils::MakeMaker qw(&WriteMakefile $Verbose %att);
use Getopt::Std;
use Config;
require 'flush.pl';

use DBI;	# The DBI must be installed before we can build a DBD

%opts = (
    'NAME'    => 'DBD::QBase',
    'VERSION' => '0.03',
);

# --- Introduction

print "\nConfiguring DBD::QBase version $opts{VERSION}...\n";
print "Remember to actually read the README file!\n\n";

# --- Where is Oracle installed...
unless ($ENV{QBase_HOME}){
    warn "\$QBase_HOME not defined. Searching for QBase...\n";
    foreach(qw(/LocalLibrary/QuickBase)){
	$ENV{QBase_HOME}=$_,last if -d "$_/Headers";
    }
    die "Unable to determine QBase_HOME" unless $ENV{QBase_HOME};
}
my $OH = $ENV{QBase_HOME};

print "Using QuickBase in $OH\n";


# --- What Oracle is installed...

die "Error: Can't determine QuickBase header.\n"
	unless -f "$OH/Headers/QuickBase.h";
die "Error: Can't determine QuickBase Library (assuming version 5.1)\n"
	 unless -f "$OH/lib/libQBSQL5_1.a";

# read list of libs that QuickBase require
$sysliblist ="-lMedia_s -lNeXT_s -lQBSQL5_1";
print "Oracle sysliblist: $sysliblist\n";

# Make sure that QuickBase setups up some flags
$MK{CFLAGS}   = "-ObjC";
$MK{LDFLAGS}  = "-ObjC";

$OCIINCLUDE = $MK{INCLUDE} || '';
$opts{LIBS} = [ $sysliblist ];
$opts{INC}  = "$OCIINCLUDE -I$Config{archlib}/DBI";
$opts{dynamic_lib} = { OTHERLDFLAGS => '-L$(LIBHOME) $(COMPOBJS) '.$linkwith };
$opts{OBJECT} = '$(O_FILES)';

# --- Handle special cases ---

$opts{DEFINE} = '-ObjC';


# Set some private WriteMakefile options if this is 'me' :-)
if ($ENV{LOGNAME} eq 'timbo' and $ENV{S_ARCH_SW}){  # a reasonable guess
    $Verbose = 1;
    $opts{INST_LIB}     = $Config{installprivlib};
    $opts{INST_ARCHLIB} = $Config{installarchlib};
}

# log key platform information to help me help you quickly
print "System: perl$] @Config{qw(myuname archname dlsrc)}\n";
print "Compiler: @Config{qw(cc optimize ccflags)}\n";
print "  CC:        $MK{CC}\n"		if $MK{CC};
print "  CFLAGS:    $MK{CFLAGS}\n"	if $MK{CFLAGS};
print "  LDFLAGS:   $MK{LDFLAGS}\n"	if $MK{LDFLAGS};
print "  LDSTRING:  $MK{LDSTRING}\n"	if $MK{LDSTRING};

# Assorted hints - these should be move to a hints subdirectory

WriteMakefile(%opts);

exit 0;


sub MY::post_initialize{

    # Ensure Oraperl.pm is installed into the top lib dir
    $att{PM}->{'QBase.pm'} = '$(INST_LIB)/QBase.pm';

    # Add $linkwith to EXTRALIBS for those doing static linking
     $att{EXTRALIBS} .= " -L\$(LIBHOME) $linkwith";

	# default target for make's which don't understand '.SUFFIXES:'
	# (which appears as the first target).
    '
default_target: all
';
}


sub MY::post_constants{

    # Oracle Definitions, based on $(ORACLE_HOME)/proc/lib/proc.mk
    # for Oracle 7.0.x for SunOS 4 (Solaris 1)
    # Please let me know if this does, or does not, work for you.
    '
###################################################################
#
ORACLE_HOME = '.$ENV{ORACLE_HOME}.'

# The following text has been extracted from '.$oraclemk.'
#
'.$MK.'
#
# End of extract from '.$oraclemk.'
#
###################################################################
';
}


sub fetch_oci_macros {

    my $oraclemk = shift;
    # Read $oraclemk makefile, extract macro definitions from it
    # and store them in $MK, @MK and %MK.

    # Don't include the following definitions in the generated
    # makefile (note that %MK stills gets these values).
    my @edit = qw(SHELL CC CFLAGS ASFLAGS RCC LDFLAGS AR ECHO EXE OBJS);
    my %edit; @edit{@edit} = ('$_ = ""') x @edit;

    $edit{COMPOBJS} = q{
	    # Change the COMPOBJS line. (Some files use LIBHOME not COMPOBJ)
	    # old: $(COMPOBJ)/crti.o $(COMPOBJ)/crt1.o $(COMPOBJ)/__fstd.o
	    # new: $(COMPOBJ)/__fstd.o
	    s:\$\S+?/crt[1in]\.o\b::g;
	} if $Config{osname} eq 'solaris'; # and $Config{gccversion};

    my $mkver = 0;
    my $linkwith = '';
    my $lastline = '';
    open(ORACLEMK,"<$oraclemk") or die "open $oraclemk: $!\n";
    for(1; $_ = <ORACLEMK>; $lastline = $_){
	# Join split lines but retain backwack and newlines:
	$_ .= <ORACLEMK> while(m/\\[\r\n]+$/);
	chomp;
	push(@MK, '') if ($_ eq '' and $lastline ne '');
	next unless $_;
	last if m/^\w+\s*:/;	# gone too far, reached actual targets

	unless($MK{mkver}) {	# still need to get version number
	    # This is tough since some versions of proc.mk split the
	    # RCS header over three lines! Well that's Oracle for you.
	    my $line = $_;
	    $line =~ s/[\\\r\n]/ /g;
	    $MK{mkver} = $mkver = $1
		if $line =~ m/\$Header:.*?\.mk.+(\d+\.\d+)/;
	}

	# We always store values into %MK before checking %edit
	$MK{$1} = $2 if m/^\s*(\w+)\s*=\s*(.*)/;

	next if m/^\s*\.SUFFIXES/;

	if ($1 and exists $edit{$1}) {
	    my $name = $1;
	    eval $edit{$name};	# execute code to edit $_
	    warn "Edit $name ($edit{$name}) failed: $@\n" if $@;
	}

	push(@MK, $_);

	# have we seen enough now?	( this caused problems)
	# last if ($MK{OCILDLIBS} or (int($mkver)==1 and $MK{TTLIBS}));
    }
    close(ORACLEMK);

    if ($MK{OCILDLIBS}) {
	$linkwith = '$(OCILDLIBS)';

    } elsif (int($mkver) == 1) {
	if ($MK{LLIBOCIC}) {
	    $linkwith = '$(LLIBOCIC) $(TTLIBS)';
	} else {
	    $linkwith = '-locic $(TTLIBS)';	# XXX GUESS HACK
	}
    }
    unless ($linkwith){
	warn "ERROR parsing $oraclemk (version '$MK{mkver}'):\n";
	warn "\tUnable to determine what to link with.\n";
    }
    $MK = join("\n", @MK);
    $linkwith;
}


sub ask {
    my($prompt, $default) = @_;
	printflush(STDOUT,"$prompt: ");
	printflush(STDOUT,"[$default] ") if $default;
    my $value = <>;
	chomp $value;
	return $value or $default;
}


# ---------------------------------------------------------------


sub MY::dist {		# new name with 5.001e
    '
DISTFILES=RCS/*

ci:
	-ci -u $(DISTFILES) 2>&1 | grep -v "no lock set by "
	-rcs -q -Nv`echo "$(VERSION)" | tr . _`: $(DISTFILES)

rcsdiff:
	for f in $(DISTFILES); do rcsdiff -r$(V) $$f; done 2>&1 | less

dist:  ci clean
	rcs -q -sRel $(DISTFILES)
	co -q -u     $(DISTFILES)
	rm -f Makefile *~ t/*~
	cd ..; tar cvFf $(DISTNAME)-$(VERSION).tar \
		`sed -e "s:^:$(BASEEXT)/:" < $(BASEEXT)/MANIFEST`
	@cd ..; compress $(DISTNAME)-$(VERSION).tar;
	@chmod -w ../$(DISTNAME)-$(VERSION).tar.Z
	mv ../$(DISTNAME)-$(VERSION).tar.Z $$HOME/perl/db/DBD/QBase/
	cp README $$HOME/perl/db/DBD/QBase/
	@cd $$HOME/perl/db/DBD/QBase; pwd; ls -l *.Z
';
}

*{"MY::distclean"} = \&MY::dist;	# remain compatible with 5.001

__END__