support objdir != srcdir
authorMathieu Lacage <mathieu.lacage@inria.fr>
Wed, 18 May 2011 00:02:42 +0200
changeset 45 532107bb1271
parent 42 31a9a363c2d3
child 46 e24d020aa31d
support objdir != srcdir
Makefile
Makefile.print
generate-autoconf.py
--- a/Makefile	Tue Feb 01 13:31:43 2011 +0100
+++ b/Makefile	Wed May 18 00:02:42 2011 +0200
@@ -1,7 +1,9 @@
-INSTALL_DIR=objdir
+SRCDIR=$(dir $(firstword $(MAKEFILE_LIST)))
+INSTALL_DIR=/usr
+KCONFIG_CONFIG?=config
+VPATH=$(SRCDIR)
 KERNEL_DIR=net-next-2.6
 KERNEL_VERSION=fed66381d65a35198639f564365e61a7f256bf79
-KERNEL_DOWNLOAD=git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6.git
 
 SIM_SRC=\
 fs.c random.c sim.c softirq.c time.c \
@@ -23,16 +25,16 @@
 SIM_OBJ=$(addprefix sim/,$(addsuffix .o,$(basename $(SIM_SRC))))
 CFLAGS+= \
  $(opt_$(OPT)) -g3 -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs \
- -fno-inline -iwithprefix $(KERNEL_DIR)/include -DKBUILD_BASENAME=\"clnt\" \
+ -fno-inline -iwithprefix $(SRCDIR)$(KERNEL_DIR)/include -DKBUILD_BASENAME=\"clnt\" \
  -fno-strict-aliasing -fno-common -fno-delete-null-pointer-checks \
  -fno-stack-protector \
  -DKBUILD_MODNAME=\"nsc\" -DMODVERSIONS -DEXPORT_SYMTAB \
- -include sim/include/generated/autoconf.h \
+ -include autoconf.h \
  -U__FreeBSD__ -D__linux__=1 -Dlinux=1 -D__linux=1 \
- -Isim/include -I$(KERNEL_DIR)/include \
- $(PIC_CFLAGS) -D_DEBUG
+ -I$(SRCDIR)sim/include -I$(SRCDIR)$(KERNEL_DIR)/include \
+ $(PIC_CFLAGS) -D_DEBUG -I$(PWD)
 
-include processor.mk
+include $(SRCDIR)processor.mk
 
 ifeq ($(PROCESSOR_SIZE),64)
 CFLAGS+= -DCONFIG_64BIT
@@ -43,11 +45,11 @@
 modules:=
 all-obj-for-clean:=
 
-all: install
+all: library modules
 
 -include objs.mk
 
-AUTOCONF=sim/include/generated/autoconf.h
+AUTOCONF=autoconf.h
 # note: the directory order below matters to ensure that we match the kernel order
 dirs=kernel mm crypto lib drivers/base drivers/net net
 empty:=
@@ -66,17 +68,20 @@
 rwsem-spinlock.o scatterlist.o ratelimit.o hexdump.o dec_and_lock.o \
 div64.o
 
-objs.mk: Makefile.print $(KERNEL_DIR)/kernel/timeconst.h .download.ts
+objs.mk: Makefile.print timeconst.h
 	-for i in 1; do \
 	$(foreach d,$(dirs), \
-           $(MAKE) -s -f Makefile.print srcdir=$(KERNEL_DIR)/$(d) \
-            config=$(KERNEL_DIR)/.config to_keep=$(subst $(space),$(colon),$($(d)_to_keep)) print;) \
+           $(MAKE) -s -f $< srcdir=$(SRCDIR)$(KERNEL_DIR)/$(d) \
+	    objdir=$(KERNEL_DIR)/$(d) \
+            config=$(PWD)/$(KCONFIG_CONFIG) \
+	    to_keep=$(subst $(space),$(colon),$($(d)_to_keep)) print;) \
 	done > $@
--include $(KERNEL_DIR)/.config
-$(AUTOCONF): ./generate-autoconf.py $(KERNEL_DIR)/.config
-	cat $(KERNEL_DIR)/.config | ./generate-autoconf.py > $@
-$(KERNEL_DIR)/kernel/timeconst.h: $(KERNEL_DIR)/.config
-	perl $(KERNEL_DIR)/kernel/timeconst.pl $(CONFIG_HZ) > $@
+$(KCONFIG_CONFIG):
+	make -C $(SRCDIR)$(KERNEL_DIR) ARCH=sim KCONFIG_CONFIG=$(PWD)/$(KCONFIG_CONFIG) defconfig 
+$(AUTOCONF): generate-autoconf.py $(KCONFIG_CONFIG)
+	$^ > $@
+timeconst.h: $(KCONFIG_CONFIG)
+	perl $(SRCDIR)$(KERNEL_DIR)/kernel/timeconst.pl $(shell grep CONFIG_HZ= $(KCONFIG_CONFIG) | sed -e 's/CONFIG_HZ=\(\w\)/\1/g') > $@
 linker.lds: ./generate-linker-script.py
 	ld -shared --verbose | ./$^ > $@
 
@@ -84,37 +89,41 @@
 OBJS=$(SIM_OBJ) $(foreach builtin,$(KERNEL_BUILTIN),$(if $($(builtin)),$($(builtin))))
 
 %/builtin.o:
-	if test "$($@)"; then for f in $($@); do $(AR) Tcru $@ $$f; done; else $(AR) Tcru $@; fi
+	mkdir -p $(dir $@); if test -n "$($@)"; then for f in $($@); do $(AR) Tcru $@ $$f; done; else $(AR) Tcru $@; fi
 %.ko:%.o
 	$(CC) -shared -o $@ -nostdlib $^
+%.o:%.c
+	mkdir -p $(dir $@)
+	$(CC) $(CFLAGS) -c $^ -o $@
 
 library: $(KERNEL_LIB)
 modules: $(modules) 
 
-install: library modules
+install: modules library
 	mkdir -p $(INSTALL_DIR)
-	cp $(KERNEL_LIB) $(INSTALL_DIR)
+	mkdir -p $(INSTALL_DIR)/lib
+	mkdir -p $(INSTALL_DIR)/include
+	mkdir -p $(INSTALL_DIR)/include/sim
+	mkdir -p $(INSTALL_DIR)/lib/$(KERNEL_DIR)
+	cp $(KERNEL_LIB) $(INSTALL_DIR)/lib
 	for mod in $(modules); do \
 	  TMP=`dirname $$mod |sed -e 's;^[^/]\+/;;'`; \
-	  mkdir -p $(INSTALL_DIR)/$$TMP; \
-	  cp $$mod $(INSTALL_DIR)/$$TMP/`basename $$mod`; \
+	  mkdir -p $(INSTALL_DIR)/lib/$(KERNEL_DIR)/$$TMP; \
+	  cp $$mod $(INSTALL_DIR)/lib/$(KERNEL_DIR)/$$TMP/`basename $$mod`; \
 	done
 	for h in sim-init.h sim-types.h sim.h; do \
-	  cp sim/include/$$h $(INSTALL_DIR)/$$h; \
+	  cp sim/include/$$h $(INSTALL_DIR)/include/sim/$$h; \
 	done
 
 install-dir:
 
-setup: .download.ts .patch.ts $(KERNEL_DIR)/arch/sim
+setup: .patch.ts $(KERNEL_DIR)/arch/sim
 $(KERNEL_DIR)/arch/sim:
 	if test ! -L $@; then ln -s $(PWD)/sim $(KERNEL_DIR)/arch/sim; fi
 .patch.ts: kernel.patch
 	CWD=`pwd` && cd $(KERNEL_DIR) && patch -p1 < $$CWD/kernel.patch && cd $$CWD && touch .patch.ts
 unpatch: 
 	CWD=`pwd` && cd $(KERNEL_DIR) && git reset --hard $(KERNEL_VERSION) && cd $$CWD && rm -f .patch.ts
-.download.ts:
-	git clone $(KERNEL_DOWNLOAD) $(KERNEL_DIR) && pushd $(KERNEL_DIR) && git reset --hard \
-	$(KERNEL_VERSION) && popd && touch .download.ts
 ALL_OBJS=$(OBJS) $(KERNEL_LIB) $(modules) $(all-obj-for-clean)
 clean:
 	@for f in $(foreach m,$(modules),$($(m))); do rm -f $$f; done
--- a/Makefile.print	Tue Feb 01 13:31:43 2011 +0100
+++ b/Makefile.print	Wed May 18 00:02:42 2011 +0200
@@ -1,4 +1,4 @@
-# inherit $(srcdir) $(config) $(to_keep) from command-line
+# inherit $(objdir) $(config) $(srcdir) $(to_keep) from command-line
 
 include $(config)
 include $(srcdir)/Makefile
@@ -20,15 +20,15 @@
 
 print: $(final-obj-m) $(subdirs)
 	@if test $(if $(final-obj-y),1); then \
-	  echo -n $(srcdir)/builtin.o; echo -n "="; echo $(addprefix $(srcdir)/,$(final-obj-y)); \
-	  echo -n $(srcdir)/builtin.o; echo -n ": "; echo $(addprefix $(srcdir)/,$(final-obj-y)); \
-	  echo -n "all-obj-for-clean+="; echo $(addprefix $(srcdir)/,$(final-obj-y)) $(srcdir)/builtin.o; \
+	  echo -n $(objdir)/builtin.o; echo -n "="; echo $(addprefix $(objdir)/,$(final-obj-y)); \
+	  echo -n $(objdir)/builtin.o; echo -n ": "; echo $(addprefix $(objdir)/,$(final-obj-y)); \
+	  echo -n "all-obj-for-clean+="; echo $(addprefix $(objdir)/,$(final-obj-y)) $(objdir)/builtin.o; \
 	fi
 $(final-obj-m):
-	@echo -n "modules+="; echo $(addprefix $(srcdir)/,$(@:.o=.ko))
-	@echo -n $(addprefix $(srcdir)/,$(@:.o=.ko)); echo -n ": "
-	@echo $(addprefix $(srcdir)/,$(if $($(@:.o=-objs)),$($(@:.o=-objs)),$@))
-	@echo -n $(addprefix $(srcdir)/,$(@:.o=.ko)); echo -n "="
-	@echo $(addprefix $(srcdir)/,$(if $($(@:.o=-objs)),$($(@:.o=-objs)),$@))
+	@echo -n "modules+="; echo $(addprefix $(objdir)/,$(@:.o=.ko))
+	@echo -n $(addprefix $(objdir)/,$(@:.o=.ko)); echo -n ": "
+	@echo $(addprefix $(objdir)/,$(if $($(@:.o=-objs)),$($(@:.o=-objs)),$@))
+	@echo -n $(addprefix $(objdir)/,$(@:.o=.ko)); echo -n "="
+	@echo $(addprefix $(objdir)/,$(if $($(@:.o=-objs)),$($(@:.o=-objs)),$@))
 $(subdirs):
-	@$(MAKE) -s -f Makefile.print srcdir=$(srcdir)/$@ config=$(config) to_keep=$(to_keep) print 2>/dev/null
+	@$(MAKE) -s -f $(firstword $(MAKEFILE_LIST)) objdir=$(objdir)/$@ config=$(config) srcdir=$(srcdir)/$@ to_keep=$(to_keep) print 2>/dev/null
--- a/generate-autoconf.py	Tue Feb 01 13:31:43 2011 +0100
+++ b/generate-autoconf.py	Wed May 18 00:02:42 2011 +0200
@@ -18,4 +18,6 @@
             writing.write('#define ' + left + ' ' + right + '\n')
 
 import sys
-autoconf_header (sys.stdin, sys.stdout)
+f = open(sys.argv[1], 'r')
+autoconf_header (f, sys.stdout)
+f.close()