################################################################################ # # uclibc # ################################################################################ UCLIBC_VERSION = $(call qstrip,$(BR2_UCLIBC_VERSION_STRING)) UCLIBC_SOURCE = uClibc-$(UCLIBC_VERSION).tar.bz2 ifeq ($(BR2_UCLIBC_VERSION_SNAPSHOT),y) UCLIBC_SITE = http://www.uclibc.org/downloads/snapshots else ifeq ($(findstring arc,$(UCLIBC_VERSION)),arc) UCLIBC_SITE = $(BR2_ARC_SITE) else UCLIBC_SITE = http://www.uclibc.org/downloads UCLIBC_SOURCE = uClibc-$(UCLIBC_VERSION).tar.xz endif UCLIBC_INSTALL_STAGING = YES # Before uClibc is configured, we must have the first stage # cross-compiler and the kernel headers UCLIBC_DEPENDENCIES = host-gcc-initial linux-headers # Before uClibc is built, we must have the second stage cross-compiler uclibc-build: host-gcc-intermediate # specifying UCLIBC_CONFIG_FILE on the command-line overrides the .config # setting. ifndef UCLIBC_CONFIG_FILE UCLIBC_CONFIG_FILE = $(call qstrip,$(BR2_UCLIBC_CONFIG)) endif UCLIBC_TARGET_ARCH = $(call qstrip,$(BR2_UCLIBC_TARGET_ARCH)) ifeq ($(GENERATE_LOCALE),) # We need at least one locale UCLIBC_LOCALES = en_US else # Strip out the encoding part of locale names, if any UCLIBC_LOCALES = $(foreach locale,$(GENERATE_LOCALE),\ $(firstword $(subst .,$(space),$(locale)))) endif # # Utility functions to manipulation the uClibc configuration file # define UCLIBC_OPT_SET $(SED) '/$(1)/d' $(3)/.config echo '$(1)=$(2)' >> $(3)/.config endef define UCLIBC_OPT_UNSET $(SED) '/$(1)/d' $(2)/.config echo '# $(1) is not set' >> $(2)/.config endef # # ARM definitions # ifeq ($(UCLIBC_TARGET_ARCH),arm) UCLIBC_ARM_TYPE = CONFIG_$(call qstrip,$(BR2_UCLIBC_ARM_TYPE)) define UCLIBC_ARM_TYPE_CONFIG $(SED) 's/^\(CONFIG_[^_]*[_]*ARM[^=]*\)=.*/# \1 is not set/g' \ $(@D)/.config $(call UCLIBC_OPT_SET,$(UCLIBC_ARM_TYPE),y,$(@D)) endef UCLIBC_ARM_ABI = CONFIG_ARM_$(call qstrip,$(BR2_UCLIBC_ARM_ABI)) define UCLIBC_ARM_ABI_CONFIG $(SED) '/CONFIG_ARM_.ABI/d' $(@D)/.config $(call UCLIBC_OPT_SET,$(UCLIBC_ARM_ABI),y,$(@D)) endef ifeq ($(BR2_UCLIBC_ARM_BX),y) define UCLIBC_ARM_BX_CONFIG $(call UCLIBC_OPT_SET,USE_BX,y,$(@D)) endef else define UCLIBC_ARM_BX_CONFIG $(call UCLIBC_OPT_UNSET,USE_BX,y,$(@D)) endef endif endif # arm # # MIPS definitions # ifeq ($(UCLIBC_TARGET_ARCH),mips) UCLIBC_MIPS_ABI = CONFIG_MIPS_$(call qstrip,$(BR2_UCLIBC_MIPS_ABI))_ABI define UCLIBC_MIPS_ABI_CONFIG $(SED) '/CONFIG_MIPS_[NO].._ABI/d' $(@D)/.config $(call UCLIBC_OPT_SET,$(UCLIBC_MIPS_ABI),y,$(@D)) endef UCLIBC_MIPS_ISA = CONFIG_MIPS_ISA_$(call qstrip,$(BR2_UCLIBC_MIPS_ISA)) define UCLIBC_MIPS_ISA_CONFIG $(SED) '/CONFIG_MIPS_ISA_.*/d' $(@D)/.config $(call UCLIBC_OPT_SET,$(UCLIBC_MIPS_ISA),y,$(@D)) endef endif # mips # # SH definitions # ifeq ($(UCLIBC_TARGET_ARCH),sh) UCLIBC_SH_TYPE = CONFIG_$(call qstrip,$(BR2_UCLIBC_SH_TYPE)) define UCLIBC_SH_TYPE_CONFIG $(SED) '/CONFIG_SH[234A]*/d' $(@D)/.config $(call UCLIBC_OPT_SET,$(UCLIBC_SH_TYPE),y,$(@D)) endef endif # sh # # SPARC definitions # ifeq ($(UCLIBC_TARGET_ARCH),sparc) UCLIBC_SPARC_TYPE = CONFIG_SPARC_$(call qstrip,$(BR2_UCLIBC_SPARC_TYPE)) define UCLIBC_SPARC_TYPE_CONFIG $(SED) 's/^\(CONFIG_[^_]*[_]*SPARC[^=]*\)=.*/# \1 is not set/g' \ $(@D)/.config $(call UCLIBC_OPT_SET,$(UCLIBC_SPARC_TYPE),y,$(@D)) endef endif # sparc # # PowerPC definitions # ifeq ($(UCLIBC_TARGET_ARCH),powerpc) UCLIBC_POWERPC_TYPE = CONFIG_$(call qstrip,$(BR2_UCLIBC_POWERPC_TYPE)) define UCLIBC_POWERPC_TYPE_CONFIG $(call UCLIBC_OPT_UNSET,CONFIG_GENERIC,$(@D)) $(call UCLIBC_OPT_UNSET,CONFIG_E500,$(@D)) $(call UCLIBC_OPT_SET,$(UCLIBC_POWERPC_TYPE),y,$(@D)) endef endif # powerpc # # AVR32 definitions # ifeq ($(UCLIBC_TARGET_ARCH),avr32) define UCLIBC_AVR32_CONFIG $(call UCLIBC_OPT_SET,LINKRELAX,y,$(@D)) endef endif # avr32 # # x86 definitions # ifeq ($(UCLIBC_TARGET_ARCH),i386) UCLIBC_X86_TYPE = CONFIG_$(call qstrip,$(BR2_UCLIBC_X86_TYPE)) define UCLIBC_X86_TYPE_CONFIG $(call UCLIBC_OPT_SET,$(UCLIBC_X86_TYPE),y,$(@D)) endef endif # # ARC definitions # ifeq ($(UCLIBC_TARGET_ARCH),arc) REALLY_NOSTDLIB = -really-nostdlib endif # # Endianess # ifeq ($(call qstrip,$(BR2_ENDIAN)),BIG) define UCLIBC_ENDIAN_CONFIG $(call UCLIBC_OPT_SET,ARCH_BIG_ENDIAN,y,$(@D)) $(call UCLIBC_OPT_SET,ARCH_WANTS_BIG_ENDIAN,y,$(@D)) $(call UCLIBC_OPT_UNSET,ARCH_LITTLE_ENDIAN,$(@D)) $(call UCLIBC_OPT_UNSET,ARCH_WANTS_LITTLE_ENDIAN,$(@D)) endef else define UCLIBC_ENDIAN_CONFIG $(call UCLIBC_OPT_SET,ARCH_LITTLE_ENDIAN,y,$(@D)) $(call UCLIBC_OPT_SET,ARCH_WANTS_LITTLE_ENDIAN,y,$(@D)) $(call UCLIBC_OPT_UNSET,ARCH_BIG_ENDIAN,$(@D)) $(call UCLIBC_OPT_UNSET,ARCH_WANTS_BIG_ENDIAN,$(@D)) endef endif # # Largefile # ifeq ($(BR2_TOOLCHAIN_BUILDROOT_LARGEFILE),y) define UCLIBC_LARGEFILE_CONFIG $(call UCLIBC_OPT_SET,UCLIBC_HAS_LFS,y,$(@D)) endef else define UCLIBC_LARGEFILE_CONFIG $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_LFS,$(@D)) $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_FOPEN_LARGEFILE_MODE,$(@D)) endef endif # # IPv6 # ifeq ($(BR2_TOOLCHAIN_BUILDROOT_INET_IPV6),y) UCLIBC_IPV6_CONFIG = $(call UCLIBC_OPT_SET,UCLIBC_HAS_IPV6,y,$(@D)) else UCLIBC_IPV6_CONFIG = $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_IPV6,$(@D)) endif # # RPC # ifeq ($(BR2_TOOLCHAIN_BUILDROOT_INET_RPC),y) define UCLIBC_RPC_CONFIG $(call UCLIBC_OPT_SET,UCLIBC_HAS_RPC,y,$(@D)) $(call UCLIBC_OPT_SET,UCLIBC_HAS_FULL_RPC,y,$(@D)) $(call UCLIBC_OPT_SET,UCLIBC_HAS_REENTRANT_RPC,y,$(@D)) endef else define UCLIBC_RPC_CONFIG $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_RPC,$(@D)) $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_FULL_RPC,$(@D)) $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_REENTRANT_RPC,$(@D)) endef endif # # soft-float # ifeq ($(BR2_SOFT_FLOAT),y) define UCLIBC_FLOAT_CONFIG $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_FPU,$(@D)) $(call UCLIBC_OPT_SET,UCLIBC_HAS_FLOATS,y,$(@D)) $(call UCLIBC_OPT_SET,DO_C99_MATH,y,$(@D)) endef else define UCLIBC_FLOAT_CONFIG $(call UCLIBC_OPT_SET,UCLIBC_HAS_FPU,y,$(@D)) $(call UCLIBC_OPT_SET,UCLIBC_HAS_FLOATS,y,$(@D)) endef endif # # SSP # ifeq ($(BR2_TOOLCHAIN_BUILDROOT_USE_SSP),y) UCLIBC_SSP_CONFIG = $(call UCLIBC_OPT_SET,UCLIBC_HAS_SSP,y,$(@D)) else UCLIBC_SSP_CONFIG = $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_SSP,$(@D)) endif # # Threads # ifeq ($(BR2_PTHREADS_NONE),y) define UCLIBC_THREAD_CONFIG $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_THREADS,$(@D)) $(call UCLIBC_OPT_UNSET,LINUXTHREADS,$(@D)) $(call UCLIBC_OPT_UNSET,LINUXTHREADS_OLD,$(@D)) $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_THREADS_NATIVE,$(@D)) endef else ifeq ($(BR2_PTHREADS),y) define UCLIBC_THREAD_CONFIG $(call UCLIBC_OPT_SET,UCLIBC_HAS_THREADS,y,$(@D)) $(call UCLIBC_OPT_SET,LINUXTHREADS_NEW,y,$(@D)) $(call UCLIBC_OPT_UNSET,LINUXTHREADS_OLD,$(@D)) $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_THREADS_NATIVE,$(@D)) endef else ifeq ($(BR2_PTHREADS_OLD),y) define UCLIBC_THREAD_CONFIG $(call UCLIBC_OPT_SET,UCLIBC_HAS_THREADS,y,$(@D)) $(call UCLIBC_OPT_UNSET,LINUXTHREADS_NEW,$(@D)) $(call UCLIBC_OPT_SET,LINUXTHREADS_OLD,y,$(@D)) $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_THREADS_NATIVE,$(@D)) endef else ifeq ($(BR2_PTHREADS_NATIVE),y) define UCLIBC_THREAD_CONFIG $(call UCLIBC_OPT_SET,UCLIBC_HAS_THREADS,y,$(@D)) $(call UCLIBC_OPT_UNSET,LINUXTHREADS_NEW,$(@D)) $(call UCLIBC_OPT_UNSET,LINUXTHREADS_OLD,$(@D)) $(call UCLIBC_OPT_SET,UCLIBC_HAS_THREADS_NATIVE,y,$(@D)) endef endif # # Thread debug # ifeq ($(BR2_PTHREAD_DEBUG),y) UCLIBC_THREAD_DEBUG_CONFIG = $(call UCLIBC_OPT_SET,PTHREADS_DEBUG_SUPPORT,y,$(@D)) else UCLIBC_THREAD_DEBUG_CONFIG = $(call UCLIBC_OPT_UNSET,PTHREADS_DEBUG_SUPPORT,$(@D)) endif # # Locale # ifeq ($(BR2_TOOLCHAIN_BUILDROOT_LOCALE),y) define UCLIBC_LOCALE_CONFIG $(call UCLIBC_OPT_SET,UCLIBC_HAS_LOCALE,y,$(@D)) $(call UCLIBC_OPT_UNSET,UCLIBC_BUILD_ALL_LOCALE,$(@D)) $(call UCLIBC_OPT_SET,UCLIBC_BUILD_MINIMAL_LOCALE,y,$(@D)) $(call UCLIBC_OPT_SET,UCLIBC_BUILD_MINIMAL_LOCALES,"$(UCLIBC_LOCALES)",$(@D)) $(call UCLIBC_OPT_UNSET,UCLIBC_PREGENERATED_LOCALE_DATA,$(@D)) $(call UCLIBC_OPT_UNSET,DOWNLOAD_PREGENERATED_LOCALE_DATA,$(@D)) $(call UCLIBC_OPT_SET,UCLIBC_HAS_XLOCALE,y,$(@D)) $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_GLIBC_DIGIT_GROUPING,$(@D)) endef else define UCLIBC_LOCALE_CONFIG $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_LOCALE,$(@D)) endef endif # # wchar # ifeq ($(BR2_TOOLCHAIN_BUILDROOT_WCHAR),y) UCLIBC_WCHAR_CONFIG = $(call UCLIBC_OPT_SET,UCLIBC_HAS_WCHAR,y,$(@D)) else UCLIBC_WCHAR_CONFIG = $(call UCLIBC_OPT_UNSET,UCLIBC_HAS_WCHAR,$(@D)) endif # # debug # ifeq ($(BR2_ENABLE_DEBUG),y) UCLIBC_DEBUG_CONFIG = $(call UCLIBC_OPT_SET,DODEBUG,y,$(@D)) endif # # strip # ifeq ($(BR2_STRIP_none),y) UCLIBC_STRIP_CONFIG = $(call UCLIBC_OPT_SET,DOSTRIP,y,$(@D)) endif # # Commands # UCLIBC_MAKE_FLAGS = \ ARCH="$(UCLIBC_TARGET_ARCH)" \ CROSS_COMPILE="$(TARGET_CROSS)" \ UCLIBC_EXTRA_CFLAGS="$(TARGET_ABI)" \ HOSTCC="$(HOSTCC)" define UCLIBC_CONFIGURE_CMDS cp -f $(UCLIBC_CONFIG_FILE) $(@D)/.config $(call UCLIBC_OPT_SET,CROSS_COMPILER_PREFIX,"$(TARGET_CROSS)",$(@D)) $(call UCLIBC_OPT_SET,TARGET_$(UCLIBC_TARGET_ARCH),y,$(@D)) $(call UCLIBC_OPT_SET,TARGET_ARCH,"$(UCLIBC_TARGET_ARCH)",$(@D)) $(call UCLIBC_OPT_SET,KERNEL_HEADERS,"$(STAGING_DIR)/usr/include",$(@D)) $(call UCLIBC_OPT_SET,RUNTIME_PREFIX,"/",$(@D)) $(call UCLIBC_OPT_SET,DEVEL_PREFIX,"/usr",$(@D)) $(call UCLIBC_OPT_SET,SHARED_LIB_LOADER_PREFIX,"/lib",$(@D)) $(UCLIBC_ARM_TYPE_CONFIG) $(UCLIBC_ARM_ABI_CONFIG) $(UCLIBC_ARM_BX_CONFIG) $(UCLIBC_MIPS_ABI_CONFIG) $(UCLIBC_MIPS_ISA_CONFIG) $(UCLIBC_SH_TYPE_CONFIG) $(UCLIBC_SPARC_TYPE_CONFIG) $(UCLIBC_POWERPC_TYPE_CONFIG) $(UCLIBC_AVR32_CONFIG) $(UCLIBC_X86_TYPE_CONFIG) $(UCLIBC_ENDIAN_CONFIG) $(UCLIBC_LARGEFILE_CONFIG) $(UCLIBC_IPV6_CONFIG) $(UCLIBC_RPC_CONFIG) $(UCLIBC_FLOAT_CONFIG) $(UCLIBC_SSP_CONFIG) $(UCLIBC_THREAD_CONFIG) $(UCLIBC_THREAD_DEBUG_CONFIG) $(UCLIBC_LOCALE_CONFIG) $(UCLIBC_WCHAR_CONFIG) $(UCLIBC_STRIP_CONFIG) $(UCLIBC_DEBUG_CONFIG) yes "" | $(MAKE1) -C $(@D) \ $(UCLIBC_MAKE_FLAGS) \ PREFIX=$(STAGING_DIR) \ DEVEL_PREFIX=/usr/ \ RUNTIME_PREFIX=$(STAGING_DIR) \ oldconfig $(MAKE1) -C $(UCLIBC_DIR) \ $(UCLIBC_MAKE_FLAGS) \ PREFIX=$(STAGING_DIR) \ DEVEL_PREFIX=/usr/ \ RUNTIME_PREFIX=$(STAGING_DIR) \ headers lib/crt1.o lib/crti.o lib/crtn.o \ install_headers $(TARGET_CROSS)gcc -nostdlib $(REALLY_NOSTDLIB) \ -nostartfiles -shared -x c /dev/null -o $(STAGING_DIR)/usr/lib/libc.so $(TARGET_CROSS)gcc -nostdlib $(REALLY_NOSTDLIB) \ -nostartfiles -shared -x c /dev/null -o $(STAGING_DIR)/usr/lib/libm.so cp -pLR $(UCLIBC_DIR)/lib/crt[1in].o $(STAGING_DIR)/usr/lib/ endef ifeq ($(BR2_UCLIBC_INSTALL_TEST_SUITE),y) define UCLIBC_BUILD_TEST_SUITE $(MAKE1) -C $(@D)/test \ $(UCLIBC_MAKE_FLAGS) \ ARCH_CFLAGS=-I$(STAGING_DIR)/usr/include \ UCLIBC_ONLY=1 \ TEST_INSTALLED_UCLIBC=1 \ compile endef endif define UCLIBC_BUILD_CMDS $(MAKE1) -C $(@D) \ $(UCLIBC_MAKE_FLAGS) \ PREFIX= \ DEVEL_PREFIX=/ \ RUNTIME_PREFIX=/ \ all $(MAKE1) -C $(@D)/utils \ PREFIX=$(HOST_DIR) \ HOSTCC="$(HOSTCC)" hostutils $(UCLIBC_BUILD_TEST_SUITE) endef ifeq ($(BR2_UCLIBC_INSTALL_TEST_SUITE),y) define UCLIBC_INSTALL_TEST_SUITE mkdir -p $(TARGET_DIR)/root/uClibc cp -rdpf $(@D)/test $(TARGET_DIR)/root/uClibc $(INSTALL) -D -m 0644 $(@D)/Rules.mak $(TARGET_DIR)/root/uClibc/Rules.mak $(INSTALL) -D -m 0644 $(@D)/.config $(TARGET_DIR)/root/uClibc/.config endef endif define UCLIBC_INSTALL_TARGET_CMDS $(MAKE1) -C $(@D) \ $(UCLIBC_MAKE_FLAGS) \ PREFIX=$(TARGET_DIR) \ DEVEL_PREFIX=/usr/ \ RUNTIME_PREFIX=/ \ install_runtime $(MAKE1) -C $(@D) \ CC="$(TARGET_CC)" CPP="$(TARGET_CPP)" LD="$(TARGET_LD)" \ ARCH="$(UCLIBC_TARGET_ARCH)" \ PREFIX=$(TARGET_DIR) \ utils install_utils $(UCLIBC_INSTALL_TEST_SUITE) endef define UCLIBC_INSTALL_STAGING_CMDS $(MAKE1) -C $(@D) \ $(UCLIBC_MAKE_FLAGS) \ PREFIX=$(STAGING_DIR) \ DEVEL_PREFIX=/usr/ \ RUNTIME_PREFIX=/ \ install_runtime install_dev install -D -m 0755 $(@D)/utils/ldd.host $(HOST_DIR)/usr/bin/ldd ln -sf ldd $(HOST_DIR)/usr/bin/$(GNU_TARGET_NAME)-ldd install -D -m 0755 $(@D)/utils/ldconfig.host $(HOST_DIR)/usr/bin/ldconfig ln -sf ldconfig $(HOST_DIR)/usr/bin/$(GNU_TARGET_NAME)-ldconfig endef uclibc-menuconfig: dirs uclibc-configure $(MAKE1) -C $(UCLIBC_DIR) \ $(UCLIBC_MAKE_FLAGS) \ PREFIX=$(STAGING_DIR) \ DEVEL_PREFIX=/usr/ \ RUNTIME_PREFIX=$(STAGING_DIR)/ \ menuconfig rm -f $(UCLIBC_DIR)/.stamp_{built,target_installed,staging_installed} $(eval $(generic-package))