From eaaeece2b0f22958e3724020f4686aa9d635a1e0 Mon Sep 17 00:00:00 2001 From: James Morrissey Date: Fri, 1 Nov 2013 13:56:59 +0000 Subject: [PATCH] Generate build products in sub-directories A single binary can be compiled using a command such as: make CROSS_COMPILE=aarch64-none-elf- bl1 Also make use of brackets consistent in the Makefile. Change-Id: I2180fdb473411ef7cffe39670a7b2de82def812e --- Makefile | 170 +++++++++++++++++++++++++++++---------------- docs/change-log.md | 2 + docs/user-guide.md | 29 +++++--- 3 files changed, 132 insertions(+), 69 deletions(-) diff --git a/Makefile b/Makefile index 5aa9ee87..9a683f41 100644 --- a/Makefile +++ b/Makefile @@ -31,30 +31,40 @@ # Decrease the verbosity of the make script # can be made verbose by passing V=1 at the make command line ifdef V - KBUILD_VERBOSE = $(V) + KBUILD_VERBOSE = ${V} else KBUILD_VERBOSE = 0 endif -ifeq "$(KBUILD_VERBOSE)" "0" +ifeq "${KBUILD_VERBOSE}" "0" Q=@ else Q= endif DEBUG ?= 0 -BL_COMMON_OBJS = misc_helpers.o cache_helpers.o tlb_helpers.o \ + +ifneq (${DEBUG}, 0) + BUILD_TYPE := debug +else + BUILD_TYPE := release +endif + +BL_COMMON_OBJS := misc_helpers.o cache_helpers.o tlb_helpers.o \ semihosting_call.o mmio.o pl011.o semihosting.o \ std.o bl_common.o platform_helpers.o sysreg_helpers.o ARCH := aarch64 +PLAT := fvp -all: $(patsubst %,%.bin,bl1 bl2 bl31) ; - +BUILD_BASE:=./build +BUILD:=${BUILD_BASE}/${PLAT}/${BUILD_TYPE} +BUILD_BL1:=${BUILD}/bl1 +BUILD_BL2:=${BUILD}/bl2 +BUILD_BL31:=${BUILD}/bl31 +BUILD_DIRS:=${BUILD_BL1} ${BUILD_BL2} ${BUILD_BL31} -#$(info $(filter bl2.%, $(MAKECMDGOALS))) -#$(info $(filter bl1.%, $(MAKECMDGOALS))) -#$(info $(MAKECMDGOALS)) +all: bl1 bl2 bl31 $(info Including bl1.mk) include bl1/bl1.mk @@ -65,7 +75,19 @@ include bl2/bl2.mk $(info Including bl31.mk) include bl31/bl31.mk -OBJS += $(BL_COMMON_OBJS) +.PHONY: dump clean realclean distclean bl1 bl2 bl31 +.SUFFIXES: + + +BL1_OBJS := $(addprefix ${BUILD_BL1}/,${BL1_OBJS} ${BL_COMMON_OBJS}) +BL2_OBJS := $(addprefix ${BUILD_BL2}/,${BL2_OBJS} ${BL_COMMON_OBJS}) +BL31_OBJS := $(addprefix ${BUILD_BL31}/,${BL31_OBJS} ${BL_COMMON_OBJS}) +BL1_MAPFILE := $(addprefix ${BUILD_BL1}/,${BL1_MAPFILE}) +BL2_MAPFILE := $(addprefix ${BUILD_BL2}/,${BL2_MAPFILE}) +BL31_MAPFILE := $(addprefix ${BUILD_BL31}/,${BL31_MAPFILE}) +BL1_LINKERFILE := $(addprefix ${BUILD_BL1}/,${BL1_LINKERFILE}) +BL2_LINKERFILE := $(addprefix ${BUILD_BL2}/,${BL2_LINKERFILE}) +BL31_LINKERFILE := $(addprefix ${BUILD_BL31}/,${BL31_LINKERFILE}) INCLUDES += -Ilib/include/ -Iinclude/aarch64/ -Iinclude/ \ -Idrivers/arm/interconnect/cci-400/ \ @@ -77,9 +99,9 @@ ASFLAGS += -D__ASSEMBLY__ $(INCLUDES) CFLAGS := -Wall -std=c99 -c -Os -DDEBUG=$(DEBUG) $(INCLUDES) ${CFLAGS} LDFLAGS += -O1 -BL1_LDFLAGS := -Map=$(BL1_MAPFILE) --script $(BL1_LINKERFILE) --entry=$(BL1_ENTRY_POINT) -BL2_LDFLAGS := -Map=$(BL2_MAPFILE) --script $(BL2_LINKERFILE) --entry=$(BL2_ENTRY_POINT) -BL31_LDFLAGS := -Map=$(BL31_MAPFILE) --script $(BL31_LINKERFILE) --entry=$(BL31_ENTRY_POINT) +BL1_LDFLAGS := -Map=${BL1_MAPFILE} --script ${BL1_LINKERFILE} --entry=${BL1_ENTRY_POINT} +BL2_LDFLAGS := -Map=${BL2_MAPFILE} --script ${BL2_LINKERFILE} --entry=${BL2_ENTRY_POINT} +BL31_LDFLAGS := -Map=${BL31_MAPFILE} --script ${BL31_LINKERFILE} --entry=${BL31_ENTRY_POINT} vpath %.ld.S bl1:bl2:bl31 @@ -88,7 +110,7 @@ vpath %.c bl1/${ARCH}:bl2/${ARCH}:bl31/${ARCH} vpath %.S bl1/${ARCH}:bl2/${ARCH}:bl31/${ARCH} -ifneq ($(DEBUG), 0) +ifneq (${DEBUG}, 0) #CFLAGS += -g -O0 CFLAGS += -g # -save-temps -fverbose-asm @@ -96,74 +118,102 @@ ASFLAGS += -g -Wa,--gdwarf-2 endif -CC = $(CROSS_COMPILE)gcc -CPP = $(CROSS_COMPILE)cpp -AS = $(CROSS_COMPILE)gcc -AR = $(CROSS_COMPILE)ar -LD = $(CROSS_COMPILE)ld -OC = $(CROSS_COMPILE)objcopy -OD = $(CROSS_COMPILE)objdump -NM = $(CROSS_COMPILE)nm -PP = $(CROSS_COMPILE)gcc -E $(CFLAGS) - - -distclean: clean - @echo " DISTCLEAN" - $(Q)rm -rf *.zi - $(Q)rm -rf *.dump - $(Q)rm -rf *.bin - $(Q)rm -f *.axf - $(Q)rm -f *.i *.s - $(Q)rm -f *.ar - $(Q)rm -f *.map - $(Q)rm -f *.scf - $(Q)rm -f *.txt - $(Q)rm -f *.elf - $(Q)rm -rf *.bin - $(Q)rm -f $(LISTFILE) +CC := ${CROSS_COMPILE}gcc +CPP := ${CROSS_COMPILE}cpp +AS := ${CROSS_COMPILE}gcc +AR := ${CROSS_COMPILE}ar +LD := ${CROSS_COMPILE}ld +OC := ${CROSS_COMPILE}objcopy +OD := ${CROSS_COMPILE}objdump +NM := ${CROSS_COMPILE}nm +PP := ${CROSS_COMPILE}gcc -E ${CFLAGS} + + +bl1: ${BUILD_BL1} ${BUILD}/bl1.bin +bl2: ${BUILD_BL2} ${BUILD}/bl2.bin +bl31: ${BUILD_BL31} ${BUILD}/bl31.bin clean: @echo " CLEAN" - $(Q)rm -f *.o *.ld + ${Q}rm -rf ${BUILD} -.PHONY: dump +realclean distclean: + @echo " REALCLEAN" + ${Q}rm -rf ${BUILD_BASE} dump: @echo " OBJDUMP" - $(OD) -d bl1.elf > bl1.dump - $(OD) -d bl2.elf > bl2.dump - $(OD) -d bl31.elf > bl31.dump + ${Q}${OD} -d ${BUILD_BL1}/bl1.elf > ${BUILD_BL1}/bl1.dump + ${Q}${OD} -d ${BUILD_BL2}/bl2.elf > ${BUILD_BL2}/bl2.dump + ${Q}${OD} -d ${BUILD_BL31}/bl31.elf > ${BUILD_BL31}/bl31.dump -%.o: %.S +${BUILD_DIRS}: + ${Q}mkdir -p "$@" + + +${BUILD_BL1}/%.o: %.S + @echo " AS $<" + ${Q}${AS} ${ASFLAGS} -c $< -o $@ + +${BUILD_BL2}/%.o: %.S @echo " AS $<" - $(Q)$(AS) $(ASFLAGS) -c $< -o $@ + ${Q}${AS} ${ASFLAGS} -c $< -o $@ + +${BUILD_BL31}/%.o: %.S + @echo " AS $<" + ${Q}${AS} ${ASFLAGS} -c $< -o $@ + +${BUILD_BL1}/%.o: %.c + @echo " CC $<" + ${Q}${CC} ${CFLAGS} -c $< -o $@ -%.o: %.c +${BUILD_BL2}/%.o: %.c @echo " CC $<" - $(Q)$(CC) $(CFLAGS) -c $< -o $@ + ${Q}${CC} ${CFLAGS} -c $< -o $@ -%.ld: %.ld.S +${BUILD_BL31}/%.o: %.c + @echo " CC $<" + ${Q}${CC} ${CFLAGS} -c $< -o $@ + +${BUILD_BL1}/%.ld: %.ld.S @echo " LDS $<" - $(Q)$(AS) $(ASFLAGS) -P -E $< -o $@ + ${Q}${AS} ${ASFLAGS} -P -E $< -o $@ +${BUILD_BL2}/%.ld: %.ld.S + @echo " LDS $<" + ${Q}${AS} ${ASFLAGS} -P -E $< -o $@ + +${BUILD_BL31}/%.ld: %.ld.S + @echo " LDS $<" + ${Q}${AS} ${ASFLAGS} -P -E $< -o $@ -bl1.elf: $(OBJS) $(BL1_OBJS) bl1.ld + +${BUILD_BL1}/bl1.elf: ${BL1_OBJS} ${BL1_LINKERFILE} @echo " LD $@" - $(Q)$(LD) -o $@ $(LDFLAGS) $(BL1_LDFLAGS) $(OBJS) $(BL1_OBJS) - @echo "Built $@ successfully" - @echo + ${Q}${LD} -o $@ ${LDFLAGS} ${BL1_LDFLAGS} ${BL1_OBJS} -bl2.elf: $(OBJS) $(BL2_OBJS) bl2.ld +${BUILD_BL2}/bl2.elf: ${BL2_OBJS} ${BL2_LINKERFILE} @echo " LD $@" - $(Q)$(LD) -o $@ $(LDFLAGS) $(BL2_LDFLAGS) $(OBJS) $(BL2_OBJS) + ${Q}${LD} -o $@ ${LDFLAGS} ${BL2_LDFLAGS} ${BL2_OBJS} + +${BUILD_BL31}/bl31.elf: ${BL31_OBJS} ${BL31_LINKERFILE} + @echo " LD $@" + ${Q}${LD} -o $@ ${LDFLAGS} ${BL31_LDFLAGS} ${BL31_OBJS} + +${BUILD}/bl1.bin: ${BUILD_BL1}/bl1.elf + ${Q}${OC} -O binary $< $@ + @echo @echo "Built $@ successfully" @echo -bl31.elf: $(OBJS) $(BL31_OBJS) bl31.ld - @echo " LD $@" - $(Q)$(LD) -o $@ $(LDFLAGS) $(BL31_LDFLAGS) $(OBJS) $(BL31_OBJS) +${BUILD}/bl2.bin: ${BUILD_BL2}/bl2.elf + ${Q}${OC} -O binary $< $@ + @echo @echo "Built $@ successfully" @echo -%.bin: %.elf - $(OC) -O binary $< $@ +${BUILD}/bl31.bin: ${BUILD_BL31}/bl31.elf + ${Q}${OC} -O binary $< $@ + @echo + @echo "Built $@ successfully" + @echo diff --git a/docs/change-log.md b/docs/change-log.md index ee9be775..ca3cb7f6 100644 --- a/docs/change-log.md +++ b/docs/change-log.md @@ -24,6 +24,8 @@ Detailed changes since last release Base FVPs have been increased from 2GB to 4GB. This resolves the issue of failing to start user-space when using a RAM-disk file-system. +* Build products are now created in a separate build directory tree. + ARM Trusted Firmware - version 0.2 ================================== diff --git a/docs/user-guide.md b/docs/user-guide.md index 2c7439a7..3bb4250e 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -87,19 +87,30 @@ To build the software for the FVPs, follow these steps: By default this produces a release version of the build. To produce a debug version instead, refer to the "Debugging options" section below. - The build creates ELF and raw binary files in the current directory. It - generates the following boot loader binary files from the ELF files: + The build process creates products in a `build` directory tree, building + the objects and binaries for each boot loader stage in separate + sub-directories. The following boot loader binary files are created from + the corresponding ELF files: - * `bl1.bin` - * `bl2.bin` - * `bl31.bin` + * `build///bl1.bin` + * `build///bl2.bin` + * `build///bl31.bin` -4. Copy the above 3 boot loader binary files to the directory where the FVPs - are launched from. Symbolic links of the same names may be created instead. + ... where `` currently defaults to `fvp` and `` is + either `debug` or `release`. -5. (Optional) To clean the build directory use +4. Copy the three boot loader binary files to the directory from which the FVP + will be launched. Symbolic links of the same names may be created instead. - make distclean +5. (Optional) Build products for a specific build variant can be removed using: + + make DEBUG= clean + + ... where `` is `0` or `1`, as specified when building. + + The build tree can be removed completely using: + + make realclean #### Debugging options -- 2.30.2