| RUSTARCH ?= aarch64-unknown-none-softfloat |
| |
| ifeq ($(shell uname),Darwin) |
| USE_CLANG ?= 1 |
| $(info INFO: Building on Darwin) |
| BREW ?= $(shell command -v brew) |
| TOOLCHAIN ?= $(shell $(BREW) --prefix llvm)/bin/ |
| ifeq ($(shell ls $(TOOLCHAIN)/ld.lld 2>/dev/null),) |
| LLDDIR ?= $(shell $(BREW) --prefix lld)/bin/ |
| else |
| LLDDIR ?= $(TOOLCHAIN) |
| endif |
| $(info INFO: Toolchain path: $(TOOLCHAIN)) |
| endif |
| |
| ifeq ($(shell uname -m),aarch64) |
| ARCH ?= |
| else |
| ARCH ?= aarch64-linux-gnu- |
| endif |
| |
| ifneq ($(TOOLCHAIN),$(LLDDIR)) |
| $(info INFO: LLD path: $(LLDDIR)) |
| endif |
| |
| ifeq ($(USE_CLANG),1) |
| CC := $(TOOLCHAIN)clang --target=$(ARCH) |
| AS := $(TOOLCHAIN)clang --target=$(ARCH) |
| LD := $(LLDDIR)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=2048 |
| endif |
| |
| ifeq ($(V),) |
| QUIET := @ |
| else |
| ifeq ($(V),0) |
| QUIET := @ |
| else |
| QUIET := |
| endif |
| 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 RUSTC_BOOTSTRAP=1 |
| 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) |
| |
| DCP_OBJECTS := $(patsubst %,dcp/%, \ |
| dpav_ep.o \ |
| dptx_phy.o \ |
| dptx_port_ep.o \ |
| parser.o \ |
| system_ep.o) |
| |
| OBJECTS := \ |
| adt.o \ |
| afk.o \ |
| aic.o \ |
| asc.o \ |
| bootlogo_48.o bootlogo_128.o bootlogo_256.o \ |
| chainload.o \ |
| chainload_asm.o \ |
| chickens.o \ |
| chickens_avalanche.o \ |
| chickens_blizzard.o \ |
| chickens_cyclone_typhoon.o \ |
| chickens_everest.o \ |
| chickens_firestorm.o \ |
| chickens_hurricane_zephyr.o \ |
| chickens_monsoon_mistral.o \ |
| chickens_icestorm.o \ |
| chickens_sawtooth.o \ |
| chickens_twister.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 \ |
| isp.o \ |
| kboot.o kboot_atc.o \ |
| main.o \ |
| mitigations.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 \ |
| sio.o \ |
| smc.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 \ |
| $(DCP_OBJECTS) \ |
| $(MINILZLIB_OBJECTS) $(TINF_OBJECTS) $(DLMALLOC_OBJECTS) $(LIBFDT_OBJECTS) $(RUST_LIBS) |
| |
| FP_OBJECTS := \ |
| kboot_gpu.o \ |
| math/expf.o \ |
| math/exp2f_data.o \ |
| math/powf.o \ |
| math/powf_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 invoke_cc always_rebuild |
| all: build/$(TARGET) build/$(TARGET_RAW) |
| clean: |
| rm -rf build/* build/.deps |
| format: |
| $(CLANG_FORMAT) -i src/*.c src/dcp/*.c src/math/*.c src/*.h src/dcp/*.h src/math/*.h sysinc/*.h |
| format-check: |
| $(CLANG_FORMAT) --dry-run --Werror src/*.c src/dcp/*.c src/math/*.c src/*.h src/dcp/*.h src/math/*.h sysinc/*.h |
| rustfmt: |
| cd rust && cargo fmt |
| rustfmt-check: |
| cd rust && cargo fmt --check |
| |
| build/$(RUST_LIB): rust/src/* rust/* |
| $(QUIET)echo " RS $@" |
| $(QUIET)mkdir -p $(DEPDIR) |
| $(QUIET)mkdir -p "$(dir $@)" |
| $(QUIET)cargo build --target $(RUSTARCH) --lib --release --manifest-path rust/Cargo.toml --target-dir build |
| $(QUIET)cp "build/$(RUSTARCH)/release/${RUST_LIB}" "$@" |
| |
| build/%.o: src/%.S |
| $(QUIET)echo " AS $@" |
| $(QUIET)mkdir -p $(DEPDIR) |
| $(QUIET)mkdir -p "$(dir $@)" |
| $(QUIET)$(AS) -c $(BASE_CFLAGS) -MMD -MF $(DEPDIR)/$(*F).d -MQ "$@" -MP -o $@ $< |
| |
| $(BUILD_FP_OBJS): build/%.o: src/%.c |
| $(QUIET)echo " CC FP $@" |
| $(QUIET)mkdir -p $(DEPDIR) |
| $(QUIET)mkdir -p "$(dir $@)" |
| $(QUIET)$(CC) -c $(BASE_CFLAGS) -MMD -MF $(DEPDIR)/$(*F).d -MQ "$@" -MP -o $@ $< |
| |
| build/%.o: src/%.c build-tag build-cfg |
| $(QUIET)echo " CC $@" |
| $(QUIET)mkdir -p $(DEPDIR) |
| $(QUIET)mkdir -p "$(dir $@)" |
| $(QUIET)$(CC) -c $(CFLAGS) -MMD -MF $(DEPDIR)/$(*F).d -MQ "$@" -MP -o $@ $< |
| |
| # special target for usage by m1n1.loadobjs |
| invoke_cc: |
| $(QUIET)$(CC) -c $(CFLAGS) -Isrc -o $(OBJFILE) $(CFILE) |
| |
| build/$(NAME).elf: $(BUILD_ALL_OBJS) m1n1.ld |
| $(QUIET)echo " LD $@" |
| $(QUIET)$(LD) -T m1n1.ld $(LDFLAGS) -o $@ $(BUILD_ALL_OBJS) |
| |
| build/$(NAME)-raw.elf: $(BUILD_ALL_OBJS) m1n1-raw.ld |
| $(QUIET)echo " LDRAW $@" |
| $(QUIET)$(LD) -T m1n1-raw.ld $(LDFLAGS) -o $@ $(BUILD_ALL_OBJS) |
| |
| build/$(NAME).macho: build/$(NAME).elf |
| $(QUIET)echo " MACHO $@" |
| $(QUIET)$(OBJCOPY) -O binary --strip-debug $< $@ |
| |
| ifeq ($(LOGO),) |
| build/$(NAME).bin: build/$(NAME)-raw.elf |
| $(QUIET)echo " RAW $@" |
| $(QUIET)$(OBJCOPY) -O binary --strip-debug $< $@ |
| |
| else |
| build/$(NAME)-asahi.bin: build/$(NAME)-raw.elf |
| $(QUIET)echo " RAW $@" |
| $(QUIET)$(OBJCOPY) -O binary --strip-debug $< $@ |
| |
| build/$(NAME).bin: build/$(NAME)-asahi.bin build/$(LOGO).logo |
| $(QUIET)echo " RAW $@" |
| $(QUIET)cat $^ > $@ |
| endif |
| |
| .INTERMEDIATE: build-tag build-cfg |
| build-tag src/../build/build_tag.h &: |
| $(QUIET)mkdir -p build |
| $(QUIET)./version.sh > build/build_tag.tmp |
| $(QUIET)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" ) |
| |
| build-cfg src/../build/build_cfg.h &: |
| $(QUIET)mkdir -p build |
| $(QUIET)for i in $(CFG); do echo "#define $$i"; done > build/build_cfg.tmp |
| $(QUIET)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/%.bin: data/%.bin |
| $(QUIET)echo " IMG $@" |
| $(QUIET)mkdir -p "$(dir $@)" |
| $(QUIET)cp $< $@ |
| |
| build/%.o: build/%.bin |
| $(QUIET)echo " BIN $@" |
| $(QUIET)mkdir -p "$(dir $@)" |
| $(QUIET)$(OBJCOPY) -I binary -B aarch64 -O elf64-littleaarch64 $< $@ |
| |
| build/%.bin: font/%.bin |
| $(QUIET)echo " CP $@" |
| $(QUIET)mkdir -p "$(dir $@)" |
| $(QUIET)cp $< $@ |
| |
| build/%.rgba: data/%.png |
| $(eval SIZE := $(lastword $(subst _, ,$*))) |
| $(QUIET)echo " MAGIC $@" |
| $(QUIET)mkdir -p "$(dir $@)" |
| $(QUIET)magick $< -background black -flatten -depth 8 -crop $(SIZE)x$(SIZE) -resize $(SIZE)x$(SIZE) rgba:$@ |
| |
| build/%.logo: build/%_256.rgba build/%_128.rgba |
| $(QUIET)echo " PAYLOAD $@" |
| $(QUIET)mkdir -p "$(dir $@)" |
| $(QUIET)echo -n "m1n1_logo_256128" > $@ |
| $(QUIET)cat $^ >> $@ |
| |
| -include $(DEPDIR)/* |