Merge with git+ssh://hera.kernel.org/pub/scm/libs/klibc/klibc.git
diff --git a/Kbuild b/Kbuild
new file mode 100644
index 0000000..0751877
--- /dev/null
+++ b/Kbuild
@@ -0,0 +1,17 @@
+#
+# Kbuild file for klibc
+#
+.PHONY: $(obj)/all
+always := all
+
+$(obj)/all:
+ $(Q)$(MAKE) $(klibc)=scripts/basic
+ $(Q)$(MAKE) $(klibc)=klibc
+ $(Q)$(MAKE) $(klibc)=usr/kinit
+ $(Q)$(MAKE) $(klibc)=dash
+ $(Q)$(MAKE) $(klibc)=utils
+ $(Q)$(MAKE) $(klibc)=gzip
+
+
+# Directories to visit during clean and install
+subdir- := scripts/basic klcc klibc dash utils gzip usr/kinit klibc/tests
diff --git a/MCONFIG b/MCONFIG
deleted file mode 100644
index 450e5c7..0000000
--- a/MCONFIG
+++ /dev/null
@@ -1,98 +0,0 @@
-# -*- makefile -*-
-#
-# Makefile configuration, without explicit rules
-#
-
-# CROSS is the prefix used for system tools like gcc, ld etc.
-CROSS =
-
-# KCROSS is the prefix we use for klibc installations. This is usually
-# the same as CROSS, but may be different, e.g. to install an i386
-# cross-compilation suite on an x86-64 system, using the same gcc/binutils.
-KCROSS ?= $(CROSS)
-
-# Location for installation
-prefix = /usr
-bindir = $(prefix)/bin
-libdir = $(prefix)/lib
-mandir = $(prefix)/man
-INSTALLDIR = $(prefix)/lib/klibc
-INSTALLROOT =
-
-INSTALL_EXEC = install -m 755
-INSTALL_DATA = install -m 644
-
-# Eventually support separate compilation, but we don't have it yet...
-OBJROOT = $(SRCROOT)
-
-# Kernel trees (source and obj) - can potentially be different
-KRNLSRC = $(SRCROOT)/linux
-KRNLOBJ = $(SRCROOT)/linux
-
-# klibc version information
-KLIBCVER = -D__KLIBC__=$(shell cut -d. -f1 < $(SRCROOT)/version) \
- -D__KLIBC_MINOR__=$(shell cut -d. -f2 < $(SRCROOT)/version)
-
-ARCH = $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/ -e s/parisc.*/parisc/)
-CC = $(CROSS)gcc
-LD = $(CROSS)ld
-KLIBSRC = $(SRCROOT)/klibc
-KLIBOBJ = $(OBJROOT)/klibc
-INCLUDE = -I$(SRCROOT)/include/arch/$(ARCH) \
- -I$(SRCROOT)/include/bits$(BITSIZE) \
- -I$(SRCROOT)/include \
- -I$(KRNLOBJ)/include -I$(KRNLOBJ)/include2 -I$(KRNLSRC)/include
-REQFLAGS = $(ARCHREQFLAGS) $(KLIBCVER) -nostdlib -nostdinc -iwithprefix include \
- $(INCLUDE)
-LDFLAGS =
-AR = $(CROSS)ar
-RANLIB = $(CROSS)ranlib
-NM = $(CROSS)nm
-PERL = perl
-OBJCOPY = $(CROSS)objcopy
-
-STRIP = $(CROSS)strip
-STRIPFLAGS = --strip-all -R .comment -R .note
-STRIPCMD = $(STRIP) $(STRIPFLAGS)
-
-HOST_CC = gcc
-HOST_CFLAGS = -g -O
-HOST_LDFLAGS =
-HOST_LIBS =
-
-# Static library paths
-CRT0 = $(KLIBOBJ)/crt0.o
-KLIBC = $(KLIBOBJ)/libc.a
-LIBGCC = $(shell $(CC) $(REQFLAGS) $(OPTFLAGS) --print-libgcc)
-
-# Shared library paths
-CRTSHARED = $(KLIBOBJ)/interp.o
-LIBSHARED = $(KLIBOBJ)/libc.so
-
-#
-# 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
-
-# Enable this to make perror/strerror return real error messages
-# This makes klibc.so and any static binary which uses these functions
-# about 4K bigger.
-ERRLIST = 1
-
-# Include zlib in klibc. This roughly triples the size of klibc!
-ZLIB = 0
-
-#
-# Include arch-specific rule fragments
-#
-include $(KLIBSRC)/arch/$(ARCH)/MCONFIG
-
-ifeq ($(DEBUG),y)
-STRIP = /bin/true -Since_we_are_debugging
-OPTFLAGS += -O1 -g
-endif
-
-# How to tell the linker main() is the entrypoint
-EMAIN ?= -e main
diff --git a/MRULES b/MRULES
deleted file mode 100644
index 41fdd07..0000000
--- a/MRULES
+++ /dev/null
@@ -1,45 +0,0 @@
-# -*- makefile -*-
-#
-# Standard pattern rules
-#
-
-.SUFFIXES: .c .o .a .so .lo .i .S .s .ls .ss .lss
-
-% : %.c # Cancel default rule
-
-% : %.S
-
-.c.o:
- $(CC) $(CFLAGS) -c -o $@ $<
-
-.c.i:
- $(CC) $(CFLAGS) -E -o $@ $<
-
-.c.s:
- $(CC) $(CFLAGS) -S -o $@ $<
-
-.S.o:
- $(CC) $(CFLAGS) -D__ASSEMBLY__ -c -o $@ $<
-
-.S.s:
- $(CC) $(CFLAGS) -D__ASSEMBLY__ -E -o $@ $<
-
-.S.lo:
- $(CC) $(CFLAGS) $(SOFLAGS) -D__ASSEMBLY__ -c -o $@ $<
-
-.S.ls:
- $(CC) $(CFLAGS) $(SOFLAGS) -D__ASSEMBLY__ -E -o $@ $<
-
-.s.o:
- $(CC) $(CFLAGS) -x assembler -c -o $@ $<
-
-.ls.lo:
- $(CC) $(CFLAGS) $(SOFLAGS) -x assembler -c -o $@ $<
-
-.c.lo:
- $(CC) $(CFLAGS) $(SOFLAGS) -c -o $@ $<
-
-.c.ls:
- $(CC) $(CFLAGS) $(SOFLAGS) -S -o $@ $<
-
-
diff --git a/Makefile b/Makefile
index c260039..8c500e3 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,74 @@
VERSION := $(shell cat version)
-SUBDIRS = klibc dash ipconfig nfsmount utils kinit gzip
SRCROOT = .
-all:
+# kbuild compatibility
+export srctree := $(shell pwd)
+export objtree := $(shell pwd)
+export KLIBCSRC := klibc
+export KLIBCINC := include
+export KLIBCOBJ := klibc
+export KLIBCKERNELSRC := linux/
+
+export CC := gcc
+NOSTDINC_FLAGS := -nostdlib -nostdinc -isystem $(shell $(CC) -print-file-name=include)
+
+export ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
+
+export HOSTCC := gcc
+export HOSTCFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
+export PERL := perl
+
+# Location for installation
+export prefix = /usr
+export bindir = $(prefix)/bin
+export libdir = $(prefix)/lib
+export mandir = $(prefix)/man
+export INSTALLDIR = $(prefix)/lib/klibc
+export INSTALLROOT =
+
+# Create a fake .config as present in the kernel tree
+# But if it exists leave it alone
+$(if $(wildcard $(objtree)/.config),,$(shell echo CONFIG_KLIBC=y > .config))
+
+# Prefix Make commands with $(Q) to silence them
+# Use quiet_cmd_xxx, cmd_xxx to create nice output
+# use make V=1 to get verbose output
+
+ifdef V
+ ifeq ("$(origin V)", "command line")
+ KBUILD_VERBOSE = $(V)
+ endif
+endif
+ifndef KBUILD_VERBOSE
+ KBUILD_VERBOSE = 0
+endif
+
+ifeq ($(KBUILD_VERBOSE),1)
+ quiet =
+ Q =
+else
+ quiet=quiet_
+ Q = @
+endif
+
+# If the user is running make -s (silent mode), suppress echoing of
+# commands
+
+ifneq ($(findstring s,$(MAKEFLAGS)),)
+ quiet=silent_
+endif
+
+export quiet Q KBUILD_VERBOSE
+
+# Do not print "Entering directory ..."
+MAKEFLAGS += --no-print-directory
+
+# Shorthand to call Kbuild.klibc
+klibc := -f $(srctree)/scripts/Kbuild.klibc obj
+
+# Very first target
+.PHONY: all klcc klibc
+all: klcc klibc
rpmbuild = $(shell which rpmbuild 2>/dev/null || which rpm)
@@ -13,65 +79,23 @@
rpm: klibc.spec
+$(rpmbuild) -bb klibc.spec --target=$(ARCH)
-$(CROSS)klibc.config: Makefile
- rm -f $@
- echo 'ARCH=$(ARCH)' >> $@
- echo 'CROSS=$(CROSS)' >> $@
- echo 'KCROSS=$(KCROSS)' >> $@
- echo 'CC=$(CC)' >> $@
- echo 'LD=$(LD)' >> $@
- echo 'REQFLAGS=$(filter-out -I%,$(REQFLAGS))' >> $@
- echo 'OPTFLAGS=$(OPTFLAGS)' >> $@
- echo 'LDFLAGS=$(LDFLAGS)' >> $@
- echo 'STRIP=$(STRIP)' >> $@
- echo 'STRIPFLAGS=$(STRIPFLAGS)' >> $@
- echo 'EMAIN=$(EMAIN)' >> $@
- echo 'BITSIZE=$(BITSIZE)' >> $@
- echo 'prefix=$(INSTALLDIR)' >> $@
- echo 'bindir=$(INSTALLDIR)/$(KCROSS)bin' >> $@
- echo 'libdir=$(INSTALLDIR)/$(KCROSS)lib' >> $@
- echo 'includedir=$(INSTALLDIR)/$(KCROSS)include' >> $@
+# Build klcc - it is the first target
+klcc:
+ $(Q)$(MAKE) $(klibc)=klcc
-$(CROSS)klcc: klcc.in $(CROSS)klibc.config makeklcc.pl
- $(PERL) makeklcc.pl klcc.in $(CROSS)klibc.config \
- $(shell bash -c 'type -p $(PERL)') > $@ || ( rm -f $@ ; exit 1 )
- chmod a+x $@
+klibc:
+ $(Q)$(MAKE) $(klibc)=.
-%: local-%
- @set -e; for d in $(SUBDIRS); do $(MAKE) -C $$d $@; done
+test: klibc
+ $(Q)$(MAKE) $(klibc)=klibc/tests
-local-all: $(CROSS)klcc
+clean:
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.clean obj=.
-local-clean:
- rm -f klibc.config klcc
-
-local-spotless: local-clean
- rm -f klibc.spec *~ tags
-
-local-install: $(CROSS)klcc
- mkdir -p $(INSTALLROOT)$(bindir)
- mkdir -p $(INSTALLROOT)$(mandir)/man1
- mkdir -p $(INSTALLROOT)$(SHLIBDIR)
- mkdir -p $(INSTALLROOT)$(INSTALLDIR)
- -rm -rf $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)include
- mkdir -p $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)include
- mkdir -p $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)lib
- mkdir -p $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)bin
- set -xe ; for d in linux scsi asm-$(ARCH) asm-generic $(ASMARCH); do \
- mkdir -p $(INSTALLROOT)$(INSTALLDIR)/$(CROSS)include/$$d ; \
- for r in $(KRNLSRC)/include $(KRNLOBJ)/include $(KRNLOBJ)/include2 ; do \
- [ ! -d $$r/$$d ] || \
- cp -rfL $$r/$$d/. $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)include/$$d/. ; \
- done ; \
- done
- cd $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)include && ln -sf asm-$(ARCH) asm
- cp -rf include/. $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)include/.
- $(INSTALL_DATA) klcc.1 $(INSTALLROOT)$(mandir)/man1/$(KCROSS)klcc.1
- $(INSTALL_EXEC) $(KCROSS)klcc $(INSTALLROOT)$(bindir)
+install: all
+ $(Q)$(MAKE) -f $(srctree)/scripts/Kbuild.install obj=.
# This does all the prep work needed to turn a freshly exported git repository
# into a release tarball tree
release: klibc.spec
rm -f maketar.sh
-
--include MCONFIG
diff --git a/ash/Kbuild b/ash/Kbuild
new file mode 100644
index 0000000..1186369
--- /dev/null
+++ b/ash/Kbuild
@@ -0,0 +1,123 @@
+#
+# Kbuild file for Ash
+#
+
+
+static-y := sh
+
+sh-y := init.o
+sh-y += arith.o arith_lex.o
+sh-y += builtins.o cd.o echo.o error.o eval.o exec.o expand.o
+sh-y += input.o jobs.o main.o memalloc.o miscbltin.o
+sh-y += mystring.o nodes.o options.o parser.o redir.o
+sh-y += show.o syntax.o trap.o output.o var.o test.o
+
+cflags-y := -DSHELL
+
+cflags-$(CONFIG_KLIBC_SH_HISTORY) += -DKLIBC_SH_HISTORY
+ sh-$(CONFIG_KLIBC_SH_HISTORY) += histedit.o
+
+cflags-$(CONFIG_KLIBC_SH_PRINTF) += -DKLIBC_SH_PRINTF
+ sh-$(CONFIG_KLIBC_SH_PRINTF) += printf.o
+
+cflags-$(CONFIG_KLIBC_SH_ALIAS) += -DKLIBC_SH_ALIAS
+ sh-$(CONFIG_KLIBC_SH_ALIAS) += alias.o
+
+cflags-$(CONFIG_KLIBC_SH_MAIL) += -DKLIBC_SH_MAIL
+ sh-$(CONFIG_KLIBC_SH_MAIL) += mail.o
+
+cflags-y += -DJOBS=$(if $(CONFIG_KLIBC_SH_JOBS),1,0)
+ sh-$(CONFIG_KLIBC_SH_JOBS) += kill.o
+
+# locate .h files from generated .c files (make O=)
+cflags-y += -I$(srctree)/$(src)
+# locate generated .h files from normal .c files
+cflags-y += -I$(objtree)/$(obj)
+
+EXTRA_KLIBCCFLAGS := $(cflags-y)
+
+# The shared binary
+shared-y := sh.shared
+sh.shared-y := $(sh-y)
+
+# For cleaning
+targets := $(static-y) $(shared-y)
+
+# bison produces substantially smaller output than byacc
+YACC = bison -y
+LEX = lex
+
+# Generate token.h
+targets += token.h
+$(obj)/parser.o: $(obj)/token.h
+
+quiet_cmd_mktokens = GEN $@
+ cmd_mktokens = sh $< $(obj)
+$(obj)/token.h: $(src)/mktokens
+ $(call cmd,mktokens)
+
+# Generate builtins{.c + .h}
+targets += builtins.c builtins.h
+quiet_cmd_mkbuiltins = GEN $@
+ cmd_mkbuiltins = sh $< $(srctree)/$(src)/shell.h \
+ $(srctree)/$(src)/builtins.def $(obj) "$(cflags)"
+$(obj)/builtins.h $(obj)/builtins.c: $(src)/mkbuiltins $(src)/shell.h \
+ $(src)/builtins.def
+ $(call cmd,mkbuiltins)
+
+# Generate init.c
+targets += init.c
+quiet_cmd_mkinit = GEN $@
+ cmd_mkinit = sh $< $(obj) $(filter-out $<, $^) && touch $@
+
+# list all .c files excluding itself
+all-src := $(addprefix $(src)/, $(filter-out init.c, $(sh-y:.o=.c)))
+$(obj)/init.c: $(src)/mkinit.sh $(all-src)
+ $(call cmd,mkinit)
+
+# Generate nodes{.c + .h}
+targets += nodes.c nodes.h
+quiet_cmd_mknodes = GEN $@
+ cmd_mknodes = sh $< $(srctree)/$(src)/nodetypes \
+ $(srctree)/$(src)/nodes.c.pat $(obj)
+
+$(obj)/nodes.c: $(obj)/nodes.h
+$(obj)/nodes.h: $(src)/mknodes.sh
+ $(call cmd,mknodes)
+
+
+# Link built in to .c files - yrk
+targets += echo.c test.c kill.c printf.c
+
+quiet_cmd_cpbltin = CP $@
+ cmd_cpbltin = cat $< > $@
+
+$(obj)/echo.c: $(src)/bltin/echo.c
+ $(call cmd,cpbltin)
+
+$(obj)/test.c: $(src)/bltin/test.c
+ $(call cmd,cpbltin)
+
+$(obj)/kill.c: $(src)/bltin/kill.c
+ $(call cmd,cpbltin)
+
+$(obj)/printf.c: $(src)/bltin/printf.c
+ $(call cmd,cpbltin)
+
+# Generate parser
+targets += arith.c arith_lex.c arith.h
+$(obj)/arith.c: $(src)/arith.y
+ $(YACC) $< -o $@
+
+$(obj)/arith_lex.o: $(obj)/arith_lex.c $(obj)/arith.h
+$(obj)/arith_yylex.o: $(obj)/arith_yylex.c $(obj)/arith.h
+
+$(obj)/arith_lex.c: $(src)/arith_lex.l
+ $(LEX) -o$@ $<
+
+$(obj)/arith.h: $(src)/arith.c
+ $(PERL) -ne 'print if ( /^\#\s*define\s+ARITH/ );' < $< > $@
+
+
+# Targets to install
+install-y := sh.shared
diff --git a/ash/mkinit.sh b/ash/mkinit.sh
new file mode 100644
index 0000000..623f669
--- /dev/null
+++ b/ash/mkinit.sh
@@ -0,0 +1,197 @@
+#! /bin/sh
+# $NetBSD: mkinit.sh,v 1.1 2004/01/17 11:47:31 dsl Exp $
+
+# Copyright (c) 2003 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by David Laight.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. Neither the name of The NetBSD Foundation nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+objdir=$1
+shift
+srcs="$*"
+
+nl='
+'
+
+includes=' "shell.h" "mystring.h" "init.h" '
+defines=
+decles=
+event_init=
+event_reset=
+event_shellproc=
+
+for src in $srcs; do
+ exec <$src
+ decnl="$nl"
+ while IFS=; read -r line; do
+ [ "$line" = x ]
+ case "$line " in
+ INIT["{ "]* ) event=init;;
+ RESET["{ "]* ) event=reset;;
+ SHELLPROC["{ "]* ) event=shellproc;;
+ INCLUDE[\ \ ]* )
+ IFS=' '
+ set -- $line
+ # ignore duplicates
+ [ "${includes}" != "${includes%* $2 }" ] && continue
+ includes="$includes$2 "
+ continue
+ ;;
+ MKINIT\ )
+ # struct declaration
+ decles="$decles$nl"
+ while
+ read -r line
+ decles="${decles}${line}${nl}"
+ [ "$line" != "};" ]
+ do
+ :
+ done
+ decnl="$nl"
+ continue
+ ;;
+ MKINIT["{ "]* )
+ # strip initialiser
+ def=${line#MKINIT}
+ comment="${def#*;}"
+ def="${def%;$comment}"
+ def="${def%%=*}"
+ def="${def% }"
+ decles="${decles}${decnl}extern${def};${comment}${nl}"
+ decnl=
+ continue
+ ;;
+ \#define[\ \ ]* )
+ IFS=' '
+ set -- $line
+ # Ignore those with arguments
+ [ "$2" = "${2##*(}" ] || continue
+ # and multiline definitions
+ [ "$line" = "${line%\\}" ] || continue
+ defines="${defines}#undef $2${nl}${line}${nl}"
+ continue
+ ;;
+ * ) continue;;
+ esac
+ # code for events
+ ev="${nl} /* from $src: */${nl} {${nl}"
+ while
+ read -r line
+ [ "$line" != "}" ]
+ do
+ # The C program indented by an extra 6 chars using
+ # tabs then spaces. I need to compare the output :-(
+ indent=6
+ while
+ l=${line# }
+ [ "$l" != "$line" ]
+ do
+ indent=$(($indent + 8))
+ line="$l"
+ done
+ while
+ l=${line# }
+ [ "$l" != "$line" ]
+ do
+ indent=$(($indent + 1))
+ line="$l"
+ done
+ [ -z "$line" -o "$line" != "${line###}" ] && indent=0
+ while
+ [ $indent -ge 8 ]
+ do
+ ev="$ev "
+ indent="$(($indent - 8))"
+ done
+ while
+ [ $indent -gt 0 ]
+ do
+ ev="$ev "
+ indent="$(($indent - 1))"
+ done
+ ev="${ev}${line}${nl}"
+ done
+ ev="${ev} }${nl}"
+ eval event_$event=\"\$event_$event\$ev\"
+ done
+done
+
+exec >${objdir}/init.c.tmp
+
+echo "/*"
+echo " * This file was generated by the mkinit program."
+echo " */"
+echo
+
+IFS=' '
+for f in $includes; do
+ echo "#include $f"
+done
+
+echo
+echo
+echo
+echo "$defines"
+echo
+echo "$decles"
+echo
+echo
+echo "/*"
+echo " * Initialization code."
+echo " */"
+echo
+echo "void"
+echo "init() {"
+echo "${event_init%$nl}"
+echo "}"
+echo
+echo
+echo
+echo "/*"
+echo " * This routine is called when an error or an interrupt occurs in an"
+echo " * interactive shell and control is returned to the main command loop."
+echo " */"
+echo
+echo "void"
+echo "reset() {"
+echo "${event_reset%$nl}"
+echo "}"
+echo
+echo
+echo
+echo "/*"
+echo " * This routine is called to initialize the shell to run a shell procedure."
+echo " */"
+echo
+echo "void"
+echo "initshellproc() {"
+echo "${event_shellproc%$nl}"
+echo "}"
+
+exec >&-
+mv ${objdir}/init.c.tmp ${objdir}/init.c
diff --git a/ash/mktokens b/ash/mktokens
new file mode 100644
index 0000000..24d568e
--- /dev/null
+++ b/ash/mktokens
@@ -0,0 +1,94 @@
+#!/bin/sh -
+# $NetBSD: mktokens,v 1.10 2003/08/22 11:22:23 agc Exp $
+#
+# Copyright (c) 1991, 1993
+# The Regents of the University of California. All rights reserved.
+#
+# This code is derived from software contributed to Berkeley by
+# Kenneth Almquist.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. Neither the name of the University nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# @(#)mktokens 8.1 (Berkeley) 5/31/93
+
+# The following is a list of tokens. The second column is nonzero if the
+# token marks the end of a list. The third column is the name to print in
+# error messages.
+
+objdir=$1
+
+cat > /tmp/ka$$ <<\!
+TEOF 1 end of file
+TNL 0 newline
+TSEMI 0 ";"
+TBACKGND 0 "&"
+TAND 0 "&&"
+TOR 0 "||"
+TPIPE 0 "|"
+TLP 0 "("
+TRP 1 ")"
+TENDCASE 1 ";;"
+TENDBQUOTE 1 "`"
+TREDIR 0 redirection
+TWORD 0 word
+TIF 0 "if"
+TTHEN 1 "then"
+TELSE 1 "else"
+TELIF 1 "elif"
+TFI 1 "fi"
+TWHILE 0 "while"
+TUNTIL 0 "until"
+TFOR 0 "for"
+TDO 1 "do"
+TDONE 1 "done"
+TBEGIN 0 "{"
+TEND 1 "}"
+TCASE 0 "case"
+TESAC 1 "esac"
+TNOT 0 "!"
+!
+nl=`wc -l /tmp/ka$$`
+exec > ${objdir}/token.h
+awk '{print "#define " $1 " " NR-1}' /tmp/ka$$
+echo '
+/* Array indicating which tokens mark the end of a list */
+const char tokendlist[] = {'
+awk '{print "\t" $2 ","}' /tmp/ka$$
+echo '};
+
+const char *const tokname[] = {'
+sed -e 's/"/\\"/g' \
+ -e 's/[^ ]*[ ][ ]*[^ ]*[ ][ ]*\(.*\)/ "\1",/' \
+ /tmp/ka$$
+echo '};
+'
+sed 's/"//g' /tmp/ka$$ | awk '
+/TIF/{print "#define KWDOFFSET " NR-1; print "";
+ print "const char *const parsekwd[] = {"}
+/TIF/,/neverfound/{print " \"" $3 "\","}'
+echo ' 0
+};'
+
+rm /tmp/ka$$
diff --git a/cp-to-kernel.sh b/cp-to-kernel.sh
index bc9f915..37eba2b 100644
--- a/cp-to-kernel.sh
+++ b/cp-to-kernel.sh
@@ -12,7 +12,7 @@
kernel=$1
if [ ! -d $kernel ]; then
- echo "$kernel is not a kernel directory"
+ echo "$kernel is not a directory"
exit 1
fi
@@ -32,9 +32,38 @@
cp -R include/* $kernel/usr/include
fi
+echo "Copying gzip"
+if [ ! -d $kernel/usr/gzip ]; then
+ mkdir -p $kernel/usr/gzip
+fi
+cp -R gzip/* $kernel/usr/gzip
+
+echo "Copying kinit ipconfig and nfsmount"
+if [ ! -d $kernel/usr/kinit ]; then
+ mkdir -p $kernel/usr/kinit
+fi
+cp -R usr/kinit/* $kernel/usr/kinit
+
+
+echo "Copying dash"
+if [ ! -d $kernel/usr/dash ]; then
+ mkdir -p $kernel/usr/dash
+fi
+cp -R dash/* $kernel/usr/dash
+
+echo "Copying utils"
+if [ ! -d $kernel/usr/utils ]; then
+ mkdir -p $kernel/usr/utils
+fi
+cp -R utils/* $kernel/usr/utils
+
echo "Copying kbuild files"
-cp kernel/Kbuild.* $kernel/scripts
-cp kernel/Kbuild $kernel/usr
+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 scripts/Kbuild.include $kernel/scripts
+fi
+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/dash/Kbuild b/dash/Kbuild
new file mode 100644
index 0000000..25c6318
--- /dev/null
+++ b/dash/Kbuild
@@ -0,0 +1,118 @@
+#
+# Kbuild file for dash
+#
+
+YACC = bison -y
+
+COMMON_CFLAGS :=
+COMMON_CPPFLAGS := \
+ -DBSD=1 -DSMALL -DSHELL \
+ -DGLOB_BROKEN -DFNMATCH_BROKEN -DIFS_BROKEN \
+ -DJOBS=0
+
+CFLAGS := $(COMMON_CFLAGS)
+CPPFLAGS := $(COMMON_CPPFLAGS)
+CFLAGS_FOR_BUILD := $(COMMON_CFLAGS)
+CPPFLAGS_FOR_BUILD := $(COMMON_CPPFLAGS)
+YFLAGS = -d
+
+DEFS := -DHAVE_CONFIG_H
+DEFAULT_INCLUDES := -I$(srctree)/$(src) -include $(srctree)/$(src)/config.h
+
+EXTRA_KLIBCCFLAGS := $(DEFS) $(DEFAULT_INCLUDES) $(CPPFLAGS) $(CFLAGS)
+HOST_EXTRACFLAGS := $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD)
+YACCCOMPILE = $(YACC) $(YFLAGS)
+
+SRCS := alias.c arith_yylex.c cd.c error.c eval.c exec.c expand.c \
+ histedit.c input.c jobs.c mail.c main.c memalloc.c miscbltin.c \
+ mystring.c options.c parser.c redir.c show.c trap.c output.c \
+ bltin/printf.c system.c bltin/test.c bltin/times.c var.c
+
+OBJ1 := builtins.o init.o nodes.o signames.o syntax.o
+OBJ2 := alias.o arith.o arith_yylex.o cd.o \
+ error.o eval.o exec.o expand.o \
+ histedit.o input.o jobs.o \
+ mail.o main.o memalloc.o \
+ miscbltin.o mystring.o options.o \
+ parser.o redir.o show.o trap.o \
+ output.o bltin/printf.o system.o \
+ bltin/test.o bltin/times.o var.o
+
+OBJS := $(OBJ1) $(OBJ2)
+
+HELPERS = mkinit mksyntax mknodes mksignames
+BUILT_SOURCES = arith.h builtins.h nodes.h syntax.h token.h
+CLEANFILES = \
+ $(BUILT_SOURCES) $(patsubst %.o,%.c,$(OBJ1)) \
+ arith.c $(HELPERS) builtins.def
+
+static-y := sh
+
+sh-y := $(OBJS)
+
+# The shared binary
+shared-y := sh.shared
+sh.shared-y := $(sh-y)
+
+hostprogs-y := $(HELPERS)
+
+# For cleaning
+targets := $(static-y) $(shared-y) $(CLEANFILES)
+
+# Generate token.h
+$(obj)/parser.o: $(obj)/token.h
+
+quiet_cmd_mktokens = GEN $@
+ cmd_mktokens = cd $(obj); sh $(srctree)/$<
+$(obj)/token.h: $(src)/mktokens
+ $(call cmd,mktokens)
+
+# Generate builtins.def
+targets += builtins.def
+quiet_cmd_mkbuiltins_def = GEN $@
+ cmd_mkbuiltins_def = $(HOSTCC) $(hostc_flags) -x c -E -o $@ $<
+$(obj)/builtins.def: $(src)/builtins.def.in $(src)/config.h
+ $(call cmd,mkbuiltins_def)
+
+# Generate builtins{.c + .h}
+quiet_cmd_mkbuiltins = GEN $@
+ cmd_mkbuiltins = cd $(obj); sh $(srctree)/$(src)/mkbuiltins builtins.def
+$(obj)/builtins.h $(obj)/builtins.c: $(src)/mkbuiltins $(obj)/builtins.def
+ $(call cmd,mkbuiltins)
+
+# Generate init.c
+quiet_cmd_mkinit = GEN $@
+ cmd_mkinit = cd $(obj); ./mkinit $(addprefix $(srctree)/$(src)/, $(SRCS))
+$(obj)/init.c: $(obj)/mkinit $(addprefix $(src)/, $(SRCS))
+ $(call cmd,mkinit)
+
+# Generate nodes{.c + .h}
+quiet_cmd_mknodes = GEN $@
+ cmd_mknodes = cd $(obj); ./mknodes $(srctree)/$(src)/nodetypes \
+ $(srctree)/$(src)/nodes.c.pat
+$(obj)/nodes.c $(obj)/nodes.h: $(obj)/mknodes $(src)/nodetypes \
+ $(src)/nodes.c.pat
+ $(call cmd,mknodes)
+
+quiet_cmd_mksyntax = GEN $@
+ cmd_mksyntax = cd $(obj); ./mksyntax
+$(obj)/syntax.c $(obj)/syntax.h: $(obj)/mksyntax
+ $(call cmd,mksyntax)
+
+quiet_cmd_mksignames = GEN $@
+ cmd_mksignames = cd $(obj); ./mksignames
+$(obj)/signames.c: $(obj)/mksignames
+ $(call cmd,mksignames)
+
+
+$(obj)/arith_yylex.o: $(obj)/arith.h
+
+$(obj)/arith.h $(obj)/arith.c: $(src)/arith.y
+ cd $(obj); \
+ $(YACCCOMPILE) $(srctree)/$<; \
+ mv y.tab.c arith.c; \
+ mv y.tab.h arith.h
+
+
+# Targets to install
+install-y := sh.shared
diff --git a/gzip/Kbuild b/gzip/Kbuild
new file mode 100644
index 0000000..c92eeea
--- /dev/null
+++ b/gzip/Kbuild
@@ -0,0 +1,29 @@
+#
+# Kbuild file for gzip
+#
+
+# The gzip executable
+static-y := gzip
+gzip-y := gzip.o util.o unzip.o inflate.o
+
+# Additional targets
+always := gunzip zcat gzip.stripped
+
+# Optional ZIP support
+gzip-$(CONFIG_KLIB_ZIP) += zip.o deflate.o trees.o bits.o
+cflags-$(CONFIG_KLIB_ZIP) += -DSUPPORT_ZIP
+EXTRA_KLIBCCFLAGS := $(cflags-y)
+
+# Additionally linked targets
+$(obj)/gunzip $(obj)/zcat: $(obj)/gzip
+ $(call cmd,ln)
+
+# A stripped version of gzip
+$(obj)/gzip.stripped: $(obj)/gzip
+ $(call cmd,strip)
+
+# Cleaning
+targets := $(static-y) $(shared-y)
+
+# Targets to install
+install-y := gzip gunzip zcat
diff --git a/gzip/MCONFIG b/gzip/MCONFIG
deleted file mode 100644
index 66ba9bb..0000000
--- a/gzip/MCONFIG
+++ /dev/null
@@ -1,14 +0,0 @@
-# Things you might add to DEFS (configure usually figures out what to do):
-# -DGNU_STANDARD Behave as gzip even if invoked as gunzip (GNU standard)
-# -DPROTO Force function prototypes even if __STDC__ not defined
-# -DDEBUG Debug code
-# -DDYN_ALLOC Use dynamic allocation of large data structures
-# -DRECORD_IO read() and write() are rounded to record sizes.
-# -DNO_SIZE_CHECK stat() does not give a reliable file size
-
-DEFS =
-
-WARNFLAGS = -W -Wall -Wsign-compare
-
-# Set this to y if you want to enable compression support
-ZIP = n
diff --git a/gzip/Makefile b/gzip/Makefile
deleted file mode 100644
index d5f9f94..0000000
--- a/gzip/Makefile
+++ /dev/null
@@ -1,79 +0,0 @@
-# Generated automatically from Makefile.in by configure.
-# Makefile for gzip (GNU zip) -*- Indented-Text -*-
-# Copyright (C) 1992-1993 Jean-loup Gailly and the Free Software Foundation
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-# $Id: Makefile,v 1.6 2005/03/01 22:36:46 hpa Exp $
-
-#### Start of system configuration section. ####
-
-SRCROOT = ..
-include ../MCONFIG
-include MCONFIG
-include ../MRULES
-
-#### End of system configuration section. ####
-
-MAKEDEPS = -Wp,-MD,.$(subst /,-,$*).d
-CFLAGS = $(MAKEDEPS) $(DEFS) $(OPTFLAGS) $(REQFLAGS) $(WARNFLAGS)
-
-ZIPSRCS = zip.c deflate.c trees.c bits.c
-UNZIPSRCS = unzip.c inflate.c
-
-SRCS = gzip.c util.c $(UNZIPSRCS)
-OBJS = $(SRCS:.c=.o)
-HDRS = gzip.h tailor.h revision.h
-LIBS = $(KLIBC) $(LIBGCC)
-
-ifeq ($(ZIP),y)
-DEFS += -DSUPPORT_ZIP
-SRCS += $(ZIPSRCS)
-endif
-
-all: gzip gunzip zcat gzip.stripped
-
-# Actual build-related targets
-
-gzip: Makefile $(OBJS) $(CRT0) $(LIBS)
- $(LD) $(LDFLAGS) -o $@ $(CRT0) $(OBJS) $(LIBS)
-
-$(CRT0) $(LIBS):
- @echo '*** error: $@ not up to date' || exit 1
-
-gunzip: gzip
- rm -f $@
- ln $< $@
-
-zcat: gzip
- rm -f $@
- ln $< $@
-
-gzip.stripped: gzip
- $(STRIP) $< -o $@
-
-clean:
- $(RM) -f core *.o gzip gunzip zcat gzip.stripped .*.d
-
-spotless: clean
- rm -f *~
-
-# These should presumably be shared...
-install: all
- $(INSTALL_EXEC) gzip gunzip zcat $(INSTALLROOT)$(INSTALLDIR)/$(CROSS)bin
-
-ifneq ($(wildcard .*.d),)
-include $(wildcard .*.d)
-endif
diff --git a/include/bits32/bitsize/stddef.h b/include/bits32/bitsize/stddef.h
index c486041..3cf41ad 100644
--- a/include/bits32/bitsize/stddef.h
+++ b/include/bits32/bitsize/stddef.h
@@ -6,7 +6,7 @@
#define _BITSIZE_STDDEF_H
#define _SIZE_T
-#if defined(__s390__) || defined(__hppa__) || defined(__cris__)
+#if defined(__s390__) || defined(__cris__)
typedef unsigned long size_t;
#else
typedef unsigned int size_t;
diff --git a/ipconfig/MCONFIG b/ipconfig/MCONFIG
deleted file mode 100644
index 472f092..0000000
--- a/ipconfig/MCONFIG
+++ /dev/null
@@ -1,8 +0,0 @@
-# -*- makefile -*-
-
-SRCROOT = ..
-
-include $(SRCROOT)/MCONFIG
-include $(SRCROOT)/MRULES
-
-CFLAGS = -Wp,-MD,$(dir $@).$(notdir $@).d $(OPTFLAGS) $(REQFLAGS) -Wstrict-prototypes -Wall -I.
diff --git a/ipconfig/Makefile b/ipconfig/Makefile
deleted file mode 100644
index c186452..0000000
--- a/ipconfig/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-include MCONFIG
-
-COMMON_OBJS = main.o netdev.o packet.o
-DHCP_OBJS = dhcp_proto.o
-BOOTP_OBJS = bootp_proto.o
-PROGS = ipconfig
-STATICPROGS := $(patsubst %,static/%,$(PROGS))
-SHAREDPROGS := $(patsubst %,shared/%,$(PROGS))
-LIB = libipconfig.a
-LIBS = $(KLIBC) $(LIBGCC)
-
-OBJS := $(COMMON_OBJS) $(BOOTP_OBJS) $(DHCP_OBJS)
-
-all: $(STATICPROGS) $(SHAREDPROGS) $(LIB)
-
-static/ipconfig: $(OBJS) $(CRT0) $(LIBS)
- mkdir -p static static.g
- $(LD) $(LDFLAGS) -o $@ $(CRT0) $(OBJS) $(LIBS)
- cp -f $@ static.g
- $(STRIPCMD) $@
-
-shared/ipconfig: $(OBJS) $(CRTSHARED) $(LIBSHARED) $(LIBGCC)
- mkdir -p shared shared.g
- $(LD) $(LDFLAGS) -o $@ $(EMAIN) $(CRTSHARED) $(OBJS) \
- -R $(LIBSHARED) $(LIBGCC)
- cp -f $@ shared.g
- $(STRIPCMD) $@
-
-$(LIB): $(OBJS)
- $(AR) cru $(LIB) $(OBJS)
-
-clean:
- $(RM) *.o $(PROG) $(LIB) core
- $(RM) -r static static.g shared shared.g
-
-spotless: clean
- $(RM) *~ .*.d
-
-install: all
- $(INSTALL_EXEC) shared/* $(INSTALLROOT)$(INSTALLDIR)/$(CROSS)bin
-
-ifneq ($(wildcard .*.d),)
-include $(wildcard .*.d)
-endif
diff --git a/kernel/Kbuild.include b/kernel/Kbuild.include
deleted file mode 100644
index e917947..0000000
--- 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
index 39b8d32..0000000
--- a/kernel/Kbuild.klibc
+++ /dev/null
@@ -1,281 +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 := -Wall -Wpointer-arith -Wwrite-strings \
- -Wstrict-prototypes -Winline
-
-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__ -DBITSIZE=$(BITSIZE)
-USERCFLAGS := $(USERCPPFLAGS) $(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) ;
-
-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)
-
-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/kinit/Makefile b/kinit/Makefile
deleted file mode 100644
index 6ac41ea..0000000
--- a/kinit/Makefile
+++ /dev/null
@@ -1,38 +0,0 @@
-SRCROOT = ..
-include $(SRCROOT)/MCONFIG
-include $(SRCROOT)/MRULES
-
-MAKEDEPS = -Wp,-MD,.$(subst /,-,$*).d
-CFLAGS = $(MAKEDEPS) $(OPTFLAGS) $(REQFLAGS) -W -Wall \
- -I$(SRCROOT)/ipconfig \
- -I$(SRCROOT)/nfsmount \
-# -DINI_DEBUG -g
-
-LIBS = \
- $(SRCROOT)/nfsmount/libnfsmount.a \
- $(SRCROOT)/ipconfig/libipconfig.a \
- $(KLIBC) $(LIBGCC)
-PROGS = kinit
-OBJS = kinit.o do_mounts.o nfsroot.o getintfile.o initrd.o \
- open.o readfile.o
-
-all: $(PROGS)
-
-kinit: $(OBJS) $(LIBS) $(CRT0)
- $(LD) $(LDFLAGS) -o $@ $(CRT0) $(OBJS) $(LIBS)
- cp -f $@ $@.g
- $(STRIPCMD) $@
-
-clean:
- -rm -f *.o *.g kinit
-
-spotless: clean
- -rm -f .*.d *~
-
-# This should perhaps be a shared binary?
-install: all
- $(INSTALL_EXEC) $(PROGS) $(INSTALLROOT)$(INSTALLDIR)/$(CROSS)bin
-
-ifneq ($(wildcard .*.d),)
-include $(wildcard .*.d)
-endif
diff --git a/klcc/Kbuild b/klcc/Kbuild
new file mode 100644
index 0000000..368bf36
--- /dev/null
+++ b/klcc/Kbuild
@@ -0,0 +1,44 @@
+#
+# Build klcc
+#
+
+always := $(KLIBCCROSS)klcc
+
+$(obj)/$(KLIBCCROSS)klibc.config: $(src)/Kbuild \
+ $(srctree)/Makefile \
+ $(srctree)/scripts/Kbuild.klibc
+ @echo " GEN $@"
+ $(Q)rm -f $@
+ $(Q)echo 'ARCH=$(ARCH)' >> $@
+ $(Q)echo 'CROSS=$(KLIBCCROSS)' >> $@
+ $(Q)echo 'KCROSS=$(KCROSS)' >> $@
+ $(Q)echo 'CC=$(KLIBCCC)' >> $@
+ $(Q)echo 'LD=$(KLIBCLD)' >> $@
+ $(Q)echo 'REQFLAGS=$(filter-out -I%,$(KLIBCREQFLAGS))' >> $@
+ $(Q)echo 'OPTFLAGS=$(KLIBCOPTFLAGS)' >> $@
+ $(Q)echo 'LDFLAGS=$(KLIBCLDFLAGS)' >> $@
+ $(Q)echo 'STRIP=$(KLIBCSTRIP)' >> $@
+ $(Q)echo 'STRIPFLAGS=$(KLIBCSTRIPFLAGS)' >> $@
+ $(Q)echo 'EMAIN=$(KLIBCEMAIN)' >> $@
+ $(Q)echo 'BITSIZE=$(KLIBCBITSIZE)' >> $@
+ $(Q)echo 'prefix=$(INSTALLDIR)' >> $@
+ $(Q)echo 'bindir=$(INSTALLDIR)/$(KCROSS)bin' >> $@
+ $(Q)echo 'libdir=$(INSTALLDIR)/$(KCROSS)lib' >> $@
+ $(Q)echo 'includedir=$(INSTALLDIR)/$(KCROSS)include' >> $@
+
+
+# Generate klcc
+targets := $(KLIBCCROSS)klcc
+
+quiet_cmd_klcc = GEN $@
+ cmd_klcc = $(PERL) $< $(srctree)/$(src)/klcc.in \
+ $(obj)/$(KLIBCCROSS)klibc.config \
+ $(shell bash -c 'type -p $(PERL)') \
+ > $@ || ( rm -f $@ ; exit 1 ) && \
+ chmod a+x $@
+$(obj)/$(KLIBCCROSS)klcc: $(src)/makeklcc.pl $(src)/klcc.in \
+ $(obj)/$(KLIBCCROSS)klibc.config
+ $(call if_changed,klcc)
+
+# Cleaning targets
+clean-files := $(KLIBCCROSS)klibc.config $(KLIBCCROSS)klcc
diff --git a/klcc.1 b/klcc/klcc.1
similarity index 100%
rename from klcc.1
rename to klcc/klcc.1
diff --git a/klcc.in b/klcc/klcc.in
similarity index 100%
rename from klcc.in
rename to klcc/klcc.in
diff --git a/makeklcc.pl b/klcc/makeklcc.pl
similarity index 100%
rename from makeklcc.pl
rename to klcc/makeklcc.pl
diff --git a/klibc.spec.in b/klibc.spec.in
index eef5dbf..f9c75ef 100644
--- a/klibc.spec.in
+++ b/klibc.spec.in
@@ -82,8 +82,8 @@
install -m 444 gzip/COPYING %{buildroot}%{bindocdir}/COPYING.gzip
install -m 444 gzip/README %{buildroot}%{bindocdir}/README.gzip
-install -m 444 ipconfig/README %{buildroot}%{bindocdir}/README.ipconfig
-install -m 444 kinit/README %{buildroot}%{bindocdir}/README.kinit
+install -m 444 usr/kinit/ipconfig/README %{buildroot}%{bindocdir}/README.ipconfig
+install -m 444 usr/kinit/README %{buildroot}%{bindocdir}/README.kinit
%clean
rm -rf $RPM_BUILD_ROOT
diff --git a/klibc/Kbuild b/klibc/Kbuild
index be239a6..401486c 100644
--- a/klibc/Kbuild
+++ b/klibc/Kbuild
@@ -9,7 +9,7 @@
atoi.o atol.o atoll.o \
strtol.o strtoll.o strtoul.o strtoull.o \
strtoimax.o strtoumax.o \
- globals.o exitc.o atexit.o onexit.o \
+ globals.o exit.o atexit.o onexit.o \
execl.o execle.o execv.o execvpe.o execvp.o execlp.o execlpe.o \
fork.o wait.o wait3.o waitpid.o system.o setpgrp.o getpgrp.o \
daemon.o \
@@ -32,6 +32,7 @@
gethostname.o getdomainname.o getcwd.o \
seteuid.o setegid.o \
getenv.o setenv.o putenv.o __put_env.o unsetenv.o \
+ clearenv.o nullenv.o \
getopt.o readdir.o \
syslog.o closelog.o pty.o getpt.o isatty.o reboot.o \
time.o utime.o llseek.o nice.o getpriority.o \
@@ -48,6 +49,9 @@
zlib/uncompr.o zlib/deflate.o zlib/trees.o zlib/zutil.o \
zlib/inflate.o zlib/infback.o zlib/inftrees.o zlib/inffast.o
+# zlib specific flag
+EXTRA_CFLAGS := -DDYNAMIC_CRC_TABLE
+
#####
# Add any architecture-specific rules
include $(obj)/arch/$(ARCH)/Makefile.inc
@@ -67,6 +71,8 @@
CRT0 := $(call objectify,$(CRT0))
INTERP_O := $(call objectify,$(INTERP_O))
+SOLIBHASH = $(shell cat $(SOLIB).hash)
+
targets := arch/$(ARCH)/crt0.o
targets += $(libc-y) $(ARCHOBJS)
@@ -95,10 +101,10 @@
######
# Build static library: libc.a
targets += libc.a __static_init.o
-quiet_cmd_libc = USERAR $@
+quiet_cmd_libc = KLIBCAR $@
cmd_libc = rm -f $@; \
- $(USERAR) cq $@ $(filter-out FORCE,$^); \
- $(USERRANLIB) $@
+ $(KLIBCAR) cq $@ $(filter-out FORCE,$^); \
+ $(KLIBCRANLIB) $@
$(LIB): $(call objectify,__static_init.o) $(libc-deps) FORCE
$(call if_changed,libc)
@@ -107,9 +113,9 @@
# Build shared library
targets += libc.so __shared_init.o
-quiet_cmd_libcso = LD $@
- cmd_libcso = $(USERLD) $(USERLDFLAGS) $(USERSHAREDFLAGS) \
- -o $@ $(filter-out FORCE,$^) $(USERLIBGCC)
+quiet_cmd_libcso = KLIBCLD $@
+ cmd_libcso = $(KLIBCLD) $(KLIBCLDFLAGS) $(KLIBCSHAREDFLAGS) \
+ -o $@ $(filter-out FORCE,$^) $(KLIBCLIBGCC)
$(SOLIB): $(CRT0) $(call objectify,__shared_init.o) $(libc-deps) FORCE
$(call if_changed,libcso)
@@ -119,18 +125,19 @@
# Build sha1 hash values
targets += klibc.so libc.so.hash
hostprogs-y := sha1hash
+clean-files += klibc-???????????????????????????.so
quiet_cmd_solibhash = HASH $@
- cmd_solibhash = $(USERNM) $< | egrep '^[0-9a-fA-F]+ [ADRTW] ' | \
+ cmd_solibhash = $(KLIBCNM) $< | egrep '^[0-9a-fA-F]+ [ADRTW] ' | \
sort | $(obj)/sha1hash > $@
$(SOLIB).hash: $(SOLIB) $(obj)/sha1hash FORCE
$(call if_changed,solibhash)
quiet_cmd_sohash = GEN $@
cmd_sohash = cat $< > $@; \
- $(USERSTRIP) $(USERSTRIPFLAGS) $@; \
- rm -f $(obj)/klibc-??????????????????????.so; \
- ln -f $@ $(obj)/klibc-`cat $(SOLIB).hash`.so
+ $(KLIBCSTRIP) $(KLIBCSTRIPFLAGS) $@; \
+ rm -f $(obj)/klibc-???????????????????????????.so; \
+ ln -f $@ $(obj)/klibc-$(SOLIBHASH).so
$(SOHASH): $(SOLIB) $(SOLIB).hash
$(call cmd,sohash)
@@ -139,11 +146,23 @@
# build interp.o
targets += interp.o
-quiet_cmd_interp = BUILD $@
- cmd_interp = $(USERCC) $(usercflags) -D__ASSEMBLY__ \
+quiet_cmd_interp = BUILD $@
+ cmd_interp = $(KLIBCCC) $(klibccflags) -D__ASSEMBLY__ \
-DLIBDIR=\"$(SHLIBDIR)\" \
- -DSOHASH=\"`cat $(SOLIB).hash`\" \
+ -DSOHASH=\"$(SOLIBHASH)\" \
-c -o $@ $<
$(INTERP_O): $(obj)/interp.S $(SOLIB).hash
$(call if_changed,interp)
+
+#####
+# Install klibc
+install-rule:
+ @echo " INSTALL klibc to $(INSTALLROOT)$(INSTALLDIR)/$(KLIBCCROSS)lib"
+ $(Q)$(foreach f, $(LIB) $(SOLIB) $(CRT0) $(INTERP_O), \
+ $(shell $(install-data) $(f) \
+ $(INSTALLROOT)$(INSTALLDIR)/$(KLIBCCROSS)lib))
+ $(Q)$(install-lib) $(obj)/klibc-$(SOLIBHASH).so \
+ $(INSTALLROOT)$(INSTALLDIR)/$(KLIBCCROSS)lib
+ $(Q)$(install-lib) $(obj)/klibc-$(SOLIBHASH).so \
+ $(INSTALLROOT)$(SHLIBDIR)
diff --git a/klibc/MCONFIG b/klibc/MCONFIG
deleted file mode 100644
index 24af09d..0000000
--- a/klibc/MCONFIG
+++ /dev/null
@@ -1,20 +0,0 @@
-# -*- makefile -*-
-#
-# Makefile configuration, without explicit rules
-#
-
-SRCROOT = ..
-include ../MCONFIG
-include ../MRULES
-
-WARNFLAGS = -W -Wall -Wpointer-arith -Wwrite-strings -Wstrict-prototypes -Winline
-
-ifeq ($(ERRLIST),1)
-REQFLAGS += -DWITH_ERRLIST
-endif
-
-CFLAGS = -Wp,-MT,$@,-MD,$(dir $@).$(notdir $@).d $(OPTFLAGS) $(REQFLAGS) $(WARNFLAGS)
-INCLUDE += -I./zlib
-CFLAGS += -DDYNAMIC_CRC_TABLE
-
-SOFLAGS = -fPIC
diff --git a/klibc/Makefile b/klibc/Makefile
deleted file mode 100644
index f7b8ac5..0000000
--- a/klibc/Makefile
+++ /dev/null
@@ -1,193 +0,0 @@
-#
-# Makefile
-#
-# Main makefile
-#
-
-# Include configuration rules
-include MCONFIG
-
-INCLUDE += -I./zlib
-
-TESTS = $(patsubst %.c,%,$(wildcard tests/*.c)) \
- $(patsubst %.c,%.shared,$(wildcard tests/*.c))
-LIBOBJS = vsnprintf.o snprintf.o vsprintf.o sprintf.o \
- asprintf.o vasprintf.o \
- vsscanf.o sscanf.o ctypes.o \
- strntoumax.o strntoimax.o \
- atoi.o atol.o atoll.o \
- strtol.o strtoll.o strtoul.o strtoull.o \
- strtoimax.o strtoumax.o \
- globals.o exit.o atexit.o onexit.o \
- execl.o execle.o execv.o execvpe.o execvp.o execlp.o execlpe.o \
- fork.o wait.o wait3.o waitpid.o system.o setpgrp.o getpgrp.o \
- daemon.o \
- printf.o vprintf.o fprintf.o vfprintf.o perror.o \
- statfs.o fstatfs.o umount.o \
- open.o fopen.o fread.o fread2.o fgetc.o fgets.o \
- fwrite.o fwrite2.o fputc.o fputs.o puts.o putchar.o \
- sleep.o usleep.o strtotimespec.o strtotimeval.o \
- raise.o abort.o assert.o alarm.o pause.o \
- __signal.o sysv_signal.o bsd_signal.o siglist.o siglongjmp.o \
- sigaction.o sigpending.o sigprocmask.o sigsuspend.o \
- brk.o sbrk.o malloc.o realloc.o calloc.o mmap.o \
- memcpy.o memcmp.o memset.o memccpy.o memmem.o memswap.o \
- memmove.o memchr.o memrchr.o \
- strcasecmp.o strncasecmp.o strndup.o strerror.o \
- strcat.o strchr.o strcmp.o strcpy.o strdup.o strlen.o strnlen.o \
- strncat.o strlcpy.o strlcat.o \
- strstr.o strncmp.o strncpy.o strrchr.o \
- strxspn.o strspn.o strcspn.o strpbrk.o strsep.o strtok.o \
- gethostname.o getdomainname.o getcwd.o \
- seteuid.o setegid.o \
- getenv.o setenv.o putenv.o __put_env.o unsetenv.o \
- clearenv.o nullenv.o \
- getopt.o readdir.o \
- syslog.o closelog.o pty.o getpt.o isatty.o reboot.o \
- time.o utime.o llseek.o nice.o getpriority.o \
- qsort.o \
- lrand48.o jrand48.o mrand48.o nrand48.o srand48.o seed48.o \
- inet/inet_ntoa.o inet/inet_aton.o inet/inet_addr.o \
- inet/inet_ntop.o inet/inet_pton.o inet/bindresvport.o \
- send.o recv.o
-
-ifeq ($(ERRLIST),1)
-LIBOBJS += errlist.o
-endif
-
-ifeq ($(ZLIB),1)
-LIBOBJS += zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/gzio.o \
- zlib/uncompr.o zlib/deflate.o zlib/trees.o zlib/zutil.o \
- zlib/inflate.o zlib/infback.o zlib/inftrees.o zlib/inffast.o
-endif
-
-SOLIB = libc.so
-SOHASH = klibc.so
-
-CRT0 = crt0.o
-LIB = libc.a
-
-INTERP_O = interp.o
-
-all: tests $(CRT0) $(LIB) $(SOLIB) $(SOHASH) $(INTERP_O)
-
-# Add any architecture-specific rules
-include arch/$(ARCH)/Makefile.inc
-EMAIN ?= -e main
-
-tests: $(TESTS)
-
-tests/%.o : tests/%.c
- $(CC) $(CFLAGS) -c -o $@ $<
-
-# This particular file uses a bunch of formats gcc don't know of, in order
-# to test the full range of our vsnprintf() function. This outputs a bunch
-# of useless warnings unless we tell it not to.
-tests/testvsnp.o : tests/testvsnp.c
- $(CC) $(CFLAGS) -Wno-format -c -o $@ $<
-
-tests/% : tests/%.o $(LIB) $(CRT0)
- $(LD) $(LDFLAGS) -o $@ $(CRT0) $< $(LIB) $(LIBGCC)
- cp $@ $@.stripped
- $(STRIPCMD) $@.stripped
-
-tests/%.shared : tests/%.o interp.o $(SOLIB)
- $(LD) $(LDFLAGS) -o $@ $(EMAIN) interp.o tests/$*.o -R $(SOLIB) $(LIBGCC)
- cp $@ $@.stripped
- $(STRIPCMD) $@.stripped
-
-$(LIB): __static_init.o $(LIBOBJS) $(ARCHOBJS) syscalls/static.obj socketcalls/static.obj
- rm -f $(LIB)
- $(AR) cq $(LIB) __static_init.o $(LIBOBJS) $(ARCHOBJS) \
- $(wildcard syscalls/*.o) $(wildcard socketcalls/*.o)
- $(RANLIB) $(LIB)
-
-$(SOLIB): $(CRT0) __shared_init.o $(LIBOBJS) $(ARCHOBJS) syscalls/static.obj socketcalls/static.obj
- $(LD) $(LDFLAGS) $(SHAREDFLAGS) -o $@ \
- $(CRT0) __shared_init.o $(LIBOBJS) $(ARCHOBJS) \
- $(wildcard syscalls/*.o) $(wildcard socketcalls/*.o) \
- $(LIBGCC)
-
-sha1hash: sha1hash.c
- $(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ $<
-
-$(SOLIB).hash: $(SOLIB) sha1hash
- $(NM) $(SOLIB) | \
- egrep '^[0-9a-fA-F]+ [ADRTW] ' | sort | ./sha1hash > $@
-
-$(SOHASH): $(SOLIB) $(SOLIB).hash
- cp -f $(SOLIB) $@
- $(STRIPCMD) $@
- rm -f klibc-??????????????????????.so
- ln -f $@ klibc-`cat $(SOLIB).hash`.so
-
-$(INTERP_O): interp.S $(SOLIB).hash
- $(CC) $(CFLAGS) -D__ASSEMBLY__ -DLIBDIR=\"$(SHLIBDIR)\" \
- -DSOHASH=\"`cat $(SOLIB).hash`\" \
- -c -o $@ $<
-
-crt0.o: arch/$(ARCH)/crt0.o
- cp arch/$(ARCH)/crt0.o .
-
-errlist.c:
- $(PERL) makeerrlist.pl -q $(INCLUDE) -errlist > $@ || rm -f $@
-
-# We pass -ansi to keep cpp from define e.g. "i386" as well as "__i386__"
-SYSCALLS.i: SYSCALLS.def
- $(CC) $(CFLAGS) -D__ASSEMBLY__ -ansi -x assembler-with-cpp -E -o $@ $<
-
-syscalls.nrs: ../include/sys/syscall.h
- $(CC) $(CFLAGS) -Wp,-dM -x c -E -o $@ $<
-
-syscalls.dir: SYSCALLS.i syscalls.pl arch/$(ARCH)/sysstub.ph syscommon.h syscalls.nrs
- rm -f syscalls/*.[Ssco] syscalls/*.obj
- mkdir -p syscalls
- $(PERL) syscalls.pl SYSCALLS.i arch/$(ARCH)/sysstub.ph $(ARCH) \
- $(BITSIZE) syscalls.nrs \
- syscalls ../include/klibc/havesyscall.h
- touch $@
-
-../include/klibc/havesyscall.h: syscalls.dir
- : Generated by side effect
-
-socketcalls.dir: SOCKETCALLS.def socketcalls.pl socketcommon.h
- rm -f socketcalls/*.[Ssco] socketcalls/*.obj
- mkdir -p socketcalls
- $(PERL) socketcalls.pl SOCKETCALLS.def $(ARCH) socketcalls
- touch $@
-
-%/static.obj: %.dir
- $(MAKE) objects-$(basename $(notdir $@)) DIR=$*/
-
-STATIC = $(addsuffix .o,$(basename $(wildcard $(DIR)*.[cS])))
-
-objects-static: $(STATIC)
- touch $(DIR)static.obj
-
-clean: archclean
- find . -type f -a \( -name \*.[isoa] -o -name \*.l[iso] \) -print0 | xargs -0rt rm -f
- rm -f *.a *.so *.hash *.syms *.stripped
- rm -f $(TESTS) tests/*.stripped
- rm -f syscalls/*.[Ssco] syscalls/*.obj syscalls.dir
- rm -f socketcalls/*.[Ssco] socketcalls/*.obj socketcalls.dir
- rm -f sha1hash errlist.c
-
-spotless: clean
- rm -f ../include/klibc/havesyscall.h syscalls.nrs
- find . \( -name \*~ -o -name '.*.d' \) -not -type d -print0 | \
- xargs -0rt rm -f
-
-bitsize:
- @echo $(BITSIZE)
-
-install: all
- $(INSTALL_DATA) $(LIB) $(SOLIB) $(CRT0) $(INTERP_O) \
- $(INSTALLROOT)$(INSTALLDIR)/$(CROSS)lib
- $(INSTALL_EXEC) klibc-`cat $(SOLIB).hash`.so \
- $(INSTALLROOT)$(INSTALLDIR)/$(CROSS)lib
- $(INSTALL_EXEC) klibc-`cat $(SOLIB).hash`.so \
- $(INSTALLROOT)/$(SHLIBDIR)
-
-ifneq ($(wildcard $(DIR).*.d),)
-include $(wildcard $(DIR).*.d)
-endif
diff --git a/klibc/arch/ppc/crt0.S b/klibc/arch/ppc/crt0.S
index 282f841..fd90c7d 100644
--- a/klibc/arch/ppc/crt0.S
+++ b/klibc/arch/ppc/crt0.S
@@ -11,10 +11,13 @@
addi 3,1,16
/*
* the SVR4abippc.pdf specifies r7 as a pointer to
- * a termination function pointer.
- * It is unused on Linux.
+ * a termination function point
+ * However, Section 8.4.1 of the LSB API docs say that
+ * The value to be placed into register r7, the termination
+ * function pointer, is not passed to the process.
+ * So we stub it out, instead.
*/
- mr 4,7
+ li 4,0
bl __libc_init
.size _start,.-_start
diff --git a/klibc/arch/ppc64/crt0.S b/klibc/arch/ppc64/crt0.S
index 872d2a0..3619181 100644
--- a/klibc/arch/ppc64/crt0.S
+++ b/klibc/arch/ppc64/crt0.S
@@ -25,7 +25,7 @@
._start:
stdu %r1,-32(%r1)
addi %r3,%r1,32
- mr %r4,%r7 /* fini */
+ li %r4,0 /* fini (unused) */
b .__libc_init
nop
diff --git a/klibc/libc_init.c b/klibc/libc_init.c
index 081eb44..9383414 100644
--- a/klibc/libc_init.c
+++ b/klibc/libc_init.c
@@ -12,6 +12,13 @@
* void (*onexit)(void) -- Function to install into onexit
*/
+/*
+ * Several Linux ABIs don't pass the onexit pointer, and the ones that
+ * do never use it. Therefore, unless USE_ONEXIT is defined, we just
+ * ignore the onexit pointer.
+ */
+/* #define USE_ONEXIT */
+
#include <stddef.h>
#include <stdlib.h>
#include <stdint.h>
@@ -32,8 +39,6 @@
uintptr_t v;
};
-static struct atexit at_exit;
-
__noreturn __libc_init(uintptr_t *elfdata, void (*onexit)(void))
{
int argc;
@@ -48,13 +53,17 @@
#endif
unsigned int page_size = 0, page_shift = 0;
+#ifdef USE_ONEXIT
if ( onexit ) {
+ static struct atexit at_exit;
+
at_exit.fctn = (void(*)(int, void *))onexit;
/* at_exit.next = NULL already */
__atexit_list = &at_exit;
}
-
- (void)onexit; /* For now, we ignore this... */
+#else
+ (void)onexit; /* Ignore this... */
+#endif
argc = (int)*elfdata++;
argv = (char **)elfdata;
diff --git a/klibc/libgcc/__moddi3.c b/klibc/libgcc/__moddi3.c
index 3e61365..c41d4f4 100644
--- a/klibc/libgcc/__moddi3.c
+++ b/klibc/libgcc/__moddi3.c
@@ -21,7 +21,7 @@
minus ^= 1;
}
- (void) __udivmoddi4(num, den, &v);
+ (void) __udivmoddi4(num, den, (uint64_t *)&v);
if ( minus )
v = -v;
diff --git a/klibc/sigpending.c b/klibc/sigpending.c
index decfe32..0d8044b 100644
--- a/klibc/sigpending.c
+++ b/klibc/sigpending.c
@@ -7,7 +7,7 @@
#ifndef __NR_sigpending
-__extern __rt_sigpending(sigset_t *, size_t);
+__extern int __rt_sigpending(sigset_t *, size_t);
int sigpending(sigset_t *set)
{
diff --git a/klibc/sigprocmask.c b/klibc/sigprocmask.c
index 372e0fd..35b37eb 100644
--- a/klibc/sigprocmask.c
+++ b/klibc/sigprocmask.c
@@ -7,7 +7,7 @@
#ifndef __NR_sigprocmask
-__extern __rt_sigprocmask(int, const sigset_t *, sigset_t *, size_t);
+__extern int __rt_sigprocmask(int, const sigset_t *, sigset_t *, size_t);
int sigprocmask(int how, const sigset_t *set, sigset_t *oset)
{
diff --git a/klibc/socketcalls/Kbuild b/klibc/socketcalls/Kbuild
index e2c8bf7..9f58b16 100644
--- a/klibc/socketcalls/Kbuild
+++ b/klibc/socketcalls/Kbuild
@@ -4,35 +4,34 @@
# Include automatically generated Makefile fragment.
# It contains definition of socketcall-objs specifying name of all .o files
+ifeq ($(clean),)
-include $(obj)/socketcalls.mk
+endif
# Composite object containing all .o file
always := socketcalls.o
-klibc-dir := $(srctree)/usr/klibc
-
#####
# Generate socket calls stubs
# Based on input from SOCKETCALLS.def generate socket call stubs
targets := socketcalls.o
targets += socketcalls.mk
targets += $(socketcall-objs)
-clean-files += *.o
+clean-files += *.S *.c *.o
# Create reloctable composite object file
$(obj)/socketcalls.o: $(call objectify,$(socketcall-objs)) FORCE
- $(call if_changed,userld)
+ $(call if_changed,klibcld)
quiet_cmd_socketcalls = GEN $@
- cmd_socketcalls = $(PERL) $(klibc-dir)/socketcalls.pl \
- $(klibc-dir)/SOCKETCALLS.def \
+ cmd_socketcalls = $(PERL) $(KLIBCSRC)/socketcalls.pl \
+ $(KLIBCSRC)/SOCKETCALLS.def \
$(ARCH) $(obj) > $@ || rm -f $@
# Generate socketcall stubs
-$(obj)/socketcalls.mk: $(klibc-dir)/socketcalls.pl \
- $(klibc-dir)/SOCKETCALLS.def \
- $(call objectify, $(socketcall-objs:.o=.S)) \
- $(klibc-dir)/socketcommon.h
+$(obj)/socketcalls.mk: $(KLIBCSRC)/socketcalls.pl \
+ $(KLIBCSRC)/SOCKETCALLS.def \
+ $(KLIBCSRC)/socketcommon.h
$(call cmd,socketcalls)
diff --git a/klibc/strcasecmp.c b/klibc/strcasecmp.c
index 12aef40..fdc5795 100644
--- a/klibc/strcasecmp.c
+++ b/klibc/strcasecmp.c
@@ -7,7 +7,8 @@
int strcasecmp(const char *s1, const char *s2)
{
- const unsigned char *c1 = s1, *c2 = s2;
+ const unsigned char *c1 = (const unsigned char *)s1;
+ const unsigned char *c2 = (const unsigned char *)s2;
unsigned char ch;
int d = 0;
diff --git a/klibc/strcmp.c b/klibc/strcmp.c
index f44774f..63a391b 100644
--- a/klibc/strcmp.c
+++ b/klibc/strcmp.c
@@ -6,7 +6,8 @@
int strcmp(const char *s1, const char *s2)
{
- const unsigned char *c1 = s1, *c2 = s2;
+ const unsigned char *c1 = (const unsigned char *)s1;
+ const unsigned char *c2 = (const unsigned char *)s2;
unsigned char ch;
int d = 0;
diff --git a/klibc/strncasecmp.c b/klibc/strncasecmp.c
index 3309d1a..c400124 100644
--- a/klibc/strncasecmp.c
+++ b/klibc/strncasecmp.c
@@ -7,7 +7,8 @@
int strncasecmp(const char *s1, const char *s2, size_t n)
{
- const unsigned char *c1 = s1, *c2 = s2;
+ const unsigned char *c1 = (const unsigned char *)s1;
+ const unsigned char *c2 = (const unsigned char *)s2;
unsigned char ch;
int d = 0;
diff --git a/klibc/strncmp.c b/klibc/strncmp.c
index 4dbde13..61f1fba 100644
--- a/klibc/strncmp.c
+++ b/klibc/strncmp.c
@@ -6,7 +6,8 @@
int strncmp(const char *s1, const char *s2, size_t n)
{
- const unsigned char *c1 = s1, *c2 = s2;
+ const unsigned char *c1 = (const unsigned char *)s1;
+ const unsigned char *c2 = (const unsigned char *)s2;
unsigned char ch;
int d = 0;
diff --git a/klibc/syscalls/Kbuild b/klibc/syscalls/Kbuild
index be08f17..6758127 100644
--- a/klibc/syscalls/Kbuild
+++ b/klibc/syscalls/Kbuild
@@ -4,13 +4,13 @@
# Include automatically generated Makefile fragment.
# It contains definition of syscall-objs specifying name of all .o files
+ifeq ($(clean),)
-include $(obj)/syscalls.mk
+endif
# Composite object containing all .o file
always := syscalls.o
-klibc-dir := $(srctree)/usr/klibc
-
#####
# Generate syscalls stubs
@@ -22,42 +22,42 @@
targets += $(syscall-objs)
# Side effect of running syscalls.pl
-clean-files += $(objtree)/usr/include/klibc/havesyscall.h
+clean-files += $(objtree)/$(KLIBCINC)/klibc/havesyscall.h
# All the syscall stubs
clean-files += *.o *.S *.c
# Create reloctable composite object file
$(obj)/syscalls.o: $(call objectify,$(syscall-objs)) FORCE
- $(call if_changed,userld)
+ $(call if_changed,klibcld)
# Generate assembler file (.i)
# We pass -ansi to keep cpp from define e.g. "i386" as well as "__i386__"
quiet_cmd_syscall.i = GEN $@
- cmd_syscall.i = $(USERCC) $(usercflags) -D__ASSEMBLY__ \
+ cmd_syscall.i = $(KLIBCCC) $(klibccflags) -D__ASSEMBLY__ \
-ansi -x assembler-with-cpp -E -o $@ $<
-$(obj)/SYSCALLS.i: $(klibc-dir)/SYSCALLS.def FORCE
+$(obj)/SYSCALLS.i: $(KLIBCSRC)/SYSCALLS.def FORCE
$(call if_changed_dep,syscall.i)
# Get syscalls numbers
quiet_cmd_syscall.nrs = GEN $@
- cmd_syscall.nrs = $(USERCC) $(usercflags) -Wp,-dM -x c -E -o $@ $<
-$(obj)/syscalls.nrs: $(srctree)/usr/include/sys/syscall.h FORCE
+ cmd_syscall.nrs = $(KLIBCCC) $(klibccflags) -Wp,-dM -x c -E -o $@ $<
+$(obj)/syscalls.nrs: $(KLIBCINC)/sys/syscall.h FORCE
$(call if_changed_dep,syscall.nrs)
-# Generate usr/include/klibc/havesyscall.h + makefile fragment
+# Generate $(KLIBINC)/klibc/havesyscall.h + makefile fragment
# Using sysstub.pl in arch dir generate all .S files
quiet_cmd_syscalls = GEN $@
- cmd_syscalls = mkdir -p $(objtree)/usr/include/klibc/; \
- $(PERL) $(klibc-dir)/syscalls.pl $(obj)/SYSCALLS.i \
- $(klibc-dir)/arch/$(ARCH)/sysstub.ph \
- $(ARCH) $(BITSIZE) $(obj)/syscalls.nrs \
- $(obj) \
- $(objtree)/usr/include/klibc/havesyscall.h > $@ \
+ cmd_syscalls = mkdir -p $(KLIBCINC)/klibc/; \
+ $(PERL) $(KLIBCSRC)/syscalls.pl $(obj)/SYSCALLS.i \
+ $(KLIBCSRC)/arch/$(ARCH)/sysstub.ph \
+ $(ARCH) $(KLIBCBITSIZE) $(obj)/syscalls.nrs \
+ $(obj) \
+ $(KLIBCINC)/klibc/havesyscall.h > $@ \
|| rm -f $@
-$(obj)/syscalls.mk: $(klibc-dir)/syscalls.pl $(obj)/SYSCALLS.i \
- $(klibc-dir)/arch/$(ARCH)/sysstub.ph \
- $(call objectify, $(syscall-objs:.o=.S)) \
- $(klibc-dir)/syscommon.h $(obj)/syscalls.nrs
+$(obj)/syscalls.mk: $(KLIBCSRC)/syscalls.pl $(obj)/SYSCALLS.i \
+ $(KLIBCSRC)/arch/$(ARCH)/sysstub.ph \
+ $(call objectify, $(syscall-objs:.o=.S)) \
+ $(KLIBCSRC)/syscommon.h $(obj)/syscalls.nrs
$(call cmd,syscalls)
diff --git a/klibc/tests/Kbuild b/klibc/tests/Kbuild
new file mode 100644
index 0000000..2525dbc
--- /dev/null
+++ b/klibc/tests/Kbuild
@@ -0,0 +1,43 @@
+#
+# Kbuild file for all test files
+#
+
+test-files := $(wildcard $(srctree)/$(src)/*.c)
+test-files := $(notdir $(test-files))
+
+# This particular file uses a bunch of formats gcc don't know of, in order
+# to test the full range of our vsnprintf() function. This outputs a bunch
+# of useless warnings unless we tell it not to.
+KLIBCCFLAGS_testvsnp.o := -Wno-format
+
+static-y := $(test-files:.c=)
+shared-y := $(addsuffix .shared, $(static-y))
+
+environ.shared-y := environ.o
+fcntl.shared-y := fcntl.o
+getopttest.shared-y := getopttest.o
+getpagesize.shared-y := getpagesize.o
+hello.shared-y := hello.o
+idtest.shared-y := idtest.o
+malloctest.shared-y := malloctest.o
+malloctest2.shared-y := malloctest2.o
+memstrtest.shared-y := memstrtest.o
+microhello.shared-y := microhello.o
+minihello.shared-y := minihello.o
+mmaptest.shared-y := mmaptest.o
+nfs_no_rpc.shared-y := nfs_no_rpc.o
+opentest.shared-y := opentest.o
+rtsig.shared-y := rtsig.o
+setenvtest.shared-y := setenvtest.o
+setjmptest.shared-y := setjmptest.o
+sigint.shared-y := sigint.o
+stat.shared-y := stat.o
+statfs.shared-y := statfs.o
+strlcpycat.shared-y := strlcpycat.o
+strtoimax.shared-y := strtoimax.o
+strtotime.shared-y := strtotime.o
+testrand48.shared-y := testrand48.o
+testvsnp.shared-y := testvsnp.o
+
+# Cleaning
+clean-files := $(static-y) $(shared-y) $(test-files:.c=.o)
diff --git a/nfsmount/MCONFIG b/nfsmount/MCONFIG
deleted file mode 100644
index 472f092..0000000
--- a/nfsmount/MCONFIG
+++ /dev/null
@@ -1,8 +0,0 @@
-# -*- makefile -*-
-
-SRCROOT = ..
-
-include $(SRCROOT)/MCONFIG
-include $(SRCROOT)/MRULES
-
-CFLAGS = -Wp,-MD,$(dir $@).$(notdir $@).d $(OPTFLAGS) $(REQFLAGS) -Wstrict-prototypes -Wall -I.
diff --git a/nfsmount/Makefile b/nfsmount/Makefile
deleted file mode 100644
index ce6159f..0000000
--- a/nfsmount/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-include MCONFIG
-
-COMMON_OBJS = main.o mount.o portmap.o dummypmap.o sunrpc.o
-PROGS = nfsmount
-STATICPROGS := $(patsubst %,static/%,$(PROGS))
-SHAREDPROGS := $(patsubst %,shared/%,$(PROGS))
-LIB = libnfsmount.a
-LIBS = $(KLIBC) $(LIBGCC)
-
-OBJS := $(COMMON_OBJS) $(BOOTP_OBJS) $(DHCP_OBJS)
-
-all: $(STATICPROGS) $(SHAREDPROGS) $(LIB)
-
-static/nfsmount: $(OBJS) $(CRT0) $(LIBS)
- mkdir -p static static.g
- $(LD) $(LDFLAGS) -o $@ $(CRT0) $(OBJS) $(LIBS)
- cp -f $@ static.g
- $(STRIPCMD) $@
-
-shared/nfsmount: $(OBJS) $(CRTSHARED) $(LIBSHARED) $(LIBGCC)
- mkdir -p shared shared.g
- $(LD) $(LDFLAGS) -o $@ $(EMAIN) $(CRTSHARED) $(OBJS) \
- -R $(LIBSHARED) $(LIBGCC)
- cp -f $@ shared.g
- $(STRIPCMD) $@
-
-dummypmap: dummypmap_test.o
- $(LD) $(LDFLAGS) -o $@ $(CRT0) $^ $(LIBS)
-
-$(LIB): $(OBJS)
- $(AR) cru $(LIB) $(OBJS)
-
-clean:
- $(RM) *.o $(LIB) core
- $(RM) -r static static.g shared shared.g
-
-spotless: clean
- $(RM) *~ .*.d *~
-
-install: all
- $(INSTALL_EXEC) shared/* $(INSTALLROOT)$(INSTALLDIR)/$(CROSS)bin
-ifneq ($(wildcard .*.d),)
-include $(wildcard .*.d)
-endif
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
new file mode 100644
index 0000000..db3c708
--- /dev/null
+++ b/scripts/Kbuild.include
@@ -0,0 +1,99 @@
+####
+# 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))
+
+# Add $(obj)/ for paths that is not absolute
+objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
+
+###
+# 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.install b/scripts/Kbuild.install
new file mode 100644
index 0000000..cbde14b
--- /dev/null
+++ b/scripts/Kbuild.install
@@ -0,0 +1,122 @@
+#
+# Install klibc
+#
+# File is logically seperated in two pieces.
+# First piece is used when during a recursive descend of the klibc tree
+# and second piece is used to do the final steps in the install
+# If KLIBC_INSTALL is defined it tells us we are descending and we
+# use first piece of the file.
+
+# 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
+
+# First rule
+.PHONY: __install install-rule
+__install:
+
+# Install commands
+install-data := install -m 644
+install-lib := install -m 755
+install-bin := install -m 755
+
+# Install command
+quiet_cmd_install = INSTALL $(install-y)
+ cmd_install = $(install-bin) $(install-y) \
+ $(INSTALLROOT)$(INSTALLDIR)/$(KLIBCCROSS)bin
+
+ifeq ($(KLIBC_INSTALL),1)
+# First part - we are descending..
+
+# Reset variables (to get right type of assingment)
+subdir- :=
+
+# Include Kbuild file
+include $(srctree)/scripts/Kbuild.include
+include $(srctree)/$(obj)/Kbuild
+
+# Directories to visit
+# First find directories specified in lib-?, static-y and shared-y
+find-dir = $(patsubst %/,%,$(filter %/, $(1)))
+
+__subdir := $(call find-dir, $(lib-))
+__subdir += $(call find-dir, $(lib-y))
+
+__subdir += $(foreach e, $(static-y), $(call find-dir, $(e)))
+__subdir += $(foreach e, $(shared-y), $(call find-dir, $(e)))
+
+# Use subdir- in Kbuild file to tell kbuild to visit a specific dir
+subdir- += $(__subdir)
+
+# Remove duplicates and add prefix
+subdir- := $(addprefix $(obj)/,$(sort $(subdir-)))
+
+# Files to install
+install-y := $(strip $(addprefix $(obj)/, $(install-y)))
+
+__install: $(subdir-) install-rule
+ifneq ($(install-y),)
+ $(call cmd,install)
+else
+ @:
+endif
+
+# Descending
+.PHONY: $(subdir-)
+$(subdir-):
+ $(Q)$(MAKE) KLIBC_INSTALL=1 \
+ -f $(srctree)/scripts/Kbuild.install obj=$@
+
+# If quiet is set, only print short version of command
+cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1))
+
+
+else
+##########################################################################
+# This is the first time this file is invoked, so kick off the
+# install process.
+# First we descend all sub-directories to let them do their install.
+# Second we do the final install steps.
+
+# Do actual install as a three steps approach
+# 1) Create directories, install headers and man pages
+# 2) Tell that we now install binaries
+# 3) Install binaries by descending
+.PHONY: header footer descend
+header:
+ $(Q)echo " INSTALL headers + man pages to $(INSTALLROOT)$(INSTALLDIR)"
+ $(Q)mkdir -p $(INSTALLROOT)$(bindir)
+ $(Q)mkdir -p $(INSTALLROOT)$(mandir)/man1
+ $(Q)mkdir -p $(INSTALLROOT)$(SHLIBDIR)
+ $(Q)mkdir -p $(INSTALLROOT)$(INSTALLDIR)
+ $(Q)-rm -rf $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)include
+ $(Q)mkdir -p $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)include
+ $(Q)mkdir -p $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)lib
+ $(Q)mkdir -p $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)bin
+ $(Q)set -e ; for d in linux scsi asm-$(ARCH) asm-generic $(ASMARCH); do \
+ mkdir -p $(INSTALLROOT)$(INSTALLDIR)/$(KLIBCCROSS)include/$$d ; \
+ for r in $(KLIBCKERNELSRC)/include $(KLIBCKERNELOBJ)/include \
+ $(KLIBCKERNELOBJ)/include2 ; do \
+ [ ! -d $$r/$$d ] || \
+ cp -rfL $$r/$$d/. \
+ $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)include/$$d/. ; \
+ done ; \
+ done
+ $(Q)cd $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)include && ln -sf asm-$(ARCH) asm
+ $(Q)cp -rf include/. $(INSTALLROOT)$(INSTALLDIR)/$(KCROSS)include/.
+ $(Q)$(install-data) $(srctree)/klcc/klcc.1 $(INSTALLROOT)$(mandir)/man1/$(KCROSS)klcc.1
+ $(Q)$(install-bin) $(objtree)/klcc/$(KCROSS)klcc $(INSTALLROOT)$(bindir)
+
+footer: header
+ $(Q)echo " INSTALL binaries to $(INSTALLROOT)$(INSTALLDIR)/$(KLIBCCROSS)bin"
+
+descend: footer
+ $(Q)$(MAKE) KLIBC_INSTALL=1 \
+ -f $(srctree)/scripts/Kbuild.install obj=$(obj)
+
+__install: descend
+ @:
+endif
+
diff --git a/scripts/Kbuild.klibc b/scripts/Kbuild.klibc
new file mode 100644
index 0000000..acf326d
--- /dev/null
+++ b/scripts/Kbuild.klibc
@@ -0,0 +1,320 @@
+# ==========================================================================
+# Support for building klibc and related programs
+# ==========================================================================
+#
+# To create a kbuild file for a userspace program do the following:
+#
+# Kbuild:
+#
+# static-y := cat
+# # This will compile a file named cat.c -> the executable 'cat'
+# # The executable will be linked statically
+#
+# shared-y := cats
+# # This will compile a file named cats.c -> the executable 'cats'
+# # The executable will be linked shared
+#
+# If the userspace program consist of more files do the following:
+# Kbuild:
+#
+# static-y := ipconfig
+# ipconfig-y := main.o netdev.c
+# So ipconfig will be linked statically using the two .o files
+# specified with ipconfig-y.
+#
+# To set directory wide CFLAGS use:
+# EXTRA_KLIBCCFLAGS := -DDEBUG
+# To set directory wide AFLAGS use:
+# EXTRA_KLIBCAFLAGS := -DDEBUG
+#
+# To set target specific CFLAGS (for .c files) use
+# KLIBCCFLAGS-main.o := -DDEBUG=3
+# To set target specific AFLAGS (for .s files) use
+# KLIBCAFLAGS-main.o := -DDEBUG=3
+
+src := $(obj)
+# Preset target and make sure it is a ':=' variable
+targets :=
+
+.phony: __build
+__build:
+
+# Generic Kbuild routines
+include $(srctree)/scripts/Kbuild.include
+
+# Defines used when compiling early userspace (klibc programs)
+# ---------------------------------------------------------------------------
+
+KLIBCREQFLAGS :=
+KLIBCARCHREQFLAGS :=
+KLIBCOPTFLAGS :=
+KLIBCWARNFLAGS := -W -Wall -Wno-sign-compare
+KLIBCSHAREDFLAGS :=
+KLIBCBITSIZE :=
+KLIBCLDFLAGS :=
+
+# Arch specific definitions for klibc
+include $(KLIBCSRC)/arch/$(ARCH)/MCONFIG
+
+# FIXME - backwards compatibility. Remove when all MCONFIGs are corrected
+KLIBCREQFLAGS += $(REQFLAGS)
+KLIBCARCHREQFLAGS += $(ARCHREQFLAGS)
+KLIBCOPTFLAGS += $(OPTFLAGS)
+KLIBCWARNFLAGS += $(WARNFLAGS) -W -Wall -Wno-sign-compare
+KLIBCSHAREDFLAGS += $(SHAREDFLAGS)
+KLIBCBITSIZE := $(strip $(KLIBCBITSIZE) $(BITSIZE))
+KLIBCLDFLAGS += $(LDFLAGS)
+KLIBCROSS := $(CROSS_COMPILE)
+
+# binutils
+KLIBCLD := $(KLIBCROSS)ld
+KLIBCCC := $(KLIBCROSS)gcc
+KLIBCAR := $(KLIBCROSS)ar
+KLIBCRANLIB := $(KLIBCROSS)ranlib
+KLIBCSTRIP := $(KLIBCROSS)strip
+KLIBCNM := $(KLIBCROSS)nm
+
+
+# klibc include paths
+KLIBCCPPFLAGS := -I$(KLIBCINC)/arch/$(ARCH) \
+ -I$(KLIBCINC)/bits$(KLIBCBITSIZE) \
+ -I$(KLIBCINC)
+# kernel include paths
+KLIBCCPPFLAGS += -I$(KLIBCKERNELSRC)include \
+ $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include)
+# klibc definitions
+KLIBCCPPFLAGS += -D__KLIBC__=1 -D__KLIBC_MINOR__=0 \
+ -DBITSIZE=$(KLIBCBITSIZE)
+KLIBCCFLAGS := $(KLIBCCPPFLAGS) $(KLIBCREQFLAGS) $(KLIBCARCHREQFLAGS) \
+ $(KLIBCOPTFLAGS) $(KLIBCWARNFLAGS)
+KLIBCAFLAGS := -D__ASSEMBLY__ $(KLIBCCFLAGS)
+KLIBCSTRIPFLAGS := --strip-all -R .comment -R .note
+
+KLIBCLIBGCC := $(shell $(KLIBCCC) --print-libgcc)
+KLIBCCRT0 := $(KLIBCOBJ)/arch/$(ARCH)/crt0.o
+KLIBCLIBC := $(KLIBCOBJ)/libc.a
+KLIBCCRTSHARED := $(KLIBCOBJ)/interp.o
+KLIBCLIBCSHARED := $(KLIBCOBJ)/libc.so
+# How to tell the linker main() is the entrypoint
+KLIBCEMAIN ?= -e main
+
+#
+# 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 KLIBCLD KLIBCCC KLIBCAR KLIBCSTRIP KLIBCNM
+export KLIBCCFLAGS KLIBCAFLAGS KLIBCLIBGCC KLIBCSHAREDFLAGS KLIBCSTRIPFLAGS
+export KLIBCCRT0 KLIBCLIBC 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
+
+#####
+# static-y + shared-y handling
+klibc-progs := $(static-y) $(shared-y)
+# klibc-progs based on a single .o file (with same name + .o)
+klibc-objs := $(foreach p, $(klibc-progs), $(if $($(p)-y),,$(p)))
+klibc-objs := $(addsuffix .o, $(klibc-objs))
+# klibc-progs which is based on several .o files
+klibc-multi := $(foreach p, $(klibc-progs), $(if $($(p)-y),$(p)))
+# objects used for klibc-progs with more then one .o file
+klibc-objs += $(foreach p, $(klibc-multi), $($(p)-y))
+# objects build in this dir
+klibc-real-objs := $(patsubst %/,,$(klibc-objs))
+# Directories we need to visit before klibc-objs are up-to-date
+klibc-dirs := $(patsubst %/,%,$(filter %/, $(klibc-objs)))
+# replace all dir/ with dir/lib.a
+klibc-objs := $(patsubst %/, %/lib.a, $(klibc-objs))
+
+targets += $(static-y) $(shared-y)
+
+# $(output-dirs) are a list of directories that contain object files
+output-dirs := $(dir $(klibc-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
+static-y := $(addprefix $(obj)/,$(static-y))
+shared-y := $(addprefix $(obj)/,$(shared-y))
+klibc-objs := $(addprefix $(obj)/,$(klibc-objs))
+klibc-real-objs := $(addprefix $(obj)/,$(klibc-real-objs))
+output-dirs := $(addprefix $(obj)/,$(output-dirs))
+klibc-dirs := $(addprefix $(obj)/,$(klibc-dirs))
+subdir-y := $(addprefix $(obj)/,$(subdir-y))
+lib-y := $(addprefix $(obj)/,$(lib-y))
+always := $(addprefix $(obj)/,$(always))
+targets := $(addprefix $(obj)/,$(targets))
+
+
+_klibccflags = $(KLIBCCFLAGS) $(EXTRA_KLIBCCFLAGS) $(KLIBCCFLAGS_$(*F).o)
+_klibcaflags = $(KLIBCAFLAGS) $(EXTRA_KLIBCAFLAGS) $(KLIBCAFLAGS_$(*F).o)
+
+klibccflags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(_klibccflags)
+klibcaflags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(_klibcaflags)
+
+# 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 lib-y := dir/file.o syntax is used
+_dummy := $(foreach d,$(output-dirs), $(shell [ -d $(d) ] || mkdir -p $(d)))
+
+# Do we have to make a lib.a in this dir?
+ifneq ($(strip $(lib-y) $(lib-n) $(lib-)),)
+lib-target := $(obj)/lib.a
+endif
+
+__build: $(subdir-y) $(lib-target) $(always)
+ @:
+
+# Compile C sources (.c)
+# ---------------------------------------------------------------------------
+
+quiet_cmd_cc_s_c = KLIBCCC $@
+ cmd_cc_s_c = $(KLIBCCC) $(klibccflags) -S -o $@ $<
+
+%.s: %.c FORCE
+ $(call if_changed_dep,cc_s_c)
+
+quiet_cmd_cc_o_c = KLIBCCC $@
+ cmd_cc_o_c = $(KLIBCCC) $(klibccflags) -c -o $@ $<
+
+%.o: %.c FORCE
+ $(call if_changed_dep,cc_o_c)
+
+# Compile assembler sources (.S)
+# ---------------------------------------------------------------------------
+
+quiet_cmd_as_o_S = KLIBCAS $@
+ cmd_as_o_S = $(KLIBCCC) $(klibcaflags) -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 lib-target
+quiet_cmd_link_o_target = LD $@
+# If the list of objects to link is empty, just create an empty lib.a
+cmd_link_o_target = $(if $(strip $(lib-y)),\
+ rm -f $@; $(KLIBCAR) cru $@ $(filter $(lib-y), $^),\
+ rm -f $@; $(KLIBCAR) crs $@)
+
+$(lib-target): $(lib-y) FORCE
+ $(call if_changed,link_o_target)
+targets += $(lib-target) $(lib-y)
+endif # lib-target
+
+
+ifdef klibc-progs
+# Compile klibcspace programs for the target
+# ===========================================================================
+
+__build : $(klibc-dirs) $(static-y) $(shared-y)
+
+# Descend if needed
+$(sort $(addsuffix /lib.a,$(klibc-dirs))): $(klibc-dirs) ;
+
+# Define dependencies for link of progs
+# For the simple program:
+# file.o => file
+# A program with multiple objects
+# filea.o, fileb.o => file
+# A program with .o files in another dir
+# dir/lib.a filea.o => file
+
+stripobj = $(subst $(obj)/,,$@)
+addliba = $(addprefix $(obj)/, $(patsubst %/, %/lib.a, $(1)))
+link-deps = $(if $($(stripobj)-y), $(call addliba, $($(stripobj)-y)), $@.o)
+
+quiet_cmd_ld-static = KLIBCLD $@
+ cmd_ld-static = $(KLIBCLD) $(KLIBCLDFLAGS) -o $@ \
+ $(EXTRA_KLIBCLDFLAGS) \
+ $(KLIBCCRT0) \
+ $(link-deps) \
+ $(KLIBCLIBC) $(KLIBCLIBGCC)
+
+$(static-y): $(klibc-objs) $(lib-target) FORCE
+ $(call if_changed,ld-static)
+
+quiet_cmd_ld-shared = KLIBCLD $@
+ cmd_ld-shared = $(KLIBCLD) $(KLIBCLDFLAGS) -o $@ \
+ $(EXTRA_KLIBCLDFLAGS) \
+ $(KLIBCEMAIN) $(KLIBCCRTSHARED) \
+ $(link-deps) \
+ $(KLIBCLIBCSHARED) $(KLIBCLIBGCC)
+
+$(shared-y): $(klibc-objs) $(lib-target) FORCE
+ $(call if_changed,ld-shared)
+
+targets += $(klibc-real-objs)
+endif
+
+# Compile programs on the host
+# ===========================================================================
+ifdef hostprogs-y
+include $(srctree)/scripts/Makefile.host
+endif
+
+# Descending
+# ---------------------------------------------------------------------------
+
+.PHONY: $(subdir-y) $(klibc-dirs)
+$(subdir-y) $(klibc-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_klibcld = KLIBCLD $@
+ cmd_klibcld = $(KLIBCLD) -r $(KLIBCLDFLAGS) \
+ $(EXTRA_KLIBCLDFLAGS) $(KLIBCLDFLAGS_$(@F)) \
+ $(filter-out FORCE,$^) -o $@
+
+
+# Link target to a new name
+# ---------------------------------------------------------------------------
+quiet_cmd_ln = LN $@
+ cmd_ln = rm -f $@ && ln $< $@
+
+# Strip target (remove all debugging info)
+quiet_cmd_strip = STRIP $@
+ cmd_strip = $(KLIBCSTRIP) $(KLIBCSTRIPFLAGS) $< -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/Makefile.clean b/scripts/Makefile.clean
new file mode 100644
index 0000000..8974ea5
--- /dev/null
+++ b/scripts/Makefile.clean
@@ -0,0 +1,96 @@
+# ==========================================================================
+# Cleaning up
+# ==========================================================================
+
+src := $(obj)
+
+.PHONY: __clean
+__clean:
+
+# Shorthand for $(Q)$(MAKE) scripts/Makefile.clean obj=dir
+# Usage:
+# $(Q)$(MAKE) $(clean)=dir
+clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj
+
+# The filename Kbuild has precedence over Makefile
+kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
+include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)
+
+# Figure out what we need to build from the various variables
+# ==========================================================================
+
+__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y)))
+subdir-y += $(__subdir-y)
+__subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m)))
+subdir-m += $(__subdir-m)
+__subdir-n := $(patsubst %/,%,$(filter %/, $(obj-n)))
+subdir-n += $(__subdir-n)
+__subdir- := $(patsubst %/,%,$(filter %/, $(obj-)))
+subdir- += $(__subdir-)
+
+# Subdirectories we need to descend into
+
+subdir-ym := $(sort $(subdir-y) $(subdir-m))
+subdir-ymn := $(sort $(subdir-ym) $(subdir-n) $(subdir-))
+
+# Add subdir path
+
+subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn))
+
+# build a list of files to remove, usually releative to the current
+# directory
+
+__clean-files := $(extra-y) $(EXTRA_TARGETS) $(always) \
+ $(targets) $(clean-files) \
+ $(host-progs) \
+ $(hostprogs-y) $(hostprogs-m) $(hostprogs-)
+
+# as clean-files is given relative to the current directory, this adds
+# a $(obj) prefix, except for absolute paths
+
+__clean-files := $(wildcard \
+ $(addprefix $(obj)/, $(filter-out /%, $(__clean-files))) \
+ $(filter /%, $(__clean-files)))
+
+# as clean-dirs is given relative to the current directory, this adds
+# a $(obj) prefix, except for absolute paths
+
+__clean-dirs := $(wildcard \
+ $(addprefix $(obj)/, $(filter-out /%, $(clean-dirs))) \
+ $(filter /%, $(clean-dirs)))
+
+# ==========================================================================
+
+quiet_cmd_clean = CLEAN $(obj)
+ cmd_clean = rm -f $(__clean-files)
+quiet_cmd_cleandir = CLEAN $(__clean-dirs)
+ cmd_cleandir = rm -rf $(__clean-dirs)
+
+
+__clean: $(subdir-ymn)
+ifneq ($(strip $(__clean-files)),)
+ +$(call cmd,clean)
+endif
+ifneq ($(strip $(__clean-dirs)),)
+ +$(call cmd,cleandir)
+endif
+ifneq ($(strip $(clean-rule)),)
+ +$(clean-rule)
+endif
+ @:
+
+
+# ===========================================================================
+# Generic stuff
+# ===========================================================================
+
+# Descending
+# ---------------------------------------------------------------------------
+
+.PHONY: $(subdir-ymn)
+$(subdir-ymn):
+ $(Q)$(MAKE) $(clean)=$@
+
+# If quiet is set, only print short version of command
+
+cmd = @$(if $($(quiet)cmd_$(1)),echo ' $($(quiet)cmd_$(1))' &&) $(cmd_$(1))
diff --git a/scripts/Makefile.host b/scripts/Makefile.host
new file mode 100644
index 0000000..2d51970
--- /dev/null
+++ b/scripts/Makefile.host
@@ -0,0 +1,156 @@
+# ==========================================================================
+# Building binaries on the host system
+# Binaries are used during the compilation of the kernel, for example
+# to preprocess a data file.
+#
+# Both C and C++ is supported, but preferred language is C for such utilities.
+#
+# Samle syntax (see Documentation/kbuild/makefile.txt for reference)
+# hostprogs-y := bin2hex
+# Will compile bin2hex.c and create an executable named bin2hex
+#
+# hostprogs-y := lxdialog
+# lxdialog-objs := checklist.o lxdialog.o
+# Will compile lxdialog.c and checklist.c, and then link the executable
+# lxdialog, based on checklist.o and lxdialog.o
+#
+# hostprogs-y := qconf
+# qconf-cxxobjs := qconf.o
+# qconf-objs := menu.o
+# Will compile qconf as a C++ program, and menu as a C program.
+# They are linked as C++ code to the executable qconf
+
+# hostprogs-y := conf
+# conf-objs := conf.o libkconfig.so
+# libkconfig-objs := expr.o type.o
+# Will create a shared library named libkconfig.so that consist of
+# expr.o and type.o (they are both compiled as C code and the object file
+# are made as position independent code).
+# conf.c is compiled as a c program, and conf.o is linked together with
+# libkconfig.so as the executable conf.
+# Note: Shared libraries consisting of C++ files are not supported
+
+__hostprogs := $(sort $(hostprogs-y)$(hostprogs-m))
+
+# hostprogs-y := tools/build may have been specified. Retreive directory
+obj-dirs += $(foreach f,$(__hostprogs), $(if $(dir $(f)),$(dir $(f))))
+obj-dirs := $(strip $(sort $(filter-out ./,$(obj-dirs))))
+
+
+# C code
+# Executables compiled from a single .c file
+host-csingle := $(foreach m,$(__hostprogs),$(if $($(m)-objs),,$(m)))
+
+# C executables linked based on several .o files
+host-cmulti := $(foreach m,$(__hostprogs),\
+ $(if $($(m)-cxxobjs),,$(if $($(m)-objs),$(m))))
+
+# Object (.o) files compiled from .c files
+host-cobjs := $(sort $(foreach m,$(__hostprogs),$($(m)-objs)))
+
+# C++ code
+# C++ executables compiled from at least on .cc file
+# and zero or more .c files
+host-cxxmulti := $(foreach m,$(__hostprogs),$(if $($(m)-cxxobjs),$(m)))
+
+# C++ Object (.o) files compiled from .cc files
+host-cxxobjs := $(sort $(foreach m,$(host-cxxmulti),$($(m)-cxxobjs)))
+
+# Shared libaries (only .c supported)
+# Shared libraries (.so) - all .so files referenced in "xxx-objs"
+host-cshlib := $(sort $(filter %.so, $(host-cobjs)))
+# Remove .so files from "xxx-objs"
+host-cobjs := $(filter-out %.so,$(host-cobjs))
+
+#Object (.o) files used by the shared libaries
+host-cshobjs := $(sort $(foreach m,$(host-cshlib),$($(m:.so=-objs))))
+
+__hostprogs := $(addprefix $(obj)/,$(__hostprogs))
+host-csingle := $(addprefix $(obj)/,$(host-csingle))
+host-cmulti := $(addprefix $(obj)/,$(host-cmulti))
+host-cobjs := $(addprefix $(obj)/,$(host-cobjs))
+host-cxxmulti := $(addprefix $(obj)/,$(host-cxxmulti))
+host-cxxobjs := $(addprefix $(obj)/,$(host-cxxobjs))
+host-cshlib := $(addprefix $(obj)/,$(host-cshlib))
+host-cshobjs := $(addprefix $(obj)/,$(host-cshobjs))
+obj-dirs := $(addprefix $(obj)/,$(obj-dirs))
+
+#####
+# Handle options to gcc. Support building with separate output directory
+
+_hostc_flags = $(HOSTCFLAGS) $(HOST_EXTRACFLAGS) $(HOSTCFLAGS_$(*F).o)
+_hostcxx_flags = $(HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) $(HOSTCXXFLAGS_$(*F).o)
+
+ifeq ($(KBUILD_SRC),)
+__hostc_flags = $(_hostc_flags)
+__hostcxx_flags = $(_hostcxx_flags)
+else
+__hostc_flags = -I$(obj) $(call flags,_hostc_flags)
+__hostcxx_flags = -I$(obj) $(call flags,_hostcxx_flags)
+endif
+
+hostc_flags = -Wp,-MD,$(depfile) $(__hostc_flags)
+hostcxx_flags = -Wp,-MD,$(depfile) $(__hostcxx_flags)
+
+#####
+# Compile programs on the host
+
+# Create executable from a single .c file
+# host-csingle -> Executable
+quiet_cmd_host-csingle = HOSTCC $@
+ cmd_host-csingle = $(HOSTCC) $(hostc_flags) -o $@ $< \
+ $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
+$(host-csingle): %: %.c FORCE
+ $(call if_changed_dep,host-csingle)
+
+# Link an executable based on list of .o files, all plain c
+# host-cmulti -> executable
+quiet_cmd_host-cmulti = HOSTLD $@
+ cmd_host-cmulti = $(HOSTCC) $(HOSTLDFLAGS) -o $@ \
+ $(addprefix $(obj)/,$($(@F)-objs)) \
+ $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
+$(host-cmulti): %: $(host-cobjs) $(host-cshlib) FORCE
+ $(call if_changed,host-cmulti)
+
+# Create .o file from a single .c file
+# host-cobjs -> .o
+quiet_cmd_host-cobjs = HOSTCC $@
+ cmd_host-cobjs = $(HOSTCC) $(hostc_flags) -c -o $@ $<
+$(host-cobjs): %.o: %.c FORCE
+ $(call if_changed_dep,host-cobjs)
+
+# Link an executable based on list of .o files, a mixture of .c and .cc
+# host-cxxmulti -> executable
+quiet_cmd_host-cxxmulti = HOSTLD $@
+ cmd_host-cxxmulti = $(HOSTCXX) $(HOSTLDFLAGS) -o $@ \
+ $(foreach o,objs cxxobjs,\
+ $(addprefix $(obj)/,$($(@F)-$(o)))) \
+ $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
+$(host-cxxmulti): %: $(host-cobjs) $(host-cxxobjs) $(host-cshlib) FORCE
+ $(call if_changed,host-cxxmulti)
+
+# Create .o file from a single .cc (C++) file
+quiet_cmd_host-cxxobjs = HOSTCXX $@
+ cmd_host-cxxobjs = $(HOSTCXX) $(hostcxx_flags) -c -o $@ $<
+$(host-cxxobjs): %.o: %.cc FORCE
+ $(call if_changed_dep,host-cxxobjs)
+
+# Compile .c file, create position independent .o file
+# host-cshobjs -> .o
+quiet_cmd_host-cshobjs = HOSTCC -fPIC $@
+ cmd_host-cshobjs = $(HOSTCC) $(hostc_flags) -fPIC -c -o $@ $<
+$(host-cshobjs): %.o: %.c FORCE
+ $(call if_changed_dep,host-cshobjs)
+
+# Link a shared library, based on position independent .o files
+# *.o -> .so shared library (host-cshlib)
+quiet_cmd_host-cshlib = HOSTLLD -shared $@
+ cmd_host-cshlib = $(HOSTCC) $(HOSTLDFLAGS) -shared -o $@ \
+ $(addprefix $(obj)/,$($(@F:.so=-objs))) \
+ $(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
+$(host-cshlib): %: $(host-cshobjs) FORCE
+ $(call if_changed,host-cshlib)
+
+targets += $(host-csingle) $(host-cmulti) $(host-cobjs)\
+ $(host-cxxmulti) $(host-cxxobjs) $(host-cshlib) $(host-cshobjs)
+
diff --git a/scripts/basic/Kbuild b/scripts/basic/Kbuild
new file mode 100644
index 0000000..22e09d2
--- /dev/null
+++ b/scripts/basic/Kbuild
@@ -0,0 +1,6 @@
+#
+# Kbuild file to build basic kbuild programs
+#
+
+hostprogs-y := fixdep
+always := $(hostprogs-y)
diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c
new file mode 100644
index 0000000..0b61bea
--- /dev/null
+++ b/scripts/basic/fixdep.c
@@ -0,0 +1,390 @@
+/*
+ * "Optimize" a list of dependencies as spit out by gcc -MD
+ * for the kernel build
+ * ===========================================================================
+ *
+ * Author Kai Germaschewski
+ * Copyright 2002 by Kai Germaschewski <kai.germaschewski@gmx.de>
+ *
+ * This software may be used and distributed according to the terms
+ * of the GNU General Public License, incorporated herein by reference.
+ *
+ *
+ * Introduction:
+ *
+ * gcc produces a very nice and correct list of dependencies which
+ * tells make when to remake a file.
+ *
+ * To use this list as-is however has the drawback that virtually
+ * every file in the kernel includes <linux/config.h> which then again
+ * includes <linux/autoconf.h>
+ *
+ * If the user re-runs make *config, linux/autoconf.h will be
+ * regenerated. make notices that and will rebuild every file which
+ * includes autoconf.h, i.e. basically all files. This is extremely
+ * annoying if the user just changed CONFIG_HIS_DRIVER from n to m.
+ *
+ * So we play the same trick that "mkdep" played before. We replace
+ * the dependency on linux/autoconf.h by a dependency on every config
+ * option which is mentioned in any of the listed prequisites.
+ *
+ * To be exact, split-include populates a tree in include/config/,
+ * e.g. include/config/his/driver.h, which contains the #define/#undef
+ * for the CONFIG_HIS_DRIVER option.
+ *
+ * So if the user changes his CONFIG_HIS_DRIVER option, only the objects
+ * which depend on "include/linux/config/his/driver.h" will be rebuilt,
+ * so most likely only his driver ;-)
+ *
+ * The idea above dates, by the way, back to Michael E Chastain, AFAIK.
+ *
+ * So to get dependencies right, there are two issues:
+ * o if any of the files the compiler read changed, we need to rebuild
+ * o if the command line given to the compile the file changed, we
+ * better rebuild as well.
+ *
+ * The former is handled by using the -MD output, the later by saving
+ * the command line used to compile the old object and comparing it
+ * to the one we would now use.
+ *
+ * Again, also this idea is pretty old and has been discussed on
+ * kbuild-devel a long time ago. I don't have a sensibly working
+ * internet connection right now, so I rather don't mention names
+ * without double checking.
+ *
+ * This code here has been based partially based on mkdep.c, which
+ * says the following about its history:
+ *
+ * Copyright abandoned, Michael Chastain, <mailto:mec@shout.net>.
+ * This is a C version of syncdep.pl by Werner Almesberger.
+ *
+ *
+ * It is invoked as
+ *
+ * fixdep <depfile> <target> <cmdline>
+ *
+ * and will read the dependency file <depfile>
+ *
+ * The transformed dependency snipped is written to stdout.
+ *
+ * It first generates a line
+ *
+ * cmd_<target> = <cmdline>
+ *
+ * and then basically copies the .<target>.d file to stdout, in the
+ * process filtering out the dependency on linux/autoconf.h and adding
+ * dependencies on include/config/my/option.h for every
+ * CONFIG_MY_OPTION encountered in any of the prequisites.
+ *
+ * It will also filter out all the dependencies on *.ver. We need
+ * to make sure that the generated version checksum are globally up
+ * to date before even starting the recursive build, so it's too late
+ * at this point anyway.
+ *
+ * The algorithm to grep for "CONFIG_..." is bit unusual, but should
+ * be fast ;-) We don't even try to really parse the header files, but
+ * merely grep, i.e. if CONFIG_FOO is mentioned in a comment, it will
+ * be picked up as well. It's not a problem with respect to
+ * correctness, since that can only give too many dependencies, thus
+ * we cannot miss a rebuild. Since people tend to not mention totally
+ * unrelated CONFIG_ options all over the place, it's not an
+ * efficiency problem either.
+ *
+ * (Note: it'd be easy to port over the complete mkdep state machine,
+ * but I don't think the added complexity is worth it)
+ */
+/*
+ * Note 2: if somebody writes HELLO_CONFIG_BOOM in a file, it will depend onto
+ * CONFIG_BOOM. This could seem a bug (not too hard to fix), but please do not
+ * fix it! Some UserModeLinux files (look at arch/um/) call CONFIG_BOOM as
+ * UML_CONFIG_BOOM, to avoid conflicts with /usr/include/linux/autoconf.h,
+ * through arch/um/include/uml-config.h; this fixdep "bug" makes sure that
+ * those files will have correct dependencies.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <limits.h>
+#include <ctype.h>
+#include <arpa/inet.h>
+
+#define INT_CONF ntohl(0x434f4e46)
+#define INT_ONFI ntohl(0x4f4e4649)
+#define INT_NFIG ntohl(0x4e464947)
+#define INT_FIG_ ntohl(0x4649475f)
+
+char *target;
+char *depfile;
+char *cmdline;
+
+void usage(void)
+
+{
+ fprintf(stderr, "Usage: fixdep <depfile> <target> <cmdline>\n");
+ exit(1);
+}
+
+void print_cmdline(void)
+{
+ printf("cmd_%s := %s\n\n", target, cmdline);
+}
+
+char * str_config = NULL;
+int size_config = 0;
+int len_config = 0;
+
+/*
+ * Grow the configuration string to a desired length.
+ * Usually the first growth is plenty.
+ */
+void grow_config(int len)
+{
+ while (len_config + len > size_config) {
+ if (size_config == 0)
+ size_config = 2048;
+ str_config = realloc(str_config, size_config *= 2);
+ if (str_config == NULL)
+ { perror("fixdep:malloc"); exit(1); }
+ }
+}
+
+
+
+/*
+ * Lookup a value in the configuration string.
+ */
+int is_defined_config(const char * name, int len)
+{
+ const char * pconfig;
+ const char * plast = str_config + len_config - len;
+ for ( pconfig = str_config + 1; pconfig < plast; pconfig++ ) {
+ if (pconfig[ -1] == '\n'
+ && pconfig[len] == '\n'
+ && !memcmp(pconfig, name, len))
+ return 1;
+ }
+ return 0;
+}
+
+/*
+ * Add a new value to the configuration string.
+ */
+void define_config(const char * name, int len)
+{
+ grow_config(len + 1);
+
+ memcpy(str_config+len_config, name, len);
+ len_config += len;
+ str_config[len_config++] = '\n';
+}
+
+/*
+ * Clear the set of configuration strings.
+ */
+void clear_config(void)
+{
+ len_config = 0;
+ define_config("", 0);
+}
+
+/*
+ * Record the use of a CONFIG_* word.
+ */
+void use_config(char *m, int slen)
+{
+ char s[PATH_MAX];
+ char *p;
+
+ if (is_defined_config(m, slen))
+ return;
+
+ define_config(m, slen);
+
+ memcpy(s, m, slen); s[slen] = 0;
+
+ for (p = s; p < s + slen; p++) {
+ if (*p == '_')
+ *p = '/';
+ else
+ *p = tolower((int)*p);
+ }
+ printf(" $(wildcard include/config/%s.h) \\\n", s);
+}
+
+void parse_config_file(char *map, size_t len)
+{
+ int *end = (int *) (map + len);
+ /* start at +1, so that p can never be < map */
+ int *m = (int *) map + 1;
+ char *p, *q;
+
+ for (; m < end; m++) {
+ if (*m == INT_CONF) { p = (char *) m ; goto conf; }
+ if (*m == INT_ONFI) { p = (char *) m-1; goto conf; }
+ if (*m == INT_NFIG) { p = (char *) m-2; goto conf; }
+ if (*m == INT_FIG_) { p = (char *) m-3; goto conf; }
+ continue;
+ conf:
+ if (p > map + len - 7)
+ continue;
+ if (memcmp(p, "CONFIG_", 7))
+ continue;
+ for (q = p + 7; q < map + len; q++) {
+ if (!(isalnum(*q) || *q == '_'))
+ goto found;
+ }
+ continue;
+
+ found:
+ use_config(p+7, q-p-7);
+ }
+}
+
+/* test is s ends in sub */
+int strrcmp(char *s, char *sub)
+{
+ int slen = strlen(s);
+ int sublen = strlen(sub);
+
+ if (sublen > slen)
+ return 1;
+
+ return memcmp(s + slen - sublen, sub, sublen);
+}
+
+void do_config_file(char *filename)
+{
+ struct stat st;
+ int fd;
+ void *map;
+
+ fd = open(filename, O_RDONLY);
+ if (fd < 0) {
+ fprintf(stderr, "fixdep: ");
+ perror(filename);
+ exit(2);
+ }
+ fstat(fd, &st);
+ if (st.st_size == 0) {
+ close(fd);
+ return;
+ }
+ map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ if ((long) map == -1) {
+ perror("fixdep: mmap");
+ close(fd);
+ return;
+ }
+
+ parse_config_file(map, st.st_size);
+
+ munmap(map, st.st_size);
+
+ close(fd);
+}
+
+void parse_dep_file(void *map, size_t len)
+{
+ char *m = map;
+ char *end = m + len;
+ char *p;
+ char s[PATH_MAX];
+
+ p = strchr(m, ':');
+ if (!p) {
+ fprintf(stderr, "fixdep: parse error\n");
+ exit(1);
+ }
+ memcpy(s, m, p-m); s[p-m] = 0;
+ printf("deps_%s := \\\n", target);
+ m = p+1;
+
+ clear_config();
+
+ while (m < end) {
+ while (m < end && (*m == ' ' || *m == '\\' || *m == '\n'))
+ m++;
+ p = m;
+ while (p < end && *p != ' ') p++;
+ if (p == end) {
+ do p--; while (!isalnum(*p));
+ p++;
+ }
+ memcpy(s, m, p-m); s[p-m] = 0;
+ if (strrcmp(s, "include/linux/autoconf.h") &&
+ strrcmp(s, "arch/um/include/uml-config.h") &&
+ strrcmp(s, ".ver")) {
+ printf(" %s \\\n", s);
+ do_config_file(s);
+ }
+ m = p + 1;
+ }
+ printf("\n%s: $(deps_%s)\n\n", target, target);
+ printf("$(deps_%s):\n", target);
+}
+
+void print_deps(void)
+{
+ struct stat st;
+ int fd;
+ void *map;
+
+ fd = open(depfile, O_RDONLY);
+ if (fd < 0) {
+ fprintf(stderr, "fixdep: ");
+ perror(depfile);
+ exit(2);
+ }
+ fstat(fd, &st);
+ if (st.st_size == 0) {
+ fprintf(stderr,"fixdep: %s is empty\n",depfile);
+ close(fd);
+ return;
+ }
+ map = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ if ((long) map == -1) {
+ perror("fixdep: mmap");
+ close(fd);
+ return;
+ }
+
+ parse_dep_file(map, st.st_size);
+
+ munmap(map, st.st_size);
+
+ close(fd);
+}
+
+void traps(void)
+{
+ static char test[] __attribute__((aligned(sizeof(int)))) = "CONF";
+
+ if (*(int *)test != INT_CONF) {
+ fprintf(stderr, "fixdep: sizeof(int) != 4 or wrong endianess? %#x\n",
+ *(int *)test);
+ exit(2);
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ traps();
+
+ if (argc != 4)
+ usage();
+
+ depfile = argv[1];
+ target = argv[2];
+ cmdline = argv[3];
+
+ print_cmdline();
+ print_deps();
+
+ return 0;
+}
diff --git a/kernel/Kbuild b/usr/Kbuild
similarity index 73%
rename from kernel/Kbuild
rename to usr/Kbuild
index 9df200a..daf5e3f 100644
--- a/kernel/Kbuild
+++ b/usr/Kbuild
@@ -2,14 +2,31 @@
# kbuild file for usr/ - including initramfs image and klibc
#
-obj-y := initramfs_data.o
-always := klibc/libc.a
-hostprogs-y := gen_init_cpio
-clean-files := initramfs_data.cpio.gz initramfs_list
+# klibc definitions - to be moved to top-level Makefile later
+export KLIBCSRC := $(srctree)/$(src)/klibc
+export KLIBCINC := $(srctree)/$(src)/include
+export KLIBCOBJ := $(objtree)/$(obj)/klibc
+CONFIG_KLIBC := 1
-# Build klibc library
-$(obj)/klibc/libc.a: FORCE
- $(Q)$(MAKE) -rR -f $(srctree)/scripts/Kbuild.klibc obj=$(obj)/klibc
+# Klibc binaries
+ifdef CONFIG_KLIBC
+klibc := -f $(srctree)/scripts/Kbuild.klibc obj
+
+.PHONY: klibcdirs
+$(obj)/initramfs_list: klibcdirs
+
+klibcdirs: FORCE
+ $(Q)$(MAKE) $(klibc)=$(src)/klibc
+ $(Q)$(MAKE) $(klibc)=$(src)/kinit
+ $(Q)$(MAKE) $(klibc)=$(src)/utils
+ $(Q)$(MAKE) $(klibc)=$(src)/dash
+ $(Q)$(MAKE) $(klibc)=$(src)/gzip
+endif
+subdir- := klibc kinit utils dash gzip
+
+
+# Generate builtin.o based on initramfs_data.o
+obj-y := initramfs_data.o
# initramfs_data.o contains the initramfs_data.cpio.gz image.
# The image is included using .incbin, a dependency which is not
@@ -34,7 +51,7 @@
$(srctree)/scripts/gen_initramfs_list.sh $(gen_initramfs_args) \
$(quotefixed_initramfs_source)
-$(obj)/initramfs_list: FORCE
+$(obj)/initramfs_list: $(src)/Kbuild FORCE
$(call filechk,initramfs_list)
quiet_cmd_cpio = CPIO $@
@@ -55,8 +72,10 @@
else
# INITRAMFS_SOURCE is not a cpio archive - create one
+hostprogs-y := gen_init_cpio
+
$(obj)/initramfs_data.cpio: $(obj)/gen_init_cpio \
- $(initramfs-y) $(obj)/initramfs_list FORCE
+ $(obj)/initramfs_list FORCE
$(call if_changed,cpio)
targets += initramfs_data.cpio
@@ -64,9 +83,10 @@
endif
-
$(obj)/initramfs_data.cpio.gz: $(initramfs_data_cpio) FORCE
$(call if_changed,gzip)
targets += initramfs_data.cpio.gz
+# Cleaning time
+clean-files := initramfs_data.cpio.gz initramfs_list
diff --git a/usr/kinit/Kbuild b/usr/kinit/Kbuild
new file mode 100644
index 0000000..a2d899e
--- /dev/null
+++ b/usr/kinit/Kbuild
@@ -0,0 +1,27 @@
+#
+# Kbuild file for kinit
+#
+
+static-y := kinit
+kinit-y := kinit.o do_mounts.o nfsroot.o getintfile.o initrd.o
+kinit-y += open.o readfile.o
+
+kinit-y += ipconfig/
+kinit-y += nfsmount/
+
+
+# kinit.c include ipconfig header file
+KLIBCCFLAGS_kinit.o := -I$(srctree)/$(src)/ipconfig
+# So do nfsroot
+KLIBCCFLAGS_nfsroot.o := -I$(srctree)/$(src)/ipconfig -I$(srctree)/$(src)/nfsmount
+
+
+# TODO - stripped image
+
+# Cleaning
+targets := $(static-y) $(shared-y)
+subdir- := ipconfig nfsmount
+
+
+# install binary
+install-y := kinit
diff --git a/kinit/README b/usr/kinit/README
similarity index 100%
rename from kinit/README
rename to usr/kinit/README
diff --git a/kinit/do_mounts.c b/usr/kinit/do_mounts.c
similarity index 100%
rename from kinit/do_mounts.c
rename to usr/kinit/do_mounts.c
diff --git a/kinit/do_mounts.h b/usr/kinit/do_mounts.h
similarity index 100%
rename from kinit/do_mounts.h
rename to usr/kinit/do_mounts.h
diff --git a/kinit/getintfile.c b/usr/kinit/getintfile.c
similarity index 100%
rename from kinit/getintfile.c
rename to usr/kinit/getintfile.c
diff --git a/kinit/initrd.c b/usr/kinit/initrd.c
similarity index 100%
rename from kinit/initrd.c
rename to usr/kinit/initrd.c
diff --git a/usr/kinit/ipconfig/Kbuild b/usr/kinit/ipconfig/Kbuild
new file mode 100644
index 0000000..7f8d181
--- /dev/null
+++ b/usr/kinit/ipconfig/Kbuild
@@ -0,0 +1,31 @@
+#
+# Kbuild file for ipconfig
+#
+
+static-y := static/ipconfig
+shared-y := shared/ipconfig
+
+# common .o files
+objs := main.o netdev.o packet.o
+# dhcp
+objs += dhcp_proto.o
+# bootp
+objs += bootp_proto.o
+
+
+# TODO - do we want a stripped version
+# TODO - do we want the static.g + shared.g directories?
+
+
+# Create built-in.o with all object files (used by kinit)
+lib-y := $(objs)
+
+# .o files used to built executables
+static/ipconfig-y := $(objs)
+shared/ipconfig-y := $(objs)
+
+# Cleaning
+clean-dirs := static shared
+
+# install binary
+install-y := $(shared-y)
diff --git a/ipconfig/README b/usr/kinit/ipconfig/README
similarity index 100%
rename from ipconfig/README
rename to usr/kinit/ipconfig/README
diff --git a/ipconfig/bootp_packet.h b/usr/kinit/ipconfig/bootp_packet.h
similarity index 100%
rename from ipconfig/bootp_packet.h
rename to usr/kinit/ipconfig/bootp_packet.h
diff --git a/ipconfig/bootp_proto.c b/usr/kinit/ipconfig/bootp_proto.c
similarity index 100%
rename from ipconfig/bootp_proto.c
rename to usr/kinit/ipconfig/bootp_proto.c
diff --git a/ipconfig/bootp_proto.h b/usr/kinit/ipconfig/bootp_proto.h
similarity index 100%
rename from ipconfig/bootp_proto.h
rename to usr/kinit/ipconfig/bootp_proto.h
diff --git a/ipconfig/dhcp_proto.c b/usr/kinit/ipconfig/dhcp_proto.c
similarity index 100%
rename from ipconfig/dhcp_proto.c
rename to usr/kinit/ipconfig/dhcp_proto.c
diff --git a/ipconfig/dhcp_proto.h b/usr/kinit/ipconfig/dhcp_proto.h
similarity index 100%
rename from ipconfig/dhcp_proto.h
rename to usr/kinit/ipconfig/dhcp_proto.h
diff --git a/ipconfig/ipconfig.h b/usr/kinit/ipconfig/ipconfig.h
similarity index 100%
rename from ipconfig/ipconfig.h
rename to usr/kinit/ipconfig/ipconfig.h
diff --git a/ipconfig/main.c b/usr/kinit/ipconfig/main.c
similarity index 100%
rename from ipconfig/main.c
rename to usr/kinit/ipconfig/main.c
diff --git a/ipconfig/netdev.c b/usr/kinit/ipconfig/netdev.c
similarity index 100%
rename from ipconfig/netdev.c
rename to usr/kinit/ipconfig/netdev.c
diff --git a/ipconfig/netdev.h b/usr/kinit/ipconfig/netdev.h
similarity index 100%
rename from ipconfig/netdev.h
rename to usr/kinit/ipconfig/netdev.h
diff --git a/ipconfig/packet.c b/usr/kinit/ipconfig/packet.c
similarity index 100%
rename from ipconfig/packet.c
rename to usr/kinit/ipconfig/packet.c
diff --git a/ipconfig/packet.h b/usr/kinit/ipconfig/packet.h
similarity index 100%
rename from ipconfig/packet.h
rename to usr/kinit/ipconfig/packet.h
diff --git a/kinit/kinit.c b/usr/kinit/kinit.c
similarity index 100%
rename from kinit/kinit.c
rename to usr/kinit/kinit.c
diff --git a/kinit/kinit.h b/usr/kinit/kinit.h
similarity index 100%
rename from kinit/kinit.h
rename to usr/kinit/kinit.h
diff --git a/usr/kinit/nfsmount/Kbuild b/usr/kinit/nfsmount/Kbuild
new file mode 100644
index 0000000..6759ee3
--- /dev/null
+++ b/usr/kinit/nfsmount/Kbuild
@@ -0,0 +1,27 @@
+#
+# kbuild file for nfsmount
+#
+
+static-y := static/nfsmount
+#FIXME - build is broken static-y := dummypmap
+shared-y := shared/nfsmount
+
+objs := main.o mount.o portmap.o dummypmap.o sunrpc.o
+
+# Create built-in.o with all .o files (used by kinit)
+lib-y := $(objs)
+
+# .o files used for executables
+static/nfsmount-y := $(objs)
+shared/nfsmount-y := $(objs)
+
+# dummypmap uses a single .o file (rename src file?)
+dummypmap-y := dummypmap_test.o
+
+# TODO - do we want a stripped version
+# TODO - do we want the static.g + shared.g directories?
+
+clean-dirs := static shared
+
+# Install binary
+install-y := $(shared-y)
diff --git a/nfsmount/README.locking b/usr/kinit/nfsmount/README.locking
similarity index 100%
rename from nfsmount/README.locking
rename to usr/kinit/nfsmount/README.locking
diff --git a/nfsmount/dummypmap.c b/usr/kinit/nfsmount/dummypmap.c
similarity index 100%
rename from nfsmount/dummypmap.c
rename to usr/kinit/nfsmount/dummypmap.c
diff --git a/nfsmount/dummypmap.h b/usr/kinit/nfsmount/dummypmap.h
similarity index 100%
rename from nfsmount/dummypmap.h
rename to usr/kinit/nfsmount/dummypmap.h
diff --git a/nfsmount/dummypmap_test.c b/usr/kinit/nfsmount/dummypmap_test.c
similarity index 100%
rename from nfsmount/dummypmap_test.c
rename to usr/kinit/nfsmount/dummypmap_test.c
diff --git a/nfsmount/main.c b/usr/kinit/nfsmount/main.c
similarity index 100%
rename from nfsmount/main.c
rename to usr/kinit/nfsmount/main.c
diff --git a/nfsmount/mount.c b/usr/kinit/nfsmount/mount.c
similarity index 100%
rename from nfsmount/mount.c
rename to usr/kinit/nfsmount/mount.c
diff --git a/nfsmount/nfsmount.h b/usr/kinit/nfsmount/nfsmount.h
similarity index 100%
rename from nfsmount/nfsmount.h
rename to usr/kinit/nfsmount/nfsmount.h
diff --git a/nfsmount/portmap.c b/usr/kinit/nfsmount/portmap.c
similarity index 100%
rename from nfsmount/portmap.c
rename to usr/kinit/nfsmount/portmap.c
diff --git a/nfsmount/sunrpc.c b/usr/kinit/nfsmount/sunrpc.c
similarity index 100%
rename from nfsmount/sunrpc.c
rename to usr/kinit/nfsmount/sunrpc.c
diff --git a/nfsmount/sunrpc.h b/usr/kinit/nfsmount/sunrpc.h
similarity index 100%
rename from nfsmount/sunrpc.h
rename to usr/kinit/nfsmount/sunrpc.h
diff --git a/kinit/nfsroot.c b/usr/kinit/nfsroot.c
similarity index 100%
rename from kinit/nfsroot.c
rename to usr/kinit/nfsroot.c
diff --git a/kinit/open.c b/usr/kinit/open.c
similarity index 100%
rename from kinit/open.c
rename to usr/kinit/open.c
diff --git a/kinit/readfile.c b/usr/kinit/readfile.c
similarity index 100%
rename from kinit/readfile.c
rename to usr/kinit/readfile.c
diff --git a/utils/Kbuild b/utils/Kbuild
new file mode 100644
index 0000000..f983325
--- /dev/null
+++ b/utils/Kbuild
@@ -0,0 +1,54 @@
+#
+# Kbuild file for klib utils
+#
+
+progs := chroot dd fstype mkdir mkfifo mount pivot_root umount
+progs += true false sleep ln nuke minips run-init cat
+progs += insmod uname
+
+static-y := $(addprefix static/, $(progs))
+shared-y := $(addprefix shared/, $(progs))
+
+# The binary is placed in a subdir, so we need to tell kbuild this
+static/chroot-y := chroot.o
+shared/chroot-y := chroot.o
+static/dd-y := dd.o
+shared/dd-y := dd.o
+static/fstype-y := fstype.o
+shared/fstype-y := fstype.o
+static/mkdir-y := mkdir.o file_mode.o
+shared/mkdir-y := mkdir.o file_mode.o
+static/mkfifo-y := mkfifo.o file_mode.o
+shared/mkfifo-y := mkfifo.o file_mode.o
+static/mount-y := mount_main.o mount_opts.o
+shared/mount-y := mount_main.o mount_opts.o
+static/pivot_root-y := pivot_root.o
+shared/pivot_root-y := pivot_root.o
+static/umount-y := umount.o
+shared/umount-y := umount.o
+static/true-y := true.o
+shared/true-y := true.o
+static/false-y := false.o
+shared/false-y := false.o
+static/sleep-y := sleep.o
+shared/sleep-y := sleep.o
+static/ln-y := ln.o
+shared/ln-y := ln.o
+static/nuke-y := nuke.o
+shared/nuke-y := nuke.o
+static/minips-y := minips.o
+shared/minips-y := minips.o
+static/run-init-y := run-init.o
+shared/run-init-y := run-init.o
+static/cat-y := cat.o
+shared/cat-y := cat.o
+static/insmod-y := insmod.o
+shared/insmod-y := insmod.o
+static/uname-y := uname.o
+shared/uname-y := uname.o
+
+# Clean deletes the static and shared dir
+clean-dirs := static shared
+
+# install only install the shared binaries
+install-y := $(shared-y)
diff --git a/utils/Makefile b/utils/Makefile
deleted file mode 100644
index 336e1e9..0000000
--- a/utils/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-SRCROOT = ..
-include ../MCONFIG
-include ../MRULES
-
-MAKEDEPS = -Wp,-MD,.$(subst /,-,$*).d
-CFLAGS = $(MAKEDEPS) $(OPTFLAGS) $(REQFLAGS) -W -Wall
-LIBS = $(KLIBC) $(LIBGCC)
-PROGS := chroot dd fstype mkdir mkfifo mount pivot_root umount \
- true false sleep ln nuke minips run-init cat \
- insmod uname
-STATICPROGS := $(patsubst %,static/%,$(PROGS))
-SHAREDPROGS := $(patsubst %,shared/%,$(PROGS))
-OBJS := $(patsubst %,%.o,$(PROGS))
-LIBOBJS = file_mode.o
-LIBUTILS = libutils.a
-
-all: $(STATICPROGS) $(SHAREDPROGS)
-
-.SECONDARY: $(OBJS)
-
-static/%: %.o $(CRT0) $(LIBS) $(LIBUTILS)
- mkdir -p static static.g
- $(LD) $(LDFLAGS) -o $@ $(CRT0) $< $(LIBUTILS) $(LIBS)
- cp -f $@ static.g
- $(STRIPCMD) $@
-
-shared/%: %.o $(CRTSHARED) $(LIBSHARED) $(LIBUTILS)
- mkdir -p shared shared.g
- $(LD) $(LDFLAGS) -o $@ $(EMAIN) $(CRTSHARED) $< $(LIBUTILS) \
- -R $(LIBSHARED) $(LIBGCC)
- cp -f $@ shared.g
- $(STRIPCMD) $@
-
-# Programs that consist of more than one file
-mount.o: mount_main.o mount_opts.o
- $(LD) $(LDFLAGS) -r -o $@ $^
-
-$(LIBUTILS): $(LIBOBJS)
- -rm -f $@
- $(AR) cq $@ $^
- $(RANLIB) $@
-
-$(CRT0) $(LIBS):
- @echo '*** error: $@ not up to date' || exit 1
-
-clean:
- $(RM) *.o core $(LIBUTILS) $(PROGS) .*.d
- $(RM) -rf static static.g shared shared.g
-
-spotless: clean
- $(RM) *~
-
-install: all
- $(INSTALL_EXEC) shared/* $(INSTALLROOT)$(INSTALLDIR)/$(CROSS)bin
-ifneq ($(wildcard .*.d),)
-include $(wildcard .*.d)
-endif
diff --git a/utils/sleep.c b/utils/sleep.c
index 769b456..0c2ebcb 100644
--- a/utils/sleep.c
+++ b/utils/sleep.c
@@ -1,23 +1,26 @@
#include <stdio.h>
#include <stdlib.h>
+#include <time.h>
+#include <errno.h>
int main(int argc, char *argv[])
{
- unsigned long s;
+ struct timespec ts;
char *p;
if (argc != 2)
goto err;
- s = strtoul(argv[1], &p, 10);
+ p = strtotimespec(argv[1], &ts);
if ( *p )
goto err;
- sleep(s);
+ while ( nanosleep(&ts, &ts) == -1 && errno == EINTR )
+ ;
return 0;
err:
- fprintf(stderr, "Usage: %s seconds\n", argv[0]);
+ fprintf(stderr, "Usage: %s seconds[.fraction]\n", argv[0]);
return 1;
}