SHELL = /bin/bash
.PHONY : all build build -container cmake format format -linux flash -stlink flash -jlink format -container shell image build -container clean clean -image clean -all
############################### Native Makefile ###############################
PROJECT_NAME ?= Probe
BUILD_DIR ?= build
FIRMWARE := $( BUILD_DIR) /$( PROJECT_NAME) .bin
BUILD_TYPE ?= Debug
PLATFORM = $( if $( OS) ,$( OS) ,$( shell uname -s) )
i f e q ( $( PLATFORM ) , W i n d o w s _ N T )
BUILD_SYSTEM ?= MinGW Makefiles
e l s e
ifeq ( $( PLATFORM) ,Linux)
BUILD_SYSTEM ?= Unix Makefiles
else
@echo "Unsuported platform"
exit 1
endif
e n d i f
all : build
build : cmake
$( MAKE) -C $( BUILD_DIR) --no-print-directory
cmake : $( BUILD_DIR ) /Makefile
$(BUILD_DIR)/Makefile : CMakeLists .txt
cmake \
-G " $( BUILD_SYSTEM) " \
-B$( BUILD_DIR) \
-DPROJECT_NAME= $( PROJECT_NAME) \
-DCMAKE_BUILD_TYPE= $( BUILD_TYPE) \
-DDUMP_ASM= OFF
# Formats all user modified source files (add ones that are missing)
# SRCS := $(shell find Project -name '*.[ch]' -or -name '*.[ch]pp') Core/Src/main.c
SRCS := $( shell find Core -name '*.[ch]' -or -name '*.[ch]pp' ) Core/Src/main.c
format : $( addsuffix .format ,$ ( SRCS ) )
%.format : %
clang-format -i $<
# Formats all CubeMX generated sources to unix style - removes \r from line endings
# Add any new directories, like Middlewares and hidden files
HIDDEN_FILES := .mxproject .project .cproject
FOUND_HIDDEN_FILES := $( shell for f in $( HIDDEN_FILES) ; do if [ [ -e $$ f ] ] ; then echo $$ f; fi ; done )
FORMAT_LINUX := $( shell find Core Drivers -name '*' -type f; find . -name '*.ioc' ) $( FOUND_HIDDEN_FILES)
format-linux : $( addsuffix .format -linux ,$ ( FORMAT_LINUX ) )
%.format-linux : %
$( if $( filter $( PLATFORM) ,Linux) ,dos2unix -q $<,)
# Device specific!
DEVICE ?= STM32F407VG
flash-st : build
st-flash --reset write $( FIRMWARE) 0x08000000
$(BUILD_DIR)/jlink-script :
touch $@
@echo device $( DEVICE) > $@
@echo si 1 >> $@
@echo speed 4000 >> $@
@echo loadfile $( FIRMWARE) ,0x08000000 >> $@
@echo -e "r\ng\nqc" >> $@
flash-jlink : build | $( BUILD_DIR ) /jlink -script
JLinkExe -commanderScript $( BUILD_DIR) /jlink-script
clean :
rm -rf $( BUILD_DIR)
################################## Container ##################################
UID ?= $( shell id -u)
GID ?= $( shell id -g)
USER ?= $( shell id -un)
GROUP ?= $( if $( filter $( PLATFORM) , Windows_NT) ,$( shell id -un) ,$( shell id -gn) )
i f e q ( $( PLATFORM ) , W i n d o w s _ N T )
WIN_PREFIX = winpty
WORKDIR_PATH = "//workdir"
WORKDIR_VOLUME = " / $$ (pwd -W):/workdir "
e l s e
WORKDIR_PATH = /workdir
WORKDIR_VOLUME = " $$ (pwd):/workdir "
e n d i f
CONTAINER_TOOL ?= docker
CONTAINER_FILE := Dockerfile
IMAGE_NAME := fedora-arm-embedded-dev
CONTAINER_NAME := fedora-arm-embedded-dev
NEED_IMAGE = $( shell $( CONTAINER_TOOL) image inspect $( IMAGE_NAME) 2> /dev/null > /dev/null || echo image)
# usefull if you have a always running container in the background: NEED_CONTAINER = $(shell $(CONTAINER_TOOL) container inspect $(CONTAINER_NAME) 2> /dev/null > /dev/null || echo container)
PODMAN_ARG = $( if $( filter $( CONTAINER_TOOL) , podman) ,--userns= keep-id,)
CONTAINER_RUN = $( WIN_PREFIX) $( CONTAINER_TOOL) run \
--name $( CONTAINER_NAME) \
--rm \
-it \
$( PODMAN_ARG) \
-v $( WORKDIR_VOLUME) \
-w $( WORKDIR_PATH) \
--security-opt label = disable \
--hostname $( CONTAINER_NAME) \
$( IMAGE_NAME)
build-container : $( NEED_IMAGE )
$( CONTAINER_RUN) bash -lc 'make -j$(shell nproc)'
format-container :
$( CONTAINER_RUN) bash -lc 'make format -j$(shell nproc)'
format-linux-container :
$( CONTAINER_RUN) bash -lc 'make format-linux'
shell :
$( CONTAINER_RUN) bash -l
image : $( CONTAINER_FILE )
$( CONTAINER_TOOL) build \
-t $( IMAGE_NAME) \
-f= $( CONTAINER_FILE) \
--build-arg UID = $( UID) \
--build-arg GID = $( GID) \
--build-arg USERNAME = $( USER) \
--build-arg GROUPNAME = $( GROUP) \
.
clean-image :
$( CONTAINER_TOOL) container rm -f $( CONTAINER_NAME) 2> /dev/null > /dev/null || true
$( CONTAINER_TOOL) image rmi -f $( IMAGE_NAME) 2> /dev/null > /dev/null || true
clean-all : clean clean -image
flash :
openocd -f interface/stlink.cfg -f target/stm32l4x.cfg -c "program build/Probe.bin verify reset exit 0x08000000"