summaryrefslogtreecommitdiff
path: root/Makefile.rules
blob: 50709aa64cdbb970893eb1d13c34c75ace719bb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# -*- makefile -*-
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Embedded Controller firmware build system - common targets
#

objs := $(all-y)
deps := $(objs:%.o=%.o.d)
build-utils := $(foreach u,$(build-util-bin),$(out)/util/$(u))
host-utils := $(foreach u,$(host-util-bin),$(out)/util/$(u))

# Create output directories if necessary
_dir_create := $(foreach d,$(dirs),$(shell [ -d $(out)/$(d) ] || \
	    mkdir -p $(out)/$(d)))
_dir_y_create := $(foreach d,$(dirs-y),$(shell [ -d $(out)/$(d) ] || \
	    mkdir -p $(out)/$(d)))

section = $(subst .,,$(suffix $(1)))
section_is = $(subst .,,SECTION_IS_$(suffix $(1)))

# Decrease verbosity unless you pass V=1
quiet = $(if $(V),,@echo '  $(2)' $(subst $(out)/,,$@) ; )$(cmd_$(1))
silent = $(if $(V),,1>/dev/null)

# commands to build all targets
cmd_lds = $(CPP) -P -C -MMD -MF $@.d -MT $@ $(CPPFLAGS) \
          -D$(call section_is,$*) \
          -DSECTION=$(call section,$*) $< -o $@
cmd_obj_to_bin = $(OBJCOPY) --gap-fill=0xff -O binary $^ $(out)/$*.bin.tmp
cmd_flat_to_obj = $(CC) -T $(out)/firmware_image.lds -nostdlib $(CPPFLAGS) \
                  -Wl,--build-id=none -o $@ $<
cmd_elf_to_flat = $(OBJCOPY) -O binary $^ $@
cmd_elf_to_dis = $(OBJDUMP) -D $< > $@
cmd_elf = $(LD) $(LDFLAGS) $(objs) -o $@ -T $< -Map $(out)/$*.map
cmd_c_to_o = $(CC) $(CFLAGS) -MMD -MF $@.d -c $< -o $@
cmd_c_to_build = $(BUILDCC) $(BUILD_CFLAGS) $(BUILD_LDFLAGS) \
	         -MMD -MF $@.d $< -o $@
cmd_c_to_host = $(HOSTCC) $(HOST_CFLAGS) -MMD -MF $@.d $(filter %.c, $^) -o $@
cmd_qemu = ./util/run_qemu_test --image=build/$(BOARD)/$*/$*.bin test/$*.py \
	   $(silent)
cmd_version = ./util/getversion.sh > $@
cmd_mv_from_tmp = mv $(out)/$*.bin.tmp $(out)/$*.bin
cmd_extractrw-y = cd $(out) && \
	dump_fmap -x $(PROJECT).bin.tmp RW_SECTION_A $(silent) && \
	mv RW_SECTION_A $(PROJECT).RW.bin
cmd_copyrw-y = cd $(out) && cp $(PROJECT).RW.flat $(PROJECT).RW.bin

.PHONY: all tests utils
all: $(out)/$(PROJECT).bin utils

dis-y = $(out)/$(PROJECT).RO.dis $(out)/$(PROJECT).RW.dis
dis: $(dis-y)

utils: $(build-utils) $(host-utils)

test-targets=$(foreach t,$(test-list),test-$(t))
qemu-test-targets=$(foreach t,$(test-list),qemu-$(t))
.PHONY: $(qemu-test-target) $(test-targets)

$(test-targets): test-%:
	@set -e ; \
	echo "  BUILD   $(out)/$*" ; \
	$(MAKE) --no-print-directory BOARD=$(BOARD) PROJECT=$* \
	        V=$(V) out=$(out)/$*

$(qemu-test-targets): qemu-%: test-%
	$(call quiet,qemu,TEST   )

tests: $(test-targets)
qemu-tests: $(qemu-test-targets)

$(out)/firmware_image.lds: common/firmware_image.lds.S
	$(call quiet,lds,LDS    )
$(out)/%.lds: core/$(CORE)/ec.lds.S
	$(call quiet,lds,LDS    )

$(out)/%.bin: $(out)/%.obj
	$(call quiet,obj_to_bin,OBJCOPY)
	$(if $(sign-y),$(call quiet,sign,SIGN   ),)
	$(if $(sign-y),$(call quiet,extractrw-y,EXTR_RW), \
			$(call quiet,copyrw-y,COPY_RW))
	$(call quiet,mv_from_tmp,MV     )

flat-y = $(out)/$(PROJECT).RO.flat $(out)/$(PROJECT).RW.flat

$(out)/%.obj: common/firmware_image.S $(out)/firmware_image.lds $(flat-y)
	$(call quiet,flat_to_obj,CAT    )

$(out)/%.dis: $(out)/%.elf
	$(call quiet,elf_to_dis,OBJDUMP)

$(out)/%.flat: $(out)/%.elf
	$(call quiet,elf_to_flat,OBJCOPY)

$(out)/%.elf: $(out)/%.lds $(objs)
	$(call quiet,elf,LD     )

$(out)/%.o:%.c
	$(call quiet,c_to_o,CC     )

$(out)/vboot/%.o:$(VBOOT_SOURCE)/%.c
	$(call quiet,c_to_o,CC     )

$(out)/%.o:%.S
	$(call quiet,c_to_o,AS     )

$(out)/common/version.o: $(out)/ec_version.h
$(out)/ec_version.h: $(filter-out $(out)/common/version.o,$(objs))
	$(call quiet,version,VERSION)

$(build-utils): $(out)/%:%.c
	$(call quiet,c_to_build,BUILDCC)

$(host-utils): $(out)/%:%.c $(foreach u,$(host-util-common),util/$(u).c) \
			    $(foreach u,$(util-lock-objs),util/lock/$(u).c)
	$(call quiet,c_to_host,HOSTCC )

$(out)/util/burn_my_ec: $(out)/$(PROJECT).bin

.PHONY: clean
clean:
	-rm -rf $(out)

.SECONDARY:

-include $(deps)