This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Build rpcgen-generated files when cross compiling


On Tue, 13 Mar 2012, Roland McGrath wrote:

> Overall, I like this direction.  It seems worthwhile to genericize it a
> little with vars/rules in Makerules to cover other future cases too.  I can
> try to come up with some general variables/rules if it's not obvious to you
> what I have in mind.

I think that would be helpful, yes.  It's not clear there are many other 
cases that would have anything much in common - or any at all where it's 
so close to just building the same sources but with a different compiler.  
There's the existing $(native-compile) used in a few places for building 
an executable from a single source file.  Apart from all the places 
needing changing for cross-testing, there's the support for populating 
/usr/libexec/getconf (where the cross-compilation adaptations are more 
complicated than those for rpcgen), and localedef (for 
localedata/install-locales rather than plain "make install").  
Cross-localedef is a lot more complicated - the format of the output files 
depends on both endianness and on the alignment of uint32_t, and the 
localedef code is quite entangled with glibc internals and features from 
recent glibc.  Now glibc no longer installs timezone data, cross-zic 
(which was as simple as cross-rpcgen) is no longer really relevant.

(What I think is the right approach for cross-localedef involves having 
separate repositories for localedef itself (building with an installed C 
library, using gnulib for portability) and for the locale data (maybe 
shipping binary locales with glibc for use in the testsuite, though you'd 
need to have different versions for different architectures, or maybe 
requiring localedef to be previously built).  That's a lot more 
complicated than most of the other cross changes, including cross 
testing.)

This cross-rpcgen patch hopefully addresses the various comments on the 
previous patch other than that about generic rules in Makerules.

Tested x86_64, native and bootstrapped cross, the same as the previous
patch.

2012-03-14  Maxim Kuvyrkov  <maxim@codesourcery.com>
	    Joseph Myers  <joseph@codesourcery.com>
	    Paul Pluzhnikov  <ppluzhnikov@google.com>

	* sunrpc/Makefile [cross-compiling] (headers): Enable additions
	requiring rpcgen.
	[cross-compiling] (extra-libs): Likewise.
	[cross-compiling] (extra-libs-others): Likewise.
	[cross-compiling] (librpcsvc-routines): Likewise.
	[cross-compiling] (librpcsvc-inhibit-o): Likewise.
	[cross-compiling] (omit-deps): Likewise.
	(sunrpc-CPPFLAGS): New variable.
	(CPPFLAGS): Define using $(sunrpc-CPPFLAGS).
	(BUILD_CPPFLAGS): Append $(sunrpc-CPPFLAGS).
	(cross-rpcgen-objs): New variable.
	($(cross-rpcgen-objs)): New rule.
	($(objpfx)cross-rpcgen): Likewise.
	(rpcgen-cmd): Define to use $(built-program-file).
	($(objpfx)rpcsvc/%.stmp): Depend on cross-rpcgen.
	($(objpfx)x%.stmp): Likewise.
	* sunrpc/proto.h [IS_IN_build] (_): Define.
	[IS_IN_build] (_libc_intl_domainname): Likewise.

diff --git a/sunrpc/Makefile b/sunrpc/Makefile
index e0339ad..43dedb3 100644
--- a/sunrpc/Makefile
+++ b/sunrpc/Makefile
@@ -102,15 +102,12 @@ otherlibs += $(nssobjdir)/libnss_files.a $(resolvobjdir)/libnss_dns.a \
 	     $(resolvobjdir)/libresolv.a
 endif
 
-ifeq (no,$(cross-compiling))
-# We can only build this library if we can run the rpcgen we build.
 headers += $(rpcsvc:%.x=rpcsvc/%.h)
 extra-libs := librpcsvc
 extra-libs-others := librpcsvc # Make it in `others' pass, not `lib' pass.
 librpcsvc-routines = $(rpcsvc:%.x=x%)
 librpcsvc-inhibit-o = .os # Build no shared rpcsvc library.
 omit-deps = $(librpcsvc-routines)
-endif
 
 include ../Rules
 
@@ -144,7 +141,9 @@ CFLAGS-pmap_rmt.c = -fexceptions
 CFLAGS-clnt_perr.c = -fexceptions
 CFLAGS-openchild.c = -fexceptions
 
-CPPFLAGS += -D_RPC_THREAD_SAFE_
+sunrpc-CPPFLAGS = -D_RPC_THREAD_SAFE_
+CPPFLAGS += $(sunrpc-CPPFLAGS)
+BUILD_CPPFLAGS += $(sunrpc-CPPFLAGS)
 
 $(objpfx)tst-getmyaddr: $(common-objpfx)linkobj/libc.so
 $(objpfx)tst-xdrmem: $(common-objpfx)linkobj/libc.so
@@ -152,13 +151,23 @@ $(objpfx)tst-xdrmem2: $(common-objpfx)linkobj/libc.so
 
 $(objpfx)rpcgen: $(addprefix $(objpfx),$(rpcgen-objs))
 
+cross-rpcgen-objs = $(addprefix $(objpfx)cross-,$(rpcgen-objs))
+
+$(cross-rpcgen-objs): $(objpfx)cross-%.o: %.c
+	$(make-target-directory)
+	$(BUILD_CC) $< -c -D_GNU_SOURCE $(BUILD_CFLAGS) $(BUILD_CPPFLAGS) \
+		-DIS_IN_build $(OUTPUT_OPTION) $(compile-mkdep-flags)
+
+$(objpfx)cross-rpcgen: $(cross-rpcgen-objs)
+	$(BUILD_CC) $^ $(BUILD_LDFLAGS) -o $@
+
 # This makes sure -DNOT_IN_libc is passed for all these modules.
 cpp-srcs-left := $(rpcgen-objs:.o=.c)
 lib := nonlib
 include $(patsubst %,$(..)cppflags-iterator.mk,$(cpp-srcs-left))
 
 # Tell rpcgen where to find the C preprocessor.
-rpcgen-cmd = CPP='$(CC) -E -x c-header' $(built-program-cmd) -Y ../scripts
+rpcgen-cmd = CPP='$(CC) -E -x c-header' $(built-program-file) -Y ../scripts
 
 # Install the rpc data base file.
 $(inst_sysconfdir)/rpc: etc.rpc $(+force)
@@ -169,7 +178,7 @@ $(inst_sysconfdir)/rpc: etc.rpc $(+force)
 # relinked.
 $(rpcsvc:%.x=$(objpfx)rpcsvc/%.h): $(objpfx)rpcsvc/%.h: $(objpfx)rpcsvc/%.stmp
 	@:
-$(objpfx)rpcsvc/%.stmp: rpcsvc/%.x $(objpfx)rpcgen
+$(objpfx)rpcsvc/%.stmp: rpcsvc/%.x $(objpfx)cross-rpcgen
 	$(make-target-directory)
 	-@rm -f ${@:stmp=T} $@
 	$(rpcgen-cmd) -h $< -o ${@:stmp=T}
@@ -179,7 +188,7 @@ $(objpfx)rpcsvc/%.stmp: rpcsvc/%.x $(objpfx)rpcgen
 # Generate the rpcsvc XDR functions with rpcgen.
 $(rpcsvc:%.x=$(objpfx)x%.c): $(objpfx)x%.c: $(objpfx)x%.stmp
 	@:
-$(objpfx)x%.stmp: rpcsvc/%.x $(objpfx)rpcgen
+$(objpfx)x%.stmp: rpcsvc/%.x $(objpfx)cross-rpcgen
 	-@rm -f ${@:stmp=T} $@
 	$(rpcgen-cmd) -c $< -o ${@:stmp=T}
 	$(move-if-change) $(@:stmp=T) $(@:stmp=c)
diff --git a/sunrpc/proto.h b/sunrpc/proto.h
index 3e1ecd1..df36ece 100644
--- a/sunrpc/proto.h
+++ b/sunrpc/proto.h
@@ -50,3 +50,14 @@ void crash(void) __attribute__ ((noreturn));
 void tabify(FILE *f, int tab);
 char *make_argname(const char *pname, const char *vname);
 void add_type(int len, const char *type);
+
+/* This header is the last one included in all rpc_*.c files,
+   so we define stuff for cross-rpcgen here to avoid conflicts with
+   $build's C library and $host's glibc.  */
+
+#ifdef IS_IN_build
+
+#define _(X) (X)
+#define _libc_intl_domainname "libc"
+
+#endif

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]