target-executable.mk (4162B)
1 ## Copyright 2011 Brian Swetland <swetland@frotz.net> 2 ## 3 ## Licensed under the Apache License, Version 2.0 (the "License"); 4 ## you may not use this file except in compliance with the License. 5 ## You may obtain a copy of the License at 6 ## 7 ## http://www.apache.org/licenses/LICENSE-2.0 8 ## 9 ## Unless required by applicable law or agreed to in writing, software 10 ## distributed under the License is distributed on an "AS IS" BASIS, 11 ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 ## See the License for the specific language governing permissions and 13 ## limitations under the License. 14 15 M_NAME := $(strip $(M_NAME)) 16 M_CHIP := $(strip $(M_CHIP)) 17 18 ifeq ($(strip $(M_START)),) 19 M_START := $(ARCH_$(M_ARCH)_START) 20 endif 21 22 M_ARCH := $(CHIP_$(M_CHIP)_ARCH) 23 M_ARCH_CFLAGS := $(ARCH_$(M_ARCH)_CFLAGS) 24 M_ARCH_OBJS := $(ARCH_$(M_ARCH)_OBJS) 25 26 # sanity check 27 ifeq "$(M_NAME)" "" 28 $(error $(M_MAKEFILE): No module name specified) 29 endif 30 ifeq "$(M_ARCH)" "" 31 $(error $(M_MAKEFILE): Module $(M_NAME): Unknown Chip: $(M_CHIP)) 32 endif 33 ifeq "$(M_ARCH_CFLAGS)" "" 34 $(error $(M_MAKEFILE): Module $(M_NAME): Unknown Architecture: $(M_ARCH)) 35 endif 36 37 # architecture start glue goes first 38 M_OBJS := $(M_START) $(M_OBJS) 39 M_OBJS := $(addprefix $(OUT_TARGET_OBJ)/$(M_NAME)/,$(M_OBJS)) 40 M_ARCH_OBJS := $(addprefix $(OUT_TARGET_OBJ)/$(M_NAME)/,$(M_ARCH_OBJS)) 41 42 DEPS += $(M_OBJS:%o=%d) 43 44 M_OUT_BIN := $(OUT)/$(M_NAME).bin 45 M_OUT_LST := $(OUT)/$(M_NAME).lst 46 M_OUT_ELF := $(OUT)/$(M_NAME).elf 47 48 ALL += $(M_OUT_BIN) $(M_OUT_LST) $(M_OUT_ELF) 49 50 M_INCLUDE := $(OUT_TARGET_OBJ)/$(M_NAME)/include 51 M_CONFIG_H := $(M_INCLUDE)/config.h 52 M_ARCH_LIB := $(OUT_TARGET_OBJ)/$(M_NAME)/arch.a 53 M_LINK_SCRIPT := $(OUT_TARGET_OBJ)/$(M_NAME)/script.ld 54 55 # generate link script 56 $(M_LINK_SCRIPT): _RADDR := $(CHIP_$(M_CHIP)_RAMBASE) 57 $(M_LINK_SCRIPT): _RSIZE := $(CHIP_$(M_CHIP)_RAMSIZE) 58 $(M_LINK_SCRIPT): _FADDR := $(CHIP_$(M_CHIP)_ROMBASE) 59 $(M_LINK_SCRIPT): _FSIZE := $(CHIP_$(M_CHIP)_ROMSIZE) 60 $(M_LINK_SCRIPT): _SCRIPT := $(CHIP_$(M_CHIP)_LINKSCRIPT) 61 $(M_LINK_SCRIPT): $(CHIP_$(M_CHIP)_DEPS) 62 @echo linkscript $@ 63 @echo "MEMORY {" > $@ 64 @echo " RAM (xrw) : ORIGIN = $(_RADDR), LENGTH = $(_RSIZE)" >> $@ 65 @echo " FLASH (xr) : ORIGIN = $(_FADDR), LENGTH = $(_FSIZE)" >> $@ 66 @echo "}" >> $@ 67 @echo " INCLUDE \"$(_SCRIPT)\"" >> $@ 68 69 $(M_ARCH_LIB): $(M_ARCH_OBJS) 70 @$(MKDIR) 71 @echo archive $@ 72 $(QUIET)rm -f $@ 73 $(QUIET)$(TARGET_AR) cr $@ $^ 74 75 $(OUT_TARGET_OBJ)/$(M_NAME)/%.o: %.c 76 @$(MKDIR) 77 @echo compile $< 78 $(QUIET)$(TARGET_CC) $(TARGET_CFLAGS) $(_CFLAGS) -c $< -o $@ -MD -MT $@ -MF $(@:%o=%d) 79 80 $(OUT_TARGET_OBJ)/$(M_NAME)/%.o: %.S 81 @$(MKDIR) 82 @echo assemble $< 83 $(QUIET)$(TARGET_CC) $(TARGET_CFLAGS) $(_CFLAGS) -c $< -o $@ -MD -MT $@ -MF $(@:%o=%d) 84 85 # apply our flags to our objects 86 $(M_OBJS): _CFLAGS := --include $(M_CONFIG_H) $(M_ARCH_CFLAGS) $(M_CFLAGS) 87 $(M_ARCH_OBJS): _CFLAGS := --include $(M_CONFIG_H) $(M_ARCH_CFLAGS) $(M_CFLAGS) 88 89 # objects depend on generated config header 90 $(M_OBJS): $(M_CONFIG_H) 91 $(M_ARCH_OBJS): $(M_CONFIG_H) 92 93 X_CONFIG := FLASHSIZE=$(CHIP_$(M_CHIP)_ROMSIZE) 94 X_CONFIG += FLASHADDR=$(CHIP_$(M_CHIP)_ROMBASE) 95 96 # generate config header from module, chip, and arch config lists 97 # generated config header depends on toplevel, module, and chip/arch makefiles 98 $(M_CONFIG_H): _CFG := $(M_CONFIG) $(CHIP_$(M_CHIP)_CONFIG) $(ARCH_$(M_ARCH)_CONFIG) $(X_CONFIG) 99 $(M_CONFIG_H): Makefile $(M_MAKEFILE) $(CHIP_$(M_CHIP)_DEPS) 100 @$(MKDIR) 101 @echo generate $@ 102 @$(call make-config-header,$@,$(_CFG)) 103 104 $(M_OUT_BIN): _SIGN := $(if $(M_SIGN),$(M_SIGN),true) 105 $(M_OUT_BIN): $(M_OUT_ELF) $(M_SIGN) 106 @echo create $@ 107 $(QUIET)$(TARGET_OBJCOPY) --gap-fill=0xee -O binary $< $@.tmp 108 $(QUIET)$(_SIGN) $@.tmp && mv $@.tmp $@ 109 110 $(M_OUT_LST): $(M_OUT_ELF) 111 @echo create $@ 112 $(QUIET)$(TARGET_OBJDUMP) --source -d $< > $@ 113 114 $(M_OUT_ELF): _OBJS := $(M_OBJS) 115 $(M_OUT_ELF): _LIBS := $(M_LIBS) $(M_ARCH_LIB) 116 $(M_OUT_ELF): _LINK := $(M_LINK_SCRIPT) 117 $(M_OUT_ELF): $(M_OBJS) $(M_ARCH_LIB) $(M_LINK_SCRIPT) 118 @echo link $@ 119 $(QUIET)$(TARGET_LD) $(TARGET_LFLAGS) -Bstatic -T $(_LINK) $(_OBJS) $(_LIBS) -o $@ 120 121 $(info module $(M_NAME)) 122 123 M_START := 124 M_OBJS := 125 M_NAME := 126 M_BASE := 127 M_LIBS := 128 M_CFLAGS := 129 M_CONFIG := 130 M_SIGN :=