diff mbox

[build] Restore bootstrap in building libcc1 on darwin

Message ID 20141205163456.GO1923@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Dec. 5, 2014, 4:34 p.m. UTC
On Mon, Nov 24, 2014 at 01:06:45AM +0100, FX wrote:
> tl;dr: One question to build maintainers, and one patch submitted to toplevel configure.ac
> 
> ---------------
> 
> I’m looked into the issue some more, and am comparing two builds of trunk (exact same source), one configured with system compiler (clang) in PATH, the other with GCC 4.9.2 in PATH.
> At the toplevel configure, the only meaningful difference is that the gcc-based build sets stage1_ldflags='-static-libstdc++ -static-libgcc' while the clang-based has stage1_ldflags='' (clang doesn’t recognized -static-libstdc++).
> 
> This is included into the toplevel Makefile as STAGE1_LDFLAGS (the comment appropriately says "Linker flags to use on the host, for stage1 or when not bootstrapping”).
> Those are exported by HOST_EXPORTS, which is are then used by configure-libcc1, all-libcc1, etc. Thus, we end up using STAGE1_LDFLAGS, which correspond to the system compiler, instead of the stage3 compiler (as we should).
> 
> So, this is “false negative” part of the problem (namely, why we don’t see the failure when bootstrapping with clang): we use STAGE1_LDFLAGS in building libcc1, and with clang as system compiler we don’t use static linking of the C++ library. This part, I don’t know how to fix: it is for the build experts to address. It is a real problem: it leads to libcc1.so being linked dynamically to libstdc++ and libgcc, instead of statically (as it should).
> 
> ---------------
> 
> Second part of the question: when the freshly built g++ is used, we need to pass the appropriate -B options. As I understand it, the appropriate place for that is in the toplevel configure.ac, where we already pass down the respective -L options. Indeed, the attached patch restores bootstrap on x86_64-apple-darwin14 with gcc as system compiler (and doesn’t break the bootstrap with clang as system compiler).
> 
> OK to commit?

Reading the toplevel Makefile and trying to understand how things work
for non-bootstrap vs. bootstrap host dirs that aren't bootstrapped,
I'd say the right fix should be something like following
(bootstrapping/regtesting it right now on x86_64-linux and i686-linux,
though it won't make much difference there, on x86_64-linux
STAGE1_LDFLAGS is equal to POSTSTAGE1_LDFLAGS and STAGE1_LIBS is equal
to POSTSTAGE1_LIBS.  On i686-linux there is at least a difference
for some reason (possibly related with my setarch and gcc -m32 wrappers
hacks to make i686-linux bootstrap work on x86_64-linux box) in
*STAGE1_LDFLAGS, only the POSTSTAGE1_LDFLAGS is -static-libstdc++ -static-libgcc.

From my reading, POSTSTAGE1_HOST_EXPORTS is clearly inappropriate for the
modules like libcc1, because it uses prev-gcc/, while we want to use gcc/,
but otherwise looking at the HOST_EXPORTS vs. POSTSTAGE1_HOST_EXPORTS
differences, LDFLAGS and HOST_LIBS is what needs changing.
For some reason POSTSTAGE1_HOST_EXPORTS sets LDFLAGS to 
$(POSTSTAGE1_LDFLAGS) $(BOOT_LDFLAGS)
(the first part is ok and clear, the latter differs from the HOST_EXPORTS
$(STAGE1_LDFLAGS) $(LDFLAGS).
With my patch below, one actually ends up with
$(POSTSTAGE1_LDFLAGS) $(LDFLAGS_FOR_TARGET)
for libcc1 when bootstrapping in LDFLAGS, while previously
$(STAGE1_LDFLAGS) $(LDFLAGS_FOR_TARGET)
was used.  STAGE1_L{DFLAGS,IBS} is only used in $(HOST_EXPORTS),
so at least in theory I think my patch should DTRT.

Can you please test it on Darwin (or whatever other target has similar
issues with bootstrapping libcc1)?

2014-12-05  Jakub Jelinek  <jakub@redhat.com>

	PR bootstrap/64023
	* Makefile.tpl (EXTRA_TARGET_FLAGS): Set STAGE1_LDFLAGS
	to POSTSTAGE1_LDFLAGS and STAGE1_LIBS to POSTSTAGE1_LIBS.
	* Makefile.in: Regenerated.



	Jakub
diff mbox

Patch

--- Makefile.tpl.jj	2014-11-12 09:31:59.000000000 +0100
+++ Makefile.tpl	2014-12-05 17:14:16.115295667 +0100
@@ -659,6 +659,8 @@  EXTRA_TARGET_FLAGS = \
 	'WINDRES=$$(WINDRES_FOR_TARGET)' \
 	'WINDMC=$$(WINDMC_FOR_TARGET)' \
 	'XGCC_FLAGS_FOR_TARGET=$(XGCC_FLAGS_FOR_TARGET)' \
+	'STAGE1_LDFLAGS=$$(POSTSTAGE1_LDFLAGS)' \
+	'STAGE1_LIBS=$$(POSTSTAGE1_LIBS)' \
 	"TFLAGS=$$TFLAGS"
 
 TARGET_FLAGS_TO_PASS = $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS)
--- Makefile.in.jj	2014-11-28 14:40:52.000000000 +0100
+++ Makefile.in	2014-12-05 17:15:04.322439003 +0100
@@ -853,6 +853,8 @@  EXTRA_TARGET_FLAGS = \
 	'WINDRES=$$(WINDRES_FOR_TARGET)' \
 	'WINDMC=$$(WINDMC_FOR_TARGET)' \
 	'XGCC_FLAGS_FOR_TARGET=$(XGCC_FLAGS_FOR_TARGET)' \
+	'STAGE1_LDFLAGS=$$(POSTSTAGE1_LDFLAGS)' \
+	'STAGE1_LIBS=$$(POSTSTAGE1_LIBS)' \
 	"TFLAGS=$$TFLAGS"
 
 TARGET_FLAGS_TO_PASS = $(BASE_FLAGS_TO_PASS) $(EXTRA_TARGET_FLAGS)