From 6f0a4470585940a07357cc75488bedeb1fcdff2a Mon Sep 17 00:00:00 2001 From: Ricardo Salveti de Araujo Date: Mon, 20 Dec 2010 11:30:27 -0200 Subject: [PATCH 1/1] Adding support for saving build objects in a separated directory. This patch basically ports the same functionality already available at u-boot, and can be used in two ways: 1) Add O= to the make command line 'make O=/tmp/build board_config' 'make O=/tmp/build ift' 2) Set environement variable BUILD_DIR to point to the desired location 'export BUILD_DIR=/tmp/build' 'make board_config' 'make ift' Similar to u-boot, setting 'O=' at the command line will override the BUILD_DIR environment variable. If you use none of above methods, the build will happen localy, as before. Changes since v1: * Rebase to correctly apply against the main Makefile after the signGP merge Signed-off-by: Ricardo Salveti de Araujo Acked-by: Nishanth Menon --- Makefile | 152 ++++++++++++++++++++++++-------- board/omap1710h3/Makefile | 20 +++-- board/omap2420h4/Makefile | 20 +++-- board/omap2430sdp/Makefile | 20 +++-- board/omap3430labrador/Makefile | 20 +++-- board/omap3430sdp/Makefile | 20 +++-- board/omap3530beagle/Makefile | 20 +++-- board/omap3evm/Makefile | 20 +++-- board/omap4430panda/Makefile | 20 +++-- board/overo/Makefile | 20 +++-- common/Makefile | 13 +-- config.mk | 45 ++++++++-- cpu/arm1136/Makefile | 16 ++-- cpu/arm926ejs/Makefile | 16 ++-- cpu/omap3/Makefile | 16 ++-- cpu/omap4/Makefile | 16 ++-- disk/Makefile | 15 ++-- drivers/Makefile | 31 ++++--- fs/Makefile | 2 +- fs/fat/Makefile | 15 ++-- lib/Makefile | 15 ++-- mkconfig | 18 ++-- rules.mk | 35 ++++++++ 23 files changed, 395 insertions(+), 190 deletions(-) create mode 100644 rules.mk diff --git a/Makefile b/Makefile index d134fdc..6f29674 100644 --- a/Makefile +++ b/Makefile @@ -41,13 +41,74 @@ export HOSTARCH VENDOR= ######################################################################### +# +# X-loader build supports producing a object files to the separate external +# directory. Two use cases are supported: +# +# 1) Add O= to the make command line +# 'make O=/tmp/build all' +# +# 2) Set environement variable BUILD_DIR to point to the desired location +# 'export BUILD_DIR=/tmp/build' +# 'make' +# +# Command line 'O=' setting overrides BUILD_DIR environent variable. +# +# When none of the above methods is used the local build is performed and +# the object files are placed in the source directory. +# + +ifdef O +ifeq ("$(origin O)", "command line") +BUILD_DIR := $(O) +endif +endif + +ifneq ($(BUILD_DIR),) +saved-output := $(BUILD_DIR) + +# Attempt to create a output directory. +$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}) + +# Verify if it was successful. +BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd) +$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist)) +endif # ifneq ($(BUILD_DIR),) + +OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) +SRCTREE := $(CURDIR) +TOPDIR := $(SRCTREE) +LNDIR := $(OBJTREE) +export TOPDIR SRCTREE OBJTREE + +MKCONFIG := $(SRCTREE)/mkconfig +export MKCONFIG + +ifneq ($(OBJTREE),$(SRCTREE)) +REMOTE_BUILD := 1 +export REMOTE_BUILD +endif -TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) -export TOPDIR +# $(obj) and (src) are defined in config.mk but here in main Makefile +# we also need them before config.mk is included which is the case for +# some targets like unconfig, clean, clobber, distclean, etc. +ifneq ($(OBJTREE),$(SRCTREE)) +obj := $(OBJTREE)/ +src := $(SRCTREE)/ +else +obj := +src := +endif +export obj src + +# Make sure CDPATH settings don't interfere +unexport CDPATH + +######################################################################### -ifeq (include/config.mk,$(wildcard include/config.mk)) +ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk)) # load ARCH, BOARD, and CPU configuration -include include/config.mk +include $(obj)include/config.mk export ARCH CPU BOARD VENDOR # load other configuration include $(TOPDIR)/config.mk @@ -63,6 +124,7 @@ endif OBJS = cpu/$(CPU)/start.o +OBJS := $(addprefix $(obj),$(OBJS)) LIBS += board/$(BOARDDIR)/lib$(BOARD).a LIBS += cpu/$(CPU)/lib$(CPU).a @@ -71,53 +133,61 @@ LIBS += fs/fat/libfat.a LIBS += disk/libdisk.a LIBS += drivers/libdrivers.a LIBS += common/libcommon.a + +LIBS := $(addprefix $(obj),$(sort $(LIBS))) .PHONY : $(LIBS) # Add GCC lib PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc SUBDIRS = + +__OBJS := $(subst $(obj),,$(OBJS)) +__LIBS := $(subst $(obj),,$(LIBS)) + ######################################################################### ######################################################################### -ALL = x-load.bin System.map +ALL = $(obj)x-load.bin $(obj)System.map all: $(ALL) -ift: $(ALL) x-load.bin.ift +ift: $(ALL) $(obj)x-load.bin.ift -x-load.bin.ift: signGP System.map x-load.bin - TEXT_BASE=`grep -w _start System.map|cut -d ' ' -f1` - ./signGP x-load.bin $(TEXT_BASE) - cp x-load.bin.ift MLO +$(obj)x-load.bin.ift: $(obj)signGP $(obj)System.map $(obj)x-load.bin + TEXT_BASE=`grep -w _start $(obj)System.map|cut -d ' ' -f1` + $(obj)./signGP $(obj)x-load.bin $(TEXT_BASE) + cp $(obj)x-load.bin.ift $(obj)MLO -x-load.bin: x-load +$(obj)x-load.bin: $(obj)x-load $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ -x-load: $(OBJS) $(LIBS) $(LDSCRIPT) +$(obj)x-load: $(OBJS) $(LIBS) $(LDSCRIPT) UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\ - $(LD) $(LDFLAGS) $$UNDEF_SYM $(OBJS) \ - --start-group $(LIBS) --end-group $(PLATFORM_LIBS) \ + cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \ + --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \ -Map x-load.map -o x-load - -$(LIBS): - $(MAKE) -C `dirname $@` +$(OBJS): + $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@)) + +$(LIBS): + $(MAKE) -C $(dir $(subst $(obj),,$@)) -System.map: x-load +$(obj)System.map: $(obj)x-load @$(NM) $< | \ grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \ - sort > System.map + sort > $(obj)System.map -oneboot: x-load.bin +oneboot: $(obj)x-load.bin scripts/mkoneboot.sh -signGP: scripts/signGP.c - gcc -Wall -g -O3 -o signGP $< +$(obj)signGP: scripts/signGP.c + gcc -Wall -g -O3 -o $(obj)signGP $< ######################################################################### else -all install x-load x-load.srec oneboot depend dep: +all $(obj)x-load $(obj)x-load.bin oneboot depend dep $(obj)System.map: @echo "System not configured - see README" >&2 @ exit 1 endif @@ -125,7 +195,7 @@ endif ######################################################################### unconfig: - rm -f include/config.h include/config.mk + rm -f $(obj)include/config.h $(obj)include/config.mk #======================================================================== # ARM @@ -135,35 +205,35 @@ unconfig: ######################################################################### omap1710h3_config : unconfig - @./mkconfig $(@:_config=) arm arm926ejs omap1710h3 + @$(MKCONFIG) $(@:_config=) arm arm926ejs omap1710h3 ######################################################################### ## OMAP2 (ARM1136) Systems ######################################################################### omap2420h4_config : unconfig - @./mkconfig $(@:_config=) arm arm1136 omap2420h4 + @$(MKCONFIG) $(@:_config=) arm arm1136 omap2420h4 omap2430sdp_config : unconfig - @./mkconfig $(@:_config=) arm arm1136 omap2430sdp + @$(MKCONFIG) $(@:_config=) arm arm1136 omap2430sdp ######################################################################### ## OMAP3 (ARM-CortexA8) Systems ######################################################################### omap3430sdp_config : unconfig - @./mkconfig $(@:_config=) arm omap3 omap3430sdp + @$(MKCONFIG) $(@:_config=) arm omap3 omap3430sdp omap3430labrador_config : unconfig - @./mkconfig $(@:_config=) arm omap3 omap3430labrador + @$(MKCONFIG) $(@:_config=) arm omap3 omap3430labrador omap3evm_config : unconfig - @./mkconfig $(@:_config=) arm omap3 omap3evm + @$(MKCONFIG) $(@:_config=) arm omap3 omap3evm overo_config : unconfig - @./mkconfig $(@:_config=) arm omap3 overo + @$(MKCONFIG) $(@:_config=) arm omap3 overo omap3530beagle_config : unconfig - @./mkconfig $(@:_config=) arm omap3 omap3530beagle + @$(MKCONFIG) $(@:_config=) arm omap3 omap3530beagle ######################################################################### ## OMAP4 (ARM-CortexA9) Systems @@ -174,23 +244,29 @@ omap4430panda_config : unconfig ######################################################################### clean: - find . -type f \ + find $(OBJTREE) -type f \ \( -name 'core' -o -name '*.bak' -o -name '*~' \ -o -name '*.o' -o -name '*.a' \) -print \ | xargs rm -f clobber: clean - find . -type f \ + find $(OBJTREE) -type f \ \( -name .depend -o -name '*.srec' -o -name '*.bin' \) \ -print \ | xargs rm -f - rm -f $(OBJS) *.bak tags TAGS - rm -fr *.*~ - rm -f x-load x-load.map $(ALL) x-load.bin.ift signGP MLO - rm -f include/asm/proc include/asm/arch + rm -f $(OBJS) $(obj)*.bak $(obj)tags $(obj)TAGS + rm -fr $(obj)*.*~ + rm -f $(obj)x-load $(obj)x-load.map $(ALL) $(obj)x-load.bin.ift $(obj)signGP $(obj)MLO + rm -f $(obj)include/asm/proc $(obj)include/asm/arch +ifeq ($(OBJTREE),$(SRCTREE)) mrproper \ distclean: clobber unconfig +else +mrproper \ +distclean: clobber unconfig + rm -rf $(obj)* +endif backup: F=`basename $(TOPDIR)` ; cd .. ; \ diff --git a/board/omap1710h3/Makefile b/board/omap1710h3/Makefile index 94f5821..54b4a3c 100644 --- a/board/omap1710h3/Makefile +++ b/board/omap1710h3/Makefile @@ -23,25 +23,29 @@ include $(TOPDIR)/config.mk -LIB = lib$(BOARD).a +LIB = $(obj)lib$(BOARD).a -OBJS := omap1710h3.o +COBJS := omap1710h3.o SOBJS := platform.o -$(LIB): $(OBJS) $(SOBJS) - $(AR) crv $@ $^ +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) crv $@ $(OBJS) $(SOBJS) clean: rm -f $(SOBJS) $(OBJS) distclean: clean - rm -f $(LIB) core *.bak .depend + rm -f $(LIB) core *.bak $(obj).depend ######################################################################### -.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk --include .depend +sinclude $(obj).depend ######################################################################### diff --git a/board/omap2420h4/Makefile b/board/omap2420h4/Makefile index c72e36b..e6f7629 100644 --- a/board/omap2420h4/Makefile +++ b/board/omap2420h4/Makefile @@ -23,25 +23,29 @@ include $(TOPDIR)/config.mk -LIB = lib$(BOARD).a +LIB = $(obj)lib$(BOARD).a -OBJS := omap2420h4.o +COBJS := omap2420h4.o SOBJS := platform.o -$(LIB): $(OBJS) $(SOBJS) - $(AR) crv $@ $^ +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) crv $@ $(OBJS) $(SOBJS) clean: rm -f $(SOBJS) $(OBJS) distclean: clean - rm -f $(LIB) core *.bak .depend + rm -f $(LIB) core *.bak $(obj).depend ######################################################################### -.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk --include .depend +sinclude $(obj).depend ######################################################################### diff --git a/board/omap2430sdp/Makefile b/board/omap2430sdp/Makefile index a9bb3f0..b6c984c 100644 --- a/board/omap2430sdp/Makefile +++ b/board/omap2430sdp/Makefile @@ -23,25 +23,29 @@ include $(TOPDIR)/config.mk -LIB = lib$(BOARD).a +LIB = $(obj)lib$(BOARD).a -OBJS := omap2430sdp.o +COBJS := omap2430sdp.o SOBJS := platform.o -$(LIB): $(OBJS) $(SOBJS) - $(AR) crv $@ $^ +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) crv $@ $(OBJS) $(SOBJS) clean: rm -f $(SOBJS) $(OBJS) distclean: clean - rm -f $(LIB) core *.bak .depend + rm -f $(LIB) core *.bak $(obj).depend ######################################################################### -.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk --include .depend +sinclude $(obj).depend ######################################################################### diff --git a/board/omap3430labrador/Makefile b/board/omap3430labrador/Makefile index a5c51b6..d54b666 100644 --- a/board/omap3430labrador/Makefile +++ b/board/omap3430labrador/Makefile @@ -23,25 +23,29 @@ include $(TOPDIR)/config.mk -LIB = lib$(BOARD).a +LIB = $(obj)lib$(BOARD).a -OBJS := omap3430sdp.o +COBJS := omap3430sdp.o SOBJS := platform.o -$(LIB): $(OBJS) $(SOBJS) - $(AR) crv $@ $^ +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) crv $@ $(OBJS) $(SOBJS) clean: rm -f $(SOBJS) $(OBJS) distclean: clean - rm -f $(LIB) core *.bak .depend + rm -f $(LIB) core *.bak $(obj).depend ######################################################################### -.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk --include .depend +sinclude $(obj).depend ######################################################################### diff --git a/board/omap3430sdp/Makefile b/board/omap3430sdp/Makefile index f5fd240..d54b666 100644 --- a/board/omap3430sdp/Makefile +++ b/board/omap3430sdp/Makefile @@ -23,25 +23,29 @@ include $(TOPDIR)/config.mk -LIB = lib$(BOARD).a +LIB = $(obj)lib$(BOARD).a -OBJS := omap3430sdp.o +COBJS := omap3430sdp.o SOBJS := platform.o -$(LIB): $(OBJS) $(SOBJS) - $(AR) crv $@ $^ +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) crv $@ $(OBJS) $(SOBJS) clean: rm -f $(SOBJS) $(OBJS) distclean: clean - rm -f $(LIB) core *.bak .depend + rm -f $(LIB) core *.bak $(obj).depend ######################################################################### -.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk --include .depend +sinclude $(obj).depend ######################################################################### diff --git a/board/omap3530beagle/Makefile b/board/omap3530beagle/Makefile index 2dab831..b7b51ce 100644 --- a/board/omap3530beagle/Makefile +++ b/board/omap3530beagle/Makefile @@ -23,25 +23,29 @@ include $(TOPDIR)/config.mk -LIB = lib$(BOARD).a +LIB = $(obj)lib$(BOARD).a -OBJS := omap3530beagle.o +COBJS := omap3530beagle.o SOBJS := platform.o -$(LIB): $(OBJS) $(SOBJS) - $(AR) crv $@ $^ +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) crv $@ $(OBJS) $(SOBJS) clean: rm -f $(SOBJS) $(OBJS) distclean: clean - rm -f $(LIB) core *.bak .depend + rm -f $(LIB) core *.bak $(obj).depend ######################################################################### -.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk --include .depend +sinclude $(obj).depend ######################################################################### diff --git a/board/omap3evm/Makefile b/board/omap3evm/Makefile index 2a0ec64..d83f45e 100644 --- a/board/omap3evm/Makefile +++ b/board/omap3evm/Makefile @@ -23,25 +23,29 @@ include $(TOPDIR)/config.mk -LIB = lib$(BOARD).a +LIB = $(obj)lib$(BOARD).a -OBJS := omap3evm.o +COBJS := omap3evm.o SOBJS := platform.o -$(LIB): $(OBJS) $(SOBJS) - $(AR) crv $@ $^ +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) crv $@ $(OBJS) $(SOBJS) clean: rm -f $(SOBJS) $(OBJS) distclean: clean - rm -f $(LIB) core *.bak .depend + rm -f $(LIB) core *.bak $(obj).depend ######################################################################### -.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk --include .depend +sinclude $(obj).depend ######################################################################### diff --git a/board/omap4430panda/Makefile b/board/omap4430panda/Makefile index b650e4a..6b6f9be 100644 --- a/board/omap4430panda/Makefile +++ b/board/omap4430panda/Makefile @@ -25,25 +25,29 @@ include $(TOPDIR)/config.mk -LIB = lib$(BOARD).a +LIB = $(obj)lib$(BOARD).a -OBJS := omap4430panda.o clock.o syslib.o +COBJS := omap4430panda.o clock.o syslib.o SOBJS := platform.o -$(LIB): $(OBJS) $(SOBJS) - $(AR) crv $@ $^ +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) crv $@ $(OBJS) $(SOBJS) clean: rm -f $(SOBJS) $(OBJS) distclean: clean - rm -f $(LIB) core *.bak .depend + rm -f $(LIB) core *.bak $(obj).depend ######################################################################### -.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk --include .depend +sinclude $(obj).depend ######################################################################### diff --git a/board/overo/Makefile b/board/overo/Makefile index 2e6c25d..32f9bf1 100644 --- a/board/overo/Makefile +++ b/board/overo/Makefile @@ -23,25 +23,29 @@ include $(TOPDIR)/config.mk -LIB = lib$(BOARD).a +LIB = $(obj)lib$(BOARD).a -OBJS := overo.o +COBJS := overo.o SOBJS := platform.o -$(LIB): $(OBJS) $(SOBJS) - $(AR) crv $@ $^ +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) +SOBJS := $(addprefix $(obj),$(SOBJS)) + +$(LIB): $(obj).depend $(OBJS) $(SOBJS) + $(AR) crv $@ $(OBJS) $(SOBJS) clean: rm -f $(SOBJS) $(OBJS) distclean: clean - rm -f $(LIB) core *.bak .depend + rm -f $(LIB) core *.bak $(obj).depend ######################################################################### -.depend: Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk --include .depend +sinclude $(obj).depend ######################################################################### diff --git a/common/Makefile b/common/Makefile index de856cf..8f4ee2c 100644 --- a/common/Makefile +++ b/common/Makefile @@ -23,26 +23,27 @@ include $(TOPDIR)/config.mk -LIB = libcommon.a +LIB = $(obj)libcommon.a AOBJS = COBJS = cmd_load.o -OBJS = $(AOBJS) $(COBJS) +SRCS := $(AOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(AOBJS) $(COBJS)) CPPFLAGS += -I.. all: $(LIB) $(AOBJS) -$(LIB): .depend $(OBJS) +$(LIB): $(obj).depend $(OBJS) $(AR) crv $@ $(OBJS) ######################################################################### -.depend: Makefile $(AOBJS:.o=.S) $(COBJS:.o=.c) - $(CC) -M $(CFLAGS) $(AOBJS:.o=.S) $(COBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk -sinclude .depend +sinclude $(obj).depend ######################################################################### diff --git a/config.mk b/config.mk index 1365b9d..f4c58e9 100644 --- a/config.mk +++ b/config.mk @@ -23,6 +23,22 @@ ######################################################################### +ifneq ($(OBJTREE),$(SRCTREE)) +ifeq ($(CURDIR),$(SRCTREE)) +dir := +else +dir := $(subst $(SRCTREE)/,,$(CURDIR)) +endif + +obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/) +src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/) + +$(shell mkdir -p $(obj)) +else +obj := +src := +endif + # clean the slate ... PLATFORM_RELFLAGS = PLATFORM_CPPFLAGS = @@ -116,10 +132,15 @@ OBJCFLAGS += --gap-fill=0xff gccincdir := $(shell $(CC) -print-file-name=include) CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS) \ - -D__KERNEL__ -DTEXT_BASE=$(TEXT_BASE) \ - -I$(TOPDIR)/include \ - -fno-builtin -ffreestanding -nostdinc -isystem \ - $(gccincdir) -pipe $(PLATFORM_CPPFLAGS) + -D__KERNEL__ -DTEXT_BASE=$(TEXT_BASE) + +ifneq ($(OBJTREE),$(SRCTREE)) +CPPFLAGS += -I$(OBJTREE)/include +endif + +CPPFLAGS += -I$(TOPDIR)/include +CPPFLAGS += -fno-builtin -ffreestanding -nostdinc \ + -isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS) ifdef BUILD_TAG CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes \ @@ -165,11 +186,23 @@ export TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS ######################################################################### +ifndef REMOTE_BUILD + %.s: %.S - $(CPP) $(AFLAGS) -o $@ $(CURDIR)/$< + $(CPP) $(AFLAGS) -o $@ $< %.o: %.S - $(CC) $(AFLAGS) -c -o $@ $(CURDIR)/$< + $(CC) $(AFLAGS) -c -o $@ $< %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< +else + +$(obj)%.s: %.S + $(CPP) $(AFLAGS) -o $@ $< +$(obj)%.o: %.S + $(CC) $(AFLAGS) -c -o $@ $< +$(obj)%.o: %.c + $(CC) $(CFLAGS) -c -o $@ $< +endif + ######################################################################### diff --git a/cpu/arm1136/Makefile b/cpu/arm1136/Makefile index 565d016..b556419 100644 --- a/cpu/arm1136/Makefile +++ b/cpu/arm1136/Makefile @@ -23,21 +23,25 @@ include $(TOPDIR)/config.mk -LIB = lib$(CPU).a +LIB = $(obj)lib$(CPU).a START = start.o -OBJS = cpu.o +COBJS = cpu.o -all: .depend $(START) $(LIB) +SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) +START := $(addprefix $(obj),$(START)) + +all: $(obj).depend $(START) $(LIB) $(LIB): $(OBJS) $(AR) crv $@ $(OBJS) ######################################################################### -.depend: Makefile $(START:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CFLAGS) $(START:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk -sinclude .depend +sinclude $(obj).depend ######################################################################### diff --git a/cpu/arm926ejs/Makefile b/cpu/arm926ejs/Makefile index 229b7e7..b556419 100644 --- a/cpu/arm926ejs/Makefile +++ b/cpu/arm926ejs/Makefile @@ -23,21 +23,25 @@ include $(TOPDIR)/config.mk -LIB = lib$(CPU).a +LIB = $(obj)lib$(CPU).a START = start.o -OBJS = cpu.o +COBJS = cpu.o -all: .depend $(START) $(LIB) +SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) +START := $(addprefix $(obj),$(START)) + +all: $(obj).depend $(START) $(LIB) $(LIB): $(OBJS) $(AR) crv $@ $(OBJS) ######################################################################### -.depend: Makefile $(START:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CFLAGS) $(START:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk -sinclude .depend +sinclude $(obj).depend ######################################################################### diff --git a/cpu/omap3/Makefile b/cpu/omap3/Makefile index 5ce8941..678619c 100644 --- a/cpu/omap3/Makefile +++ b/cpu/omap3/Makefile @@ -23,21 +23,25 @@ include $(TOPDIR)/config.mk -LIB = lib$(CPU).a +LIB = $(obj)lib$(CPU).a START = start.o -OBJS = cpu.o mmc.o gpio.o +COBJS = cpu.o mmc.o gpio.o -all: .depend $(START) $(LIB) +SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) +START := $(addprefix $(obj),$(START)) + +all: $(obj).depend $(START) $(LIB) $(LIB): $(OBJS) $(AR) crv $@ $(OBJS) ######################################################################### -.depend: Makefile $(START:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CFLAGS) $(START:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk -sinclude .depend +sinclude $(obj).depend ######################################################################### diff --git a/cpu/omap4/Makefile b/cpu/omap4/Makefile index e5c88a0..0b39db0 100644 --- a/cpu/omap4/Makefile +++ b/cpu/omap4/Makefile @@ -24,21 +24,25 @@ include $(TOPDIR)/config.mk -LIB = lib$(CPU).a +LIB = $(obj)lib$(CPU).a START = start.o -OBJS = cpu.o mmc.o sys_info.o +COBJS = cpu.o mmc.o sys_info.o -all: .depend $(START) $(LIB) +SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) +START := $(addprefix $(obj),$(START)) + +all: $(obj).depend $(START) $(LIB) $(LIB): $(OBJS) $(AR) crv $@ $(OBJS) ######################################################################### -.depend: Makefile $(START:.o=.S) $(OBJS:.o=.c) - $(CC) -M $(CFLAGS) $(START:.o=.S) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk -sinclude .depend +sinclude $(obj).depend ######################################################################### diff --git a/disk/Makefile b/disk/Makefile index 7da4624..512b1cb 100644 --- a/disk/Makefile +++ b/disk/Makefile @@ -25,20 +25,23 @@ include $(TOPDIR)/config.mk #CFLAGS += -DET_DEBUG -DDEBUG -LIB = libdisk.a +LIB = $(obj)libdisk.a -OBJS = part.o +COBJS = part.o + +SRCS := $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) all: $(LIB) -$(LIB): $(START) $(OBJS) +$(LIB): $(obj).depend $(OBJS) $(AR) crv $@ $(OBJS) ######################################################################### -.depend: Makefile $(OBJS:.o=.c) - $(CC) -M $(CFLAGS) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk -sinclude .depend +sinclude $(obj).depend ######################################################################### diff --git a/drivers/Makefile b/drivers/Makefile index 4eb7585..017b8c0 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -25,39 +25,39 @@ include $(TOPDIR)/config.mk # CFLAGS += -DET_DEBUG -DDEBUG -LIB = libdrivers.a -OBJS = serial.o ns16550.o omap24xx_i2c.o +LIB = $(obj)libdrivers.a +COBJS = serial.o ns16550.o omap24xx_i2c.o ifeq ($(BOARD), omap3430sdp) -OBJS += k9f1g08r0a.o +COBJS += k9f1g08r0a.o endif ifeq ($(BOARD), omap3430labrador) -OBJS += k9f1g08r0a.o +COBJS += k9f1g08r0a.o endif ifeq ($(BOARD), omap3530beagle) -OBJS += k9f1g08r0a.o +COBJS += k9f1g08r0a.o endif ifeq ($(BOARD), omap3evm) -OBJS += k9f1g08r0a.o onenand.o +COBJS += k9f1g08r0a.o onenand.o endif ifeq ($(BOARD), overo) -OBJS += k9f1g08r0a.o +COBJS += k9f1g08r0a.o endif ifeq ($(BOARD), omap2420h4) -OBJS += k9k1216.o +COBJS += k9k1216.o endif ifeq ($(BOARD), omap2430sdp) -OBJS += k9k1216.o +COBJS += k9k1216.o endif ifeq ($(BOARD), omap1710h3) -OBJS += k9f5616.o +COBJS += k9f5616.o endif @@ -67,16 +67,19 @@ endif ## smc91111.o smiLynxEM.o spi_eeprom.o sym53c8xx.o \ ## +SRCS := $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(COBJS)) + all: $(LIB) -$(LIB): $(OBJS) +$(LIB): $(obj).depend $(OBJS) $(AR) crv $@ $(OBJS) ######################################################################### -.depend: Makefile $(OBJS:.o=.c) - $(CC) -M $(CFLAGS) $(OBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk -sinclude .depend +sinclude $(obj).depend ######################################################################### diff --git a/fs/Makefile b/fs/Makefile index f419b99..a2f61e7 100644 --- a/fs/Makefile +++ b/fs/Makefile @@ -24,6 +24,6 @@ SUBDIRS := fat -.depend all: +$(obj).depend all: @for dir in $(SUBDIRS) ; do \ $(MAKE) -C $$dir $@ ; done diff --git a/fs/fat/Makefile b/fs/fat/Makefile index e462757..2fa428c 100644 --- a/fs/fat/Makefile +++ b/fs/fat/Makefile @@ -19,28 +19,27 @@ # MA 02111-1307 USA # -TOPDIR=../../ - include $(TOPDIR)/config.mk -LIB = libfat.a +LIB = $(obj)libfat.a AOBJS = COBJS = fat.o file.o -OBJS = $(AOBJS) $(COBJS) +SRCS := $(AOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(AOBJS) $(COBJS)) all: $(LIB) $(AOBJS) -$(LIB): .depend $(OBJS) +$(LIB): $(obj).depend $(OBJS) $(AR) crv $@ $(OBJS) ######################################################################### -.depend: Makefile $(AOBJS:.o=.S) $(COBJS:.o=.c) - $(CC) -M $(CFLAGS) $(AOBJS:.o=.S) $(COBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk -sinclude .depend +sinclude $(obj).depend ######################################################################### diff --git a/lib/Makefile b/lib/Makefile index 60b8090..32b3798 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -25,22 +25,23 @@ include $(TOPDIR)/config.mk -LIB = lib$(ARCH).a +LIB = $(obj)lib$(ARCH).a -AOBJS = _udivsi3.o _umodsi3.o +SOBJS = _udivsi3.o _umodsi3.o COBJS = board.o ecc.o printf.o div0.o -OBJS = $(AOBJS) $(COBJS) +SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) -$(LIB): .depend $(OBJS) +$(LIB): $(obj).depend $(OBJS) $(AR) crv $@ $(OBJS) ######################################################################### -.depend: Makefile $(AOBJS:.o=.S) $(COBJS:.o=.c) - $(CC) -M $(CFLAGS) $(AOBJS:.o=.S) $(COBJS:.o=.c) > $@ +# defines $(obj).depend target +include $(SRCTREE)/rules.mk -sinclude .depend +sinclude $(obj).depend ######################################################################### diff --git a/mkconfig b/mkconfig index 43b6f09..54c5268 100755 --- a/mkconfig +++ b/mkconfig @@ -24,17 +24,19 @@ done echo "Configuring for $1 board..." -cd ./include - # # Create link to architecture specific headers # -rm -f asm/arch -ln -s arch-$3 asm/arch - -if [ "$2" = "arm" ] ; then - rm -f asm/proc - ln -s proc-armv asm/proc +if [ "$SRCTREE" != "$OBJTREE" ] ; then + mkdir -p ${OBJTREE}/include + cd ${OBJTREE}/include + mkdir -p asm + rm -f asm/arch + ln -s ${SRCTREE}/include/asm/arch-$3 asm/arch +else + cd ./include + rm -f asm/arch + ln -s arch-$3 asm/arch fi # diff --git a/rules.mk b/rules.mk new file mode 100644 index 0000000..107f2a3 --- /dev/null +++ b/rules.mk @@ -0,0 +1,35 @@ +# +# (C) Copyright 2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# 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 of +# the License, 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., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +######################################################################### + +_depend: $(obj).depend + +$(obj).depend: $(src)Makefile $(TOPDIR)/config.mk $(SRCS) + @rm -f $@ + @for f in $(SRCS); do \ + g=`basename $$f | sed -e 's/\(.*\)\.\w/\1.o/'`; \ + $(CC) -M $(HOST_CFLAGS) $(CPPFLAGS) -MQ $(obj)$$g $$f >> $@ ; \ + done + +######################################################################### -- 2.39.2