Script to automagically synchronize the object file lists
authorH. Peter Anvin <hpa@zytor.com>
Sun, 15 Jun 2008 23:54:29 +0000 (16:54 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Sun, 15 Jun 2008 23:54:29 +0000 (16:54 -0700)
Add a script to automagically synchronize the list of object files
between the various Makefiles.

Makefile.in
Mkfiles/msvc.mak
Mkfiles/netware.mak
Mkfiles/openwcom.mak
Mkfiles/owlinux.mak
syncfiles.pl [new file with mode: 0755]

index 7d32d06..10a8368 100644 (file)
@@ -58,6 +58,7 @@ X               = @EXEEXT@
 .1.man:
        $(NROFF) -man $< > $@
 
+#--- Begin File Lists ---#
 NASM = nasm.$(O) nasmlib.$(O) raa.$(O) saa.$(O) \
        float.$(O) insnsa.$(O) insnsb.$(O) \
        assemble.$(O) labels.$(O) hashtbl.$(O) crc64.$(O) parser.$(O) \
@@ -72,6 +73,7 @@ NASM =        nasm.$(O) nasmlib.$(O) raa.$(O) saa.$(O) \
 
 NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) \
        insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(O)
+#--- End File Lists ---#
 
 all: nasm$(X) ndisasm$(X) nasm.man ndisasm.man
        cd rdoff && $(MAKE) all
@@ -224,6 +226,7 @@ splint:
 # it's expected to be invoked manually.
 #
 alldeps: perlreq
+       $(PERL) syncfiles.pl Makefile.in Mkfiles/*.mak
        $(PERL) mkdep.pl -M Makefile.in Mkfiles/*.mak -- \
                . output lib
        ./config.status
index 937e106..7264ff4 100644 (file)
@@ -32,6 +32,8 @@ X               = .exe
 .c.obj:
        $(CC) /c $(ALL_CFLAGS) /Fo$@ $<
 
+#--- Begin File Lists ---#
+# Edit in Makefile.in, not here!
 NASM = nasm.$(O) nasmlib.$(O) raa.$(O) saa.$(O) \
        float.$(O) insnsa.$(O) insnsb.$(O) \
        assemble.$(O) labels.$(O) hashtbl.$(O) crc64.$(O) parser.$(O) \
@@ -46,6 +48,7 @@ NASM =        nasm.$(O) nasmlib.$(O) raa.$(O) saa.$(O) \
 
 NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) \
        insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(O)
+#--- End File Lists ---#
 
 all: nasm$(X) ndisasm$(X)
        rem cd rdoff && $(MAKE) all
index 59891de..775ead9 100644 (file)
@@ -1,4 +1,4 @@
-# -* makefile -*- GNU Makefile for NetWare target
+# -*- makefile -*- GNU Makefile for NetWare target
 
 PROOT=.
 OBJDIR=release
@@ -28,20 +28,23 @@ LDFLAGS+=-s
 
 O = o
 
-NASM = nasm.$(O) nasmlib.$(O) raa.$(O) saa.$(O) \
-       float.$(O) insnsa.$(O) insnsb.$(O) \
-       assemble.$(O) labels.$(O) hashtbl.$(O) crc64.$(O) parser.$(O) \
-       outform.$(O) output/outbin.$(O) \
-       output/outaout.$(O) output/outcoff.$(O) \
-       output/outelf32.$(O) output/outelf64.$(O) \
-       output/outobj.$(O) output/outas86.$(O) output/outrdf2.$(O) \
-       output/outdbg.$(O) output/outieee.$(O) output/outmacho.$(O) \
-       preproc.$(O) quote.$(O) pptok.$(O) macros.$(O) \
-       listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) strfunc.$(O) \
-       tokhash.$(O) regvals.$(O) regflags.$(O)
-
-NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) \
-       insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(O)
+#--- Begin File Lists ---#
+# Edit in Makefile.in, not here!
+NASM = nasm.o nasmlib.o raa.o saa.o \
+       float.o insnsa.o insnsb.o \
+       assemble.o labels.o hashtbl.o crc64.o parser.o \
+       outform.o output/outbin.o \
+       output/outaout.o output/outcoff.o \
+       output/outelf32.o output/outelf64.o \
+       output/outobj.o output/outas86.o output/outrdf2.o \
+       output/outdbg.o output/outieee.o output/outmacho.o \
+       preproc.o quote.o pptok.o macros.o \
+       listing.o eval.o exprlib.o stdscan.o strfunc.o \
+       tokhash.o regvals.o regflags.o
+
+NDISASM = ndisasm.o disasm.o sync.o nasmlib.o \
+       insnsd.o insnsb.o insnsn.o regs.o regdis.o
+#--- End File Lists ---#
 
 NASM_OBJ = $(addprefix $(OBJDIR)/,$(notdir $(NASM))) $(EOLIST)
 NDIS_OBJ = $(addprefix $(OBJDIR)/,$(notdir $(NDISASM))) $(EOLIST)
index c72c792..bee458e 100644 (file)
@@ -44,6 +44,8 @@ X               = .exe
        $(CC) -c $(ALL_CFLAGS) -fo=$^@ $[@
 
 # Note: wcl386 is broken if forward slashes are used as path separators.
+#--- Begin File Lists ---#
+# Edit in Makefile.in, not here!
 NASM = nasm.$(O) nasmlib.$(O) raa.$(O) saa.$(O) &
        float.$(O) insnsa.$(O) insnsb.$(O) &
        assemble.$(O) labels.$(O) hashtbl.$(O) crc64.$(O) parser.$(O) &
@@ -58,6 +60,7 @@ NASM =        nasm.$(O) nasmlib.$(O) raa.$(O) saa.$(O) &
 
 NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) &
        insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(O)
+#--- End File Lists ---#
 
 what:  .SYMBOLIC
        @echo Please build "dos", "win32" or "os2"
index fef0103..fbd36e3 100644 (file)
@@ -55,6 +55,8 @@ X               = .exe
 .c.$(O):
        $(CC) -c $(ALL_CFLAGS) -fo=$@ $<
 
+#--- Begin File Lists ---#
+# Edit in Makefile.in, not here!
 NASM = nasm.$(O) nasmlib.$(O) raa.$(O) saa.$(O) \
        float.$(O) insnsa.$(O) insnsb.$(O) \
        assemble.$(O) labels.$(O) hashtbl.$(O) crc64.$(O) parser.$(O) \
@@ -69,6 +71,7 @@ NASM =        nasm.$(O) nasmlib.$(O) raa.$(O) saa.$(O) \
 
 NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) \
        insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(O)
+#--- End File Lists ---#
 
 what:
        @echo 'Please build "dos", "win32" or "os2"'
diff --git a/syncfiles.pl b/syncfiles.pl
new file mode 100755 (executable)
index 0000000..5be984a
--- /dev/null
@@ -0,0 +1,86 @@
+#!/usr/bin/perl
+#
+# 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.
+# The initial file is assumed to be in Unix notation.
+#
+%def_hints = ('object-ending' => '.o',
+             'path-separator' => '/',
+             'continuation' => "\\");
+
+sub do_transform($$) {
+    my($l, $h) = @_;
+
+    $l =~ s/\x01/$$h{'object-ending'}/g;
+    $l =~ s/\x02/$$h{'path-separator'}/g;
+    $l =~ s/\x03/$$h{'continuation'}/g;
+
+    return $l;
+}
+
+@file_list = ();
+
+$first = 1;
+$first_file = $ARGV[0];
+die unless (defined($first_file));
+
+foreach $file (@ARGV) {
+    open(FILE, "< $file\0") or die;
+
+    # First, read the syntax hints
+    %hints = %def_hints;
+    while (defined($line = <FILE>)) {
+       if ($line =~ /^\#\s+\@(\S+)\:\s*\"([^\"]+)\"/) {
+           $hints{$1} = $2;
+       }
+    }
+
+    # Read and process the file
+    seek(FILE,0,0);
+    @lines = ();
+    $processing = 0;
+    while (defined($line = <FILE>)) {
+       chomp $line;
+       if ($processing) {
+           if ($line eq '#--- End File Lists ---#') {
+               push(@lines, $line."\n");
+               $processing = 0;
+           } 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(@file_list, $xl);
+               push(@lines, $line);
+           }
+       } else {
+           push(@lines, $line."\n");
+           if ($line eq '#--- Begin File Lists ---#') {
+               $processing = 1;
+               if (!$first) {
+                   push(@lines, "# Edit in $first_file, not here!\n");
+                   foreach $l (@file_list) {
+                       push(@lines, do_transform($l, \%hints)."\n");
+                   }
+               }
+           }
+       }
+    }
+    close(FILE);
+
+    # Write the file back out
+    if (!$first) {
+       open(FILE, "> $file\0") or die;
+       print FILE @lines;
+       close(FILE);
+    }
+
+    undef @lines;
+    $first = 0;
+}