1SHELL := /usr/bin/env bash 2 3ifeq ($(wildcard config.mak),) 4$(error run ./configure first. See ./configure -h) 5endif 6 7include config.mak 8 9# Set search path for all sources 10VPATH = $(SRCDIR) 11 12libdirs-get = $(shell [ -d "lib/$(1)" ] && echo "lib/$(1) lib/$(1)/asm") 13ARCH_LIBDIRS := $(call libdirs-get,$(ARCH)) $(call libdirs-get,$(TEST_DIR)) 14OBJDIRS := $(ARCH_LIBDIRS) 15 16DESTDIR := $(PREFIX)/share/kvm-unit-tests/ 17 18.PHONY: arch_clean clean distclean cscope 19 20#make sure env CFLAGS variable is not used 21CFLAGS = 22 23libgcc := $(shell $(CC) --print-libgcc-file-name) 24 25libcflat := lib/libcflat.a 26cflatobjs := \ 27 lib/argv.o \ 28 lib/printf.o \ 29 lib/string.o \ 30 lib/abort.o \ 31 lib/report.o \ 32 lib/stack.o 33 34# libfdt paths 35LIBFDT_objdir = lib/libfdt 36LIBFDT_srcdir = $(SRCDIR)/lib/libfdt 37LIBFDT_archive = $(LIBFDT_objdir)/libfdt.a 38LIBFDT_include = $(addprefix $(LIBFDT_srcdir)/,$(LIBFDT_INCLUDES)) 39LIBFDT_version = $(addprefix $(LIBFDT_srcdir)/,$(LIBFDT_VERSION)) 40 41OBJDIRS += $(LIBFDT_objdir) 42 43#include architecture specific make rules 44include $(SRCDIR)/$(TEST_DIR)/Makefile 45 46# cc-option 47# Usage: OP_CFLAGS+=$(call cc-option, -falign-functions=0, -malign-functions=0) 48 49cc-option = $(shell if $(CC) $(1) -S -o /dev/null -xc /dev/null \ 50 > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;) 51 52COMMON_CFLAGS += -g $(autodepend-flags) 53COMMON_CFLAGS += -Wall -Wwrite-strings -Wclobbered -Wempty-body -Wuninitialized 54COMMON_CFLAGS += -Wignored-qualifiers -Wunused-but-set-parameter 55COMMON_CFLAGS += -Werror 56frame-pointer-flag=-f$(if $(KEEP_FRAME_POINTER),no-,)omit-frame-pointer 57fomit_frame_pointer := $(call cc-option, $(frame-pointer-flag), "") 58fnostack_protector := $(call cc-option, -fno-stack-protector, "") 59fnostack_protector_all := $(call cc-option, -fno-stack-protector-all, "") 60wno_frame_address := $(call cc-option, -Wno-frame-address, "") 61fno_pic := $(call cc-option, -fno-pic, "") 62no_pie := $(call cc-option, -no-pie, "") 63COMMON_CFLAGS += $(fomit_frame_pointer) 64COMMON_CFLAGS += $(fno_stack_protector) 65COMMON_CFLAGS += $(fno_stack_protector_all) 66COMMON_CFLAGS += $(wno_frame_address) 67COMMON_CFLAGS += $(if $(U32_LONG_FMT),-D__U32_LONG_FMT__,) 68COMMON_CFLAGS += $(fno_pic) $(no_pie) 69 70CFLAGS += $(COMMON_CFLAGS) 71CFLAGS += -Wmissing-parameter-type -Wold-style-declaration -Woverride-init 72CFLAGS += -Wmissing-prototypes -Wstrict-prototypes 73 74CXXFLAGS += $(COMMON_CFLAGS) 75 76autodepend-flags = -MMD -MF $(dir $*).$(notdir $*).d 77 78LDFLAGS += $(CFLAGS) 79 80$(libcflat): $(cflatobjs) 81 $(AR) rcs $@ $^ 82 83include $(LIBFDT_srcdir)/Makefile.libfdt 84$(LIBFDT_archive): CFLAGS += -ffreestanding -I $(SRCDIR)/lib -I $(SRCDIR)/lib/libfdt -Wno-sign-compare 85$(LIBFDT_archive): $(addprefix $(LIBFDT_objdir)/,$(LIBFDT_OBJS)) 86 $(AR) rcs $@ $^ 87 88 89# Build directory target 90.PHONY: directories 91directories: 92 @mkdir -p $(OBJDIRS) 93 94%.o: %.S 95 $(CC) $(CFLAGS) -c -nostdlib -o $@ $< 96 97-include */.*.d */*/.*.d 98 99all: directories $(shell cd $(SRCDIR) && git rev-parse --verify --short=8 HEAD >$(PWD)/build-head 2>/dev/null) 100 101standalone: all 102 @scripts/mkstandalone.sh 103 104install: standalone 105 mkdir -p $(DESTDIR) 106 install tests/* $(DESTDIR) 107 108clean: arch_clean 109 $(RM) lib/.*.d $(libcflat) $(cflatobjs) 110 111libfdt_clean: 112 $(RM) $(LIBFDT_archive) \ 113 $(addprefix $(LIBFDT_objdir)/,$(LIBFDT_OBJS)) \ 114 $(LIBFDT_objdir)/.*.d 115 116distclean: clean libfdt_clean 117 $(RM) lib/asm lib/config.h config.mak $(TEST_DIR)-run msr.out cscope.* build-head 118 $(RM) -r tests logs logs.old 119 120cscope: cscope_dirs = lib lib/libfdt lib/linux $(TEST_DIR) $(ARCH_LIBDIRS) lib/asm-generic 121cscope: 122 $(RM) ./cscope.* 123 find -L $(cscope_dirs) -maxdepth 1 \ 124 -name '*.[chsS]' -exec realpath --relative-base=$(PWD) {} \; | sort -u > ./cscope.files 125 cscope -bk 126