#!/usr/bin/perl -w
# configure script for elkhound
use strict 'subs';
# default location of smbase relative to this package
$SMBASE = "../smbase";
$req_smcv = 1.03; # required sm_config version number
$thisPackage = "elkhound";
# -------------- BEGIN common block ---------------
# do an initial argument scan to find if smbase is somewhere else
for (my $i=0; $i < @ARGV; $i++) {
my ($d) = ($ARGV[$i] =~ m/-*smbase=(.*)/);
if (defined($d)) {
$SMBASE = $d;
}
}
# try to load the sm_config module
eval {
push @INC, ($SMBASE);
require sm_config;
};
if ($@) {
die("$@" . # ends with newline, usually
"\n" .
"I looked for smbase in \"$SMBASE\".\n" .
"\n" .
"You can explicitly specify the location of smbase with the -smbase=
\n" .
"command-line argument.\n");
}
# check version number
$smcv = get_sm_config_version();
if ($smcv < $req_smcv) {
die("This package requires version $req_smcv of sm_config, but found\n" .
"only version $smcv.\n");
}
# -------------- END common block ---------------
# defaults
%flags = (
"loc" => 1,
"eef" => 0,
"gcs" => 0,
"gcsc" => 0,
"crs" => 0,
"subconfigure" => 1
);
$AST = "../ast";
# arguments to pass to sub-configures
@c_args = ();
# copy from %flags to individual global variables
sub copyFlagsToGlobals {
$loc = $flags{loc};
$eef = $flags{eef};
$gcs = $flags{gcs};
$gcsc = $flags{gcsc};
$crs = $flags{crs};
$subconfigure = $flags{subconfigure};
# test consistency of configuration
if ($gcs && !$eef) {
die "GCS requires EEF\n";
}
if ($gcsc && !$gcs) {
die "GCSC requires GCS\n";
}
}
copyFlagsToGlobals();
sub usage {
standardUsage();
print(<<"EOF");
package options:
-prof enable profiling
-devel add options useful while developing
-loc[=0/1]: enable/disable source location tracking [enabled]
-action: enable use of "-tr action" to see parser actions
-compression[=0/1]: enable/disable all table compression options [disabled]
-eef[=0/1] enable/disable EEF compression [disabled]
-gcs[=0/1] enable/disable GCS compression [disabled]
-gcsc[=0/1] enable/disable GCS column compression [disabled]
-crs[=0/1] enable/disable CRS compression [disabled]
-fastest: turn off all Elkhound features that are not present
in Bison, for the purpose of performance comparison
(note that Elsa will not work in this mode)
-nosub: do not invoke subdirectory configure scripts
-ast=: specify where the ast library is [$AST]
EOF
}
# -------------- BEGIN common block 2 -------------
# global variables holding information about the current command-line
# option being processed
$option = "";
$value = "";
# process command-line arguments
foreach $optionAndValue (@ARGV) {
# ignore leading '-' characters, and split at first '=' (if any)
($option, $value) =
($optionAndValue =~ m/^-*([^-][^=]*)=?(.*)$/);
# option = value
my $arg = $option;
if (handleStandardOption()) {
# handled by sm_config.pm
}
# -------------- END common block 2 -------------
elsif ($arg eq "prof") {
push @CCFLAGS, "-pg";
push @c_args, $arg;
}
elsif ($arg eq "devel") {
push @CCFLAGS, "-Werror";
push @c_args, $arg;
}
elsif ($arg eq "loc") {
$flags{loc} = getBoolArg();
}
elsif ($arg eq "action") {
push @CCFLAGS, "-DACTION_TRACE=1";
}
elsif ($arg eq "fastest") {
# the idea is I can say
# $ ./configure -fastest
# $ make clean; make
# $ ./perf -tests c -iters 5
# to verify that I'm still within 3% of Bison (at least
# when compiled with gcc-2.95.3)
$flags{loc} = 0;
$flags{debug} = 0;
push @CCFLAGS,
("-DUSE_RECLASSIFY=0", # no token reclassification
"-DUSE_KEEP=0", # don't call keep() functions
"-DNDEBUG_NO_ASSERTIONS", # disable all xassert() calls
"-DDO_ACCOUNTING=0", # don't count stack nodes, etc.
"-DENABLE_YIELD_COUNT=0"); # don't check for yield-then-merge at runtime
push @c_args, "-DUSE_RECLASSIFY=0";
}
elsif ($arg eq "nosub") {
$flags{subconfigure} = 0;
}
elsif ($arg eq "ast") {
$AST = getOptArg();
if ($AST !~ m|^/|) {
push @c_args, "-ast=../$AST";
}
else {
push @c_args, "-ast=$AST";
}
}
elsif ($arg =~ "compression|eef|gcs|gcsc|crs") {
my $value = getBoolArg();
if ($arg eq "compression") {
$flags{eef} = $value;
$flags{gcs} = $value;
$flags{gcsc} = $value;
$flags{crs} = $value;
}
else {
$flags{$arg} = $value;
}
}
else {
die "unknown option: $arg\n";
}
}
copyFlagsToGlobals();
finishedOptionProcessing();
# summarize compression flags
@compflags = ();
for $k (keys %flags) {
if ($k eq "eef" || $k eq "gcs" || $k eq "gcsc" || $k eq "crs") {
if ($flags{$k}) {
push @compflags, $k;
}
}
}
if (@compflags) {
$compflags = join(',', @compflags);
}
else {
$compflags = "";
}
# ------------------ needed components ---------------
test_smbase_presence();
test_CXX_compiler();
# does the compiler want me to pass "-I."? unfortunately, some versions
# of gcc-3 will emit an annoying warning if I pass "-I." when I don't need to
print("checking whether compiler needs \"-I.\"... ");
$cmd = "$CXX -c @CCFLAGS cc2/testprog.cc";
if (0!=system("$cmd >/dev/null 2>&1")) {
# failed without "-I.", so try adding it
$cmd = "$CXX -c -I. @CCFLAGS cc2/testprog.cc";
if (0!=system("$cmd >/dev/null 2>&1")) {
my $wd = `pwd`;
chomp($wd);
die "\n" .
"I was unable to compile a simple test program. I tried:\n" .
" cd $wd\n" .
" $cmd\n" .
"Try it yourself to see the error message. This needs be fixed\n" .
"before Elkhound will compile.\n";
}
# adding "-I." fixed the problem
print("yes\n");
push @CCFLAGS, "-I.";
}
else {
print("no\n");
}
# ast
if (! -f "$AST/asthelp.h") {
die "I cannot find asthelp.h in `$AST'.\n" .
"The ast library is required for elkhound.\n" .
"If it's in a different location, use the -ast= option.\n";
}
$PERL = get_PERL_variable();
# ------------------ config.summary -----------------
$summary = getStandardConfigSummary();
$summary .= <<"OUTER_EOF";
cat < "$PERL",
"AST" => "$AST");
# extend config.status
open(OUT, ">>config.status") or die("could not append to config.status: $!\n");
print OUT (<<"OUTER_EOF");
cat >glrconfig.h.tmp <>glrconfig.h.tmp
# see if the new glrconfig.h differs from the old; if not, then
# leave the old, so 'make' won't think something needs to be rebuilt
if diff glrconfig.h glrconfig.h.tmp >/dev/null 2>&1; then
# leave it
echo "glrconfig.h is unchanged"
else
echo "creating glrconfig.h ..."
# overwrite it, and make it read-only
mv -f glrconfig.h.tmp glrconfig.h
chmod a-w glrconfig.h
fi
OUTER_EOF
close(OUT) or die;
chmod 0755, "config.status";
# ----------------- final actions -----------------
# invoke sub-configures
if ($subconfigure) {
chdir("c") or die;
my $tmp = join(' ', ("./configure", @c_args));
print("Invoking $tmp in 'c' directory..\n");
run("./configure", @c_args);
chdir("..") or die;
}
# run the output file generator
run("./config.status");
print("\nYou can now run make, usually called 'make' or 'gmake'.\n");
exit(0);
# silence warnings
pretendUsed($thisPackage);
# EOF