
CGo depends on syscall, which (in the standard library) depends on sync, which depends on the runtime. There are also other import cycles. To be able to use the syscall package from upstream, stop using CGo.
142 строки
3,4 КиБ
Makefile
142 строки
3,4 КиБ
Makefile
|
|
# aliases
|
|
all: tgo
|
|
tgo: build/tgo
|
|
|
|
.PHONY: all tgo run-hello run-blinky 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
|
|
LLC = $(LLVM)llc
|
|
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.
|
|
GCC = gcc
|
|
LD = clang
|
|
SIZE = size
|
|
|
|
else ifeq ($(TARGET),pca10040)
|
|
# PCA10040: nRF52832 development board
|
|
GCC = arm-none-eabi-gcc
|
|
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)
|
|
GCC = avr-gcc
|
|
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-hello: build/hello
|
|
./build/hello
|
|
|
|
run-blinky: build/blinky
|
|
./build/blinky
|
|
|
|
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/hello
|
|
@go fmt ./src/runtime/*.go
|
|
|
|
gen-device: gen-device-nrf
|
|
|
|
gen-device-nrf:
|
|
./gen-device.py lib/nrfx/mdk/ src/device/nrf/
|
|
go fmt ./src/device/nrf
|
|
|
|
|
|
# Build the Go compiler.
|
|
build/tgo: *.go
|
|
@mkdir -p build
|
|
go build -o build/tgo -i .
|
|
|
|
# Build IR with the Go compiler.
|
|
build/%.bc: 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 and optimize bitcode file.
|
|
build/%.o: build/%.bc
|
|
$(OPT) -Oz -enable-coroutines -o $< $<
|
|
$(LLC) -filetype=obj -o $@ $<
|
|
|
|
# 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 $@ $^
|
|
|
|
# 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 $^ $@
|