From 440dcafbd07915cadeb26806fe6d8835d62f293b Mon Sep 17 00:00:00 2001
From: Waldemar Brodkorb <mail@waldemar-brodkorb.de>
Date: Sun, 7 Oct 2012 19:42:00 +0200
Subject: support for 32/64 x86_64 multilib with eglibc

---
 toolchain/eglibc/Makefile | 79 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 78 insertions(+), 1 deletion(-)

(limited to 'toolchain/eglibc')

diff --git a/toolchain/eglibc/Makefile b/toolchain/eglibc/Makefile
index 677711f10..7f369d3ed 100644
--- a/toolchain/eglibc/Makefile
+++ b/toolchain/eglibc/Makefile
@@ -13,7 +13,6 @@ endif
 TARGET_CFLAGS:= $(filter-out -fstack-protector,$(TARGET_CFLAGS))
 
 EGLIBC_CONFOPTS:=	--build=$(GNU_HOST_NAME) \
-			--host=$(REAL_GNU_TARGET_NAME) \
 			--without-cvs \
 			--disable-profile \
 			--disable-debug \
@@ -43,9 +42,15 @@ EGLIBC_CONFOPTS+=       --without-fp
 endif
 
 EGLIBC_BUILD_DIR_INITIAL:=	${WRKDIR}/$(PKG_NAME)-$(PKG_VERSION)-headers
+EGLIBC_BUILD_DIR_INITIAL32:=	${WRKDIR}/$(PKG_NAME)-$(PKG_VERSION)-headers32
 EGLIBC_BUILD_DIR_FINAL:=	${WRKDIR}/$(PKG_NAME)-$(PKG_VERSION)-final
+EGLIBC_BUILD_DIR_FINAL32:=	${WRKDIR}/$(PKG_NAME)-$(PKG_VERSION)-final32
 
+ifeq ($(ADK_TARGET_WITH_MULTILIB),y)
+$(WRKBUILD)/.headers_configure: $(WRKBUILD)/.headers_configure32
+else
 $(WRKBUILD)/.headers_configure:
+endif
 	mkdir -p $(EGLIBC_BUILD_DIR_INITIAL)
 	(cd ${WRKDIR}/$(PKG_NAME)-$(PKG_VERSION); \
 		ln -sf ../ports ${WRKDIR}/$(PKG_NAME)-$(PKG_VERSION)/libc);
@@ -56,6 +61,7 @@ $(WRKBUILD)/.headers_configure:
 		$(WRKBUILD)/libc/configure \
 			--prefix=$(STAGING_TARGET_DIR)/usr \
 			--with-headers=$(STAGING_TARGET_DIR)/usr/include \
+			--host=$(REAL_GNU_TARGET_NAME) \
 			${EGLIBC_CONFOPTS} \
 	);
 	touch $@
@@ -70,13 +76,42 @@ $(WRKBUILD)/.headers: $(WRKBUILD)/.headers_configure
 	touch $(STAGING_TARGET_DIR)/usr/include/gnu/stubs-64.h
 	touch $@
 
+$(WRKBUILD)/.headers_configure32:
+	mkdir -p $(EGLIBC_BUILD_DIR_INITIAL32)
+	(cd ${WRKDIR}/$(PKG_NAME)-$(PKG_VERSION); \
+		ln -sf ../ports ${WRKDIR}/$(PKG_NAME)-$(PKG_VERSION)/libc);
+	$(CP) ${TOPDIR}/toolchain/eglibc/eglibc.config \
+		$(EGLIBC_BUILD_DIR_INITIAL32)/option-groups.config
+	(cd $(EGLIBC_BUILD_DIR_INITIAL32); \
+		${EGLIBC_ENV} \
+		CC='${REAL_GNU_TARGET_NAME}-gcc -m32' \
+		$(WRKBUILD)/libc/configure \
+			--prefix=$(STAGING_TARGET_DIR_32)/usr \
+			--with-headers=$(STAGING_TARGET_DIR_32)/usr/include \
+			--host=i486-openadk-linux-gnu \
+			${EGLIBC_CONFOPTS} \
+	);
+	(cd $(EGLIBC_BUILD_DIR_INITIAL32); \
+		PATH='${TARGET_PATH}' \
+		${EGLIBC_ENV} \
+		CC='${REAL_GNU_TARGET_NAME}-gcc -m32' \
+		$(MAKE) install-headers install-bootstrap-headers=yes cross-compiling=yes \
+	);
+	touch $(STAGING_TARGET_DIR_32)/usr/include/gnu/stubs.h
+	touch $(STAGING_TARGET_DIR_32)/usr/include/gnu/stubs-64.h
+	touch $@
+
 ifeq ($(ADK_TOOLCHAIN_GCC_USE_SSP),y)
 EGLIBC_ENV+=		libc_cv_ssp=yes
 else
 EGLIBC_ENV+=		libc_cv_ssp=no
 endif
 
+ifeq ($(ADK_TARGET_WITH_MULTILIB),y)
+$(WRKBUILD)/.configured: $(WRKBUILD)/.configured32
+else
 $(WRKBUILD)/.configured:
+endif
 	mkdir -p $(EGLIBC_BUILD_DIR_FINAL)
 	$(CP) ${TOPDIR}/toolchain/eglibc/eglibc.config \
 		$(EGLIBC_BUILD_DIR_FINAL)/option-groups.config
@@ -86,6 +121,7 @@ $(WRKBUILD)/.configured:
 			--prefix=/usr \
 			--enable-shared \
 			--enable-stackguard-randomization \
+			--host=$(REAL_GNU_TARGET_NAME) \
 			${EGLIBC_CONFOPTS} \
 	);
 	touch $@
@@ -102,4 +138,45 @@ $(WRKBUILD)/.installed: $(EGLIBC_BUILD_DIR_FINAL)/libc.so
 	${INSTALL_DATA} ${WRKBUILD}/libc/nss/nsswitch.conf ${STAGING_TARGET_DIR}/etc/
 	touch $@
 
+$(WRKBUILD)/.configured32:
+	mkdir -p $(EGLIBC_BUILD_DIR_FINAL32)
+	$(CP) ${TOPDIR}/toolchain/eglibc/eglibc.config \
+		$(EGLIBC_BUILD_DIR_FINAL32)/option-groups.config
+	(cd $(EGLIBC_BUILD_DIR_FINAL32); \
+		${EGLIBC_ENV} \
+		CC='${REAL_GNU_TARGET_NAME}-gcc -m32' \
+		$(WRKBUILD)/libc/configure \
+			--prefix=/usr \
+			--enable-shared \
+			--enable-stackguard-randomization \
+			--host=i486-openadk-linux-gnu \
+			${EGLIBC_CONFOPTS} \
+	);
+	${EGLIBC_ENV} $(MAKE) -C $(EGLIBC_BUILD_DIR_FINAL32) cross-compiling=yes all
+	${EGLIBC_ENV} $(MAKE) -C $(EGLIBC_BUILD_DIR_FINAL32) install_root=$(STAGING_TARGET_DIR_32) install
+	mkdir -p $(STAGING_TARGET_DIR)/lib/$(REAL_GNU_TARGET_NAME)/4.7.2/32
+	$(CP) $(STAGING_TARGET_DIR_32)/lib/* $(STAGING_TARGET_DIR_32)/usr/lib/* \
+		$(STAGING_TARGET_DIR)/lib/$(REAL_GNU_TARGET_NAME)/4.7.2/32
+	-rm $(STAGING_TARGET_DIR)/lib/$(REAL_GNU_TARGET_NAME)/4.7.2/32/libc.so
+	touch $@
+
+$(WRKBUILD)/.configuredx32:
+	mkdir -p $(EGLIBC_BUILD_DIR_FINALX32)
+	$(CP) ${TOPDIR}/toolchain/eglibc/eglibc.config \
+		$(EGLIBC_BUILD_DIR_FINALX32)/option-groups.config
+	(cd $(EGLIBC_BUILD_DIR_FINALX32); \
+		${EGLIBC_ENV} \
+		CC=${REAL_GNU_TARGET_NAME}-gcc -mx32 \
+		$(WRKBUILD)/libc/configure \
+			--prefix=/usr \
+			--enable-shared \
+			--enable-stackguard-randomization \
+			--host=x86_64-x32-openadk-linux-gnu \
+			${EGLIBC_CONFOPTS} \
+	);
+	${EGLIBC_ENV} $(MAKE) -C $(EGLIBC_BUILD_DIR_FINALX32) cross-compiling=yes all
+	${EGLIBC_ENV} $(MAKE) -C $(EGLIBC_BUILD_DIR_FINALX32) install_root=$(STAGING_TARGET_DIR_X32) install
+	touch $@
+
+
 include ${TOPDIR}/mk/toolchain.mk
-- 
cgit v1.2.3