toolchain: add support for glibc

The support for eglibc 2.17 was added to the internal toolchain
backend for 2013.08. This commit now adds glibc 2.18 support to the
internal toolchain backend.

Since the building procedure is very similar to the one of eglibc, we
have renamed the 'eglibc' package to 'glibc', and made it capable of
handling either glibc or eglibc.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: Peter Korsgaard <jacmet@sunsite.dk>
This commit is contained in:
Thomas Petazzoni 2013-09-02 18:06:33 +02:00 committed by Peter Korsgaard
parent 8e12e0a17a
commit 14a2d0b5ab
4 changed files with 64 additions and 28 deletions

View File

@ -145,7 +145,7 @@ config BR2_INSTALL_FORTRAN
config BR2_GCC_ENABLE_TLS config BR2_GCC_ENABLE_TLS
bool "Enable compiler tls support" if BR2_TOOLCHAIN_BUILDROOT_UCLIBC bool "Enable compiler tls support" if BR2_TOOLCHAIN_BUILDROOT_UCLIBC
default y default y
depends on BR2_PTHREADS_NATIVE || BR2_TOOLCHAIN_BUILDROOT_EGLIBC depends on BR2_PTHREADS_NATIVE || BR2_TOOLCHAIN_BUILDROOT_EGLIBC || BR2_TOOLCHAIN_BUILDROOT_GLIBC
help help
Enable the compiler to generate code for accessing Enable the compiler to generate code for accessing
thread local storage variables thread local storage variables

View File

@ -80,11 +80,11 @@ endef
HOST_GCC_FINAL_POST_INSTALL_HOOKS += HOST_GCC_FINAL_CREATE_SIMPLE_SYMLINKS HOST_GCC_FINAL_POST_INSTALL_HOOKS += HOST_GCC_FINAL_CREATE_SIMPLE_SYMLINKS
# In gcc 4.7.x, the ARM EABIhf library loader path for eglibc was not # In gcc 4.7.x, the ARM EABIhf library loader path for (e)glibc was not
# correct, so we create a symbolic link to make things work # correct, so we create a symbolic link to make things work
# properly. eglibc installs the library loader as ld-linux-armhf.so.3, # properly. eglibc installs the library loader as ld-linux-armhf.so.3,
# but gcc creates binaries that reference ld-linux.so.3. # but gcc creates binaries that reference ld-linux.so.3.
ifeq ($(BR2_arm)$(BR2_ARM_EABIHF)$(BR2_GCC_VERSION_4_7_X)$(BR2_TOOLCHAIN_BUILDROOT_EGLIBC),yyyy) ifeq ($(BR2_arm)$(BR2_ARM_EABIHF)$(BR2_GCC_VERSION_4_7_X)$(BR2_TOOLCHAIN_USES_GLIBC),yyyy)
define HOST_GCC_FINAL_LD_LINUX_LINK define HOST_GCC_FINAL_LD_LINUX_LINK
ln -sf ld-linux-armhf.so.3 $(TARGET_DIR)/lib/ld-linux.so.3 ln -sf ld-linux-armhf.so.3 $(TARGET_DIR)/lib/ld-linux.so.3
ln -sf ld-linux-armhf.so.3 $(STAGING_DIR)/lib/ld-linux.so.3 ln -sf ld-linux-armhf.so.3 $(STAGING_DIR)/lib/ld-linux.so.3

View File

@ -1,32 +1,46 @@
################################################################################ ################################################################################
# #
# eglibc # glibc/eglibc
# #
################################################################################ ################################################################################
EGLIBC_VERSION = 2.17-svnr22064 ifeq ($(BR2_TOOLCHAIN_BUILDROOT_EGLIBC),y)
EGLIBC_SITE = http://downloads.yoctoproject.org/releases/eglibc/ GLIBC_VERSION = 2.17-svnr22064
EGLIBC_SOURCE = eglibc-$(EGLIBC_VERSION).tar.bz2 GLIBC_SITE = http://downloads.yoctoproject.org/releases/eglibc/
EGLIBC_LICENSE = GPLv2+ (programs), LGPLv2.1+, BSD-3c, MIT (library) GLIBC_SOURCE = eglibc-$(GLIBC_VERSION).tar.bz2
EGLIBC_LICENSE_FILES = libc/COPYING libc/COPYING.LIB libc/LICENSES GLIBC_SRC_SUBDIR = libc
else
GLIBC_VERSION = 2.18
GLIBC_SITE = $(BR2_GNU_MIRROR)/libc
GLIBC_SOURCE = glibc-$(GLIBC_VERSION).tar.xz
GLIBC_SRC_SUBDIR = .
endif
# Before eglibc is configured, we must have the first stage GLIBC_LICENSE = GPLv2+ (programs), LGPLv2.1+, BSD-3c, MIT (library)
GLIBC_LICENSE_FILES = $(addprefix $(GLIBC_SRC_SUBDIR)/,COPYING COPYING.LIB LICENSES)
# Before (e)glibc is configured, we must have the first stage
# cross-compiler and the kernel headers # cross-compiler and the kernel headers
EGLIBC_DEPENDENCIES = host-gcc-initial linux-headers host-gawk GLIBC_DEPENDENCIES = host-gcc-initial linux-headers
# Before eglibc is built, we must have the second stage # eglibc also needs host-gawk
ifeq ($(BR2_TOOLCHAIN_BUILDROOT_EGLIBC),y)
GLIBC_DEPENDENCIES += host-gawk
endif
# Before (e)glibc is built, we must have the second stage
# cross-compiler, for some gcc versions # cross-compiler, for some gcc versions
eglibc-build: $(if $(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),host-gcc-intermediate) glibc-build: $(if $(BR2_TOOLCHAIN_NEEDS_THREE_STAGE_BUILD),host-gcc-intermediate)
EGLIBC_SUBDIR = build GLIBC_SUBDIR = build
EGLIBC_INSTALL_STAGING = YES GLIBC_INSTALL_STAGING = YES
EGLIBC_INSTALL_STAGING_OPT = install_root=$(STAGING_DIR) install GLIBC_INSTALL_STAGING_OPT = install_root=$(STAGING_DIR) install
# Thumb build is broken, build in ARM mode # Thumb build is broken, build in ARM mode
ifeq ($(BR2_ARM_INSTRUCTIONS_THUMB),y) ifeq ($(BR2_ARM_INSTRUCTIONS_THUMB),y)
EGLIBC_EXTRA_CFLAGS += -marm GLIBC_EXTRA_CFLAGS += -marm
endif endif
# Even though we use the autotools-package infrastructure, we have to # Even though we use the autotools-package infrastructure, we have to
@ -38,16 +52,16 @@ endif
# 2. We have to execute the configure script with bash and not sh. # 2. We have to execute the configure script with bash and not sh.
# #
# Note that as mentionned in # Note that as mentionned in
# http://patches.openembedded.org/patch/38849/, eglibc must be built # http://patches.openembedded.org/patch/38849/, eglibc/glibc must be
# with -O2, so we pass our own CFLAGS and CXXFLAGS below. # built with -O2, so we pass our own CFLAGS and CXXFLAGS below.
define EGLIBC_CONFIGURE_CMDS define GLIBC_CONFIGURE_CMDS
mkdir -p $(@D)/build mkdir -p $(@D)/build
# Do the configuration # Do the configuration
(cd $(@D)/build; \ (cd $(@D)/build; \
$(TARGET_CONFIGURE_OPTS) \ $(TARGET_CONFIGURE_OPTS) \
CFLAGS="-O2 $(EGLIBC_EXTRA_CFLAGS)" CPPFLAGS="" \ CFLAGS="-O2 $(GLIBC_EXTRA_CFLAGS)" CPPFLAGS="" \
CXXFLAGS="-O2 $(EGLIBC_EXTRA_CFLAGS)" \ CXXFLAGS="-O2 $(GLIBC_EXTRA_CFLAGS)" \
$(SHELL) $(@D)/libc/configure \ $(SHELL) $(@D)/$(GLIBC_SRC_SUBDIR)/configure \
ac_cv_path_BASH_SHELL=/bin/bash \ ac_cv_path_BASH_SHELL=/bin/bash \
libc_cv_forced_unwind=yes \ libc_cv_forced_unwind=yes \
--target=$(GNU_TARGET_NAME) \ --target=$(GNU_TARGET_NAME) \
@ -81,17 +95,17 @@ endef
# to install the libraries, and nothing more. # to install the libraries, and nothing more.
# #
EGLIBC_LIBS_LIB = \ GLIBC_LIBS_LIB = \
ld*.so libc.so libcrypt.so libdl.so libgcc_s.so libm.so \ ld*.so libc.so libcrypt.so libdl.so libgcc_s.so libm.so \
libnsl.so libpthread.so libresolv.so librt.so libutil.so \ libnsl.so libpthread.so libresolv.so librt.so libutil.so \
libnss_files.so libnss_dns.so libnss_files.so libnss_dns.so
ifeq ($(BR2_PACKAGE_GDB_SERVER),y) ifeq ($(BR2_PACKAGE_GDB_SERVER),y)
EGLIBC_LIBS_LIB += libthread_db.so GLIBC_LIBS_LIB += libthread_db.so
endif endif
define EGLIBC_INSTALL_TARGET_CMDS define GLIBC_INSTALL_TARGET_CMDS
for libs in $(EGLIBC_LIBS_LIB); do \ for libs in $(GLIBC_LIBS_LIB); do \
$(call copy_toolchain_lib_root,$(STAGING_DIR)/,,lib,$$libs,/lib) ; \ $(call copy_toolchain_lib_root,$(STAGING_DIR)/,,lib,$$libs,/lib) ; \
done done
endef endef

View File

@ -35,12 +35,34 @@ config BR2_TOOLCHAIN_BUILDROOT_EGLIBC
http://eglibc.org http://eglibc.org
config BR2_TOOLCHAIN_BUILDROOT_GLIBC
bool "glibc (experimental)"
depends on BR2_arm || BR2_armeb || BR2_aarch64 || \
BR2_i386 || BR2_mips || BR2_mipsel || \
BR2_mips64 || BR2_mips64el || BR2_powerpc || \
BR2_sh || BR2_sh64 || BR2_sparc || \
BR2_x86_64
select BR2_TOOLCHAIN_USES_GLIBC
# our glibc.mk enables RPC support
select BR2_TOOLCHAIN_HAS_NATIVE_RPC
help
This option selects glibc as the C library for the
cross-compilation toolchain.
The glibc support in the Buildroot toolchain backend is
very recent, and therefore marked experimental.
http://www.gnu.org/software/libc/
endchoice endchoice
config BR2_TOOLCHAIN_BUILDROOT_LIBC config BR2_TOOLCHAIN_BUILDROOT_LIBC
string string
default "uclibc" if BR2_TOOLCHAIN_BUILDROOT_UCLIBC default "uclibc" if BR2_TOOLCHAIN_BUILDROOT_UCLIBC
default "eglibc" if BR2_TOOLCHAIN_BUILDROOT_EGLIBC # Both glibc and eglibc are handled by the package called
# 'glibc'
default "glibc" if BR2_TOOLCHAIN_BUILDROOT_EGLIBC
default "glibc" if BR2_TOOLCHAIN_BUILDROOT_GLIBC
source "package/uclibc/Config.in" source "package/uclibc/Config.in"