summaryrefslogtreecommitdiff
path: root/tools/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Makefile')
-rw-r--r--tools/Makefile239
1 files changed, 239 insertions, 0 deletions
diff --git a/tools/Makefile b/tools/Makefile
new file mode 100644
index 0000000..54e374e
--- /dev/null
+++ b/tools/Makefile
@@ -0,0 +1,239 @@
+RUSTARCH ?= aarch64-unknown-none-softfloat
+
+ifeq ($(shell uname),Darwin)
+USE_CLANG ?= 1
+$(info INFO: Building on Darwin)
+ifeq ($(shell uname -p),arm)
+TOOLCHAIN ?= /opt/homebrew/opt/llvm/bin/
+else
+TOOLCHAIN ?= /usr/local/opt/llvm/bin/
+endif
+$(info INFO: Toolchain path: $(TOOLCHAIN))
+endif
+
+ifeq ($(shell uname -m),aarch64)
+ARCH ?=
+else
+ARCH ?= aarch64-linux-gnu-
+endif
+
+ifeq ($(USE_CLANG),1)
+CC := $(TOOLCHAIN)clang --target=$(ARCH)
+AS := $(TOOLCHAIN)clang --target=$(ARCH)
+LD := $(TOOLCHAIN)ld.lld
+OBJCOPY := $(TOOLCHAIN)llvm-objcopy
+CLANG_FORMAT := $(TOOLCHAIN)clang-format
+EXTRA_CFLAGS ?=
+else
+CC := $(TOOLCHAIN)$(ARCH)gcc
+AS := $(TOOLCHAIN)$(ARCH)gcc
+LD := $(TOOLCHAIN)$(ARCH)ld
+OBJCOPY := $(TOOLCHAIN)$(ARCH)objcopy
+CLANG_FORMAT := clang-format
+EXTRA_CFLAGS ?= -Wstack-usage=1024
+endif
+
+BASE_CFLAGS := -O2 -Wall -g -Wundef -Werror=strict-prototypes -fno-common -fno-PIE \
+ -Werror=implicit-function-declaration -Werror=implicit-int \
+ -Wsign-compare -Wunused-parameter -Wno-multichar \
+ -ffreestanding -fpic -ffunction-sections -fdata-sections \
+ -nostdinc -isystem $(shell $(CC) -print-file-name=include) -isystem sysinc \
+ -fno-stack-protector -mstrict-align -march=armv8.2-a \
+ $(EXTRA_CFLAGS)
+
+CFLAGS := $(BASE_CFLAGS) -mgeneral-regs-only
+
+CFG :=
+ifeq ($(RELEASE),1)
+CFG += RELEASE
+endif
+
+# Required for no_std + alloc for now
+export RUSTUP_TOOLCHAIN=nightly
+RUST_LIB := librust.a
+RUST_LIBS :=
+ifeq ($(CHAINLOADING),1)
+CFG += CHAINLOADING
+RUST_LIBS += $(RUST_LIB)
+endif
+
+LDFLAGS := -EL -maarch64elf --no-undefined -X -Bsymbolic \
+ -z notext --no-apply-dynamic-relocs --orphan-handling=warn \
+ -z nocopyreloc --gc-sections -pie
+
+MINILZLIB_OBJECTS := $(patsubst %,minilzlib/%, \
+ dictbuf.o inputbuf.o lzma2dec.o lzmadec.o rangedec.o xzstream.o)
+
+TINF_OBJECTS := $(patsubst %,tinf/%, \
+ adler32.o crc32.o tinfgzip.o tinflate.o tinfzlib.o)
+
+DLMALLOC_OBJECTS := dlmalloc/malloc.o
+
+LIBFDT_OBJECTS := $(patsubst %,libfdt/%, \
+ fdt_addresses.o fdt_empty_tree.o fdt_ro.o fdt_rw.o fdt_strerror.o fdt_sw.o \
+ fdt_wip.o fdt.o)
+
+OBJECTS := \
+ adt.o \
+ afk.o \
+ aic.o \
+ asc.o \
+ bootlogo_128.o bootlogo_256.o \
+ chainload.o \
+ chainload_asm.o \
+ chickens.o \
+ chickens_avalanche.o \
+ chickens_blizzard.o \
+ chickens_firestorm.o \
+ chickens_icestorm.o \
+ clk.o \
+ cpufreq.o \
+ dapf.o \
+ dart.o \
+ dcp.o \
+ dcp_iboot.o \
+ devicetree.o \
+ display.o \
+ exception.o exception_asm.o \
+ fb.o font.o font_retina.o \
+ firmware.o \
+ gxf.o gxf_asm.o \
+ heapblock.o \
+ hv.o hv_vm.o hv_exc.o hv_vuart.o hv_wdt.o hv_asm.o hv_aic.o hv_virtio.o \
+ i2c.o \
+ iodev.o \
+ iova.o \
+ kboot.o \
+ main.o \
+ mcc.o \
+ memory.o memory_asm.o \
+ nvme.o \
+ payload.o \
+ pcie.o \
+ pmgr.o \
+ proxy.o \
+ ringbuffer.o \
+ rtkit.o \
+ sart.o \
+ sep.o \
+ smp.o \
+ start.o \
+ startup.o \
+ string.o \
+ tunables.o tunables_static.o \
+ tps6598x.o \
+ uart.o \
+ uartproxy.o \
+ usb.o usb_dwc3.o \
+ utils.o utils_asm.o \
+ vsprintf.o \
+ wdt.o \
+ $(MINILZLIB_OBJECTS) $(TINF_OBJECTS) $(DLMALLOC_OBJECTS) $(LIBFDT_OBJECTS) $(RUST_LIBS)
+
+FP_OBJECTS := \
+ kboot_gpu.o \
+ math/expf.o \
+ math/exp2f_data.o \
+
+BUILD_OBJS := $(patsubst %,build/%,$(OBJECTS))
+BUILD_FP_OBJS := $(patsubst %,build/%,$(FP_OBJECTS))
+BUILD_ALL_OBJS := $(BUILD_OBJS) $(BUILD_FP_OBJS)
+NAME := m1n1
+TARGET := m1n1.macho
+TARGET_RAW := m1n1.bin
+
+DEPDIR := build/.deps
+
+.PHONY: all clean format update_tag update_cfg invoke_cc
+all: update_tag update_cfg build/$(TARGET) build/$(TARGET_RAW)
+clean:
+ rm -rf build/*
+format:
+ $(CLANG_FORMAT) -i src/*.c src/math/*.c src/*.h src/math/*.h sysinc/*.h
+format-check:
+ $(CLANG_FORMAT) --dry-run --Werror src/*.c src/*.h sysinc/*.h
+rustfmt:
+ cd rust && cargo fmt
+rustfmt-check:
+ cd rust && cargo fmt --check
+
+build/$(RUST_LIB): rust/src/* rust/*
+ @echo " RS $@"
+ @mkdir -p $(DEPDIR)
+ @mkdir -p "$(dir $@)"
+ @cargo build --target $(RUSTARCH) --lib --release --manifest-path rust/Cargo.toml --target-dir build
+ @cp "build/$(RUSTARCH)/release/${RUST_LIB}" "$@"
+
+build/%.o: src/%.S
+ @echo " AS $@"
+ @mkdir -p $(DEPDIR)
+ @mkdir -p "$(dir $@)"
+ @$(AS) -c $(CFLAGS) -MMD -MF $(DEPDIR)/$(*F).d -MQ "$@" -MP -o $@ $<
+
+$(BUILD_FP_OBJS): build/%.o: src/%.c
+ @echo " CC FP $@"
+ @mkdir -p $(DEPDIR)
+ @mkdir -p "$(dir $@)"
+ @$(CC) -c $(BASE_CFLAGS) -MMD -MF $(DEPDIR)/$(*F).d -MQ "$@" -MP -o $@ $<
+
+build/%.o: src/%.c
+ @echo " CC $@"
+ @mkdir -p $(DEPDIR)
+ @mkdir -p "$(dir $@)"
+ @$(CC) -c $(CFLAGS) -MMD -MF $(DEPDIR)/$(*F).d -MQ "$@" -MP -o $@ $<
+
+# special target for usage by m1n1.loadobjs
+invoke_cc:
+ @$(CC) -c $(CFLAGS) -Isrc -o $(OBJFILE) $(CFILE)
+
+build/$(NAME).elf: $(BUILD_ALL_OBJS) m1n1.ld
+ @echo " LD $@"
+ @$(LD) -T m1n1.ld $(LDFLAGS) -o $@ $(BUILD_ALL_OBJS)
+
+build/$(NAME)-raw.elf: $(BUILD_ALL_OBJS) m1n1-raw.ld
+ @echo " LDRAW $@"
+ @$(LD) -T m1n1-raw.ld $(LDFLAGS) -o $@ $(BUILD_ALL_OBJS)
+
+build/$(NAME).macho: build/$(NAME).elf
+ @echo " MACHO $@"
+ @$(OBJCOPY) -O binary --strip-debug $< $@
+
+build/$(NAME).bin: build/$(NAME)-raw.elf
+ @echo " RAW $@"
+ @$(OBJCOPY) -O binary --strip-debug $< $@
+
+update_tag:
+ @mkdir -p build
+ @./version.sh > build/build_tag.tmp
+ @cmp -s build/build_tag.h build/build_tag.tmp 2>/dev/null || \
+ ( mv -f build/build_tag.tmp build/build_tag.h && echo " TAG build/build_tag.h" )
+
+update_cfg:
+ @mkdir -p build
+ @for i in $(CFG); do echo "#define $$i"; done > build/build_cfg.tmp
+ @cmp -s build/build_cfg.h build/build_cfg.tmp 2>/dev/null || \
+ ( mv -f build/build_cfg.tmp build/build_cfg.h && echo " CFG build/build_cfg.h" )
+
+build/build_tag.h: update_tag
+build/build_cfg.h: update_cfg
+
+build/%.bin: data/%.bin
+ @echo " IMG $@"
+ @mkdir -p "$(dir $@)"
+ @cp $< $@
+
+build/%.o: build/%.bin
+ @echo " BIN $@"
+ @mkdir -p "$(dir $@)"
+ @$(OBJCOPY) -I binary -B aarch64 -O elf64-littleaarch64 $< $@
+
+build/%.bin: font/%.bin
+ @echo " CP $@"
+ @mkdir -p "$(dir $@)"
+ @cp $< $@
+
+build/main.o: build/build_tag.h build/build_cfg.h src/main.c
+build/usb_dwc3.o: build/build_tag.h src/usb_dwc3.c
+build/chainload.o: build/build_cfg.h src/usb_dwc3.c
+
+-include $(DEPDIR)/*