[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