blob: 92b272794630696d1ff5d2ee89d3b369782221e0 [file] [log] [blame]
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +01001ROOT_DIR := $(dir $(lastword $(MAKEFILE_LIST)))
2ifeq ($(ROOT_DIR),./)
3 ROOT_DIR :=
4endif
5
6# Defaults.
7ARCH ?= aarch64
8PLAT ?= qemu
9DEBUG ?= 1
Wedson Almeida Filho049f1412018-07-17 23:54:51 +010010CROSS_COMPILE ?= aarch64-linux-gnu-
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010011NAME := hafnium
12
13OUT := $(ROOT_DIR)out/$(ARCH)/$(PLAT)
14
15all: $(OUT)/$(NAME).bin
16
17# Include platform-specific constants.
18include $(ROOT_DIR)src/arch/$(ARCH)/$(PLAT).mk
19
20define include_module
21 SRCS :=
22 OFFSET_SRCS :=
23 include $(ROOT_DIR)$(1)/rules.mk
24 GLOBAL_SRCS += $$(addprefix $(1)/,$$(SRCS))
25 GLOBAL_OFFSET_SRCS += $$(addprefix $(1)/,$$(OFFSET_SRCS))
26endef
27
28#
29# Include each module.
30#
31MODULES := src
32MODULES += src/arch/$(ARCH)
33GLOBAL_SRCS :=
34GLOBAL_OFFSET_SRCS :=
35$(foreach mod,$(MODULES),$(eval $(call include_module,$(mod))))
36
Andrew Scull7ae61652018-07-12 16:14:14 +010037ifeq ($(CLANG),1)
Wedson Almeida Filho049f1412018-07-17 23:54:51 +010038 CC := clang -target $(patsubst %-,%,$(CROSS_COMPILE))
Andrew Scull7ae61652018-07-12 16:14:14 +010039else
Wedson Almeida Filho049f1412018-07-17 23:54:51 +010040 CC := $(CROSS_COMPILE)gcc
Andrew Scull7ae61652018-07-12 16:14:14 +010041endif
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010042
43#
44# Rules to build C files.
45#
46COPTS = -mcpu=cortex-a57+nofp
47COPTS += -fno-stack-protector
48COPTS += -fno-builtin -ffreestanding
49COPTS += -g
50COPTS += -O2
51COPTS += -fpic
52COPTS += -std=c11
53COPTS += -Wall -Wpedantic -Werror
54COPTS += -DDEBUG=$(DEBUG)
55COPTS += -MMD -MP -MF $$(patsubst %,%.d,$$@)
56COPTS += -DMAX_CPUS=8
Wedson Almeida Filho87009642018-07-02 10:20:07 +010057COPTS += -DMAX_VMS=16
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010058COPTS += -DSTACK_SIZE=4096
59COPTS += -I$(ROOT_DIR)inc
60COPTS += -I$(ROOT_DIR)src/arch/$(ARCH)/inc
61COPTS += -I$(OUT)/arch/$(ARCH)/inc
62COPTS += -DGICD_BASE=$(GICD_BASE)
63COPTS += -DGICC_BASE=$(GICC_BASE)
64COPTS += -DGICR_BASE=$(GICR_BASE)
65COPTS += -DTIMER_IRQ=$(TIMER_IRQ)
66
67ifeq ($(PL011),1)
68 COPTS += -DPL011_BASE=$(PL011_BASE)
69endif
70
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010071define build_c
72 TGT := $(patsubst %.c,%.o,$(OUT)/$(patsubst src/%,%,$(1)))
73 GLOBAL_OBJS += $$(TGT)
74 REMAIN_SRCS := $$(filter-out $(1),$$(REMAIN_SRCS))
75$$(TGT): $(ROOT_DIR)$(1) | $$(dir $$(TGT))
76 $$(info CC $(ROOT_DIR)$1)
Andrew Scull7ae61652018-07-12 16:14:14 +010077 @$(CC) $(COPTS) -c $(ROOT_DIR)$(1) -o $$@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010078endef
79
80#
81# Rules to generate offsets.
82#
83define gen_offsets
84 TMP := $(patsubst src/%,%,$(1))
85 TMP := $$(dir $$(TMP))inc/$$(notdir $$(TMP))
86 TGT := $$(patsubst %.c,%.h,$(OUT)/$$(TMP))
87 GLOBAL_OFFSETS += $$(TGT)
88$$(TGT): $(ROOT_DIR)$(1) | $$(dir $$(TGT))
89 $$(info GENOFFSET $(ROOT_DIR)$1)
Andrew Scull7ae61652018-07-12 16:14:14 +010090 @$(CC) $(COPTS) -MT $$@ -S -c $(ROOT_DIR)$(1) -o - | grep DEFINE_OFFSET | sed 's/\tDEFINE_OFFSET/#define/g' > $$@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010091endef
92
93#
94# Rules to build S files.
95#
96define build_S
97 TGT := $(patsubst %.S,%.o,$(OUT)/$(patsubst src/%,%,$(1)))
98 GLOBAL_OBJS += $$(TGT)
99 REMAIN_SRCS := $$(filter-out $(1),$$(REMAIN_SRCS))
100$$(TGT): $(ROOT_DIR)$(1) $(GLOBAL_OFFSETS) | $$(dir $$(TGT))
101 $$(info AS $(ROOT_DIR)$1)
Andrew Scull7ae61652018-07-12 16:14:14 +0100102 @$(CC) $(COPTS) -c $(ROOT_DIR)$(1) -o $$@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +0100103endef
104
105#
106# Generate the build rules for all .c and .S files.
107#
108GLOBAL_OBJS :=
109GLOBAL_OFFSETS :=
110REMAIN_SRCS := $(GLOBAL_SRCS)
111$(foreach file,$(filter %.c,$(GLOBAL_OFFSET_SRCS)),$(eval $(call gen_offsets,$(file))))
112$(foreach file,$(filter %.c,$(GLOBAL_SRCS)),$(eval $(call build_c,$(file))))
113$(foreach file,$(filter %.S,$(GLOBAL_SRCS)),$(eval $(call build_S,$(file))))
114
115#
116# Check if there are any source files which we don't know to handle.
117#
118ifneq ($(REMAIN_SRCS),)
119 $(error Don't know how to handle $(REMAIN_SRCS))
120endif
121
122#
123# Rule to create all output directories.
124#
125define create_dir
126$1:
127 @mkdir -p $1
128endef
129$(foreach name,$(sort $(dir $(GLOBAL_OBJS))),$(eval $(call create_dir,$(name))))
130$(foreach name,$(sort $(dir $(GLOBAL_OFFSETS))),$(eval $(call create_dir,$(name))))
131
132#
133# Rules to build the hypervisor.
134#
135$(OUT)/$(NAME): $(GLOBAL_OBJS) $(ROOT_DIR)src/$(NAME).ld
136 $(info LD $(ROOT_DIR)src/$(NAME).ld)
Wedson Almeida Filho049f1412018-07-17 23:54:51 +0100137 @$(CROSS_COMPILE)ld -g -pie $(GLOBAL_OBJS) -T$(ROOT_DIR)src/$(NAME).ld --defsym PREFERRED_LOAD_ADDRESS=$(LOAD_ADDRESS) -o $@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +0100138
139$(OUT)/$(NAME).bin: $(OUT)/$(NAME)
140 $(info OBJCOPY $@)
Wedson Almeida Filho049f1412018-07-17 23:54:51 +0100141 @$(CROSS_COMPILE)objcopy -O binary $< $@
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +0100142
143clean:
144 rm -rf $(ROOT_DIR)out
145
146-include $(patsubst %,%.d,$(GLOBAL_OBJS),$(GLOBAL_OFFSETS))