mirror of
https://github.com/netwide-assembler/nasm.git
synced 2024-12-03 08:41:02 +08:00
2956abbbf9
Allow for multiple sections of Makefiles to be synchronized; the intent is to use this to synchronize the Perl file generation rules. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
138 lines
4.1 KiB
Perl
Executable File
138 lines
4.1 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
## --------------------------------------------------------------------------
|
|
##
|
|
## Copyright 1996-2009 The NASM Authors - All Rights Reserved
|
|
## See the file AUTHORS included with the NASM distribution for
|
|
## the specific copyright holders.
|
|
##
|
|
## Redistribution and use in source and binary forms, with or without
|
|
## modification, are permitted provided that the following
|
|
## conditions are met:
|
|
##
|
|
## * Redistributions of source code must retain the above copyright
|
|
## notice, this list of conditions and the following disclaimer.
|
|
## * Redistributions in binary form must reproduce the above
|
|
## copyright notice, this list of conditions and the following
|
|
## disclaimer in the documentation and/or other materials provided
|
|
## with the distribution.
|
|
##
|
|
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
|
## CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
## INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
## DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
## NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
## LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
## CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
## OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
## EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
##
|
|
## --------------------------------------------------------------------------
|
|
|
|
#
|
|
# Sync the output file list between Makefiles
|
|
# Use the mkdep.pl parameters to get the filename syntax
|
|
#
|
|
# The first file is the source file; the other ones target.
|
|
#
|
|
%def_hints = ('object-ending' => '.o',
|
|
'path-separator' => '/',
|
|
'continuation' => "\\");
|
|
|
|
sub do_transform($$) {
|
|
my($l, $h) = @_;
|
|
my($ps) = $$h{'path-separator'};
|
|
|
|
$l =~ s/\x01/$$h{'object-ending'}/g;
|
|
$l =~ s/\x03/$$h{'continuation'}/g;
|
|
|
|
if ($ps eq '') {
|
|
# Remove the path separator and the preceeding directory
|
|
$l =~ s/[^\s\=]*\x02//g;
|
|
} else {
|
|
# Convert the path separator
|
|
$l =~ s/\x02/$ps/g;
|
|
}
|
|
|
|
return $l;
|
|
}
|
|
|
|
undef %line_lists;
|
|
|
|
$first = 1;
|
|
$first_file = $ARGV[0];
|
|
die unless (defined($first_file));
|
|
|
|
foreach $file (@ARGV) {
|
|
open(FILE, '<', $file) or die;
|
|
|
|
# First, read the syntax hints
|
|
%hints = %def_hints;
|
|
while (defined($line = <FILE>)) {
|
|
if ( $line =~ /^\s*\#\s*@([a-z0-9-]+):\s*\"([^\"]*)\"/ ) {
|
|
$hints{$1} = $2;
|
|
}
|
|
}
|
|
|
|
# Read and process the file
|
|
seek(FILE,0,0);
|
|
@lines = ();
|
|
undef $processing;
|
|
while (defined($line = <FILE>)) {
|
|
chomp $line;
|
|
if (defined($processing)) {
|
|
if ($line =~ /^\#-- End ([^-\#]*[^-#\s]) --\#$/) {
|
|
if ($1 ne $processing) {
|
|
die "$0: $file: Mismatched Begin and End lines (\"$processing\" -> \"$1\"\n";
|
|
}
|
|
push(@lines, $line."\n");
|
|
undef $processing;
|
|
} elsif ($first) {
|
|
my $xl = $line;
|
|
my $oe = "\Q$hints{'object-ending'}";
|
|
my $ps = "\Q$hints{'path-separator'}";
|
|
my $cn = "\Q$hints{'continuation'}";
|
|
|
|
$xl =~ s/${oe}(\s|$)/\x01$1/g;
|
|
$xl =~ s/${ps}/\x02/g;
|
|
$xl =~ s/${cn}$/\x03/;
|
|
push(@{$line_lists{$processing}}, $xl);
|
|
push(@lines, $line);
|
|
}
|
|
} else {
|
|
push(@lines, $line."\n");
|
|
if ($line =~ '#-- Begin ([^-\#]*[^-#\s]) --#') {
|
|
$processing = $1;
|
|
if ($first) {
|
|
if (defined($line_lists{$processing})) {
|
|
die "$0: $file: Repeated Begin block: $processing\n";
|
|
}
|
|
$line_lists{$processing} = [];
|
|
} elsif (!$first) {
|
|
if (!defined($line_lists{$processing})) {
|
|
die "$0: $file: Begin block without template\n";
|
|
}
|
|
push(@lines, "# Edit in $first_file, not here!\n");
|
|
foreach $l (@{$line_lists{$processing}}) {
|
|
push(@lines, do_transform($l, \%hints)."\n");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
close(FILE);
|
|
|
|
# Write the file back out
|
|
if (!$first) {
|
|
open(FILE, '>', $file) or die;
|
|
print FILE @lines;
|
|
close(FILE);
|
|
}
|
|
|
|
undef @lines;
|
|
$first = 0;
|
|
}
|