111 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| CC = arm-none-eabi-gcc
 | |
| LD = arm-none-eabi-g++
 | |
| CXX = arm-none-eabi-g++
 | |
| OBJCOPY = arm-none-eabi-objcopy
 | |
| 
 | |
| linker_script = bootloader.ld
 | |
| includes =
 | |
| sources =
 | |
| 
 | |
| CFLAGS = -march=armv6-m -g -ffunction-sections -fdata-sections -Os -Werror -Wall -flto
 | |
| CXXFLAGS = $(CFLAGS) -std=c++20 -fno-exceptions -fcoroutines
 | |
| CPPFLAGS = -MD -MP
 | |
| LDFLAGS = -march=armv6-m \
 | |
| 		  -g --specs=nano.specs --specs=nosys.specs \
 | |
| 		  -Wl,--gc-sections -Os \
 | |
| 		  -Wl,--print-memory-usage -flto
 | |
| 
 | |
| includes += -Ihal/cmsis
 | |
| 
 | |
| sources += hal/lib/common/xil_assert.c
 | |
| includes += -Ihal/lib/common
 | |
| 
 | |
| sources += hal/uart/xuartlite.c hal/uart/xuartlite_stats.c hal/uart/xuartlite_intr.c
 | |
| includes += -Ihal/uart
 | |
| 
 | |
| bootloader_objects = bootloader.o vector_table.o $(sources:.c=.o)
 | |
| app_objects = app_init.o crash.o main.o uart.o stdlib.o async.o trace.o $(sources:.c=.o)
 | |
| 
 | |
| CPPFLAGS += $(includes)
 | |
| 
 | |
| .PHONY: app
 | |
| app: app.bin  ## Build the main app
 | |
| 
 | |
| .PHONY: bootloader  ## Build the bootloader
 | |
| bootloader: bootloader.elf
 | |
| 
 | |
| %.bin: %.elf
 | |
| 	$(OBJCOPY) -O binary $< $@
 | |
| 
 | |
| bootloader.elf: $(bootloader_objects) bootloader.ld
 | |
| 	$(LD) -Wl,-Tbootloader.ld $(LDFLAGS) -o $@ $(bootloader_objects)
 | |
| 
 | |
| app.elf: $(app_objects) app.ld
 | |
| 	$(LD) -Wl,-Tapp.ld $(LDFLAGS) -o $@ $(app_objects)
 | |
| 
 | |
| deps = $(app_objects:.o=.d) $(bootloader_objects:.o=.d)
 | |
| 
 | |
| HOSTCXX = clang++
 | |
| HOSTLDFLAGS = -lgmock -lgtest -lgtest_main -L/usr/local/opt/llvm/lib -L/usr/local/lib
 | |
| HOSTCFLAGS = -std=c++20 -g\
 | |
| 			 -I/usr/local/opt/llvm/include \
 | |
| 			 -I/usr/local/include \
 | |
| 			 -I/usr/local/include \
 | |
| 			 -MP -MD
 | |
| 
 | |
| TSAN_CFLAGS = $(HOSTCFLAGS) -fsanitize=thread
 | |
| ASAN_CFLAGS = $(HOSTCFLAGS) -fsanitize=address -fsanitize=leak
 | |
| 
 | |
| tests = ring_buffer_test.run async_test_asan.run async_test_tsan.run uart_test_tsan.run
 | |
| 
 | |
| .PHONY: test
 | |
| test: $(tests)  ## Run tests
 | |
| 
 | |
| test/async_test_asan: async_test.cc async.host.o lock.host.o
 | |
| test/async_test_tsan: async_test.cc async.host.o lock.host.o
 | |
| test/ring_buffer_test: ring_buffer_test.cc lock.host.o
 | |
| test/uart_test_tsan: uart_test.cc fake_uart.host.o async.host.o lock.host.o
 | |
| 
 | |
| %.run: test/%
 | |
| 	TSAN_OPTIONS='suppressions=tsan.suppressions' ASAN_OPTIONS=detect_leaks=1 ./$<
 | |
| 
 | |
| %.host.o: %.cc
 | |
| 	$(HOSTCXX) $(HOSTCFLAGS) -c -o $@ $<
 | |
| 
 | |
| test/%_test: | mktest
 | |
| 	$(HOSTCXX) $(HOSTCFLAGS) -o $@ $^ $(HOSTLDFLAGS)
 | |
| 
 | |
| test/%_asan: | mktest
 | |
| 	$(HOSTCXX) $(ASAN_CFLAGS) -o $@ $^ $(HOSTLDFLAGS)
 | |
| 
 | |
| test/%_tsan: | mktest
 | |
| 	$(HOSTCXX) $(TSAN_CFLAGS) -o $@ $^ $(HOSTLDFLAGS)
 | |
| 
 | |
| .PHONY: mktest
 | |
| mktest:
 | |
| 	mkdir -p test
 | |
| 
 | |
| test_deps = async.host.d lock.host.d fake_uart.host.d
 | |
| 
 | |
| .PHONY: dev-image
 | |
| dev-image:
 | |
| 	docker build -t arm-dev -f dev.dockerfile .
 | |
| 
 | |
| .PHONY: dev
 | |
| dev: dev-image  ## Run a dev container
 | |
| 	docker run -it --rm -v $(CURDIR):/workspace -w /workspace arm-dev
 | |
| 
 | |
| .PHONY: clean
 | |
| clean:  ## Remove generated files
 | |
| 	rm -rf *.elf *.bin $(app_objects) $(bootloader_objects) $(deps)
 | |
| 	rm -rf test/ *.dSYM $(test_deps) *.o
 | |
| 
 | |
| .PHONY: help
 | |
| help:           ## Show this help
 | |
| 	@echo Noteworthy targets:
 | |
| 	@egrep '^[a-zA-Z_-]+:.*?## .*$$' $(firstword $(MAKEFILE_LIST)) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
 | |
| .DEFAULT_GOAL := help
 | |
| 
 | |
| #-include $(deps)
 | |
| #-include $(test_deps)
 |