Files
NJU_PA/navy-apps/Makefile
tracer-ics2023 78038b59c4 > compile NEMU
221220000 张三
Linux zzy 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
 20:09:33 up 8 days,  7:53,  1 user,  load average: 0.85, 0.37, 0.19
2024-09-26 20:09:33 +08:00

188 lines
5.9 KiB
Makefile

# Makefile for Navy Applications and Libraries
### *Get a more readable version of this Makefile* by `make html` (requires python-markdown)
html:
cat Makefile | sed 's/^\([^#]\)/ \1/g' | markdown_py > Makefile.html
.PHONY: html
## 1. Basic Setup and Checks
### Default to build an application
ifeq ($(MAKECMDGOALS),)
MAKECMDGOALS = app
.DEFAULT_GOAL = app
endif
### Override checks when `make clean/clean-all/html/init`
ifeq ($(findstring $(MAKECMDGOALS),clean|clean-all|html|init),)
### Print build info message
$(info # Building $(NAME)-$(MAKECMDGOALS) [$(ISA)])
### Check: environment variable `$NAVY_HOME` looks sane
ifeq ($(wildcard $(NAVY_HOME)/libs/libos/src/syscall.h),)
$(error $$NAVY_HOME must be a Navy-apps repo)
endif
### Check: environment variable `$ISA` must be in the supported list
ISAS = $(basename $(notdir $(shell ls $(NAVY_HOME)/scripts/*.mk)))
ifeq ($(filter $(ISAS), $(ISA)), )
$(error Expected $$ISA in {$(ISAS)}, Got "$(ISA)")
endif
### Checks end here
endif
## 2. General Compilation Targets
### Create the destination directory (`build/$ISA`)
WORK_DIR = $(shell pwd)
DST_DIR = $(WORK_DIR)/build/$(ISA)
$(shell mkdir -p $(DST_DIR))
### Compilation targets (application or archive)
APP ?= $(WORK_DIR)/build/$(NAME)-$(ISA)
ARCHIVE = $(WORK_DIR)/build/$(NAME)-$(ISA).a
### Add default libraries for ISA != native
ifneq ($(ISA), native)
LIBS += libc libos libndl libbmp libminiSDL libbdf
CFLAGS += -U_FORTIFY_SOURCE # fix compile error in Newlib on ubuntu
else
WL = -Wl,
endif
### 32-bit ISA may need compiler-rt to support 64-bit mul/div
ifneq ($(findstring $(ISA), x86|mips32|riscv32|riscv32e|loongarch32r),)
LIBS += compiler-rt
endif
### All libraries to add to the include path
LIBS_INC := $(sort $(LIBS) $(LIB_DEP))
ifeq ($(MAKECMDGOALS),archive)
LIBS := $(LIB_DEP) # overwrite here to only build and archive the dependent libraries
endif
### Files to be linked: object files (`.o`) and libraries (`.a`)
OBJS = $(addprefix $(DST_DIR)/, $(addsuffix .o, $(basename $(SRCS))))
LIBS := $(sort $(LIBS)) # lazy evaluation ("=") causes infinite recursions
LINKAGE = $(OBJS) $(foreach l,$(LIBS),$(NAVY_HOME)/libs/$(l)/build/$(l)-$(ISA).a)
## 3. General Compilation Flags
### (Cross) compilers, e.g., mips-linux-gnu-g++
AS = $(CROSS_COMPILE)gcc
CC = $(CROSS_COMPILE)gcc
CXX = $(CROSS_COMPILE)g++
LD = $(CROSS_COMPILE)ld
### Compilation flags
INC_PATH += $(WORK_DIR)/include $(foreach l,$(LIBS_INC),$(NAVY_HOME)/libs/$(l)/include/)
INCFLAGS += $(addprefix -I, $(INC_PATH))
CFLAGS += -O2 -MMD $(INCFLAGS) -static -D__NAVY__ \
-D__ISA__=\"$(ISA)\" -D__ISA_$(shell echo $(ISA) | tr a-z A-Z)__ \
-fno-asynchronous-unwind-tables -fno-builtin -fno-stack-protector
CXXFLAGS += $(CFLAGS) -ffreestanding -fno-rtti -fno-exceptions
ASFLAGS += $(CFLAGS)
## 4. ISA-Specific Configurations
### Paste in ISA-specific configurations (e.g., from `scripts/x86.mk`)
-include $(NAVY_HOME)/scripts/$(ISA).mk
## 5. Compilation Rules
### Rule (compile): a single `.c` -> `.o` (gcc)
$(DST_DIR)/%.o: %.c
@mkdir -p $(dir $@) && echo + CC $<
@$(CC) -std=gnu11 $(CFLAGS) -c -o $@ $(realpath $<)
### Rule (compile): a single `.cc` -> `.o` (g++)
$(DST_DIR)/%.o: %.cc
@mkdir -p $(dir $@) && echo + CXX $<
@$(CXX) -std=c++17 $(CXXFLAGS) -c -o $@ $(realpath $<)
### Rule (compile): a single `.cpp` -> `.o` (g++)
$(DST_DIR)/%.o: %.cpp
@mkdir -p $(dir $@) && echo + CXX $<
@$(CXX) -std=c++17 $(CXXFLAGS) -c -o $@ $(realpath $<)
### Rule (compile): a single `.S` -> `.o` (gcc, which calls as)
$(DST_DIR)/%.o: %.S
@mkdir -p $(dir $@) && echo + AS $<
@$(AS) $(ASFLAGS) -c -o $@ $(realpath $<)
### Rule (recursive make): build dependent libraries (libc, libos, ...)
libs:
@for t in $(LIBS); do $(MAKE) -s -C $(NAVY_HOME)/libs/$$t archive; done
### Rule (link): objects (`*.o`) and libraries (`*.a`) -> `$(APP)`, the final ELF binary to be packed into application (ld)
$(APP): $(OBJS) libs
@echo + LD "->" $(shell realpath $@ --relative-to .)
@$(LD) $(LDFLAGS) -o $@ $(WL)--start-group $(LINKAGE) $(WL)--end-group
### Rule (archive): objects (`*.o`) -> `ARCHIVE.a` (ar)
$(ARCHIVE): $(OBJS) libs
@echo + AR "->" $(shell realpath $@ --relative-to .)
@ar rcsT $@ $(LINKAGE)
### Rule (`#include` dependencies): paste in `.d` files generated by gcc on `-MMD`
-include $(addprefix $(DST_DIR)/, $(addsuffix .d, $(basename $(SRCS))))
## 6. Miscellaneous
### Pull newlib from github if it does not exist
ifeq ($(wildcard $(NAVY_HOME)/libs/libc/Makefile),)
$(shell cd $(NAVY_HOME)/libs && git clone https://www.github.com/NJU-ProjectN/newlib-navy.git libc)
endif
### Build order control
app: $(APP)
archive: $(ARCHIVE)
.PHONY: app archive libs
### Install an application to fsimg
install: app
@echo + INSTALL "->" $(NAME)
@mkdir -p $(NAVY_HOME)/fsimg/bin
@cp $(APP) $(NAVY_HOME)/fsimg/bin/$(NAME)
.PHONY: install
### Clean a single project (remove `build/`)
clean:
rm -rf Makefile.html $(WORK_DIR)/build/ build/
.PHONY: clean
### Clean all sub-projects within depth 2 (and ignore errors)
CLEAN_ALL = $(dir $(shell find . -mindepth 2 -maxdepth 3 -name Makefile))
clean-all: $(CLEAN_ALL) clean
-@rm -f $(NAVY_HOME)/fsimg/bin/*
$(CLEAN_ALL):
-@$(MAKE) -s -C $@ clean
.PHONY: clean-all $(CLEAN_ALL)
### Build fsimg and ramdisk for Nanos-lite
APPS = nslider menu nterm am-kernels
TESTS = dummy hello file-test timer-test event-test bmp-test
fsimg: $(addprefix apps/, $(APPS)) $(addprefix tests/, $(TESTS))
-for t in $^; do $(MAKE) -s -C $(NAVY_HOME)/$$t install; done
RAMDISK = build/ramdisk.img
RAMDISK_H = build/ramdisk.h
$(RAMDISK): fsimg
$(eval FSIMG_FILES := $(shell find -L ./fsimg -type f))
@mkdir -p $(@D)
@cat $(FSIMG_FILES) > $@
@truncate -s \%512 $@
@echo "// file path, file size, offset in disk" > $(RAMDISK_H)
@wc -c $(FSIMG_FILES) | grep -v 'total$$' | sed -e 's+ ./fsimg+ +' | awk -v sum=0 '{print "\x7b\x22" $$2 "\x22\x2c " $$1 "\x2c " sum "\x7d\x2c";sum += $$1}' >> $(RAMDISK_H)
ramdisk: $(RAMDISK)
.PHONY: fsimg ramdisk