#*************************************************************************************** # Copyright (c) 2014-2022 Zihao Yu, Nanjing University # # NEMU is licensed under Mulan PSL v2. # You can use this software according to the terms and conditions of the Mulan PSL v2. # You may obtain a copy of Mulan PSL v2 at: # http://license.coscl.org.cn/MulanPSL2 # # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, # EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, # MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. # # See the Mulan PSL v2 for more details. #**************************************************************************************/ # Sanity check ifeq ($(wildcard $(NEMU_HOME)/src/nemu-main.c),) $(error NEMU_HOME=$(NEMU_HOME) is not a NEMU repo) endif # Include variables and rules generated by menuconfig -include $(NEMU_HOME)/include/config/auto.conf -include $(NEMU_HOME)/include/config/auto.conf.cmd remove_quote = $(patsubst "%",%,$(1)) # Extract variabls from menuconfig GUEST_ISA ?= $(call remove_quote,$(CONFIG_ISA)) ENGINE ?= $(call remove_quote,$(CONFIG_ENGINE)) NAME = $(GUEST_ISA)-nemu-$(ENGINE) # Include all filelist.mk to merge file lists FILELIST_MK = $(shell find -L ./src -name "filelist.mk") include $(FILELIST_MK) # Filter out directories and files in blacklist to obtain the final set of source files DIRS-BLACKLIST-y += $(DIRS-BLACKLIST) SRCS-BLACKLIST-y += $(SRCS-BLACKLIST) $(shell find -L $(DIRS-BLACKLIST-y) -name "*.c") SRCS-y += $(shell find -L $(DIRS-y) -name "*.c") SRCS = $(filter-out $(SRCS-BLACKLIST-y),$(SRCS-y)) # Extract compiler and options from menuconfig ifneq ($(CONFIG_CC),) CC = $(call remove_quote,$(CONFIG_CC)) endif CFLAGS_BUILD += $(call remove_quote,$(CONFIG_CC_OPT)) CFLAGS_BUILD += $(if $(CONFIG_CC_LTO),-flto,) CFLAGS_BUILD += $(if $(CONFIG_CC_DEBUG),-Og -ggdb3,) CFLAGS_BUILD += $(if $(CONFIG_CC_ASAN),-fsanitize=address,) CFLAGS_TRACE += -DITRACE_COND=$(if $(CONFIG_ITRACE_COND),$(call remove_quote,$(CONFIG_ITRACE_COND)),true) CFLAGS += $(CFLAGS_BUILD) $(CFLAGS_TRACE) -D__GUEST_ISA__=$(GUEST_ISA) LDFLAGS += $(CFLAGS_BUILD) INC_PATH += $(NEMU_HOME)/src/isa/$(GUEST_ISA)/local-include # Include rules for menuconfig include $(NEMU_HOME)/scripts/config.mk ifdef CONFIG_TARGET_AM include $(AM_HOME)/Makefile LINKAGE += $(ARCHIVES) else # Include rules to build NEMU include $(NEMU_HOME)/scripts/native.mk endif include $(NEMU_HOME)/tests/Makefile unit-tests: TEST_OBJS = $(filter-out $(OBJ_DIR)/src/nemu-main.o, $(OBJS)) unit-tests: CFLAGS += $(shell pkg-config --cflags check) unit-tests: LDFLAGS += $(shell pkg-config --libs check) unit-tests: $(TEST_SRCS:%.c=$(OBJ_DIR)/%) IMAGES = $(patsubst %.bin, %, $(shell find $(IMAGES_PATH) -type f -name '*.bin')) COLOR_RED = \033[1;31m COLOR_GREEN = \033[1;32m COLOR_BLUE = \033[1;34m COLOR_NONE = \033[0m RESULT = .result.tmp $(shell > $(RESULT)) # Clear result file $(IMAGES): %: %.bin $(BINARY) @echo + TEST $(notdir $<) @$(BINARY) -b $< >/dev/null 2>&1 || printf "\t%14s\n" $(notdir $<) >> $(RESULT) integration-tests: $(IMAGES) @printf "$(COLOR_BLUE)INTEGRATION TEST:$(COLOR_NONE)\n\tALL: %s\n\tFAILED: %s\n" $(words $(IMAGES)) $(shell wc -l $(RESULT) | cut -f1 -d' ') @test ! -s $(RESULT) || printf "$(COLOR_RED)FAILED:$(COLOR_NONE)\n" @cat $(RESULT) @test ! -s $(RESULT); \ r=$$?; \ $(RM) $(RESULT); \ test $$r -eq 0 test: unit-tests integration-tests .PHONY: test unit-tests integration-tests