[klibc] kbuild: Update to latest kbuild tree changes, fix make clean, add gzip to kernel

Sam Ravnborg sam at ravnborg.org
Sat Jul 30 13:27:35 PDT 2005


This update requires the latest changes from the kbuild tree
to be fully operational.
The changes are planned to hit mainstream kernel when 2.6.14 opens up.

This patch should work with older kernels too, except for the make
clean functionality.

Included in this patch:
- Fixes so make clean is now working
- Added gzip to kernel tree (in cp-to-kernel) including a small Kbuild file
- Updated to latest Kbuild.include
- Modified CFLAGS to match the klibc supplied values

Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
---
commit 3d669f9229cb75affb2c13df3fff98f3c71dd94c
tree dfc007f4217ee3499a8fbb4caac9efeb5a6eaf0d
parent 5691e96ebfccd21a1f75d3518dd55a96b311d1aa
author Sam Ravnborg <sam at mars.(none)> Sat, 30 Jul 2005 21:54:33 +0200
committer Sam Ravnborg <sam at mars.(none)> Sat, 30 Jul 2005 21:54:33 +0200

 cp-to-kernel.sh          |   14 ++++++-
 gzip/Kbuild              |   49 ++++++++++++++++++++++++++
 kernel/Kbuild            |   13 ++++++-
 kernel/Kbuild.include    |   86 +++++++++++++++++++++++++++++++++++-----------
 kernel/Kbuild.klibc      |   12 ++++--
 klibc/Kbuild             |    5 ++-
 klibc/socketcalls/Kbuild |    4 ++
 klibc/syscalls/Kbuild    |    2 +
 8 files changed, 153 insertions(+), 32 deletions(-)

diff --git a/cp-to-kernel.sh b/cp-to-kernel.sh
--- a/cp-to-kernel.sh
+++ b/cp-to-kernel.sh
@@ -12,7 +12,7 @@ fi
 
 kernel=$1
 if [ ! -d $kernel ]; then
-	echo "$kernel is not a kernel directory"
+	echo "$kernel is not a directory"
 	exit 1
 fi
 
@@ -32,8 +32,18 @@ if [ -z $2 ]; then
 	cp -R include/* $kernel/usr/include
 fi
 
+echo "Copying gzip"
+if [ ! -d $kernel/usr/gzip ]; then
+	mkdir -p $kernel/usr/gzip
+fi
+cp -R gzip/* $kernel/usr/gzip
+
 echo "Copying kbuild files"
-cp kernel/Kbuild.*          $kernel/scripts
+cp kernel/Kbuild.klibc       $kernel/scripts
+# Newer kernel versions have Kbuild.include, so do not overwrite it
+if [ ! -f $kernel/scripts/Kbuild.include ]; then
+	cp kernel/Kbuild.include $kernel/scripts
+fi
 cp kernel/Kbuild            $kernel/usr
 cp klibc/Kbuild             $kernel/usr/klibc
 cp klibc/syscalls/Kbuild    $kernel/usr/klibc/syscalls
diff --git a/gzip/Kbuild b/gzip/Kbuild
new file mode 100644
--- /dev/null
+++ b/gzip/Kbuild
@@ -0,0 +1,49 @@
+
+user-progs := gzip
+gzip-y    := gzip.o util.o unzip.o inflate.o
+
+ifeq (a,b)
+
+Kept for convinience
+ZIPSRCS = zip.c deflate.c trees.c bits.c
+UNZIPSRCS = unzip.c inflate.c
+
+SRCS = gzip.c util.c $(UNZIPSRCS)
+OBJS = $(SRCS:.c=.o)
+HDRS = gzip.h tailor.h revision.h
+LIBS = $(KLIBC) $(LIBGCC)
+
+ifeq ($(ZIP),y)
+DEFS += -DSUPPORT_ZIP
+SRCS += $(ZIPSRCS)
+endif
+
+all:	gzip gunzip zcat gzip.stripped
+
+# Actual build-related targets
+
+gzip:	Makefile $(OBJS) $(CRT0) $(LIBS)
+	$(LD) $(LDFLAGS) -o $@ $(CRT0) $(OBJS) $(LIBS)
+
+gunzip:	gzip
+	rm -f $@
+	ln $< $@
+
+zcat: gzip
+	rm -f $@
+	ln $< $@
+
+gzip.stripped: gzip
+	$(STRIP) $< -o $@
+
+clean:
+	$(RM) -f core *.o gzip gunzip zcat gzip.stripped .*.d
+
+spotless: clean
+	rm -f *~
+
+# These should presumably be shared...
+install: all
+	$(INSTALL_EXEC) gzip gunzip zcat $(INSTALLROOT)$(INSTALLDIR)/$(CROSS)bin
+	
+endif
diff --git a/kernel/Kbuild b/kernel/Kbuild
--- a/kernel/Kbuild
+++ b/kernel/Kbuild
@@ -7,15 +7,26 @@ always       := klibc/libc.a
 hostprogs-y  := gen_init_cpio
 clean-files  := initramfs_data.cpio.gz initramfs_list
 
+# Descend down into klibc when cleaning
+subdir-      := klibc
+
 # Build klibc library
 $(obj)/klibc/libc.a: FORCE
 	$(Q)$(MAKE) -rR -f $(srctree)/scripts/Kbuild.klibc obj=$(obj)/klibc
 
+initramfs-y += gzip
+
+initramfs-y := $(addprefix $(obj)/,$(initramfs-y))
+.PHONY: $(initramfs-y)
+
 # initramfs_data.o contains the initramfs_data.cpio.gz image.
 # The image is included using .incbin, a dependency which is not
 # tracked automatically.
 $(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE
 
+$(initramfs-y): $(obj)/klibc/libc.a
+	$(Q)$(MAKE) -f $(srctree)/scripts/Kbuild.klibc obj=$@
+
 ifdef CONFIG_INITRAMFS_ROOT_UID
 gen_initramfs_args += -u $(CONFIG_INITRAMFS_ROOT_UID)
 endif
@@ -34,7 +45,7 @@ filechk_initramfs_list = $(CONFIG_SHELL)
   $(srctree)/scripts/gen_initramfs_list.sh $(gen_initramfs_args) \
                                            $(quotefixed_initramfs_source)
 
-$(obj)/initramfs_list: FORCE
+$(obj)/initramfs_list: $(src)/Kbuild FORCE
 	$(call filechk,initramfs_list)
 
 quiet_cmd_cpio = CPIO    $@
diff --git a/kernel/Kbuild.include b/kernel/Kbuild.include
--- a/kernel/Kbuild.include
+++ b/kernel/Kbuild.include
@@ -1,52 +1,96 @@
-#
-# Generic kbuild routines
-#
+####
+# kbuild: Generic definitions
 
+# Convinient variables
+comma   := ,
+empty   :=
+space   := $(empty) $(empty)
+
+###
 # The temporary file to save gcc -MD generated dependencies must not
 # contain a comma
 depfile = $(subst $(comma),_,$(@D)/.$(@F).d)
 
+###
+# filechk is used to check if the content of a generated file is updated.
+# Sample usage:
+# define filechk_sample
+#	echo $KERNELRELEASE
+# endef
+# version.h : Makefile
+#	$(call filechk,sample)
+# The rule defined shall write to stdout the content of the new file.
+# The existing file will be compared with the new one.
+# - If no file exist it is created
+# - If the content differ the new file is used
+# - If they are equal no change, and no timestamp update
+# - stdin is piped in from the first prerequisite ($<) so one has
+#   to specify a valid file as first prerequisite (often the kbuild file)
+define filechk
+	$(Q)set -e;				\
+	echo '  CHK     $@';			\
+	mkdir -p $(dir $@);			\
+	$(filechk_$(1)) < $< > $@.tmp;		\
+	if [ -r $@ ] && cmp -s $@ $@.tmp; then	\
+		rm -f $@.tmp;			\
+	else					\
+		echo '  UPD     $@';		\
+		mv -f $@.tmp $@;		\
+	fi
+endef
+
+###
+# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
+# Usage:
+# $(Q)$(MAKE) $(build)=dir
+build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
+
+# If quiet is set, only print short version of command
+cmd = @$(if $($(quiet)cmd_$(1)),\
+      echo '  $(subst ','\'',$($(quiet)cmd_$(1)))' &&) $(cmd_$(1))
+
+###
+# if_changed      - execute command if any prerequisite is newer than 
+#                   target, or command line has changed
+# if_changed_dep  - as if_changed, but uses fixdep to reveal dependencies
+#                   including used config symbols
+# if_changed_rule - as if_changed but execute rule instead
+# See Documentation/kbuild/makefiles.txt for more info
 
 ifneq ($(KBUILD_NOCMDDEP),1)
 # Check if both arguments has same arguments. Result in empty string if equal
 # User may override this check using make KBUILD_NOCMDDEP=1
 arg-check = $(strip $(filter-out $(1), $(2)) $(filter-out $(2), $(1)) )
-
 endif
 
-# If quiet is set, only print short version of command
-cmd = @$(if $($(quiet)cmd_$(1)),\
-      echo '  $(subst ','\'',$($(quiet)cmd_$(1)))' &&) $(cmd_$(1))
-
-
 # echo command. Short version is $(quiet) equals quiet, otherwise full command
 echo-cmd = $(if $($(quiet)cmd_$(1)), \
 	echo '  $(subst ','\'',$($(quiet)cmd_$(1)))';)
 
 # function to only execute the passed command if necessary
-# >'< substitution is for echo to work,
-# >$< substitution to preserve $ when reloading .cmd file
-# note: when using inline perl scripts [perl -e '...$$t=1;...'] in
-#       $(cmd_xxx) double $$ your perl vars
+# >'< substitution is for echo to work, >$< substitution to preserve $ when reloading .cmd file
+# note: when using inline perl scripts [perl -e '...$$t=1;...'] in $(cmd_xxx) double $$ your perl vars
 # 
 if_changed = $(if $(strip $? $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \
 	@set -e; \
 	$(echo-cmd) \
 	$(cmd_$(1)); \
-	echo 'cmd_$@ := $(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' \
-	  > $(@D)/.$(@F).cmd)
-
+	echo 'cmd_$@ := $(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' > $(@D)/.$(@F).cmd)
 
 # execute the command and also postprocess generated .d dependencies
 # file
-if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^) \
-	$(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),                   \
+if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^)\
+	$(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),                  \
 	@set -e; \
 	$(echo-cmd) \
 	$(cmd_$(1)); \
-	scripts/basic/fixdep $(depfile) $@ \
-	  '$(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' > $(@D)/.$(@F).tmp; \
+	scripts/basic/fixdep $(depfile) $@ '$(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' > $(@D)/.$(@F).tmp; \
 	rm -f $(depfile); \
 	mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd)
 
-
+# Usage: $(call if_changed_rule,foo)
+# will check if $(cmd_foo) changed, or any of the prequisites changed,
+# and if so will execute $(rule_foo)
+if_changed_rule = $(if $(strip $? $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),\
+			@set -e; \
+			$(rule_$(1)))
diff --git a/kernel/Kbuild.klibc b/kernel/Kbuild.klibc
--- a/kernel/Kbuild.klibc
+++ b/kernel/Kbuild.klibc
@@ -31,8 +31,7 @@ KLIBSRC         := usr/klibc
 # Arch specific definitions for klibc
 include $(KLIBSRC)/arch/$(ARCH)/MCONFIG
 
-USERWARNFLAGS   := -Wall -Wpointer-arith -Wwrite-strings                 \
-                   -Wstrict-prototypes -Winline
+USERWARNFLAGS   := -W -Wall -Wsign-compare
 
 USERCROSS       := $(CROSS_COMPILE)
 
@@ -48,9 +47,10 @@ USERCPPFLAGS    := -I$(srctree)/usr/incl
                    -I$(srctree)/usr/include                              \
                    -Iinclude                                             \
                    $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)   \
-                   -D__KLIBC__ -DBITSIZE=$(BITSIZE)
-USERCFLAGS      := $(USERCPPFLAGS) $(ARCHREQFLAGS) $(OPTFLAGS)           \
-                   $(USERWARNFLAGS)
+                   -D__KLIBC__=1 -D__KLIBC_MINOR__=0                     \
+		   -DBITSIZE=$(BITSIZE)
+USERCFLAGS      := $(USERCPPFLAGS) $(REQFLAGS) $(ARCHREQFLAGS)           \
+                   $(OPTFLAGS) $(USERWARNFLAGS)
 USERAFLAGS      := -D__ASSEMBLY__ $(USERCPPFLAGS)
 USERSTRIPFLAGS  := --strip-all -R .comment -R .note
 
@@ -201,6 +201,7 @@ __build : $(user-dirs) $(user-progs)
 # Descend if needed
 $(sort $(addsuffix /built-in.o,$(user-dirs))): $(user-dirs) ;
 
+# link program that has only a single .o file
 quiet_cmd_user-ld-single = USERLD  $@
       cmd_user-ld-single = $(USERLD) $(USERLDFLAGS) -o $@      \
                            $(USERCRT0) $<                      \
@@ -214,6 +215,7 @@ $(user-single): %: %.o $(USERCRT0) $(USE
 
 targets += $(user-single) $(user-single:=.o)
 
+# link programs that consist of more than one .o file
 multi-deps = $($(subst $(obj)/,,$@-y))
 link-multi-deps = $(addprefix $(obj)/, \
                     $(patsubst %/, %/built-in.o, $(multi-deps)))
diff --git a/klibc/Kbuild b/klibc/Kbuild
--- a/klibc/Kbuild
+++ b/klibc/Kbuild
@@ -119,6 +119,7 @@ $(SOLIB): $(CRT0) $(call objectify,__sha
 # Build sha1 hash values
 targets     += klibc.so libc.so.hash
 hostprogs-y := sha1hash
+clean-files += klibc-???????????????????????????.so
 
 quiet_cmd_solibhash = HASH    $@
       cmd_solibhash = $(USERNM) $< | egrep '^[0-9a-fA-F]+ [ADRTW] ' | \
@@ -129,7 +130,7 @@ $(SOLIB).hash: $(SOLIB) $(obj)/sha1hash 
 quiet_cmd_sohash = GEN     $@
       cmd_sohash = cat $< > $@;                                           \
                      $(USERSTRIP) $(USERSTRIPFLAGS) $@;                   \
-                     rm -f $(obj)/klibc-??????????????????????.so;        \
+                     rm -f $(obj)/klibc-???????????????????????????.so;   \
                      ln -f $@ $(obj)/klibc-`cat $(SOLIB).hash`.so
 $(SOHASH): $(SOLIB) $(SOLIB).hash
 	$(call cmd,sohash)
@@ -139,7 +140,7 @@ $(SOHASH): $(SOLIB) $(SOLIB).hash
 # build interp.o
 targets += interp.o
 
-quiet_cmd_interp = BUILD  $@
+quiet_cmd_interp = BUILD   $@
       cmd_interp = $(USERCC) $(usercflags) -D__ASSEMBLY__     \
                              -DLIBDIR=\"$(SHLIBDIR)\"         \
 			     -DSOHASH=\"`cat $(SOLIB).hash`\" \
diff --git a/klibc/socketcalls/Kbuild b/klibc/socketcalls/Kbuild
--- a/klibc/socketcalls/Kbuild
+++ b/klibc/socketcalls/Kbuild
@@ -4,7 +4,9 @@
 
 # Include automatically generated Makefile fragment.
 # It contains definition of socketcall-objs specifying name of all .o files
+ifeq ($(clean),)
 -include $(obj)/socketcalls.mk
+endif
 
 # Composite object containing all .o file
 always := socketcalls.o
@@ -17,7 +19,7 @@ klibc-dir := $(srctree)/usr/klibc
 targets     := socketcalls.o
 targets     += socketcalls.mk
 targets     += $(socketcall-objs)
-clean-files += *.o
+clean-files += *.S *.o
 
 # Create reloctable composite object file
 $(obj)/socketcalls.o: $(call objectify,$(socketcall-objs)) FORCE
diff --git a/klibc/syscalls/Kbuild b/klibc/syscalls/Kbuild
--- a/klibc/syscalls/Kbuild
+++ b/klibc/syscalls/Kbuild
@@ -4,7 +4,9 @@
 
 # Include automatically generated Makefile fragment.
 # It contains definition of syscall-objs specifying name of all .o files
+ifeq ($(clean),)
 -include $(obj)/syscalls.mk
+endif
 
 # Composite object containing all .o file
 always := syscalls.o



More information about the klibc mailing list