[klibc] klibc: kbuild improvements

Sam Ravnborg sam at ravnborg.org
Sun Oct 5 00:07:01 PDT 2003


Hi Bryan and other klibc people.

I have taken a stamp on the Makefiles for klibc, this is what
I came up with.
1) No longer recompile on every invocation
2) Correct checking on dependencies
3) Simpler makefile syntax (almost all over the place)

I compile-time tested it only.
Two open issues:
a) Do we realy use .a files for initramfs. I renemed that to the
executable.

b) I renamed nfsmount/main.c to nfsmount/nfsmount.c
Similar for ipconfig. THIS IS NOT IN THE PATCH.

I have it in bk, but this is mainly for review - whatever.
I will push it when  have made a few more changes.

Are there any plans to upgrade to lastest -test soon?
It may cause some problems in the top-level Makefile, and usr/Makefile.
I will be happy to sort any kbuild problems out if needed.

PS. Not subscribed to klibc at zytor.com - how do I do that?
    Already tried majordome at zytor.com - no luck.

	Sam

===== Makefile 1.415 vs edited =====
--- 1.415/Makefile	Thu Jul 31 22:15:44 2003
+++ edited/Makefile	Sat Oct  4 06:51:19 2003
@@ -255,7 +255,7 @@
 
 include $(KLIBSRC)/arch/$(ARCH)/MCONFIG
 
-export	USERLD USERCC USERAR USERSTRIP USERNM				\
+export	KLIBSRC USERLD USERCC USERAR USERSTRIP USERNM			\
 	USERCFLAGS USERAFLAGS USERLIBGCC USERSHAREDFLAGS USERSTRIPFLAGS \
 	USERCRT0 USERLIBC
 
===== scripts/Makefile.user 1.3 vs edited =====
--- 1.3/scripts/Makefile.user	Tue Jun 10 05:56:56 2003
+++ edited/scripts/Makefile.user	Sat Oct  4 22:47:02 2003
@@ -13,7 +13,7 @@
 
 objectify	 = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
 
-build-multi	:= $(foreach o,$(build-targets),$(if $(deps_$(o)),$(o)))
+build-multi	:= $(foreach o,$(targets),$(if $(deps_$(o)),$(o)))
 build-y		:= $(foreach o,$(build-multi),$(deps_$(o)))
 
 include scripts/Makefile.lib
@@ -22,7 +22,7 @@
 build-y		:= $(call objectify,$(build-y))
 real-objs-y	+= $(build-y)
 
-__build: $(subdir-ym) $(build-targets)
+__build: $(subdir-ym) $(always)
 	@:
 
 # Compile C sources (.c)
@@ -32,19 +32,19 @@
 	$(NOSTDINC_FLAGS)
 
 quiet_cmd_cc_s_c = USERCC  $@
-cmd_cc_s_c       = $(USERCC) $(usercflags) -S -o $@ $< 
+      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 $@ $<
+      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 $@ $<
+      cmd_cc_o_c = $(USERCC) $(usercflags) -c -o $@ $<
 
 %.o: %.c FORCE
 	$(call if_changed_dep,cc_o_c)
@@ -55,23 +55,23 @@
 useraflags	= -Wp,-MD,$(depfile) $(USERAFLAGS) $(NOSTDINC_FLAGS)
 
 quiet_cmd_as_s_S = USERCPP $@
-cmd_as_s_S       = $(USERCPP) $(useraflags)   -o $@ $< 
+      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 $@ $<
+      cmd_as_o_S = $(USERCC) $(useraflags) -c -o $@ $<
 
 %.o: %.S FORCE
 	$(call if_changed_dep,as_o_S)
 
-targets += $(real-objs-y) $(build-targets)
+targets += $(real-objs-y) $(targets)
 
 # User defined commands...
 # ==========================================================================
 
-$(build-multi) : %: $(build-y) FORCE
+$(build-multi): FORCE
 	$(call if_changed,$(subst $(obj)/,,$@))
 
 # Compile userspace programs for the target
@@ -81,18 +81,38 @@
 
 user-progs	:= $(addprefix $(obj)/,$(user-progs))
 user-single	:= $(user-progs)
+__build	: $(user-progs)
 
 quiet_cmd_user-ld-single = USERLD  $@
       cmd_user-ld-single = $(USERLD) $(USERLDFLAGS) -o $@ 		\
-			   $(USERCRT0) $< $(USERLIBC) $(USERLIBGCC);	\
+			   --start-group				\
+			   $(filter-out FORCE,$^)		        \
+			   --end-group $(USERLIBGCC);			\
 			   $(USERSTRIP) $(USERSTRIPFLAGS) $@
 
-$(user-single): %: %.o FORCE
+$(user-single): %: %.o $(USERCRT0) $(USERLIBC) FORCE
 	$(call if_changed,user-ld-single)
 
 targets += $(user-single) $(user-single:=.o)
 
 endif
+
+ifdef user-libs
+
+user-libs	:= $(addprefix $(obj)/,$(user-libs))
+user-lib-single	:= $(user-libs)
+__build	: $(user-libs)
+
+quiet_cmd_user-ar-single = USERAR  $@
+      cmd_user-ar-single = $(USERAR) cru $@ $(filter-out FORCE,$^)
+
+$(user-lib-single): %.a: %.o FORCE
+	$(call if_changed,user-ar-single)
+
+targets += $(user-lib-single)
+
+endif
+
 
 # Compile programs on the host
 # ===========================================================================
===== usr/Makefile 1.11 vs edited =====
--- 1.11/usr/Makefile	Thu Jul 31 22:19:05 2003
+++ edited/usr/Makefile	Sat Oct  4 22:40:56 2003
@@ -2,8 +2,6 @@
 
 host-progs  := gen_init_cpio
 
-HOSTCC += -I$(TOPDIR)/include
-
 clean-files := initramfs_data.cpio.gz
 
 # initramfs_data.o contains the initramfs_data.cpio.gz image.
@@ -16,9 +14,16 @@
 # but we need the information for the build as well, so it's duplicated
 # here.
 
-initramfs-$(CONFIG_USR_KINIT) :=	$(obj)/kinit/kinit
-initramfs-$(CONFIG_IP_PNP) +=		$(obj)/ipconfig/libipconfig.a
-initramfs-$(CONFIG_ROOT_NFS) +=		$(obj)/nfsmount/libnfsmount.a
+initramfs-$(CONFIG_IP_PNP)	:= $(obj)/ipconfig/ipconfig
+usr_sdirs-$(CONFIG_IP_PNP)	:= $(obj)/ipconfig
+
+initramfs-$(CONFIG_ROOT_NFS)	+= $(obj)/nfsmount/nfsmount
+usr_sdirs-$(CONFIG_ROOT_NFS)	+= $(obj)/nfsmount
+
+# kinit uses .a files from nfsmount and ipconfig
+$(obj)/kinit/kinit: $(usr_sdirs-y)
+initramfs-$(CONFIG_USR_KINIT)	+= $(obj)/kinit/kinit
+usr_sdirs-$(CONFIG_USR_KINIT)	+= $(obj)/kinit
 
 quiet_cmd_cpio = CPIO    $@
       cmd_cpio = ./$< $(obj) > $@
@@ -28,23 +33,21 @@
 
 targets += initramfs_data.cpio
 
-usr_subdirs-y :=
-usr_subdirs-$(CONFIG_ROOT_NFS) += $(obj)/nfsmount
-usr_subdirs-$(CONFIG_IP_PNP) += $(obj)/ipconfig
-usr_subdirs-$(CONFIG_USR_KINIT) += $(obj)/kinit
+$(obj)/initramfs_data.cpio.gz: $(obj)/initramfs_data.cpio FORCE
+	$(call if_changed,gzip)
+
+targets += initramfs_data.cpio.gz
 
-ifdef CONFIG_USR_KINIT
-$(initramfs-y): $(usr_subdirs-y)
 
-$(usr_subdirs-y): $(obj)/lib
+# Which targets do we need to update before building the initramfs
+$(initramfs-y): $(usr_sdirs-y)
 
-.PHONY: $(obj)/lib $(usr_subdirs-y)
+# Traverse subdirectorie first, but make sure lib/ is build before
+# all others - they need it
 
-$(obj)/lib $(usr_subdirs-y):
-	$(Q)$(MAKE) $(user)=$@
-endif
+.PHONY: $(obj)/lib $(usr_sdirs-y)
+$(usr_sdirs-y): $(obj)/lib
 
-$(obj)/initramfs_data.cpio.gz: $(obj)/initramfs_data.cpio FORCE
-	$(call if_changed,gzip)
+$(obj)/lib $(usr_sdirs-y): FORCE
+	$(Q)$(MAKE) $(user)=$@
 
-targets += initramfs_data.cpio.gz
===== usr/gen_init_cpio.c 1.6 vs edited =====
--- 1.6/usr/gen_init_cpio.c	Wed Jul  9 07:35:07 2003
+++ edited/usr/gen_init_cpio.c	Sat Oct  4 07:39:26 2003
@@ -8,10 +8,7 @@
 #include <time.h>
 #include <fcntl.h>
 
-#include <config/usr/klibc.h>
-#ifdef CONFIG_USR_KLIBC
-#include <config/usr/kinit.h>
-#endif
+#include <linux/config.h>
 
 static unsigned int offset;
 static unsigned int ino = 721;
===== usr/ipconfig/Makefile 1.3 vs edited =====
--- 1.3/usr/ipconfig/Makefile	Mon May 26 07:20:31 2003
+++ edited/usr/ipconfig/Makefile	Sat Oct  4 22:03:13 2003
@@ -1,18 +1,11 @@
-user-progs	:= $(obj)/ipconfig
-build-targets	:= $(obj)/ipconfig $(obj)/ipconfig.a
-objs		:= main.o netdev.o packet.o dhcp_proto.o bootp_proto.o
-LIBS		:= $(USERLIBC) $(USERLIBGCC)
+user-progs	:= ipconfig
+user-libs	:= ipconfig.a
 
-OBJS := $(objs:%=$(obj)/%)
+#Objects build in local directory
+objs	:= netdev.o packet.o dhcp_proto.o bootp_proto.o
 
-quiet_cmd_ipconfig = USERLD  $@
-      cmd_ipconfig = $(USERLD) $(USERLDFLAGS) -o $@ $^
+targets	:= $(objs)
+objs    := $(addprefix $(obj)/,$(objs))
 
-$(obj)/ipconfig: $(USERCRT0) $(OBJS) $(LIBS)
-	$(call if_changed,ipconfig)
-
-quiet_cmd_ipconfig.a = USERAR  $@
-      cmd_ipconfig.a = $(USERAR) cru $@ $^
-
-$(obj)/ipconfig.a: $(OBJS)
-	$(call if_changed,ipconfig.a)
+$(obj)/ipconfig   : $(objs)
+$(obj)/ipconfig.a : $(objs)
===== usr/kinit/Makefile 1.4 vs edited =====
--- 1.4/usr/kinit/Makefile	Tue Jun 10 05:56:57 2003
+++ edited/usr/kinit/Makefile	Sat Oct  4 22:01:55 2003
@@ -1,17 +1,17 @@
-user-progs	:= $(obj)/kinit
-build-targets	:= $(obj)/kinit
-objs		:= kinit.o nfsroot.o do_mounts.o
-USERCFLAGS	+= -I$(src)/../ipconfig -I$(src)/../nfsmount
+# Makefile for kinit - tiny init program
+user-progs	:= kinit
 
-LIBS-y		:=
-LIBS-$(CONFIG_IP_PNP) += $(obj)/../ipconfig/ipconfig.a
-LIBS-$(CONFIG_ROOT_NFS) += $(obj)/../nfsmount/nfsmount.a
-LIBS-y += $(USERLIBC) $(USERLIBGCC)
+# Needs header files here
+USERCFLAGS	+= -I$(obj)/../ipconfig -I$(obj)/../nfsmount
 
-OBJS := $(objs:%=$(obj)/%)
+# objects build in this directory
+objs	:= nfsroot.o do_mounts.o
 
-quiet_cmd_kinit = USERLD  $@
-      cmd_kinit = $(USERLD) $(USERLDFLAGS) -o $@ $^
+targets := $(objs)
+objs	:= $(addprefix $(obj)/,$(objs))
 
-$(obj)/kinit: $(USERCRT0) $(OBJS) $(LIBS-y)
-	$(call if_changed,kinit)
+libs-$(CONFIG_IP_PNP)	+= $(obj)/../ipconfig/ipconfig.a
+libs-$(CONFIG_ROOT_NFS)	+= $(obj)/../nfsmount/nfsmount.a
+
+# Must list local dependencies here
+$(obj)/kinit: $(objs) $(libs-y)
===== usr/lib/Makefile 1.8 vs edited =====
--- 1.8/usr/lib/Makefile	Mon May 26 06:50:43 2003
+++ edited/usr/lib/Makefile	Fri Oct  3 23:33:54 2003
@@ -28,11 +28,6 @@
 	  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
-SOLIB   = libc.so
-SOHASH  = klibc.so
-
-CRT0    = crt0.o
-LIB     = libc.a
 
 # Add any architecture-specific rules
 include $(src)/arch/$(ARCH)/Makefile.inc
@@ -44,73 +39,76 @@
 quiet_cmd_objs.mk = GEN     $@
       cmd_objs.mk = $(PERL) $(word 2,$^) $(ARCH) $(obj) $< > $@
 
+clean-files += syscalls.mk syscalls/*.[cS] 
 $(obj)/syscalls.mk: $(src)/SYSCALLS $(src)/syscalls.pl
-	$(call if_changed,objs.mk)
+	$(call cmd,objs.mk)
 
+clean-files += socketcalls.mk socketcalls/*.[cS] 
 $(obj)/socketcalls.mk: $(src)/SOCKETCALLS $(src)/socketcalls.pl
-	$(call if_changed,objs.mk)
+	$(call cmd,objs.mk)
 
 # That's what we're supposed to build
 
-build-targets	:= $(obj)/crt0.o $(obj)/libc.a $(obj)/libc.so $(obj)/klibc.so
+always		:= crt0.o libc.a libc.so klibc.so
+host-progs	:= sha1hash
 
-host-progs	:= $(obj)/sha1hash
-
-$(obj)/sha1hash: $(src)/sha1hash.c
-	$(HOSTCC) -o $@ $^
+defdep = $(obj)/$(1): $(addprefix $(obj)/,$(deps_$(1)))
 
 # crt0.o
-
-quiet_cmd_cp = CP      $@
-      cmd_cp = cp $< $@
-
-$(obj)/crt0.o: $(obj)/arch/$(ARCH)/crt0.o
-	$(call if_changed,cp)
-
-targets += $(obj)/crt0.o $(obj)/arch/$(ARCH)/crt0.o
+targets			+= crt0.o
+deps_crt0.o		:= arch/$(ARCH)/crt0.o
+$(call defdep,crt0.o)
+quiet_cmd_crt0.o	 = CP      $@
+      cmd_crt0.o         = cp $(word 2,$^) $@
 
 # static lib
+dep_libc = $(LIBOBJS) $(ARCHOBJS) $(syscall-objs) $(socketcall-objs)
 
-deps_libc.a = __static_init.o $(LIBOBJS) $(ARCHOBJS) 		\
-	$(syscall-objs) $(socketcall-objs)
-quiet_cmd_libc.a = USERAR  $@
-      cmd_libc.a = rm -f $@; $(USERAR) rcs $@ $^
-
-$(obj)/libc.a: $(deps_libc.a:%=$(obj)/%)
-	$(call if_changed,libc.a)
+targets			+= libc.a
+deps_libc.a		:= __static_init.o $(dep_libc)
+$(call defdep,libc.a)
+quiet_cmd_libc.a	 = USERAR  $@
+      cmd_libc.a	 = rm -f $@; $(USERAR) rcs $@ $(filter-out FORCE,$^)
 
 # shared lib
+targets			+= libc.so
+deps_libc.so		:= crt0.o __shared_init.o $(dep_libc)
+$(call defdep,libc.so)
+quiet_cmd_libc.so	 = LD      $@
+      cmd_libc.so	 = $(USERLD) $(USERLDFLAGS) $(USERSHAREDFLAGS) -o $@ $(filter-out FORCE,$^)
+
+targets			+= klibc.so
+deps_klibc.so		:= libc.so libc.so.hash
+$(call defdep,klibc.so)
+quiet_cmd_klibc.so	 = GEN     $@
+      cmd_klibc.so	 = cp $(word 2,$^) $@;$(USERSTRIP) $(USERSTRIPFLAGS) $@;	\
+			     rm -f $(obj)/klibc-??????????????????????.so;	\
+			     ln -f $@ $(obj)/klibc-`cat $(obj)/libc.so.hash`.so
+
+# Hash variant of libc
+
+targets			+= libc.so.hash
+deps_libc.so.hash	:= libc.so sha1hash
+$(call defdep,libc.so.hash)
+quiet_cmd_libc.so.hash	 = HASH    $@
+      cmd_libc.so.hash	 = $(USERNM) $(word 2,$^) | egrep '^[0-9a-fA-F]+ [ADRTW] ' | \
+				sort | $(obj)/sha1hash > $@
 
-deps_libc.so      = crt0.o __shared_init.o $(LIBOBJS) $(ARCHOBJS)	\
-		    $(syscall-objs) $(socketcall-objs)
-quiet_cmd_libc.so = LD      $@
-      cmd_libc.so = $(USERLD) $(USERLDFLAGS) $(USERSHAREDFLAGS) -o $@ $^
-
-$(obj)/libc.so: $(deps_libc.so:%=$(obj)/%) $(USERLIBGCC)
-	$(call if_changed,libc.so)
+# Additional cleanup upon make clean
+clean-files += *.so *.hash 
 
-quiet_cmd_klibc.so = GEN     $@
-      cmd_klibc.so = cp $< $@;$(USERSTRIP) $(USERSTRIPFLAGS) $@;	\
-		     rm -f $(obj)/klibc-??????????????????????.so;	\
-		     ln -f $@ $(obj)/klibc-`cat $(obj)/libc.so.hash`.so
 
-$(obj)/klibc.so: $(obj)/libc.so $(obj)/libc.so.hash
-	$(call if_changed,klibc.so)
 
-targets += $(obj)/klibc.so
 
-#
 
-quiet_cmd_libc.so.hash = HASH    $@
-      cmd_libc.so.hash = $(USERNM) $< | egrep '^[0-9a-fA-F]+ [ADRTW] ' | \
-			 sort | $(obj)/sha1hash > $@
 
-$(obj)/libc.so.hash: $(obj)/libc.so $(obj)/sha1hash
-	$(call if_changed,libc.so.hash)
+ifdef notdef
 
-targets += $(obj)/libc.so.hash
+SOLIB   = libc.so
+SOHASH  = klibc.so
 
-ifdef notdef
+CRT0    = crt0.o
+LIB     = libc.a
 
 TESTS   = $(patsubst %.c,%,$(wildcard tests/*.c)) \
 	  $(patsubst %.c,%.shared,$(wildcard tests/*.c))
@@ -140,6 +138,3 @@
 
 endif
 
-clean-files := syscalls/*.[cS] syscalls.mk				\
-	       socketcalls/*.[cS] socketcalls.mk			\
-	       *.so *.hash 
===== usr/nfsmount/Makefile 1.2 vs edited =====
--- 1.2/usr/nfsmount/Makefile	Mon May 26 07:19:57 2003
+++ edited/usr/nfsmount/Makefile	Sat Oct  4 14:26:20 2003
@@ -1,18 +1,12 @@
-user-progs	:= $(obj)/nfsmount
-build-targets	:= $(obj)/nfsmount $(obj)/nfsmount.a
-objs		:= main.o mount.o portmap.o sunrpc.o
-LIBS		:= $(USERLIBC) $(USERLIBGCC)
+user-progs	:= nfsmount
+user-libs	:= nfsmount.a
 
-OBJS := $(objs:%=$(obj)/%)
+#Objects build in local directory
+objs	:= mount.o portmap.o sunrpc.o
 
-quiet_cmd_nfsmount = USERLD  $@
-      cmd_nfsmount = $(USERLD) $(USERLDFLAGS) -o $@ $^
+targets	:= $(objs)
+objs	:= $(addprefix $(obj)/,$(objs))
 
-$(obj)/nfsmount: $(USERCRT0) $(OBJS) $(LIBS)
-	$(call if_changed,nfsmount)
-
-quiet_cmd_nfsmount.a = USERAR  $@
-      cmd_nfsmount.a = $(USERAR) cru $@ $^
-
-$(obj)/nfsmount.a: $(OBJS)
-	$(call if_changed,nfsmount.a)
+# Must list explicit dependencies
+$(obj)/nfsmount:   $(objs)
+$(obj)/nfsmount.a: $(objs)


More information about the klibc mailing list