Index: Makefile.in
===================================================================
--- Makefile.in	(revision 22237)
+++ Makefile.in	(working copy)
@@ -59,49 +59,72 @@ ifneq ($(TARGET_SUBARCH),)
 HEADERS_BITS_SUBARCH := $(notdir $(wildcard $(top_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/bits/$(TARGET_SUBARCH)/*.h))
 endif
 HEADERS_BITS_COMMON := $(filter-out $(HEADERS_BITS_ARCH) $(HEADERS_BITS_SUBARCH),$(HEADERS_BITS_COMMON))
+
+HEADERS_SYS_COMMON := $(notdir $(wildcard $(top_srcdir)libc/sysdeps/linux/common/sys/*.h))
+HEADERS_SYS_ARCH := $(notdir $(wildcard $(top_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/sys/*.h))
+HEADERS_SYS_COMMON := $(filter-out $(HEADERS_SYS_ARCH),$(HEADERS_SYS_COMMON))
+
+ALL_HEADERS_BITS_COMMON  := $(addprefix include/bits/,$(HEADERS_BITS_COMMON))
+ALL_HEADERS_BITS_ARCH    := $(addprefix include/bits/,$(HEADERS_BITS_ARCH))
+ifneq ($(TARGET_SUBARCH),)
+ALL_HEADERS_BITS_SUBARCH := $(addprefix include/bits/,$(HEADERS_BITS_SUBARCH))
+else
+ALL_HEADERS_BITS_SUBARCH :=
+endif
+ALL_HEADERS_SYS_COMMON   := $(addprefix include/sys/,$(HEADERS_SYS_COMMON))
+ALL_HEADERS_SYS_ARCH     := $(addprefix include/sys/,$(HEADERS_SYS_ARCH))
+
+target-headers-sysdep := include/fpu_control.h \
+	include/dl-osinfo.h include/hp-timing.h \
+	$(ALL_HEADERS_BITS_COMMON) \
+	$(ALL_HEADERS_BITS_ARCH) \
+	$(ALL_HEADERS_BITS_SUBARCH) \
+	$(ALL_HEADERS_SYS_COMMON) \
+	$(ALL_HEADERS_SYS_ARCH)
+
+target-headers-sysdep: include/bits/uClibc_config.h
+	@$(MAKE) $(target-headers-sysdep)
+
+include/fpu_control.h: include/bits/uClibc_config.h
+	@$(disp_ln)
+	$(Q)[ -r libc/sysdeps/linux/$(TARGET_ARCH)/$(@F) ] && \
+		$(LN) -fs ../libc/sysdeps/linux/$(TARGET_ARCH)/$(@F) $@ || \
+		$(LN) -fs ../libc/sysdeps/linux/common/$(@F) $@
+include/dl-osinfo.h include/hp-timing.h: include/bits/uClibc_config.h
+	$(do_ln) -fs ../libc/sysdeps/linux/common/$(@F) $@
+
+$(ALL_HEADERS_BITS_COMMON): include/bits/uClibc_config.h
+	$(do_ln) -fs ../../libc/sysdeps/linux/common/bits/$(@F) $@
+
+$(ALL_HEADERS_BITS_ARCH): include/bits/uClibc_config.h
+	$(do_ln) -fs ../../libc/sysdeps/linux/$(TARGET_ARCH)/bits/$(@F) $@
+
+ifneq ($(TARGET_SUBARCH),)
+$(ALL_HEADERS_BITS_SUBARCH): include/bits/uClibc_config.h
+	$(do_ln) -fs ../../../libc/sysdeps/linux/$(TARGET_ARCH)/bits/$(TARGET_SUBARCH)/$(@F) $@
+endif
+
+ifneq ($(strip $(ALL_HEADERS_SYS_COMMON)),)
+$(ALL_HEADERS_SYS_COMMON): include/bits/uClibc_config.h
+	$(do_ln) -fs ../../libc/sysdeps/linux/common/sys/$(@F) $@
+endif
+
+ifneq ($(strip $(ALL_HEADERS_SYS_ARCH)),)
+$(ALL_HEADERS_SYS_ARCH): include/bits/uClibc_config.h
+	$(do_ln) -fs ../../libc/sysdeps/linux/$(TARGET_ARCH)/sys/$(@F) $@
+endif
+
 headers: include/bits/uClibc_config.h
 	$(Q)$(MAKE) headers-y
-	$(Q)\
-	set -e; \
-	if [ -e libc/sysdeps/linux/$(TARGET_ARCH)/fpu_control.h ] ; then \
-		$(LN) -fs ../libc/sysdeps/linux/$(TARGET_ARCH)/fpu_control.h include/ ; \
-	else \
-		$(LN) -fs ../libc/sysdeps/linux/common/fpu_control.h include/ ; \
-	fi; \
-	for f in dl-osinfo.h hp-timing.h ; do \
-		$(LN) -fs ../libc/sysdeps/linux/common/$$f include/ ; \
-	done
-	$(Q)\
-	cd include/bits; \
-	set -e; \
-	for i in $(HEADERS_BITS_COMMON) ; do \
-		$(LN) -fs ../../libc/sysdeps/linux/common/bits/$$i .; \
-	done; \
-	for i in $(HEADERS_BITS_ARCH) ; do \
-		$(LN) -fs ../../libc/sysdeps/linux/$(TARGET_ARCH)/bits/$$i .; \
-	done; \
-	for i in $(HEADERS_BITS_SUBARCH) ; do \
-		$(LN) -fs ../../libc/sysdeps/linux/$(TARGET_ARCH)/bits/$(TARGET_SUBARCH)/$$i .; \
-	done
-	$(Q)\
-	cd include/sys; \
-	set -e; \
-	for i in `ls ../../libc/sysdeps/linux/common/sys/*.h` ; do \
-		$(LN) -fs $$i .; \
-	done; \
-	if [ -d ../../libc/sysdeps/linux/$(TARGET_ARCH)/sys ] ; then \
-		for i in `ls ../../libc/sysdeps/linux/$(TARGET_ARCH)/sys/*.h` ; do \
-			$(LN) -fs $$i .; \
-		done; \
-	fi
-ifeq ($(UCLIBC_HAS_LOCALE),y)
-	$(MAKE) -C extra/locale locale_headers
-endif
+	$(Q)$(if $(UCLIBC_HAS_LOCALE),$(MAKE) -C extra/locale locale_headers)
+	$(Q)$(MAKE) target-headers-sysdep
 
+pregen: headers include/bits/sysnum.h
 
-pregen: headers
-	$(Q)\
-	set -e; \
+include/bits/sysnum.h: $(top_srcdir)extra/scripts/gen_bits_syscall_h.sh \
+			include/bits/uClibc_config.h | headers
+	@$(disp_gen)
+	$(Q)set -e; \
 	cd $(top_builddir); \
 	tmp=`mktemp include/bits/sysnum.h.XXXXXX 2>/dev/null`; \
 	[ -z "$$tmp" ] && tmp='include/bits/sysnum.h.new'; \
Index: Makerules
===================================================================
--- Makerules	(revision 22237)
+++ Makerules	(working copy)
@@ -71,6 +71,9 @@ pur_disp_strip     = echo "  "STRIP $(ST
 pur_disp_t_strip   = echo "  "STRIP $(STRIP_FLAGS) $@
 pur_disp_ar        = echo "  "AR $(ARFLAGS) $@
 pur_disp_ld        = echo "  "LD $(1)
+pur_disp_ln        = echo "  "LN $@
+pur_disp_gen       = echo "  "GEN $@
+pur_disp_unifdef   = echo "  "UNIFDEF $@
 
 sil_disp_compile.c = true
 sil_disp_compile.i = true
@@ -83,6 +86,9 @@ sil_disp_strip     = true
 sil_disp_t_strip   = true
 sil_disp_ar        = true
 sil_disp_ld        = true
+sil_disp_ln        = true
+sil_disp_gen       = true
+sil_disp_unifdef   = true
 
 ver_disp_compile.c = echo $(cmd_compile.c)
 ver_disp_compile.i = echo $(cmd_compile.i)
@@ -95,6 +101,9 @@ ver_disp_strip     = echo $(cmd_strip)
 ver_disp_t_strip   = echo $(cmd_t_strip)
 ver_disp_ar        = echo $(cmd_ar)
 ver_disp_ld        =
+ver_disp_ln        =
+ver_disp_gen       = echo $(cmd_gen)
+ver_disp_unifdef   = echo $(cmd_unifdef)
 
 disp_compile.c = $($(DISP)_disp_compile.c)
 disp_compile.i = $($(DISP)_disp_compile.i)
@@ -107,6 +116,9 @@ disp_strip     = $($(DISP)_disp_strip)
 disp_t_strip   = $($(DISP)_disp_t_strip)
 disp_ar        = $($(DISP)_disp_ar)
 disp_ld        = $($(DISP)_disp_ld)
+disp_ln        = $($(DISP)_disp_ln)
+disp_gen       = $($(DISP)_disp_gen)
+disp_unifdef   = $($(DISP)_disp_unifdef)
 
 any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
 
@@ -142,6 +154,10 @@ cmd_compile-m = $(CC) $^ -c -o $@ $(CFLA
 cmd_strip     = $(STRIPTOOL) $(STRIP_FLAGS) $^
 cmd_t_strip   = $(STRIPTOOL) $(STRIP_FLAGS) $@
 cmd_ar        = $(AR) $(ARFLAGS) $@ $^
+define do_ln
+	@$(disp_ln)
+	$(Q)$(LN)
+endef
 
 compile.c = @$(call maybe_exec,compile.c)
 compile.i =  $(call maybe_exec,compile.i)
@@ -152,6 +168,7 @@ compile-m = @$(disp_compile-m) ; $(cmd_c
 do_strip  = @$(disp_strip)     ; $(cmd_strip)
 do_t_strip= @$(disp_t_strip)   ; $(cmd_t_strip)
 do_ar     = @$(disp_ar)        ; $(cmd_ar)
+do_unifdef= @$(disp_unifdef)   ; $(cmd_unifdef)
 
 define compile.u
 	@$(disp_compile.u) ; $(cmd_compile.u)
@@ -244,9 +261,6 @@ $(ldso):
 $(libc):
 	@cd $(top_builddir); $(MAKE) lib/$(patsubst %.$(MAJOR_VERSION),%,$(notdir $@))
 
-$(headers_dep): $(top_srcdir)extra/scripts/gen_bits_syscall_h.sh
-	$(Q)cd $(top_builddir); $(MAKE) pregen
-
 CRT := crt1
 
 ifeq ($(HAVE_SHARED)$(UCLIBC_FORMAT_SHARED_FLAT),y)
Index: Rules.mak
===================================================================
--- Rules.mak	(revision 22237)
+++ Rules.mak	(working copy)
@@ -44,6 +44,8 @@ TAR        = tar
 
 STRIP_FLAGS ?= -x -R .note -R .comment
 
+UNIFDEF := $(top_builddir)extra/scripts/unifdef -UUCLIBC_INTERNAL
+
 # Select the compiler needed to build binaries for your development system
 HOSTCC     = gcc
 BUILD_CFLAGS = -O2 -Wall
