# # ACRN Hypervisor # include ../VERSION FULL_VERSION=$(MAJOR_VERSION).$(MINOR_VERSION)$(EXTRA_VERSION) SCENARIO_IN_XML := API_MAJOR_VERSION=1 API_MINOR_VERSION=0 GCC_MAJOR=$(shell echo __GNUC__ | $(CC) -E -x c - | tail -n 1) GCC_MINOR=$(shell echo __GNUC_MINOR__ | $(CC) -E -x c - | tail -n 1) #enable stack overflow check STACK_PROTECTOR := 1 BASEDIR := $(shell pwd) HV_OBJDIR ?= $(CURDIR)/build HV_MODDIR ?= $(HV_OBJDIR)/modules HV_FILE := acrn SUB_MAKEFILES := $(wildcard */Makefile) LIB_MOD = $(HV_MODDIR)/lib_mod.a BOOT_MOD = $(HV_MODDIR)/boot_mod.a HW_MOD = $(HV_MODDIR)/hw_mod.a VP_BASE_MOD = $(HV_MODDIR)/vp_base_mod.a VP_DM_MOD = $(HV_MODDIR)/vp_dm_mod.a VP_TRUSTY_MOD = $(HV_MODDIR)/vp_trusty_mod.a VP_HCALL_MOD = $(HV_MODDIR)/vp_hcall_mod.a LIB_DEBUG = $(HV_MODDIR)/libdebug.a LIB_RELEASE = $(HV_MODDIR)/librelease.a SYS_INIT_MOD = $(HV_MODDIR)/sys_init_mod.a # initialize the flags we used CFLAGS := ASFLAGS := LDFLAGS := ARFLAGS := ARCH_CFLAGS := ARCH_ASFLAGS := ARCH_ARFLAGS := ARCH_LDFLAGS := ifneq ($(BOARD_FILE)$(SCENARIO_FILE),) override BOARD := $(shell echo `sed -n '/ does not match Kconfig <$(CONFIG_BOARD)>!"; exit 1; \ fi @if [ "$(SCENARIO_IN_XML)" != "$(SCENARIO_NAME)" ]; then \ echo "Scenario in xml file <$(SCENARIO_IN_XML)> does not match Kconfig <$(SCENARIO_NAME)>!"; exit 1; \ fi @python3 ../misc/acrn-config/board_config/board_cfg_gen.py --board $(BOARD_FILE) --scenario $(SCENARIO_FILE) > $(HV_OBJDIR)/.cfg_src_result @cat $(HV_OBJDIR)/.cfg_src_result @if [ "`sed -n /successfully/p $(HV_OBJDIR)/.cfg_src_result`" = "" ]; then exit 1; fi @python3 ../misc/acrn-config/scenario_config/scenario_cfg_gen.py --board $(BOARD_FILE) --scenario $(SCENARIO_FILE) > $(HV_OBJDIR)/.cfg_src_result @cat $(HV_OBJDIR)/.cfg_src_result @if [ "`sed -n /successfully/p $(HV_OBJDIR)/.cfg_src_result`" = "" ]; then exit 1; fi @echo "Import hypervisor configurations from Config-xmls, configurations in source code are ignored!" @sed -i 's/#define HV_CONFIG_TOOL ""/#define HV_CONFIG_TOOL " with acrn-config"/g' $(VERSION) else @echo "Use hypervisor configurations from source code directly." endif .PHONY: pre_build pre_build: $(PRE_BUILD_OBJS) .PHONY: header header: $(VERSION) $(HV_OBJDIR)/$(HV_CONFIG_H) $(TARGET_ACPI_INFO_HEADER) .PHONY: lib-mod boot-mod hw-mod vp-base-mod vp-dm-mod vp-trusty-mod vp-hcall-mod sys-init-mod lib-mod: $(LIB_C_OBJS) $(LIB_S_OBJS) $(AR) $(ARFLAGS) $(LIB_MOD) $(LIB_C_OBJS) $(LIB_S_OBJS) $(LIB_MOD): lib-mod boot-mod: $(BOOT_S_OBJS) $(BOOT_C_OBJS) $(AR) $(ARFLAGS) $(BOOT_MOD) $(BOOT_S_OBJS) $(BOOT_C_OBJS) $(BOOT_MOD): boot-mod hw-mod: $(HW_S_OBJS) $(HW_C_OBJS) $(AR) $(ARFLAGS) $(HW_MOD) $(HW_S_OBJS) $(HW_C_OBJS) $(HW_MOD): hw-mod vp-base-mod: $(VP_BASE_S_OBJS) $(VP_BASE_C_OBJS) $(AR) $(ARFLAGS) $(VP_BASE_MOD) $(VP_BASE_S_OBJS) $(VP_BASE_C_OBJS) $(VP_BASE_MOD): vp-base-mod vp-dm-mod: $(VP_DM_C_OBJS) $(AR) $(ARFLAGS) $(VP_DM_MOD) $(VP_DM_C_OBJS) $(VP_DM_MOD): vp-dm-mod vp-trusty-mod: $(VP_TRUSTY_C_OBJS) $(AR) $(ARFLAGS) $(VP_TRUSTY_MOD) $(VP_TRUSTY_C_OBJS) $(VP_TRUSTY_MOD): vp-trusty-mod vp-hcall-mod: $(VP_HCALL_C_OBJS) $(AR) $(ARFLAGS) $(VP_HCALL_MOD) $(VP_HCALL_C_OBJS) $(VP_HCALL_MOD): vp-hcall-mod sys-init-mod: $(SYS_INIT_C_OBJS) $(AR) $(ARFLAGS) $(SYS_INIT_MOD) $(SYS_INIT_C_OBJS) $(SYS_INIT_MOD): sys-init-mod .PHONY: lib lib: $(SUB_MAKEFILES) .PHONY: $(SUB_MAKEFILES) $(SUB_MAKEFILES): header for Makefile in $(SUB_MAKEFILES); do \ $(MAKE) -f $$Makefile MKFL_NAME=$$Makefile; \ done $(LIB_RELEASE): lib $(LIB_DEBUG): lib $(HV_OBJDIR)/$(HV_FILE).32.out: $(HV_OBJDIR)/$(HV_FILE).out $(OBJCOPY) -S --section-alignment=0x1000 -O elf32-i386 $< $@ $(HV_OBJDIR)/$(HV_FILE).bin: $(HV_OBJDIR)/$(HV_FILE).out $(OBJCOPY) -O binary $< $(HV_OBJDIR)/$(HV_FILE).bin $(HV_OBJDIR)/$(HV_FILE).out: $(MODULES) ${BASH} ${LD_IN_TOOL} $(ARCH_LDSCRIPT_IN) $(ARCH_LDSCRIPT) ${HV_OBJDIR}/.config $(CC) -Wl,-Map=$(HV_OBJDIR)/$(HV_FILE).map -o $@ $(LDFLAGS) $(ARCH_LDFLAGS) -T$(ARCH_LDSCRIPT) \ -Wl,--start-group $^ -Wl,--end-group .PHONY: clean clean: rm -f $(VERSION) rm -rf $(HV_OBJDIR) .PHONY: distclean distclean: rm -f $(DISTCLEAN_OBJS) rm -f $(VERSION) rm -rf $(HV_OBJDIR) rm -f tags TAGS cscope.files cscope.in.out cscope.out cscope.po.out GTAGS GPATH GRTAGS GSYMS PHONY: (VERSION) $(VERSION): touch $(VERSION) @COMMIT=`git rev-parse --verify --short HEAD 2>/dev/null`;\ DIRTY=`git diff-index --name-only HEAD`;\ if [ -n "$$DIRTY" ];then PATCH="$$COMMIT-dirty";else PATCH="$$COMMIT";fi;\ DAILY_TAG=`git tag --merged HEAD|grep "acrn"|tail -n 1`;\ TIME=`date "+%F %T"`;\ USER=`id -u -n`; \ if [ x$(CONFIG_RELEASE) = "xy" ];then BUILD_TYPE="REL";else BUILD_TYPE="DBG";fi;\ echo "/*" > $(VERSION); \ sed 's/^/ * /' ../LICENSE >> $(VERSION); \ echo " */" >> $(VERSION); \ echo "" >> $(VERSION); \ echo "#ifndef VERSION_H" >> $(VERSION); \ echo "#define VERSION_H" >> $(VERSION); \ echo "#define HV_FULL_VERSION "\"$(FULL_VERSION)\""" >> $(VERSION);\ echo "#define HV_API_MAJOR_VERSION $(API_MAJOR_VERSION)U" >> $(VERSION);\ echo "#define HV_API_MINOR_VERSION $(API_MINOR_VERSION)U" >> $(VERSION);\ echo "#define HV_DAILY_TAG "\""$$DAILY_TAG"\""" >> $(VERSION);\ echo "#define HV_BUILD_VERSION "\""$$PATCH"\""" >> $(VERSION);\ echo "#define HV_BUILD_TYPE "\""$$BUILD_TYPE"\""" >> $(VERSION);\ echo "#define HV_BUILD_TIME "\""$$TIME"\""" >> $(VERSION);\ echo "#define HV_BUILD_USER "\""$$USER"\""" >> $(VERSION);\ echo "#define HV_CONFIG_TOOL \"\"" >> $(VERSION);\ echo "#endif" >> $(VERSION) -include $(C_OBJS:.o=.d) -include $(S_OBJS:.o=.d) $(HV_OBJDIR)/%.o: %.c $(VERSION) $(HV_OBJDIR)/$(HV_CONFIG_H) $(TARGET_ACPI_INFO_HEADER) [ ! -e $@ ] && mkdir -p $(dir $@) && mkdir -p $(HV_MODDIR); \ $(CC) $(patsubst %, -I%, $(INCLUDE_PATH)) -I. -c $(CFLAGS) $(ARCH_CFLAGS) $< -o $@ -MMD -MT $@ $(HV_OBJDIR)/%.o: %.S $(HV_OBJDIR)/$(HV_CONFIG_H) [ ! -e $@ ] && mkdir -p $(dir $@) && mkdir -p $(HV_MODDIR); \ $(CC) $(patsubst %, -I%, $(INCLUDE_PATH)) -I. $(ASFLAGS) $(ARCH_ASFLAGS) -c $< -o $@ -MMD -MT $@