# aliases all: tgo tgo: build/tgo .PHONY: all tgo run-test run-blinky run-blinky2 clean fmt gen-device gen-device-nrf # Custom LLVM toolchain. LLVM := $(shell go env GOPATH)/src/github.com/aykevl/llvm/bindings/go/llvm/workdir/llvm_build/bin/ LINK = $(LLVM)llvm-link LLAS = $(LLVM)llvm-as OPT = $(LLVM)opt CFLAGS = -Wall -Werror -Os -fno-exceptions -flto -ffunction-sections -fdata-sections $(LLFLAGS) CFLAGS += -fno-exceptions -fno-unwind-tables # Avoid .ARM.exidx etc. RUNTIME_PARTS = build/runtime.bc TARGET ?= unix ifeq ($(TARGET),unix) # Regular *nix system. LD = clang SIZE = size else ifeq ($(TARGET),pca10040) # PCA10040: nRF52832 development board LD = arm-none-eabi-ld -T arm.ld --gc-sections SIZE = arm-none-eabi-size OBJCOPY = arm-none-eabi-objcopy LLFLAGS += -target armv7m-none-eabi TGOFLAGS += -target $(TARGET) CFLAGS += -I$(CURDIR)/src/runtime CFLAGS += -I$(CURDIR)/lib/nrfx CFLAGS += -I$(CURDIR)/lib/nrfx/mdk CFLAGS += -I$(CURDIR)/lib/CMSIS/CMSIS/Include CFLAGS += -DNRF52832_XXAA CFLAGS += -Wno-uninitialized RUNTIME_PARTS += build/runtime_nrf.bc RUNTIME_PARTS += build/nrfx_system_nrf52.bc OBJ += build/nrfx_startup_nrf51.o # TODO nrf52, see https://bugs.llvm.org/show_bug.cgi?id=31601 else ifeq ($(TARGET),arduino) AS = avr-as -mmcu=atmega328p LD = avr-ld -T avr.ld --gc-sections SIZE = avr-size OBJCOPY = avr-objcopy LLFLAGS += -target avr8-- TGOFLAGS += -target $(TARGET) OBJ += build/avr.o else $(error Unknown target) endif run-test: build/test ./build/test run-blinky: run-blinky2 run-blinky2: build/blinky2 ./build/blinky2 ifeq ($(TARGET),pca10040) flash-%: build/%.hex nrfjprog -f nrf52 --sectorerase --program $< --reset else ifeq ($(TARGET),arduino) flash-%: build/%.hex avrdude -c arduino -p atmega328p -P /dev/ttyACM0 -U flash:w:$< endif clean: @rm -rf build fmt: @go fmt . ./src/examples/test @go fmt ./src/runtime/*.go gen-device: gen-device-nrf gen-device-nrf: ./gen-device-svd.py lib/nrfx/mdk/ src/device/nrf/ go fmt ./src/device/nrf gen-device-avr: ./gen-device-avr.py lib/avr/packs/atmega src/device/avr/ go fmt ./src/device/avr # Build the Go compiler. build/tgo: *.go @mkdir -p build go build -o build/tgo -i . # Build IR with the Go compiler. build/%.o: src/examples/% src/examples/%/*.go build/tgo src/runtime/*.go build/runtime-$(TARGET)-combined.bc ./build/tgo $(TGOFLAGS) -runtime build/runtime-$(TARGET)-combined.bc -o $@ $(subst src/,,$<) # Compile C sources for the runtime. build/%.bc: src/runtime/%.c src/runtime/*.h @mkdir -p build clang $(CFLAGS) -c -o $@ $< # Compile LLVM bitcode from LLVM source. build/%.bc: src/runtime/%.ll $(LLAS) -o $@ $< # Compile system_* file for the nRF. build/nrfx_%.bc: lib/nrfx/mdk/%.c @mkdir -p build clang $(CFLAGS) -c -o $@ $^ # Compile startup_* file for the nRF. build/nrfx_%.o: lib/nrfx/mdk/gcc_%.S @mkdir -p build clang $(CFLAGS) -D__STARTUP_CLEAR_BSS -c -o $@ $^ build/%.o: %.S $(AS) -o $@ $^ # Merge all runtime LLVM files together in a single bitcode file. build/runtime-$(TARGET)-combined.bc: $(RUNTIME_PARTS) $(LINK) -o $@ $^ # Generate output ELF executable. build/%: build/%.o $(OBJ) $(LD) -o $@ $^ $(SIZE) $@ # Generate output ELF for use in objcopy (on a microcontroller). build/%.elf: build/%.o $(OBJ) $(LD) -o $@ $^ $(SIZE) $@ # Convert executable to Intel hex file (for flashing). build/%.hex: build/%.elf $(OBJCOPY) -O ihex $^ $@