mirror of
https://github.com/wesnoth/wesnoth
synced 2025-04-26 07:19:48 +00:00
110 lines
3.4 KiB
Perl
Executable File
110 lines
3.4 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
# mkmam: make Makefile.am from Makefile.am.in,
|
|
# substituting file lists into _SOURCES variables
|
|
|
|
# Copyright (C) 2005 by ott
|
|
# Part of the Battle for Wesnoth Project http://wesnoth.org/
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License.
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY.
|
|
#
|
|
# See the COPYING file for more details.
|
|
|
|
# Automake is dysfunctional: it doesn't understand
|
|
# that one may want to use a list of sources for multiple projects,
|
|
# and that this list should be clean and simple...
|
|
# The automake authors seem to think one should extract the list of sources
|
|
# from the Makefile.am _SOURCES variable if one needs it.
|
|
# This script works around this limitation by substituting any
|
|
# occurrences of @NAME@ inside any _SOURCES variable assignments
|
|
# in FILE.in with the contents of the file NAME, and writes FILE as the output.
|
|
# It is assumed that NAME contains a list of files, one per line
|
|
# and multiple files can be substituted at once.
|
|
# Watch out for @ substitutions inside file NAME, no check is made
|
|
# for infinite loops -- it's probably best to avoid @ inside the NAME files.
|
|
|
|
use strict;
|
|
use File::Basename;
|
|
|
|
my $DEBUG = 0;
|
|
my $filename;
|
|
|
|
sub process_arg {
|
|
# uses global $filename
|
|
my $arg = shift;
|
|
$DEBUG and print STDERR "argument :$arg:\n";
|
|
while (1) { # process $arg
|
|
my $i = index($arg, '@');
|
|
my $l = index($arg, '@', $i+1) - $i + 1;
|
|
last if $l <= 1; # stop unless we find two @'s
|
|
# now $l > 1 and substr($arg, $i, $l) =~ /^@.*@$/
|
|
my $thisfile = substr($arg, $i, $l, '');
|
|
$thisfile =~ s/^@([^@]*)@/\1/;
|
|
my ($base,$path,$type) = fileparse($filename, '');
|
|
$thisfile = (fileparse($filename, ''))[1] . $thisfile unless $thisfile =~ /^\//;
|
|
$DEBUG and print STDERR "substituting $thisfile\n";
|
|
substr($arg, $i, 0) = `cat $thisfile`;
|
|
}
|
|
$arg =~ s/^([^\\])/\\\n\1/;
|
|
$arg =~ s/([^\\\n ])\n/\1 \\\n/g;
|
|
$arg =~ s/\n +/\n\t/g;
|
|
$arg =~ s/\n([^\t\n])/\n\t\1/g;
|
|
$arg =~ s/\s*\\(\n+)$/\1/;
|
|
$DEBUG and print STDERR "argument now :$arg:\n";
|
|
return $arg;
|
|
}
|
|
|
|
my $state;
|
|
my $arg;
|
|
|
|
Argument:
|
|
while ($filename = shift) {
|
|
$DEBUG and print STDERR "opening $filename for reading\n";
|
|
if (! open(CURRENT, $filename)) {
|
|
warn("cannot open file $filename, skipping");
|
|
next Argument;
|
|
}
|
|
my ($base,$path,$type) = fileparse($filename, qr{\.in});
|
|
if ($type ne '.in') {
|
|
warn "Can only process files ending with .in, skipping $filename";
|
|
next Argument;
|
|
}
|
|
my $outfile = $path . $base;
|
|
$DEBUG and print STDERR "opening $outfile for writing\n";
|
|
if (! open(OUTFILE, ">$outfile")) {
|
|
warn "Can't open $outfile for writing, skipping $filename";
|
|
next Argument;
|
|
}
|
|
$state = 0;
|
|
$arg = '';
|
|
while (<CURRENT>) {
|
|
if ($state == 0) {
|
|
if ( /^(\w+_SOURCES\s*=\s*)(.*)/s ) {
|
|
print OUTFILE $1;
|
|
$arg = $2;
|
|
# chomp $arg;
|
|
if ( $arg =~ /\\$/ ) {
|
|
$state = 1;
|
|
} else {
|
|
print OUTFILE process_arg( $arg );
|
|
}
|
|
} else {
|
|
print OUTFILE; # keep looking
|
|
}
|
|
} elsif ($state == 1) { # looking for more lines
|
|
$arg .= $_;
|
|
if ( ! /\\$/ ) { # got the whole SOURCES line, substitute
|
|
print OUTFILE process_arg($arg);
|
|
$arg = '';
|
|
$state = 0;
|
|
}
|
|
} else {
|
|
die 'Internal error, quitting';
|
|
}
|
|
}
|
|
print OUTFILE process_arg($arg) if $arg;
|
|
close $outfile;
|
|
}
|