1 ################################################################################
5 ################################################################################
7 UCLIBC_VERSION = $(call qstrip,$(BR2_UCLIBC_VERSION_STRING))
8 UCLIBC_SOURCE ?= uClibc-$(UCLIBC_VERSION).tar.bz2
9 UCLIBC_LICENSE = LGPLv2.1+
10 UCLIBC_LICENSE_FILES = COPYING.LIB
12 ifeq ($(BR2_UCLIBC_VERSION_SNAPSHOT),y)
13 UCLIBC_SITE = http://www.uclibc.org/downloads/snapshots
14 BR_NO_CHECK_HASH_FOR += $(UCLIBC_SOURCE)
15 else ifeq ($(BR2_UCLIBC_VERSION_NG),y)
16 UCLIBC_SITE = http://downloads.uclibc-ng.org/releases/$(UCLIBC_VERSION)
17 UCLIBC_SOURCE = uClibc-ng-$(UCLIBC_VERSION).tar.xz
18 else ifeq ($(BR2_UCLIBC_VERSION_ARC_GIT),y)
19 UCLIBC_SITE = $(call github,foss-for-synopsys-dwc-arc-processors,uClibc,$(UCLIBC_VERSION))
20 UCLIBC_SOURCE = uClibc-$(UCLIBC_VERSION).tar.gz
21 else ifeq ($(BR2_UCLIBC_VERSION_XTENSA_GIT),y)
22 UCLIBC_SITE = git://git.busybox.net/uClibc
23 UCLIBC_SOURCE = uClibc-$(UCLIBC_VERSION).tar.gz
25 UCLIBC_SITE = http://www.uclibc.org/downloads
26 UCLIBC_SOURCE = uClibc-$(UCLIBC_VERSION).tar.xz
29 UCLIBC_INSTALL_STAGING = YES
31 # uclibc is part of the toolchain so disable the toolchain dependency
32 UCLIBC_ADD_TOOLCHAIN_DEPENDENCY = NO
34 # Before uClibc is configured, we must have the first stage
35 # cross-compiler and the kernel headers
36 UCLIBC_DEPENDENCIES = host-gcc-initial linux-headers
38 # specifying UCLIBC_CONFIG_FILE on the command-line overrides the .config
40 ifndef UCLIBC_CONFIG_FILE
41 UCLIBC_CONFIG_FILE = $(call qstrip,$(BR2_UCLIBC_CONFIG))
44 UCLIBC_KCONFIG_FILE = $(UCLIBC_CONFIG_FILE)
46 UCLIBC_KCONFIG_OPTS = \
47 $(UCLIBC_MAKE_FLAGS) \
48 PREFIX=$(STAGING_DIR) \
50 RUNTIME_PREFIX=$(STAGING_DIR)/ \
52 UCLIBC_TARGET_ARCH = $(call qstrip,$(BR2_UCLIBC_TARGET_ARCH))
54 UCLIBC_GENERATE_LOCALES = $(call qstrip,$(BR2_GENERATE_LOCALE))
56 ifeq ($(UCLIBC_GENERATE_LOCALES),)
57 # We need at least one locale
58 UCLIBC_LOCALES = en_US
60 # Strip out the encoding part of locale names, if any
62 $(foreach locale,$(UCLIBC_GENERATE_LOCALES),\
63 $(firstword $(subst .,$(space),$(locale))))
70 ifeq ($(UCLIBC_TARGET_ARCH),arc)
71 UCLIBC_ARC_TYPE = CONFIG_$(call qstrip,$(BR2_UCLIBC_ARC_TYPE))
72 define UCLIBC_ARC_TYPE_CONFIG
73 $(call KCONFIG_ENABLE_OPT,$(UCLIBC_ARC_TYPE),$(@D)/.config)
81 ifeq ($(UCLIBC_TARGET_ARCH),arm)
82 define UCLIBC_ARM_ABI_CONFIG
83 $(SED) '/CONFIG_ARM_.ABI/d' $(@D)/.config
84 $(call KCONFIG_ENABLE_OPT,CONFIG_ARM_EABI,$(@D)/.config)
87 # Thumb build is broken with threads, build in ARM mode
88 ifeq ($(BR2_ARM_INSTRUCTIONS_THUMB)$(BR2_TOOLCHAIN_HAS_THREADS),yy)
89 UCLIBC_EXTRA_CFLAGS += -marm
92 ifeq ($(BR2_UCLIBC_ARM_BX),y)
93 define UCLIBC_ARM_BX_CONFIG
94 $(call KCONFIG_ENABLE_OPT,USE_BX,$(@D)/.config)
97 define UCLIBC_ARM_BX_CONFIG
98 $(call KCONFIG_DISABLE_OPT,USE_BX,$(@D)/.config)
108 ifeq ($(UCLIBC_TARGET_ARCH),mips)
109 UCLIBC_MIPS_ABI = CONFIG_MIPS_$(call qstrip,$(BR2_UCLIBC_MIPS_ABI))_ABI
110 define UCLIBC_MIPS_ABI_CONFIG
111 $(SED) '/CONFIG_MIPS_[NO].._ABI/d' $(@D)/.config
112 $(call KCONFIG_ENABLE_OPT,$(UCLIBC_MIPS_ABI),$(@D)/.config)
115 UCLIBC_MIPS_ISA = CONFIG_MIPS_ISA_$(call qstrip,$(BR2_UCLIBC_MIPS_ISA))
116 define UCLIBC_MIPS_ISA_CONFIG
117 $(SED) '/CONFIG_MIPS_ISA_.*/d' $(@D)/.config
118 $(call KCONFIG_ENABLE_OPT,$(UCLIBC_MIPS_ISA),$(@D)/.config)
126 ifeq ($(UCLIBC_TARGET_ARCH),sh)
127 UCLIBC_SH_TYPE = CONFIG_$(call qstrip,$(BR2_UCLIBC_SH_TYPE))
128 define UCLIBC_SH_TYPE_CONFIG
129 $(SED) '/CONFIG_SH[234A]*/d' $(@D)/.config
130 $(call KCONFIG_ENABLE_OPT,$(UCLIBC_SH_TYPE),$(@D)/.config)
138 ifeq ($(UCLIBC_TARGET_ARCH),sparc)
139 UCLIBC_SPARC_TYPE = CONFIG_SPARC_$(call qstrip,$(BR2_UCLIBC_SPARC_TYPE))
140 define UCLIBC_SPARC_TYPE_CONFIG
141 $(SED) 's/^\(CONFIG_[^_]*[_]*SPARC[^=]*\)=.*/# \1 is not set/g' \
143 $(call KCONFIG_ENABLE_OPT,$(UCLIBC_SPARC_TYPE),$(@D)/.config)
148 # PowerPC definitions
151 ifeq ($(UCLIBC_TARGET_ARCH),powerpc)
152 UCLIBC_POWERPC_TYPE = CONFIG_$(call qstrip,$(BR2_UCLIBC_POWERPC_TYPE))
153 define UCLIBC_POWERPC_TYPE_CONFIG
154 $(call KCONFIG_DISABLE_OPT,CONFIG_GENERIC,$(@D)/.config)
155 $(call KCONFIG_DISABLE_OPT,CONFIG_E500,$(@D)/.config)
156 $(call KCONFIG_ENABLE_OPT,$(UCLIBC_POWERPC_TYPE),$(@D)/.config)
163 ifeq ($(UCLIBC_TARGET_ARCH),i386)
164 UCLIBC_X86_TYPE = CONFIG_$(call qstrip,$(BR2_UCLIBC_X86_TYPE))
165 define UCLIBC_X86_TYPE_CONFIG
166 $(call KCONFIG_ENABLE_OPT,$(UCLIBC_X86_TYPE),$(@D)/.config)
174 ifeq ($(call qstrip,$(BR2_ENDIAN)),BIG)
175 define UCLIBC_ENDIAN_CONFIG
176 $(call KCONFIG_ENABLE_OPT,ARCH_BIG_ENDIAN,$(@D)/.config)
177 $(call KCONFIG_ENABLE_OPT,ARCH_WANTS_BIG_ENDIAN,$(@D)/.config)
178 $(call KCONFIG_DISABLE_OPT,ARCH_LITTLE_ENDIAN,$(@D)/.config)
179 $(call KCONFIG_DISABLE_OPT,ARCH_WANTS_LITTLE_ENDIAN,$(@D)/.config)
182 define UCLIBC_ENDIAN_CONFIG
183 $(call KCONFIG_ENABLE_OPT,ARCH_LITTLE_ENDIAN,$(@D)/.config)
184 $(call KCONFIG_ENABLE_OPT,ARCH_WANTS_LITTLE_ENDIAN,$(@D)/.config)
185 $(call KCONFIG_DISABLE_OPT,ARCH_BIG_ENDIAN,$(@D)/.config)
186 $(call KCONFIG_DISABLE_OPT,ARCH_WANTS_BIG_ENDIAN,$(@D)/.config)
194 define UCLIBC_LARGEFILE_CONFIG
195 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_LFS,$(@D)/.config)
202 ifeq ($(BR2_USE_MMU),y)
203 define UCLIBC_MMU_CONFIG
204 $(call KCONFIG_ENABLE_OPT,ARCH_USE_MMU,$(@D)/.config)
207 define UCLIBC_MMU_CONFIG
208 $(call KCONFIG_DISABLE_OPT,ARCH_USE_MMU,$(@D)/.config)
216 UCLIBC_IPV6_CONFIG = $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_IPV6,$(@D)/.config)
222 ifeq ($(BR2_TOOLCHAIN_BUILDROOT_INET_RPC),y)
223 define UCLIBC_RPC_CONFIG
224 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_RPC,$(@D)/.config)
225 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_FULL_RPC,$(@D)/.config)
226 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_REENTRANT_RPC,$(@D)/.config)
229 define UCLIBC_RPC_CONFIG
230 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_RPC,$(@D)/.config)
231 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_FULL_RPC,$(@D)/.config)
232 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_REENTRANT_RPC,$(@D)/.config)
240 ifeq ($(BR2_SOFT_FLOAT),y)
241 define UCLIBC_FLOAT_CONFIG
242 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_FPU,$(@D)/.config)
243 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_FLOATS,$(@D)/.config)
244 $(call KCONFIG_ENABLE_OPT,DO_C99_MATH,$(@D)/.config)
247 define UCLIBC_FLOAT_CONFIG
248 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_FPU,$(@D)/.config)
249 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_FLOATS,$(@D)/.config)
256 ifeq ($(BR2_TOOLCHAIN_BUILDROOT_USE_SSP),y)
257 define UCLIBC_SSP_CONFIG
258 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_SSP,$(@D)/.config)
259 $(call KCONFIG_ENABLE_OPT,UCLIBC_BUILD_SSP,$(@D)/.config)
262 define UCLIBC_SSP_CONFIG
263 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_SSP,$(@D)/.config)
264 $(call KCONFIG_DISABLE_OPT,UCLIBC_BUILD_SSP,$(@D)/.config)
271 ifeq ($(BR2_PTHREADS_NONE),y)
272 define UCLIBC_THREAD_CONFIG
273 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_THREADS,$(@D)/.config)
274 $(call KCONFIG_DISABLE_OPT,LINUXTHREADS,$(@D)/.config)
275 $(call KCONFIG_DISABLE_OPT,LINUXTHREADS_OLD,$(@D)/.config)
276 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_THREADS_NATIVE,$(@D)/.config)
278 else ifeq ($(BR2_PTHREADS),y)
279 define UCLIBC_THREAD_CONFIG
280 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_THREADS,$(@D)/.config)
281 $(call KCONFIG_ENABLE_OPT,LINUXTHREADS_NEW,$(@D)/.config)
282 $(call KCONFIG_DISABLE_OPT,LINUXTHREADS_OLD,$(@D)/.config)
283 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_THREADS_NATIVE,$(@D)/.config)
285 else ifeq ($(BR2_PTHREADS_OLD),y)
286 define UCLIBC_THREAD_CONFIG
287 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_THREADS,$(@D)/.config)
288 $(call KCONFIG_DISABLE_OPT,LINUXTHREADS_NEW,$(@D)/.config)
289 $(call KCONFIG_ENABLE_OPT,LINUXTHREADS_OLD,$(@D)/.config)
290 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_THREADS_NATIVE,$(@D)/.config)
292 else ifeq ($(BR2_PTHREADS_NATIVE),y)
293 define UCLIBC_THREAD_CONFIG
294 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_THREADS,$(@D)/.config)
295 $(call KCONFIG_DISABLE_OPT,LINUXTHREADS_NEW,$(@D)/.config)
296 $(call KCONFIG_DISABLE_OPT,LINUXTHREADS_OLD,$(@D)/.config)
297 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_THREADS_NATIVE,$(@D)/.config)
305 ifeq ($(BR2_PTHREAD_DEBUG),y)
306 UCLIBC_THREAD_DEBUG_CONFIG = $(call KCONFIG_ENABLE_OPT,PTHREADS_DEBUG_SUPPORT,$(@D)/.config)
308 UCLIBC_THREAD_DEBUG_CONFIG = $(call KCONFIG_DISABLE_OPT,PTHREADS_DEBUG_SUPPORT,$(@D)/.config)
315 ifeq ($(BR2_TOOLCHAIN_BUILDROOT_LOCALE),y)
316 define UCLIBC_LOCALE_CONFIG
317 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_LOCALE,$(@D)/.config)
318 $(call KCONFIG_DISABLE_OPT,UCLIBC_BUILD_ALL_LOCALE,$(@D)/.config)
319 $(call KCONFIG_ENABLE_OPT,UCLIBC_BUILD_MINIMAL_LOCALE,$(@D)/.config)
320 $(call KCONFIG_SET_OPT,UCLIBC_BUILD_MINIMAL_LOCALES,"$(UCLIBC_LOCALES)",$(@D)/.config)
321 $(call KCONFIG_DISABLE_OPT,UCLIBC_PREGENERATED_LOCALE_DATA,$(@D)/.config)
322 $(call KCONFIG_DISABLE_OPT,DOWNLOAD_PREGENERATED_LOCALE_DATA,$(@D)/.config)
323 $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_XLOCALE,$(@D)/.config)
324 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_GLIBC_DIGIT_GROUPING,$(@D)/.config)
327 define UCLIBC_LOCALE_CONFIG
328 $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_LOCALE,$(@D)/.config)
336 ifeq ($(BR2_TOOLCHAIN_BUILDROOT_WCHAR),y)
337 UCLIBC_WCHAR_CONFIG = $(call KCONFIG_ENABLE_OPT,UCLIBC_HAS_WCHAR,$(@D)/.config)
339 UCLIBC_WCHAR_CONFIG = $(call KCONFIG_DISABLE_OPT,UCLIBC_HAS_WCHAR,$(@D)/.config)
346 ifeq ($(BR2_STATIC_LIBS),y)
347 UCLIBC_SHARED_LIBS_CONFIG = $(call KCONFIG_DISABLE_OPT,HAVE_SHARED,$(@D)/.config)
349 UCLIBC_SHARED_LIBS_CONFIG = $(call KCONFIG_ENABLE_OPT,HAVE_SHARED,$(@D)/.config)
356 UCLIBC_MAKE_FLAGS = \
357 ARCH="$(UCLIBC_TARGET_ARCH)" \
358 CROSS_COMPILE="$(TARGET_CROSS)" \
359 UCLIBC_EXTRA_CFLAGS="$(UCLIBC_EXTRA_CFLAGS) $(TARGET_ABI)" \
362 define UCLIBC_KCONFIG_FIXUP_CMDS
363 $(call KCONFIG_SET_OPT,CROSS_COMPILER_PREFIX,"$(TARGET_CROSS)",$(@D)/.config)
364 $(call KCONFIG_ENABLE_OPT,TARGET_$(UCLIBC_TARGET_ARCH),$(@D)/.config)
365 $(call KCONFIG_SET_OPT,TARGET_ARCH,"$(UCLIBC_TARGET_ARCH)",$(@D)/.config)
366 $(call KCONFIG_SET_OPT,KERNEL_HEADERS,"$(LINUX_HEADERS_DIR)/usr/include",$(@D)/.config)
367 $(call KCONFIG_SET_OPT,RUNTIME_PREFIX,"/",$(@D)/.config)
368 $(call KCONFIG_SET_OPT,DEVEL_PREFIX,"/usr",$(@D)/.config)
369 $(call KCONFIG_SET_OPT,SHARED_LIB_LOADER_PREFIX,"/lib",$(@D)/.config)
371 $(UCLIBC_ARC_TYPE_CONFIG)
372 $(UCLIBC_ARM_ABI_CONFIG)
373 $(UCLIBC_ARM_BX_CONFIG)
374 $(UCLIBC_MIPS_ABI_CONFIG)
375 $(UCLIBC_MIPS_ISA_CONFIG)
376 $(UCLIBC_SH_TYPE_CONFIG)
377 $(UCLIBC_SPARC_TYPE_CONFIG)
378 $(UCLIBC_POWERPC_TYPE_CONFIG)
379 $(UCLIBC_X86_TYPE_CONFIG)
380 $(UCLIBC_ENDIAN_CONFIG)
381 $(UCLIBC_LARGEFILE_CONFIG)
382 $(UCLIBC_IPV6_CONFIG)
384 $(UCLIBC_FLOAT_CONFIG)
386 $(UCLIBC_THREAD_CONFIG)
387 $(UCLIBC_THREAD_DEBUG_CONFIG)
388 $(UCLIBC_LOCALE_CONFIG)
389 $(UCLIBC_WCHAR_CONFIG)
390 $(UCLIBC_SHARED_LIBS_CONFIG)
393 ifeq ($(BR2_UCLIBC_INSTALL_TEST_SUITE),y)
394 define UCLIBC_BUILD_TEST_SUITE
395 $(MAKE1) -C $(@D)/test \
396 $(UCLIBC_MAKE_FLAGS) \
397 ARCH_CFLAGS=-I$(STAGING_DIR)/usr/include \
399 TEST_INSTALLED_UCLIBC=1 \
404 define UCLIBC_BUILD_CMDS
405 $(MAKE) -C $(@D) $(UCLIBC_MAKE_FLAGS) headers
406 $(MAKE) -C $(@D) $(UCLIBC_MAKE_FLAGS)
407 $(MAKE) -C $(@D)/utils \
409 HOSTCC="$(HOSTCC)" hostutils
412 ifeq ($(BR2_UCLIBC_INSTALL_TEST_SUITE),y)
413 define UCLIBC_INSTALL_TEST_SUITE
414 mkdir -p $(TARGET_DIR)/root/uClibc
415 cp -rdpf $(@D)/test $(TARGET_DIR)/root/uClibc
416 $(INSTALL) -D -m 0644 $(@D)/Rules.mak $(TARGET_DIR)/root/uClibc/Rules.mak
417 $(INSTALL) -D -m 0644 $(@D)/.config $(TARGET_DIR)/root/uClibc/.config
421 ifeq ($(BR2_UCLIBC_INSTALL_UTILS),y)
422 define UCLIBC_INSTALL_UTILS_TARGET
424 CC="$(TARGET_CC)" CPP="$(TARGET_CPP)" LD="$(TARGET_LD)" \
425 ARCH="$(UCLIBC_TARGET_ARCH)" \
426 PREFIX=$(TARGET_DIR) \
431 # gcc produces binaries that use ld{64,}-uClibc.so.0 as the program
432 # interpreter, but since uClibc-ng version is 1.0.0, it generates
433 # ld{64,}-uClibc.so.1. In order to avoid changing gcc, we simply
434 # create the necessary symbolic links here.
435 ifeq ($(BR2_UCLIBC_VERSION_NG),y)
436 define UCLIBC_INSTALL_LDSO_SYMLINKS
437 if [ -e $(TARGET_DIR)/lib/ld64-uClibc.so.1 ]; then \
438 (cd $(TARGET_DIR)/lib;ln -sf ld64-uClibc.so.1 ld64-uClibc.so.0) \
440 if [ -e $(TARGET_DIR)/lib/ld-uClibc.so.1 ]; then \
441 (cd $(TARGET_DIR)/lib;ln -sf ld-uClibc.so.1 ld-uClibc.so.0) \
446 define UCLIBC_INSTALL_TARGET_CMDS
448 $(UCLIBC_MAKE_FLAGS) \
449 PREFIX=$(TARGET_DIR) \
453 $(UCLIBC_INSTALL_UTILS_TARGET)
454 $(UCLIBC_BUILD_TEST_SUITE)
455 $(UCLIBC_INSTALL_TEST_SUITE)
456 $(UCLIBC_INSTALL_LDSO_SYMLINKS)
459 # STATIC has no ld* tools, only getconf
460 ifeq ($(BR2_STATIC_LIBS),)
461 define UCLIBC_INSTALL_UTILS_STAGING
462 $(INSTALL) -D -m 0755 $(@D)/utils/ldd.host $(HOST_DIR)/usr/bin/ldd
463 ln -sf ldd $(HOST_DIR)/usr/bin/$(GNU_TARGET_NAME)-ldd
464 $(INSTALL) -D -m 0755 $(@D)/utils/ldconfig.host $(HOST_DIR)/usr/bin/ldconfig
465 ln -sf ldconfig $(HOST_DIR)/usr/bin/$(GNU_TARGET_NAME)-ldconfig
469 define UCLIBC_INSTALL_STAGING_CMDS
471 $(UCLIBC_MAKE_FLAGS) \
472 PREFIX=$(STAGING_DIR) \
475 install_runtime install_dev
476 $(UCLIBC_INSTALL_UTILS_STAGING)
479 $(eval $(kconfig-package))