[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