opcodes: more build fixes

Ralf Wildenhues Ralf.Wildenhues@gmx.de
Mon Aug 24 21:56:00 GMT 2009


Hello Alan,

* Alan Modra wrote on Mon, Aug 24, 2009 at 10:46:51AM CEST:
> On Sun, Aug 23, 2009 at 11:41:05AM +0200, Ralf Wildenhues wrote:
> > z8kgen.c documents to generate z8k-opc.h, but there is no
> > accompanying rule for this.  Intentional omission?
> 
> Unintentional I would say.

Ok.  Below has a first cut of such a rule.

> > Also, do I assume correctly that i386-gen and ia64-gen only work
> > correctly in non-cross-compile situations, and are thus only enabled
> > in maintainer-mode?  Because otherwise you wouldn't necessarily be able
> > to execute code not compiled with CC_FOR_BUILD.  If that were to be
> > changed (similar to how s390-opc.c is created), then the dependency
> > tracking wouldn't necessarily work any more for files compiled with
> > this.
> 
> I think it's a bug that CC_FOR_BUILD isn't used here.

Well, but in that case there are more issues than just CC_FOR_BUILD.
Using $(LINK) is wrong, too.  The inclusion of "config.h" from the
current directory is wrong, as that will have settings for the host
compiler $CC, not for $CC_FOR_BUILD.  LIBIBERTY is wrong, that should be
BUILD_LIBIBERTY, and for that we'd need more machinery to get its value
right.

And then there is DaveK's posted mail (without patch) to add LIBINTL,
which would also be wrong in cross compile mode, because it would have
to be BUILD_LIBINTL, and that would require even more other build
machinery changes.  (BTW, maybe the easiest way out is to just not use
i18n in generator binaries, like gcc/ does.)

At least if I understand correctly.

In this case, the *-gen* parts of my previous patch are wrong, and I
have applied it only after dropping these hunks:

> > 	(i386-gen, ia64-gen): Remove.
> > 	(noinst_PROGRAMS, i386_gen_LDADD, ia64_gen_LDADD): New variables.

The following lays some foundation for improving things, but it still
doesn't work if you enable both cross-compilation and maintainer-mode.

The patch goes back to manual dependencies for stuff built with the
$build compiler.  It adds suitable entries for the various *clean
targets.  Noticing that created C files ought to be built before the po/
machinery runs on them, subdir make ordering is fixed.  Consistently to
how is done in binutils/, $(EXEEXT_FOR_BUILD) and similar are used.

Also, to avoid parallel make failures, it needs manual dependencies for
the generator output files.

The z8kgen compilation required a compiler warning fix.

I don't mind whether this is applied now, or postponed until a more
complete solution is available, but to me it looks like at least it
shouldn't regress anywhere.

DaveK's LIBINTL addition is missing from the patch below.

Cheers,
Ralf

opcodes/ChangeLog:
2009-08-24  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>

	* Makefile.am (SUBDIRS): Build '.' before 'po'.
	(COMPILE_FOR_BUILD, LINK_FOR_BUILD, BUILD_LIBIBERTY)
	(MOSTLYCLEANFILES, MAINTAINERCLEANFILES): New variables.
	(i386-gen$(EXEEXT_FOR_BUILD)): Renamed from i386-gen, rewrite
	using *BUILD variables, depend upon $(BUILD_LIBIBERTY).
	(i386-gen.o): New rule.
	($(srcdir)/i386-init.h): Adjust.
	(i386-opc.lo): Depend on $(srcdir)/i386-tbl.h.
	(ia64-gen$(EXEEXT_FOR_BUILD)): Rename from ia64-gen, adjust likewise.
	(ia64-gen.o): New rule.
	(ia64_asmtab_deps): New variable.
	($(srcdir)/ia64-asmtab.c): Use it; adjust likewise.
	(ia64-opc.lo): Depend on $(srcdir)/ia64-asmtab.c.
	(s390-mkopc$(EXEEXT_FOR_BUILD)): Rename from s390-mkopc, adjust
	likewise.
	(s390-opc.tab): Adjust.
	(z8kgen$(EXEEXT_FOR_BUILD), z8kgen.o, $(srcdir)/z8k-opc.h): New
	rules.
	(z8k-dis.lo): Depend on $(srcdir)/z8k-opc.h.
	* Makefile.in: Regenerate.
	* z8kgen.c (gas): Avoid '/*' in comment.
	* z8k-opc.h (func): Regenerate.

diff --git a/opcodes/Makefile.am b/opcodes/Makefile.am
index f9b7060..465ea05 100644
--- a/opcodes/Makefile.am
+++ b/opcodes/Makefile.am
@@ -3,7 +3,8 @@
 AUTOMAKE_OPTIONS = 1.11 foreign no-dist
 ACLOCAL_AMFLAGS = -I .. -I ../config -I ../bfd
 
-SUBDIRS = po
+# Build '.' first so all generated files exist.
+SUBDIRS = . po
 
 INCDIR = $(srcdir)/../include
 BFDDIR = $(srcdir)/../bfd
@@ -12,6 +13,10 @@ WARN_CFLAGS = @WARN_CFLAGS@
 NO_WERROR = @NO_WERROR@
 AM_CFLAGS = $(WARN_CFLAGS)
 
+COMPILE_FOR_BUILD = $(CC_FOR_BUILD) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(BUILD_CPPFLAGS) $(BUILD_CFLAGS)
+LINK_FOR_BUILD = $(CC_FOR_BUILD) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) -o $@
+
 bfdlibdir = @bfdlibdir@
 bfdincludedir = @bfdincludedir@
 
@@ -29,6 +34,8 @@ BFD_H = ../bfd/bfd.h
 
 # This is where libiberty lives.
 LIBIBERTY = ../libiberty/libiberty.a
+# This is only true when not cross-compiling.
+BUILD_LIBIBERTY = $(LIBIBERTY)
 
 # Header files.
 HFILES = \
@@ -438,31 +445,67 @@ stamp-xc16x: $(CGENDEPS) $(CPUDIR)/xc16x.cpu $(CPUDIR)/xc16x.opc
 	$(MAKE) run-cgen arch=xc16x prefix=xc16x options= \
 		archfile=$(CPUDIR)/xc16x.cpu opcfile=$(CPUDIR)/xc16x.opc extrafiles=
 
-i386-gen: i386-gen.o
-	$(LINK) i386-gen.o $(LIBIBERTY)
+MOSTLYCLEANFILES = i386-gen$(EXEEXT_FOR_BUILD) ia64-gen$(EXEEXT_FOR_BUILD) \
+	s390-mkopc$(EXEEXT_FOR_BUILD) z8kgen$(EXEEXT_FOR_BUILD)
+
+MAINTAINERCLEANFILES = $(srcdir)/i386-tbl.h $(srcdir)/i386-init.h \
+	$(srcdir)/ia64-asmtab.c s390-opc.tab $(srcdir)/z8k-opc.h
+
+i386-gen$(EXEEXT_FOR_BUILD): i386-gen.o $(BUILD_LIBIBERTY)
+	$(LINK_FOR_BUILD) i386-gen.o $(BUILD_LIBIBERTY)
+
+i386-gen.o: i386-gen.c i386-opc.h $(srcdir)/../include/opcode/i386.h \
+	$(INCDIR)/ansidecl.h $(INCDIR)/getopt.h $(INCDIR)/hashtab.h \
+	$(INCDIR)/libiberty.h $(INCDIR)/opcode/i386.h $(INCDIR)/safe-ctype.h \
+	config.h i386-opc.h sysdep.h
+	$(COMPILE_FOR_BUILD) -c $(srcdir)/i386-gen.c
 
 $(srcdir)/i386-tbl.h: $(srcdir)/i386-init.h 
 	@echo $@
 
-$(srcdir)/i386-init.h: @MAINT@ i386-gen i386-opc.tbl i386-reg.tbl
-	./i386-gen --srcdir $(srcdir)
+$(srcdir)/i386-init.h: @MAINT@ i386-gen$(EXEEXT_FOR_BUILD) i386-opc.tbl i386-reg.tbl
+	./i386-gen$(EXEEXT_FOR_BUILD) --srcdir $(srcdir)
+
+i386-opc.lo: $(srcdir)/i386-tbl.h
+
+ia64-gen$(EXEEXT_FOR_BUILD): ia64-gen.o $(BUILD_LIBIBERTY)
+	$(LINK_FOR_BUILD) ia64-gen.o $(BUILD_LIBIBERTY)
 
-ia64-gen: ia64-gen.o
-	$(LINK) ia64-gen.o $(LIBIBERTY)
+ia64-gen.o: ia64-gen.c $(BFD_H) $(INCDIR)/ansidecl.h $(INCDIR)/getopt.h \
+	$(INCDIR)/libiberty.h $(INCDIR)/opcode/ia64.h $(INCDIR)/safe-ctype.h \
+	$(INCDIR)/symcat.h config.h ia64-opc-a.c ia64-opc-b.c \
+	ia64-opc-d.c ia64-opc-f.c ia64-opc-i.c ia64-opc-m.c \
+	ia64-opc-x.c ia64-opc.h sysdep.h
+	$(COMPILE_FOR_BUILD) -c $(srcdir)/ia64-gen.c
 
-# Don't wrap the line below, as @MAINT@ can be expanded to '#'.
-# Some make versions don't handle line continuations in comments.
-$(srcdir)/ia64-asmtab.c: @MAINT@ ia64-gen ia64-ic.tbl ia64-raw.tbl ia64-waw.tbl ia64-war.tbl
-	./ia64-gen --srcdir $(srcdir) > $@
+# Use a helper variable for the dependencies to avoid 'make' issues
+# with continuations in comments, as @MAINT@ can be expanded to '#'.
+ia64_asmtab_deps = ia64-gen$(EXEEXT_FOR_BUILD) ia64-ic.tbl \
+	ia64-raw.tbl ia64-waw.tbl ia64-war.tbl
+$(srcdir)/ia64-asmtab.c: @MAINT@ $(ia64_asmtab_deps)
+	./ia64-gen$(EXEEXT_FOR_BUILD) --srcdir $(srcdir) > $@
 
-s390-mkopc: s390-mkopc.c
-	$(CC_FOR_BUILD) -o s390-mkopc $(srcdir)/s390-mkopc.c
+ia64-opc.lo: $(srcdir)/ia64-asmtab.c
 
-s390-opc.tab: s390-mkopc s390-opc.txt
-	./s390-mkopc < $(srcdir)/s390-opc.txt > s390-opc.tab
+s390-mkopc$(EXEEXT_FOR_BUILD): s390-mkopc.c
+	$(COMPILE_FOR_BUILD) -o s390-mkopc $(srcdir)/s390-mkopc.c
+
+s390-opc.tab: s390-mkopc$(EXEEXT_FOR_BUILD) s390-opc.txt
+	./s390-mkopc$(EXEEXT_FOR_BUILD) < $(srcdir)/s390-opc.txt > s390-opc.tab
 
 s390-opc.lo: s390-opc.tab
 
+z8kgen$(EXEEXT_FOR_BUILD): z8kgen.o $(BUILD_LIBIBERTY)
+	$(LINK_FOR_BUILD) z8kgen.o $(BUILD_LIBIBERTY)
+
+z8kgen.o: z8kgen.c
+	$(COMPILE_FOR_BUILD) -c $(srcdir)/z8kgen.c
+
+$(srcdir)/z8k-opc.h: @MAINT@ z8kgen$(EXEEXT_FOR_BUILD)
+	./z8kgen$(EXEEXT_FOR_BUILD) -a > $@
+
+z8k-dis.lo: $(srcdir)/z8k-opc.h
+
 sh-dis.lo: sh-dis.c
 if am__fastdepCC
 	$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ @archdefs@ $(srcdir)/sh-dis.c
diff --git a/opcodes/z8k-opc.h b/opcodes/z8k-opc.h
index ba05fbe..837dd39 100644
--- a/opcodes/z8k-opc.h
+++ b/opcodes/z8k-opc.h
@@ -1,7 +1,7 @@
 /* DO NOT EDIT!  -*- buffer-read-only: t -*-
    This file is automatically generated by z8kgen.  */
 
-/* Copyright 2007 Free Software Foundation, Inc.
+/* Copyright 2007, 2009 Free Software Foundation, Inc.
 
    This file is part of the GNU opcodes library.
 
@@ -289,7 +289,7 @@ typedef struct {
 #endif
   const char *name;
   unsigned char opcode;
-  void (*func) PARAMS ((void));
+  void (*func) (void);
   unsigned int arg_info[4];
   unsigned int byte_info[10];
   int noperands;
diff --git a/opcodes/z8kgen.c b/opcodes/z8kgen.c
index bb513ba..9fb7de2 100644
--- a/opcodes/z8kgen.c
+++ b/opcodes/z8kgen.c
@@ -1,4 +1,4 @@
-/* Copyright 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
+/* Copyright 2001, 2002, 2003, 2005, 2007, 2009 Free Software Foundation, Inc.
 
    This file is part of the GNU opcodes library.
 
@@ -969,9 +969,9 @@ gas (void)
 
   printf ("/* DO NOT EDIT!  -*- buffer-read-only: t -*-\n");
   printf ("   This file is automatically generated by z8kgen.  */\n\n");
-  printf ("/* Copyright 2007 Free Software Foundation, Inc.\n\
+  printf ("/* Copyright 2007, 2009 Free Software Foundation, Inc.\n\
 \n\
-/* This file is part of the GNU opcodes library.\n\
+   This file is part of the GNU opcodes library.\n\
 \n\
    This library is free software; you can redistribute it and/or modify\n\
    it under the terms of the GNU General Public License as published by\n\



More information about the Binutils mailing list