summaryrefslogtreecommitdiff
path: root/mcon/pl/configure.pl
diff options
context:
space:
mode:
Diffstat (limited to 'mcon/pl/configure.pl')
-rw-r--r--mcon/pl/configure.pl248
1 files changed, 248 insertions, 0 deletions
diff --git a/mcon/pl/configure.pl b/mcon/pl/configure.pl
new file mode 100644
index 0000000..d99d74b
--- /dev/null
+++ b/mcon/pl/configure.pl
@@ -0,0 +1,248 @@
+;# $Id$
+;#
+;# Copyright (c) 1991-1997, 2004-2006, Raphael Manfredi
+;#
+;# You may redistribute only under the terms of the Artistic Licence,
+;# as specified in the README file that comes with the distribution.
+;# You may reuse parts of this distribution only within the terms of
+;# that same Artistic Licence; a copy of which may be found at the root
+;# of the source tree for dist 4.0.
+;#
+;# $Log: configure.pl,v $
+;# Revision 3.0.1.5 1995/01/30 14:47:15 ram
+;# patch49: removed old "do name()" routine call constructs
+;#
+;# Revision 3.0.1.4 1995/01/11 15:40:02 ram
+;# patch45: now allows @if statements for the add.Config_sh unit inclusion
+;#
+;# Revision 3.0.1.3 1994/05/06 15:21:23 ram
+;# patch23: cleaned up the 'prepend' command
+;#
+;# Revision 3.0.1.2 1994/01/24 14:23:21 ram
+;# patch16: new general <\$variable> macro substitutions in wiped units
+;#
+;# Revision 3.0.1.1 1993/10/16 13:54:02 ram
+;# patch12: added support for ?M: lines and confmagic.h production
+;# patch12: new Makefile command cm_h_weed
+;#
+;# Revision 3.0 1993/08/18 12:10:20 ram
+;# Baseline for dist 3.0 netwide release.
+;#
+;#
+;# This file is the heart of metaconfig. We generate a Configure script using
+;# the informations gathered in the @cmdwanted array. A unit is expected to have
+;# its path written in the %Unit array (indexing is done with the unit's name
+;# without the .U extension).
+;#
+;# The units are run through a built-in interpreter before being written to
+;# the Configure script.
+;#
+# Create the Configure script
+sub create_configure {
+ print "Creating Configure...\n" unless $opt_s;
+ open(CONFIGURE,">Configure") || die "Can't create Configure: $!\n";
+ open(CONF_H,">config_h.SH") || die "Can't create config_h.SH: $!\n";
+ if ($opt_M) {
+ open(MAGIC_H,">confmagic.h") || die "Can't create confmagic.h: $!\n";
+ }
+
+ chdir('.MT') || die "Can't cd to .MT: $!\n";
+ for (@cmdwanted) {
+ &process_command($_); # Run the makefile command
+ }
+ chdir($WD) || die "Can't cd back to $WD\n";
+ close CONFIGURE;
+ print CONF_H "#endif\n"; # Close the opened #ifdef (see Config_h.U)
+ print CONF_H "!GROK!THIS!\n";
+ close CONF_H;
+ if ($opt_M) {
+ print MAGIC_H "#endif\n"; # Close the opened #ifdef (see Magic_h.U)
+ close MAGIC_H;
+ }
+ `chmod +x Configure`;
+}
+
+# Process a Makefile 'pick' command
+sub process_command {
+ local($cmd, $target, $unit_name) = split(' ', $_[0]);
+ local($name) = $unit_name . '.U'; # Restore missing .U
+ local($file) = $name; # Where unit is located
+ unless ($file =~ m|^\./|) { # Unit produced earlier by metaconfig
+ $file = $Unit{$unit_name}; # Fetch unit from U directory
+ }
+ if (defined $Obsolete{$name}) { # Signal use of an obsolete unit
+ warn "\tObsolete unit $name is used:\n";
+ local(@msg) = split(/\n/, $Obsolete{$name});
+ foreach $msg (@msg) {
+ warn "\t $msg\n";
+ }
+ }
+ die "Can't open $file.($name for target $target): $!\n"
+ unless open(UNIT, $file);
+ print "\t$cmd $file\n" if $opt_v;
+ &init_interp; # Initializes the interpreter
+
+ # The 'add' command adds the unit to Configure.
+ if ($cmd eq 'add') {
+ while (<UNIT>) {
+ print CONFIGURE unless &skipped || !&interpret($_);
+ }
+ }
+
+ # The 'weed' command adds the unit to Configure, but
+ # makes some tests for the lines starting with '?' or '%'.
+ # These lines are kept only if the symbol is wanted.
+ elsif ($cmd eq 'weed') {
+ while (<UNIT>) {
+ if (/^\?(\w+):/) {
+ s/^\?\w+:// if $symwanted{$1};
+ }
+ if (/^%(\w+):/) {
+ s/^%\w+:// if $condwanted{$1};
+ }
+ print CONFIGURE unless &skipped || !&interpret($_);
+ }
+ }
+
+ # The 'wipe' command adds the unit to Configure, but
+ # also substitues some hardwired macros.
+ elsif ($cmd eq 'wipe') {
+ while (<UNIT>) {
+ s/<PACKAGENAME>/$package/g;
+ s/<MAINTLOC>/$maintloc/g;
+ s/<VERSION>/$version/g; # This is metaconfig's version
+ s/<REVISION>/$revision/g; # And revision information
+ warn "\"$file\": usage of <PATCHLEVEL> is deprecated\n"
+ if s/<PATCHLEVEL>/$patchlevel/g;
+ s/<DATE>/$date/g;
+ s/<BASEREV>/$baserev/g;
+ s/<\$(\w+)>/eval("\$$1")/ge; # <$var> -> $var substitution
+ print CONFIGURE unless &skipped || !&interpret($_);
+ }
+ }
+
+ # The 'add.Null' command adds empty initializations
+ # to Configure for all the shell variable used.
+ elsif ($cmd eq 'add.Null') {
+ for (sort @Master) {
+ if (/^\?(\w+):/) {
+ s/^\?\w+:// if $symwanted{$1};
+ }
+ print CONFIGURE unless &skipped;
+ }
+ for (sort @Cond) {
+ print CONFIGURE "$_=''\n"
+ unless $symwanted{$_} || $hasdefault{$_};
+ }
+ while (<UNIT>) {
+ print CONFIGURE unless &skipped || !&interpret($_);
+ }
+ print CONFIGURE "CONFIG=''\n\n";
+ }
+
+ # The 'add.Config_sh' command fills in the production of
+ # the config.sh script within Configure. Only the used
+ # variable are added, the conditional ones are skipped.
+ elsif ($cmd eq 'add.Config_sh') {
+ while (<UNIT>) {
+ print CONFIGURE unless &skipped || !&interpret($_);
+ }
+ for (sort @Master) {
+ if (/^\?(\w+):/) {
+ # Can't use $shmaster, because config.sh must
+ # also contain some internal defaults used by
+ # Configure (e.g. nm_opt, libc, etc...).
+ s/^\?\w+:// if $symwanted{$1};
+ }
+ s/^(\w+)=''/$1='\$$1'/;
+ print CONFIGURE unless &skipped;
+ }
+ }
+
+ # The 'close.Config_sh' command adds the final EOT line at
+ # the end of the here-document construct which produces the
+ # config.sh file within Configure.
+ elsif ($cmd eq 'close.Config_sh') {
+ print CONFIGURE "EOT\n\n"; # Ends up file
+ }
+
+ # The 'c_h_weed' command produces the config_h.SH file.
+ # Only the necessary lines are kept. If no conditional line is
+ # ever printed, then the file is useless and will be removed.
+ elsif ($cmd eq 'c_h_weed') {
+ $printed = 0;
+ while (<UNIT>) {
+ if (/^\?(\w+):/) {
+ s/^\?\w+:// if $cmaster{$1} || $symwanted{$1};
+ }
+ unless (&skipped || !&interpret($_)) {
+ if (/^$/) {
+ print CONF_H "\n" if $printed;
+ $printed = 0;
+ } else {
+ print CONF_H;
+ ++$printed;
+ }
+ }
+ }
+ }
+
+ # The 'cm_h_weed' command produces the confmagic.h file.
+ # Only the necessary lines are kept. If no conditional line is
+ # ever printed, then the file is useless and will be removed.
+ elsif ($cmd eq 'cm_h_weed') {
+ if ($opt_M) {
+ $printed = 0;
+ while (<UNIT>) {
+ if (/^\?(\w+):/) {
+ s/^\?\w+:// if $cmaster{$1} || $symwanted{$1};
+ }
+ unless (&skipped || !&interpret($_)) {
+ if (/^$/) {
+ print MAGIC_H "\n" if $printed;
+ $printed = 0;
+ } else {
+ print MAGIC_H;
+ ++$printed;
+ }
+ }
+ }
+ }
+ }
+
+ # The 'prepend' command will add the content of the target to
+ # the current file (held in $file, the one which UNIT refers to),
+ # if the file is not empty.
+ elsif ($cmd eq 'prepend') {
+ if (-s $file) {
+ open(PREPEND, ">.prepend") ||
+ die "Can't create .MT/.prepend: $!\n";
+ open(TARGET, $Unit{$target}) ||
+ die "Can't open unit $Unit{$target}: $!\n";
+ while (<TARGET>) {
+ print PREPEND unless &skipped;
+ }
+ print PREPEND <UNIT>; # Now add original file contents
+ close PREPEND;
+ close TARGET;
+ rename('.prepend', $file) ||
+ die "Can't rename .prepend into $file: $!\n";
+ }
+ }
+
+ # Command not found
+ else {
+ die "Unrecognized command from Makefile: $cmd\n";
+ }
+ &check_state; # Make sure there are no pending statements
+ close UNIT;
+}
+
+# Skip lines starting with ? or %, including all the following continuation
+# lines, if any. Return 0 if the line was not to be skipped, 1 otherwise.
+sub skipped {
+ return 0 unless /^\?|^%/;
+ &complete_line(UNIT) if /\\\s*$/; # Swallow continuation lines
+ 1;
+}
+