[klibc] move kbuild files to reflect dir structure in kernel

Sam Ravnborg sam at ravnborg.org
Fri Jul 29 02:29:15 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 scripts
mv kernel/Kbuild.* scripts/
mkdir usr
mv kernel/Kbuild usr
rmdir kernel

Furthermore:
- updated cp-to-kernel to refelct new directory layout
- teach cp-to-kernel to place gzip right under usr/
- Add '#' in front of comment in usr/Kbuild

---
I assume cogito will see this as proper renames.
The file move was triggered by my secret objective to introduce kbuild
in klibc.  But since it add clarity to the intent this patch should
be applied no matter what we decide on this matter.

	Sam

diffstat:

 b/cp-to-kernel.sh        |   12 -
 b/scripts/Kbuild.include |   52 ++++++++
 b/scripts/Kbuild.klibc   |  283 +++++++++++++++++++++++++++++++++++++++++++++++
 b/usr/Kbuild             |   87 ++++++++++++++
 kernel/Kbuild            |   87 --------------
 kernel/Kbuild.include    |   52 --------
 kernel/Kbuild.klibc      |  283 -----------------------------------------------
 7 files changed, 428 insertions(+), 428 deletions(-)
diff --git a/cp-to-kernel.sh b/cp-to-kernel.sh
--- a/cp-to-kernel.sh
+++ b/cp-to-kernel.sh
@@ -33,18 +33,18 @@ if [ -z $2 ]; then
 fi
 
 echo "Copying gzip"
-if [ ! -d $kernel/usr/bin/gzip ]; then
-	mkdir -p $kernel/usr/bin/gzip
+if [ ! -d $kernel/usr/gzip ]; then
+	mkdir -p $kernel/usr/gzip
 fi
-cp -R gzip/* $kernel/usr/bin/gzip
+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,52 +0,0 @@
-#
-# Generic kbuild routines
-#
-
-# The temporary file to save gcc -MD generated dependencies must not
-# contain a comma
-depfile = $(subst $(comma),_,$(@D)/.$(@F).d)
-
-
-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
-# 
-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)
-
-
diff --git a/kernel/Kbuild.klibc b/kernel/Kbuild.klibc
deleted file mode 100644
--- a/kernel/Kbuild.klibc
+++ /dev/null
@@ -1,283 +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)
-# ---------------------------------------------------------------------------
-KLIBSRC         := usr/klibc
-
-# 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$(srctree)/usr/include/arch/$(ARCH)                 \
-                   -I$(srctree)/usr/include/bits$(BITSIZE)               \
-                   -I$(srctree)/usr/include                              \
-                   -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        := $(objtree)/$(KLIBSRC)/arch/$(ARCH)/crt0.o
-USERLIBC        := $(objtree)/$(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,52 @@
+#
+# Generic kbuild routines
+#
+
+# The temporary file to save gcc -MD generated dependencies must not
+# contain a comma
+depfile = $(subst $(comma),_,$(@D)/.$(@F).d)
+
+
+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
+# 
+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)
+
+
diff --git a/scripts/Kbuild.klibc b/scripts/Kbuild.klibc
new file mode 100644
--- /dev/null
+++ b/scripts/Kbuild.klibc
@@ -0,0 +1,283 @@
+# ==========================================================================
+# 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)
+# ---------------------------------------------------------------------------
+KLIBSRC         := usr/klibc
+
+# 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$(srctree)/usr/include/arch/$(ARCH)                 \
+                   -I$(srctree)/usr/include/bits$(BITSIZE)               \
+                   -I$(srctree)/usr/include                              \
+                   -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        := $(objtree)/$(KLIBSRC)/arch/$(ARCH)/crt0.o
+USERLIBC        := $(objtree)/$(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