#!/usr/local/bin/perl
######################################################################
# This script configures the CCSO Nameserver.
#
# The configuration process includes:
#	Building include files
#	Building Makefiles
#
# The script first sources defaults. Then, it sources each of its
# arguments in turn.  This allows maximum flexibility in configuration.
#
# defaults contains a list of things you might want to put in
# your own configuration files
######################################################################

######################################################################
# Setup
######################################################################
print "\nWARNING: This version of Configure now expects any DefineStrings to\n";
print 'be uppercase, e.g., $DefineStrings{"DATABASE"} = "/nameserv/db/prod"';
print "\n\nConfiguring for ". join(' ',@ARGV) . "\n";
@INC = (@INC,"configs");		# search configs
require "defaults";			# read defaults
foreach $a (@ARGV) {require $a;}	# and each argument file
chdir $SrcDir || die "$SrcDir: $!\n";

######################################################################
# All our settings are now read.  Let's get to work.
######################################################################

######################################################################
# Phase 1; generate configuration files
######################################################################
&OpenOrElse(CONFH,">include/conf.h",1);
&OpenOrElse(CONFC,">qi/conf.c",1);
print CONFH "#ifndef CONF_H\n#define CONF_H\n";

foreach $f (@Features)
  {print CONFH "#define $f\n";eval "\$$f=1;";}
if (!$EMAIL_AUTH)
  {$StripEmail = ";perl -i -n -e 'if (!/email/) {print;}' temp.l";}

print CONFH "extern char *OkAddrs[];\n";
print CONFC "char *OkAddrs[]={";
foreach $ok (@OkAddrs) {print CONFC qq/"$ok",/;}
print CONFC "0};\n";

print CONFH "extern char *LocalAddrs[];\n";
print CONFC "char *LocalAddrs[]={";
foreach $loc (@LocalAddrs) {print CONFC qq/"$loc",/;}
print CONFC "0};\n";

$i = 1;
print CONFH "extern char *Strings[];\n";
print CONFC '#include <sys/param.h>'."\n";
print CONFC '#include "conf.h"'."\n";
print CONFC "char *Strings[] = {\n";
foreach $d (keys(%DefineStrings))
{
  printf CONFH "#define $d (Strings[%d])\n",$i;
  $i += 2;
  print CONFC qq/  "$d","$DefineStrings{$d}",\n/; 
}
print CONFC "0 };\n";
foreach $d (keys(%OtherDefines))
{
  $realD = $d;
  $realD =~ tr/a-z/A-Z/;
  print CONFH "#define $realD $OtherDefines{$d}\n";
}
print CONFH "extern char *Database;\n#endif\n";
print CONFC "char *Database = NULL;\n";
close(CONFH);
close(CONFC);

######################################################################
# Phase 2; generate the Makefiles
#  Except for the top-level makefile, these are generated by eval-ing
#  each line of Makefile.templ, and adding some stuff
######################################################################
foreach $l (@PhLinks) {$PhLinks .= "\t-ln -s ph \$(DESTDIR)/$l\n";}
chop($PhLinks);
foreach $phopt (keys(%PhFlags))
{
  $PhFlags .= " -D";
  $opt = $phopt;  $opt =~ tr/a-z/A-Z/;
  $PhFlags .= $opt;
  if ($PhFlags{$phopt} ne "")
  {
    $PhFlags .= qq|=\\"$PhFlags{$phopt}\\"|;
  }
}
&OpenOrElse(TOPMAKE,">Makefile",1);
print TOPMAKE $DontEditMake;

foreach $targ (@TopTargets)
{
  print TOPMAKE $targ eq "install" ? "$targ: all\n" : "$targ:\n";
  if ($targ eq "clean") {print TOPMAKE "\trm -f tags\n";}
  foreach $dir (@WantDirs) {print TOPMAKE "\tcd $dir; make $targ\n";}
  print TOPMAKE "\n";
}
print TOPMAKE "tags:\n\tcd lib; ctags -t -f ../tags ../*/*.[chly]\n";
foreach $dir (@WantDirs) {print TOPMAKE "\tln tags $dir/tags\n";}
close(TOPMAKE);

foreach $dir (@WantDirs)
{
  &OpenOrElse(TEMPLATE,"<$dir/Makefile.templ",0);
  &OpenOrElse(MAKEFILE,">$dir/Makefile",1);
  chdir $dir || die "$dir: $!";
  
  print MAKEFILE $DontEditMake;
  
  #
  # copy makefile, expanding variables as we go
  #
  while (<TEMPLATE>)
  {
    $_ = &SubLine($_);
    print MAKEFILE $_;
  }
  print MAKEFILE "# DO NOT DELETE THIS LINE.\n\n";

  close(TEMPLATE);
  close(MAKEFILE);
  chdir $SrcDir;
}

system("make clean" . ($Depend ne "" ? " depend" : ""));

######################################################################
# subroutines
######################################################################
sub OpenOrElse
{
  ($filehandle,$filename,$snitch) = @_;
  $fnOnly = substr($filename,1);
  if (open($filehandle,$filename)) {if ($snitch) {print "$fnOnly...\n";}}
  else {die "$fnOnly: $!\n";}
}

sub SubLine
{
  $line = "";
  @line = split('_',$_[0]);
  for ($i=0;;$i+=2)
  {
    if ($i>$#line) {last;}
    $line .= $line[$i];
    if ($i==$#line) {last;}
    $line .= eval("\$$line[$i+1]");
  }
  $line;
}
