summaryrefslogtreecommitdiffstats
path: root/package/uclibc/uclibc.mk
diff options
context:
space:
mode:
Diffstat (limited to 'package/uclibc/uclibc.mk')
-rw-r--r--package/uclibc/uclibc.mk484
1 files changed, 484 insertions, 0 deletions
diff --git a/package/uclibc/uclibc.mk b/package/uclibc/uclibc.mk
new file mode 100644
index 000000000..1c5340c85
--- /dev/null
+++ b/package/uclibc/uclibc.mk
@@ -0,0 +1,484 @@
+################################################################################
+#
+# uclibc
+#
+################################################################################
+
+UCLIBC_VERSION = $(call qstrip,$(BR2_UCLIBC_VERSION_STRING))
+UCLIBC_SOURCE = uClibc-$(UCLIBC_VERSION).tar.xz
+
+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)
+UCLIBC_SOURCE = uClibc-$(UCLIBC_VERSION).tar.bz2
+else
+UCLIBC_SITE = http://www.uclibc.org/downloads
+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,$(@Ð))
+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' \
+ $(@Ð)/.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,$(@Ð))
+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))