[PATCH] Kbuild: fix generating Config.in and Kbuild

Bernhard Reutner-Fischer rep.dot.nop at gmail.com
Thu May 27 12:46:16 UTC 2010


This stuff is part of the make machinery, so implement it in make
proper.
Avoids spurious, slow re-generation of the generated Config.in and
Kbuild files.

Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
---
 Makefile                   |   61 ++++++++++++++++++++++++++++++++++++++------
 scripts/Kbuild.include     |    8 ++++++
 scripts/gen_build_files.sh |   60 -------------------------------------------
 3 files changed, 61 insertions(+), 68 deletions(-)
 delete mode 100755 scripts/gen_build_files.sh

diff --git a/Makefile b/Makefile
index c231092..de66535 100644
--- a/Makefile
+++ b/Makefile
@@ -298,6 +298,7 @@ STRIP		= $(CROSS_COMPILE)strip
 OBJCOPY		= $(CROSS_COMPILE)objcopy
 OBJDUMP		= $(CROSS_COMPILE)objdump
 AWK		= awk
+SED		= sed
 GENKSYMS	= scripts/genksyms/genksyms
 DEPMOD		= /sbin/depmod
 KALLSYMS	= scripts/kallsyms
@@ -329,7 +330,7 @@ KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
 
 export	VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION \
 	ARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \
-	CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE \
+	CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK SED GENKSYMS PERL UTS_MACHINE \
 	HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
 
 export CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
@@ -377,11 +378,6 @@ ifneq ($(KBUILD_SRC),)
 	    $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
 endif
 
-# This target generates Kbuild's and Config.in's from *.c files
-PHONY += gen_build_files
-gen_build_files:
-	$(Q)$(srctree)/scripts/gen_build_files.sh $(srctree) $(objtree)
-
 # To make sure we do not include .config for any of the *config targets
 # catch them early, and hand them over to scripts/kconfig/Makefile
 # It is allowed to specify more targets when calling make, including
@@ -433,7 +429,56 @@ ifeq ($(config-targets),1)
 -include $(srctree)/arch/$(ARCH)/Makefile
 export KBUILD_DEFCONFIG
 
-config %config: scripts_basic outputmakefile gen_build_files FORCE
+busybox-alldirs := $(shell find $(srctree) -type f -name Kbuild.src)
+busybox-alldirs := $(foreach d,$(busybox-alldirs),$(dir $(d)))
+busybox-alldirs := $(patsubst $(srctree)/%/,%,$(busybox-alldirs))
+
+gen_build_files = $(addsuffix /Config.in,$(busybox-alldirs)) \
+	$(addsuffix /Kbuild,$(busybox-alldirs))
+
+define get_kbuild_str
+	$(shell $(SED) 's/\(["()]\)/\\\1/g;s@^//kbuild:@\\n at gp;d' -- $(subst $<,,$^))
+endef
+
+define get_config_str
+	$(shell $(SED) 's/\(["()]\)/\\\1/g;s@^//config:@\\n at gp;d' -- $(subst $<,,$^))
+endef
+
+define generate_kbuild
+	echo '# DO NOT EDIT. This file is generated from Kbuild.src' > $@.tmp; \
+	$(SED) -e "/^INSERT/c\ $(call get_kbuild_str)" $< >> $@.tmp; \
+	if cmp -s $@ $@.tmp; \
+	then touch $@; \
+	else \
+		mv $@.tmp $@; \
+	fi; \
+	rm -f $@.tmp
+endef
+define generate_config_in
+	echo '# DO NOT EDIT. This file is generated from Config.src' > $@.tmp; \
+	$(SED) -e "/^INSERT/c\ $(call get_config_str)" $< >> $@.tmp; \
+	if cmp -s $@ $@.tmp; \
+	then touch $@; \
+	else \
+		mv $@.tmp $@; \
+	fi; \
+	rm -f $@.tmp
+endef
+
+quiet_cmd_gen_config_in ?= GEN     $@
+brief_cmd_gen_config_in ?= GEN     $< + $(SED) 's@^//config:@p;d' $(@D)/*.c -> $@
+      cmd_gen_config_in ?= $(generate_config_in)
+quiet_cmd_gen_kbuild    ?= GEN     $@
+brief_cmd_gen_kbuild    ?= GEN     $< + $(SED) 's@^//kbuild:@p;d' $(@D)/*.c -> $@
+      cmd_gen_kbuild    ?= $(generate_kbuild)
+
+# This target generates Kbuild's and Config.in's from *.c files
+%/Config.in: %/Config.src %/*.c
+	$(call briefcmd,gen_config_in)
+%/Kbuild: %/Kbuild.src %/*.c
+	$(call briefcmd,gen_kbuild)
+
+config %config: scripts_basic outputmakefile $(gen_build_files) FORCE
 	$(Q)mkdir -p include
 	$(Q)$(MAKE) $(build)=scripts/kconfig $@
 	$(Q)$(MAKE) -C $(srctree) KBUILD_SRC= .kernelrelease
@@ -448,7 +493,7 @@ ifeq ($(KBUILD_EXTMOD),)
 # Carefully list dependencies so we do not try to build scripts twice
 # in parrallel
 PHONY += scripts
-scripts: gen_build_files scripts_basic include/config/MARKER
+scripts: $(gen_build_files) scripts_basic include/config/MARKER
 	$(Q)$(MAKE) $(build)=$(@)
 
 scripts_basic: include/autoconf.h
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index 6ec1809..1e9f703 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -101,6 +101,10 @@ flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o)))
 # If quiet is set, only print short version of command
 cmd = @$(echo-cmd) $(cmd_$(1))
 
+# If quiet is set, only print short version of command
+# else print brief command, iff set
+briefcmd = @$(brief-cmd) $(cmd_$(1))
+
 # Add $(obj)/ for paths that is not absolute
 objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
 
@@ -122,6 +126,10 @@ endif
 echo-cmd = $(if $($(quiet)cmd_$(1)), \
 	echo '  $(call escsq,$($(quiet)cmd_$(1)))';)
 
+# echo command. Short version is $(quiet) equals quiet, otherwise brief command
+brief-cmd = $(if $(quiet),$(echo-cmd), \
+	$(if $(brief_cmd_$(1)), echo '  $(call escsq,$(brief_cmd_$(1)))';))
+
 make-cmd = $(subst \#,\\\#,$(subst $$,$$$$,$(call escsq,$(cmd_$(1)))))
 
 # function to only execute the passed command if necessary
diff --git a/scripts/gen_build_files.sh b/scripts/gen_build_files.sh
deleted file mode 100755
index b3aa132..0000000
--- a/scripts/gen_build_files.sh
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/bin/sh
-
-test $# -ge 2 || { echo "Syntax: $0 SRCTREE OBJTREE"; exit 1; }
-
-# cd to objtree
-cd -- "$2" || { echo "Syntax: $0 SRCTREE OBJTREE"; exit 1; }
-
-srctree="$1"
-
-find -type d | while read -r d; do
-	d="${d#./}"
-	src="$srctree/$d/Kbuild.src"
-	dst="$d/Kbuild"
-	if test -f "$src"; then
-		#echo "  CHK     $dst"
-
-		s=`sed -n 's@^//kbuild:@@p' -- "$srctree/$d"/*.c`
-		echo "# DO NOT EDIT. This file is generated from Kbuild.src" >"$dst.$$.tmp"
-
-		# Why "IFS='' read -r REPLY"??
-		# This atrocity is needed to read lines without mangling.
-		# IFS='' prevents whitespace trimming,
-		# -r suppresses backslash handling.
-		while IFS='' read -r REPLY; do
-			test x"$REPLY" = x"INSERT" && REPLY="$s"
-			printf "%s\n" "$REPLY"
-		done <"$src" >>"$dst.$$.tmp"
-
-		if test -f "$dst" && cmp -s "$dst.$$.tmp" "$dst"; then
-			rm -- "$dst.$$.tmp"
-		else
-			echo "  GEN     $dst"
-			mv -- "$dst.$$.tmp" "$dst"
-		fi
-	fi
-
-	src="$srctree/$d/Config.src"
-	dst="$d/Config.in"
-	if test -f "$src"; then
-		#echo "  CHK     $dst"
-
-		s=`sed -n 's@^//config:@@p' -- "$srctree/$d"/*.c`
-		echo "# DO NOT EDIT. This file is generated from Config.src" >"$dst.$$.tmp"
-
-		while IFS='' read -r REPLY; do
-			test x"$REPLY" = x"INSERT" && REPLY="$s"
-			printf "%s\n" "$REPLY"
-		done <"$src" >>"$dst.$$.tmp"
-
-		if test -f "$dst" && cmp -s "$dst.$$.tmp" "$dst"; then
-			rm -- "$dst.$$.tmp"
-		else
-			echo "  GEN     $dst"
-			mv -- "$dst.$$.tmp" "$dst"
-		fi
-	fi
-done
-
-# Last read failed. This is normal. Don't exit with its error code:
-exit 0
-- 
1.7.1



More information about the busybox mailing list