[klibc] [patch 3/3] kbuild: move kbuild files to reflects directory structure in the kernel

Sam Ravnborg sam at ravnborg.org
Sat Jul 30 13:29:04 PDT 2005


To make it more obvious where the files are supposed to end up
move files so they reflect the directory structure in the kernel.

mkdir usr
mv kernel/Kbuild usr

mkdir scripts
mv kernel/* scripts/

rmdir kernel

Furthermore updated cp-to-kernel to refelct new directory layout
And added '#' in front of comment in usr/Kbuild

Signed-off-by: Sam Ravnborg <sam at ravnborg.org>
---
commit 6b1838e0265930a078ab79815dfa8fe86102a562
tree a704f20950106726a2c91b4882ac8ed60a971e81
parent 6327408a6bf07cf284adb344e982cb91b6eed4a7
author Sam Ravnborg <sam at mars.(none)> Sat, 30 Jul 2005 22:19:06 +0200
committer Sam Ravnborg <sam at mars.(none)> Sat, 30 Jul 2005 22:19:06 +0200

 cp-to-kernel.sh        |    6 +
 kernel/Kbuild          |   87 ---------------
 kernel/Kbuild.include  |   96 ----------------
 kernel/Kbuild.klibc    |  282 ------------------------------------------------
 scripts/Kbuild.include |   96 ++++++++++++++++
 scripts/Kbuild.klibc   |  282 ++++++++++++++++++++++++++++++++++++++++++++++++
 usr/Kbuild             |   87 +++++++++++++++
 7 files changed, 468 insertions(+), 468 deletions(-)

diff --git a/cp-to-kernel.sh b/cp-to-kernel.sh
--- a/cp-to-kernel.sh
+++ b/cp-to-kernel.sh
@@ -39,12 +39,12 @@ fi
 cp -R gzip/* $kernel/usr/gzip
 
 echo "Copying kbuild files"
-cp kernel/Kbuild.klibc       $kernel/scripts
+cp scripts/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
+	cp scripts/Kbuild.include $kernel/scripts
 fi
-cp kernel/Kbuild            $kernel/usr
+cp usr/Kbuild               $kernel/usr
 cp klibc/Kbuild             $kernel/usr/klibc
 cp klibc/syscalls/Kbuild    $kernel/usr/klibc/syscalls
 cp klibc/socketcalls/Kbuild $kernel/usr/klibc/socketcalls
diff --git a/kernel/Kbuild b/kernel/Kbuild
deleted file mode 100644
--- a/kernel/Kbuild
+++ /dev/null
@@ -1,87 +0,0 @@
-#
-# kbuild file for usr/ - including initramfs image and klibc
-#
-
-klibc definitions - to be moved to top-level Makefile later
-export KLIBSRC := $(srctree)/$(src)/klibc
-export KLIBINC := $(srctree)/$(src)/include
-
-obj-y        := initramfs_data.o
-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
-
-ifdef CONFIG_INITRAMFS_ROOT_GID
-gen_initramfs_args += -g $(CONFIG_INITRAMFS_ROOT_GID)
-endif
-
-# The $(shell echo $(CONFIG_INITRAMFS_SOURCE)) is to remove the
-# gratuitous begin and end quotes from the Kconfig string type.
-# Internal, escaped quotes in the Kconfig string will loose the
-# escape and become active quotes.
-quotefixed_initramfs_source := $(shell echo $(CONFIG_INITRAMFS_SOURCE))
-
-filechk_initramfs_list = $(CONFIG_SHELL) \
-  $(srctree)/scripts/gen_initramfs_list.sh $(gen_initramfs_args) \
-                                           $(quotefixed_initramfs_source)
-
-$(obj)/initramfs_list: $(src)/Kbuild FORCE
-	$(call filechk,initramfs_list)
-
-quiet_cmd_cpio = CPIO    $@
-      cmd_cpio = ./$< $(obj)/initramfs_list > $@
-
-
-# Check if the INITRAMFS_SOURCE is a cpio archive
-ifneq (,$(findstring .cpio,$(quotefixed_initramfs_source)))
-
-# INITRAMFS_SOURCE has a cpio archive - verify that it's a single file
-ifneq (1,$(words $(quotefixed_initramfs_source)))
-$(error Only a single file may be specified in CONFIG_INITRAMFS_SOURCE (="$(quotefixed_initramfs_source)") when a cpio archive is directly specified.)
-endif
-# Now use the cpio archive directly
-initramfs_data_cpio = $(quotefixed_initramfs_source)
-targets += $(quotefixed_initramfs_source)
-
-else
-
-# INITRAMFS_SOURCE is not a cpio archive - create one
-$(obj)/initramfs_data.cpio: $(obj)/gen_init_cpio \
-                            $(initramfs-y) $(obj)/initramfs_list FORCE
-	$(call if_changed,cpio)
-
-targets += initramfs_data.cpio
-initramfs_data_cpio = $(obj)/initramfs_data.cpio
-
-endif
-
-
-$(obj)/initramfs_data.cpio.gz: $(initramfs_data_cpio) FORCE
-	$(call if_changed,gzip)
-
-targets += initramfs_data.cpio.gz
-
diff --git a/kernel/Kbuild.include b/kernel/Kbuild.include
deleted file mode 100644
--- a/kernel/Kbuild.include
+++ /dev/null
@@ -1,96 +0,0 @@
-####
-# 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
-
-# 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
-# 
-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)
-
-# 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_$@)) ),                  \
-	@set -e; \
-	$(echo-cmd) \
-	$(cmd_$(1)); \
-	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
deleted file mode 100644
--- a/kernel/Kbuild.klibc
+++ /dev/null
@@ -1,282 +0,0 @@
-# ==========================================================================
-# Support for building klibc and related programs
-# ==========================================================================
-#
-# To create a kbuild file for a userspace program do the following:
-#
-# Kbuild:
-# 
-# user-progs := cat
-#
-# This will compile a file named cat.c -> the executable 'cat'
-# 
-# If the user space program consist of more files do the following:
-# Kbuild:
-#
-# user-progs := ipconfig
-# ipconfig-y := main.o netdev.c
-
-src := $(obj)
-
-.phony: __build
-__build:
-
-# Generic Kbuild routines
-include $(srctree)/scripts/Kbuild.include
-
-# Defines used when compiling early userspace (klibc programs)
-# ---------------------------------------------------------------------------
-
-# Arch specific definitions for klibc
-include $(KLIBSRC)/arch/$(ARCH)/MCONFIG
-
-USERWARNFLAGS   := -W -Wall -Wsign-compare
-
-USERCROSS       := $(CROSS_COMPILE)
-
-USERLD          := $(USERCROSS)ld
-USERCC          := $(USERCROSS)gcc
-USERAR          := $(USERCROSS)ar
-USERRANLIB      := $(USERCROSS)ranlib
-USERSTRIP       := $(USERCROSS)strip
-USERNM          := $(USERCROSS)nm
-
-USERCPPFLAGS    := -I$(KLIBINC)/arch/$(ARCH)                             \
-                   -I$(KLIBINC)/bits$(BITSIZE)                           \
-                   -I$(KLIBINC)                                          \
-                   -Iinclude                                             \
-                   $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)   \
-                   -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
-
-USERLIBGCC      := $(shell $(USERCC) --print-libgcc)
-USERSHAREDFLAGS := $(SHAREDFLAGS)
-USERCRT0        := $(KLIBSRC)/arch/$(ARCH)/crt0.o
-USERLIBC        := $(KLIBSRC)/libc.a
-
-#
-# This indicates the location of the final version of the shared library.
-# THIS MUST BE AN ABSOLUTE PATH WITH NO FINAL SLASH.
-# Leave this empty to make it the root.
-#
-SHLIBDIR = /lib
-
-export USERLD USERCC USERAR USERSTRIP USERNM
-export USERCFLAGS USERAFLAGS USERLIBGCC USERSHAREDFLAGS USERSTRIPFLAGS
-export USERCRT0 USERLIBC SHLIBDIR
-
-# kernel configuration
-include .config
-
-# Add $(obj)/ for paths that is not absolute
-objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
-
-# Kbuild file in the directory that is being build
-include $(obj)/Kbuild
-
-#####
-# user-progs := handling
-
-# user-progs based on a single .c file (with same name)
-user-single := $(foreach p, $(user-progs), $(if $($(p)-y),,$(p)))
-
-# user-progs which is based on several .o files
-user-multi  := $(foreach p, $(user-progs), $(if $($(p)-y),$(p)))
-# objects used for user-progs with more then one .o file
-user-multi-objs := $(foreach p, $(user-multi), $($(p)-y))
-# objects build in this dir
-user-real-objs := $(patsubst %/,,$(user-multi-objs))
-# Directories we need to visit before user-multi-obs are up-to-date
-user-dirs :=  $(patsubst %/,%,$(filter %/, $(user-multi-objs))) 
-# replace all dir/ with dir/built-in.o
-user-multi-objs := $(patsubst %/, %/built-in.o, $(user-multi-objs))
-
-# $(output-dirs) are a list of directories that contain object files
-output-dirs := $(dir $(user-dirs))
-output-dirs += $(foreach f, $(hostprogs-y) $(targets), \
-               $(if $(dir $(f)), $(dir $(f))))
-output-dirs := $(strip $(sort $(filter-out ./,$(output-dirs))))
-
-# prefix so we get full dir
-user-progs      := $(addprefix $(obj)/,$(user-progs))
-user-single     := $(addprefix $(obj)/,$(user-single))
-user-multi      := $(addprefix $(obj)/,$(user-multi))
-user-multi-objs := $(addprefix $(obj)/,$(user-multi-objs))
-user-real-objs  := $(addprefix $(obj)/,$(user-real-objs))
-output-dirs     := $(addprefix $(obj)/,$(output-dirs))
-user-dirs       := $(addprefix $(obj)/,$(user-dirs))
-subdir-y        := $(addprefix $(obj)/,$(subdir-y))
-always          := $(addprefix $(obj)/,$(always))
-targets         := $(addprefix $(obj)/,$(targets))
-
-
-_usercflags    = $(USERCFLAGS) $(EXTRA_USERCFLAGS) $(USERCFLAGS_$(*F).o)
-_useraflags    = $(USERAFLAGS) $(EXTRA_USERAFLAGS) $(USERAFLAGS_$(*F).o)
-
-usercflags     = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(_usercflags)
-useraflags     = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(_useraflags)
-
-ifneq ($(KBUILD_SRC),)
-# Create output directory if not already present
-_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
-
-# Create directories for object files if directory does not exist
-# Needed when obj-y := dir/file.o syntax is used
-_dummy := $(foreach d,$(output-dirs), $(shell [ -d $(d) ] || mkdir -p $(d)))
-endif
-
-# Do we have to make a built-in.o in this dir?
-ifneq ($(strip $(obj-y) $(obj-n) $(obj-)),)
-builtin-target := $(obj)/built-in.o
-endif
-
-__build: $(subdir-y) $(builtin-target) $(always)
-	@:
-
-# Compile C sources (.c)
-# ---------------------------------------------------------------------------
-
-quiet_cmd_cc_s_c = USERCC  $@
-      cmd_cc_s_c = $(USERCC) $(usercflags) -S -o $@ $< 
-
-%.s: %.c FORCE
-	$(call if_changed_dep,cc_s_c)
-
-quiet_cmd_cc_i_c = USERCPP $@
-      cmd_cc_i_c = $(USERCPP) $(usercflags)   -o $@ $<
-
-%.i: %.c FORCE
-	$(call if_changed_dep,cc_i_c)
-
-quiet_cmd_cc_o_c = USERCC  $@
-      cmd_cc_o_c = $(USERCC) $(usercflags) -c -o $@ $<
-
-%.o: %.c FORCE
-	$(call if_changed_dep,cc_o_c)
-
-# Compile assembler sources (.S)
-# ---------------------------------------------------------------------------
-
-quiet_cmd_as_s_S = USERCPP $@
-      cmd_as_s_S = $(USERCPP) $(useraflags)   -o $@ $< 
-
-%.s: %.S FORCE
-	$(call if_changed_dep,as_s_S)
-
-quiet_cmd_as_o_S = USERAS  $@
-      cmd_as_o_S = $(USERCC) $(useraflags) -c -o $@ $<
-
-%.o: %.S FORCE
-	$(call if_changed_dep,as_o_S)
-
-targets += $(real-objs-y)
-
-#
-# Rule to compile a set of .o files into one .o file
-#
-ifdef builtin-target
-quiet_cmd_link_o_target = LD      $@
-# If the list of objects to link is empty, just create an empty built-in.o
-cmd_link_o_target = $(if $(strip $(obj-y)),\
-                    $(USERLD) $(USERLDFLAGS) -r -o $@ $(filter $(obj-y), $^),\
-                    rm -f $@; $(AR) rcs $@)
-
-$(builtin-target): $(obj-y) FORCE
-	$(call if_changed,link_o_target)
-targets += $(builtin-target)
-endif # builtin-target
-
-
-ifdef user-progs
-# Compile userspace programs for the target
-# ===========================================================================
-
-__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) $<                      \
-                           $(filter-out FORCE,$^)              \
-                           $(USERLIBC) $(USERLIBGCC)           \
-                           $(USERLIBGCC);                      \
-                           $(USERSTRIP) $(USERSTRIPFLAGS) $@
-
-$(user-single): %: %.o $(USERCRT0) $(USERLIBC) FORCE
-	$(call if_changed,user-ld-single)
-
-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)))
-
-quiet_cmd_user-ld-multi = USERLD  $@
-      cmd_user-ld-multi = $(USERLD) $(USERLDFLAGS) -o $@       \
-                           $(USERCRT0)                         \
-                           $(link-multi-deps)                  \
-                           $(USERLIBC) $(USERLIBGCC)           \
-                           $(USERLIBGCC);                      \
-                           $(USERSTRIP) $(USERSTRIPFLAGS) $@
-
-$(user-multi): $(user-multi-objs) FORCE
-	$(call if_changed,user-ld-multi)
-
-targets += $(user-multi) $(user-real-objs)
-endif
-
-
-# Compile programs on the host
-# ===========================================================================
-ifdef hostprogs-y
-include $(srctree)/scripts/Makefile.host
-endif
-
-# Descending
-# ---------------------------------------------------------------------------
-
-.PHONY: $(subdir-y) $(user-dirs)
-$(subdir-y) $(user-dirs):
-	$(Q)$(MAKE) $(klibc)=$@
-
-# Add FORCE to the prequisites of a target to force it to be always rebuilt.
-# ---------------------------------------------------------------------------
-
-.PHONY: FORCE
-
-FORCE:
-
-# Linking
-# Create a reloctable composite object file
-# ---------------------------------------------------------------------------
-quiet_cmd_userld = USERLD  $@
-      cmd_userld = $(USERLD) -r $(USERLDFLAGS) \
-                                $(EXTRA_USERLDFLAGS) $(USERLDFLAGS_$(@F)) \
-                                $(filter-out FORCE,$^) -o $@
-
-
-# Read all saved command lines and dependencies for the $(targets) we
-# may be building above, using $(if_changed{,_dep}). As an
-# optimization, we don't need to read them if the target does not
-# exist, we will rebuild anyway in that case.
-
-targets := $(wildcard $(sort $(targets)))
-cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
-
-ifneq ($(cmd_files),)
-  include $(cmd_files)
-endif
-
-# Shorthand for $(Q)$(MAKE) -f scripts/Kbuild.klibc obj
-# Usage:
-# $(Q)$(MAKE) $(klibc)=dir
-klibc := -rR -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Kbuild.klibc obj
-
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
new file mode 100644
--- /dev/null
+++ b/scripts/Kbuild.include
@@ -0,0 +1,96 @@
+####
+# 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
+
+# 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
+# 
+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)
+
+# 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_$@)) ),                  \
+	@set -e; \
+	$(echo-cmd) \
+	$(cmd_$(1)); \
+	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/scripts/Kbuild.klibc b/scripts/Kbuild.klibc
new file mode 100644
--- /dev/null
+++ b/scripts/Kbuild.klibc
@@ -0,0 +1,282 @@
+# ==========================================================================
+# Support for building klibc and related programs
+# ==========================================================================
+#
+# To create a kbuild file for a userspace program do the following:
+#
+# Kbuild:
+# 
+# user-progs := cat
+#
+# This will compile a file named cat.c -> the executable 'cat'
+# 
+# If the user space program consist of more files do the following:
+# Kbuild:
+#
+# user-progs := ipconfig
+# ipconfig-y := main.o netdev.c
+
+src := $(obj)
+
+.phony: __build
+__build:
+
+# Generic Kbuild routines
+include $(srctree)/scripts/Kbuild.include
+
+# Defines used when compiling early userspace (klibc programs)
+# ---------------------------------------------------------------------------
+
+# Arch specific definitions for klibc
+include $(KLIBSRC)/arch/$(ARCH)/MCONFIG
+
+USERWARNFLAGS   := -W -Wall -Wsign-compare
+
+USERCROSS       := $(CROSS_COMPILE)
+
+USERLD          := $(USERCROSS)ld
+USERCC          := $(USERCROSS)gcc
+USERAR          := $(USERCROSS)ar
+USERRANLIB      := $(USERCROSS)ranlib
+USERSTRIP       := $(USERCROSS)strip
+USERNM          := $(USERCROSS)nm
+
+USERCPPFLAGS    := -I$(KLIBINC)/arch/$(ARCH)                             \
+                   -I$(KLIBINC)/bits$(BITSIZE)                           \
+                   -I$(KLIBINC)                                          \
+                   -Iinclude                                             \
+                   $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)   \
+                   -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
+
+USERLIBGCC      := $(shell $(USERCC) --print-libgcc)
+USERSHAREDFLAGS := $(SHAREDFLAGS)
+USERCRT0        := $(KLIBSRC)/arch/$(ARCH)/crt0.o
+USERLIBC        := $(KLIBSRC)/libc.a
+
+#
+# This indicates the location of the final version of the shared library.
+# THIS MUST BE AN ABSOLUTE PATH WITH NO FINAL SLASH.
+# Leave this empty to make it the root.
+#
+SHLIBDIR = /lib
+
+export USERLD USERCC USERAR USERSTRIP USERNM
+export USERCFLAGS USERAFLAGS USERLIBGCC USERSHAREDFLAGS USERSTRIPFLAGS
+export USERCRT0 USERLIBC SHLIBDIR
+
+# kernel configuration
+include .config
+
+# Add $(obj)/ for paths that is not absolute
+objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
+
+# Kbuild file in the directory that is being build
+include $(obj)/Kbuild
+
+#####
+# user-progs := handling
+
+# user-progs based on a single .c file (with same name)
+user-single := $(foreach p, $(user-progs), $(if $($(p)-y),,$(p)))
+
+# user-progs which is based on several .o files
+user-multi  := $(foreach p, $(user-progs), $(if $($(p)-y),$(p)))
+# objects used for user-progs with more then one .o file
+user-multi-objs := $(foreach p, $(user-multi), $($(p)-y))
+# objects build in this dir
+user-real-objs := $(patsubst %/,,$(user-multi-objs))
+# Directories we need to visit before user-multi-obs are up-to-date
+user-dirs :=  $(patsubst %/,%,$(filter %/, $(user-multi-objs))) 
+# replace all dir/ with dir/built-in.o
+user-multi-objs := $(patsubst %/, %/built-in.o, $(user-multi-objs))
+
+# $(output-dirs) are a list of directories that contain object files
+output-dirs := $(dir $(user-dirs))
+output-dirs += $(foreach f, $(hostprogs-y) $(targets), \
+               $(if $(dir $(f)), $(dir $(f))))
+output-dirs := $(strip $(sort $(filter-out ./,$(output-dirs))))
+
+# prefix so we get full dir
+user-progs      := $(addprefix $(obj)/,$(user-progs))
+user-single     := $(addprefix $(obj)/,$(user-single))
+user-multi      := $(addprefix $(obj)/,$(user-multi))
+user-multi-objs := $(addprefix $(obj)/,$(user-multi-objs))
+user-real-objs  := $(addprefix $(obj)/,$(user-real-objs))
+output-dirs     := $(addprefix $(obj)/,$(output-dirs))
+user-dirs       := $(addprefix $(obj)/,$(user-dirs))
+subdir-y        := $(addprefix $(obj)/,$(subdir-y))
+always          := $(addprefix $(obj)/,$(always))
+targets         := $(addprefix $(obj)/,$(targets))
+
+
+_usercflags    = $(USERCFLAGS) $(EXTRA_USERCFLAGS) $(USERCFLAGS_$(*F).o)
+_useraflags    = $(USERAFLAGS) $(EXTRA_USERAFLAGS) $(USERAFLAGS_$(*F).o)
+
+usercflags     = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(_usercflags)
+useraflags     = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(_useraflags)
+
+ifneq ($(KBUILD_SRC),)
+# Create output directory if not already present
+_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
+
+# Create directories for object files if directory does not exist
+# Needed when obj-y := dir/file.o syntax is used
+_dummy := $(foreach d,$(output-dirs), $(shell [ -d $(d) ] || mkdir -p $(d)))
+endif
+
+# Do we have to make a built-in.o in this dir?
+ifneq ($(strip $(obj-y) $(obj-n) $(obj-)),)
+builtin-target := $(obj)/built-in.o
+endif
+
+__build: $(subdir-y) $(builtin-target) $(always)
+	@:
+
+# Compile C sources (.c)
+# ---------------------------------------------------------------------------
+
+quiet_cmd_cc_s_c = USERCC  $@
+      cmd_cc_s_c = $(USERCC) $(usercflags) -S -o $@ $< 
+
+%.s: %.c FORCE
+	$(call if_changed_dep,cc_s_c)
+
+quiet_cmd_cc_i_c = USERCPP $@
+      cmd_cc_i_c = $(USERCPP) $(usercflags)   -o $@ $<
+
+%.i: %.c FORCE
+	$(call if_changed_dep,cc_i_c)
+
+quiet_cmd_cc_o_c = USERCC  $@
+      cmd_cc_o_c = $(USERCC) $(usercflags) -c -o $@ $<
+
+%.o: %.c FORCE
+	$(call if_changed_dep,cc_o_c)
+
+# Compile assembler sources (.S)
+# ---------------------------------------------------------------------------
+
+quiet_cmd_as_s_S = USERCPP $@
+      cmd_as_s_S = $(USERCPP) $(useraflags)   -o $@ $< 
+
+%.s: %.S FORCE
+	$(call if_changed_dep,as_s_S)
+
+quiet_cmd_as_o_S = USERAS  $@
+      cmd_as_o_S = $(USERCC) $(useraflags) -c -o $@ $<
+
+%.o: %.S FORCE
+	$(call if_changed_dep,as_o_S)
+
+targets += $(real-objs-y)
+
+#
+# Rule to compile a set of .o files into one .o file
+#
+ifdef builtin-target
+quiet_cmd_link_o_target = LD      $@
+# If the list of objects to link is empty, just create an empty built-in.o
+cmd_link_o_target = $(if $(strip $(obj-y)),\
+                    $(USERLD) $(USERLDFLAGS) -r -o $@ $(filter $(obj-y), $^),\
+                    rm -f $@; $(AR) rcs $@)
+
+$(builtin-target): $(obj-y) FORCE
+	$(call if_changed,link_o_target)
+targets += $(builtin-target)
+endif # builtin-target
+
+
+ifdef user-progs
+# Compile userspace programs for the target
+# ===========================================================================
+
+__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) $<                      \
+                           $(filter-out FORCE,$^)              \
+                           $(USERLIBC) $(USERLIBGCC)           \
+                           $(USERLIBGCC);                      \
+                           $(USERSTRIP) $(USERSTRIPFLAGS) $@
+
+$(user-single): %: %.o $(USERCRT0) $(USERLIBC) FORCE
+	$(call if_changed,user-ld-single)
+
+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)))
+
+quiet_cmd_user-ld-multi = USERLD  $@
+      cmd_user-ld-multi = $(USERLD) $(USERLDFLAGS) -o $@       \
+                           $(USERCRT0)                         \
+                           $(link-multi-deps)                  \
+                           $(USERLIBC) $(USERLIBGCC)           \
+                           $(USERLIBGCC);                      \
+                           $(USERSTRIP) $(USERSTRIPFLAGS) $@
+
+$(user-multi): $(user-multi-objs) FORCE
+	$(call if_changed,user-ld-multi)
+
+targets += $(user-multi) $(user-real-objs)
+endif
+
+
+# Compile programs on the host
+# ===========================================================================
+ifdef hostprogs-y
+include $(srctree)/scripts/Makefile.host
+endif
+
+# Descending
+# ---------------------------------------------------------------------------
+
+.PHONY: $(subdir-y) $(user-dirs)
+$(subdir-y) $(user-dirs):
+	$(Q)$(MAKE) $(klibc)=$@
+
+# Add FORCE to the prequisites of a target to force it to be always rebuilt.
+# ---------------------------------------------------------------------------
+
+.PHONY: FORCE
+
+FORCE:
+
+# Linking
+# Create a reloctable composite object file
+# ---------------------------------------------------------------------------
+quiet_cmd_userld = USERLD  $@
+      cmd_userld = $(USERLD) -r $(USERLDFLAGS) \
+                                $(EXTRA_USERLDFLAGS) $(USERLDFLAGS_$(@F)) \
+                                $(filter-out FORCE,$^) -o $@
+
+
+# Read all saved command lines and dependencies for the $(targets) we
+# may be building above, using $(if_changed{,_dep}). As an
+# optimization, we don't need to read them if the target does not
+# exist, we will rebuild anyway in that case.
+
+targets := $(wildcard $(sort $(targets)))
+cmd_files := $(wildcard $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
+
+ifneq ($(cmd_files),)
+  include $(cmd_files)
+endif
+
+# Shorthand for $(Q)$(MAKE) -f scripts/Kbuild.klibc obj
+# Usage:
+# $(Q)$(MAKE) $(klibc)=dir
+klibc := -rR -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Kbuild.klibc obj
+
diff --git a/usr/Kbuild b/usr/Kbuild
new file mode 100644
--- /dev/null
+++ b/usr/Kbuild
@@ -0,0 +1,87 @@
+#
+# kbuild file for usr/ - including initramfs image and klibc
+#
+
+# klibc definitions - to be moved to top-level Makefile later
+export KLIBSRC := $(srctree)/$(src)/klibc
+export KLIBINC := $(srctree)/$(src)/include
+
+obj-y        := initramfs_data.o
+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
+
+ifdef CONFIG_INITRAMFS_ROOT_GID
+gen_initramfs_args += -g $(CONFIG_INITRAMFS_ROOT_GID)
+endif
+
+# The $(shell echo $(CONFIG_INITRAMFS_SOURCE)) is to remove the
+# gratuitous begin and end quotes from the Kconfig string type.
+# Internal, escaped quotes in the Kconfig string will loose the
+# escape and become active quotes.
+quotefixed_initramfs_source := $(shell echo $(CONFIG_INITRAMFS_SOURCE))
+
+filechk_initramfs_list = $(CONFIG_SHELL) \
+  $(srctree)/scripts/gen_initramfs_list.sh $(gen_initramfs_args) \
+                                           $(quotefixed_initramfs_source)
+
+$(obj)/initramfs_list: $(src)/Kbuild FORCE
+	$(call filechk,initramfs_list)
+
+quiet_cmd_cpio = CPIO    $@
+      cmd_cpio = ./$< $(obj)/initramfs_list > $@
+
+
+# Check if the INITRAMFS_SOURCE is a cpio archive
+ifneq (,$(findstring .cpio,$(quotefixed_initramfs_source)))
+
+# INITRAMFS_SOURCE has a cpio archive - verify that it's a single file
+ifneq (1,$(words $(quotefixed_initramfs_source)))
+$(error Only a single file may be specified in CONFIG_INITRAMFS_SOURCE (="$(quotefixed_initramfs_source)") when a cpio archive is directly specified.)
+endif
+# Now use the cpio archive directly
+initramfs_data_cpio = $(quotefixed_initramfs_source)
+targets += $(quotefixed_initramfs_source)
+
+else
+
+# INITRAMFS_SOURCE is not a cpio archive - create one
+$(obj)/initramfs_data.cpio: $(obj)/gen_init_cpio \
+                            $(initramfs-y) $(obj)/initramfs_list FORCE
+	$(call if_changed,cpio)
+
+targets += initramfs_data.cpio
+initramfs_data_cpio = $(obj)/initramfs_data.cpio
+
+endif
+
+
+$(obj)/initramfs_data.cpio.gz: $(initramfs_data_cpio) FORCE
+	$(call if_changed,gzip)
+
+targets += initramfs_data.cpio.gz
+



More information about the klibc mailing list