
@setlocal enabledelayedexpansion

@REM These are the calling parameters ...
@REM "$(target)" "$(outdir)" "$(chipalt)" "$(family)" "$(lscript)" "$(romsize)" "$(ramsize)"
@PUSHD %~2
@REM Save the cuurent path as we are going to change it
@SET MX_PATH=%PATH%

@REM Setup the path for the tools ...
@PATH=%~dp0..\gcc\bin

@REM Setup the build parameters 
@SET MX_PROJECT=%~1
@SET MX_FAMILY=%~4
@SET MX_LSCRIPT=%~5
@SET MX_DEVICE=STM%~3
@SET MX_HSE_VALUE=%~6
@SET MX_ROMSIZE=%~7
@SET MX_RAMSIZE=%~8

@set MX_FPUType=-mfloat-abi=hard -mfpu=fpv4-sp-d16
@set OptLevel=s

@IF "%MX_FAMILY%" == "F0" (
	@SET MX_CORE=cortex-m0
	@SET MX_FPUType=-mfloat-abi=soft -D__SOFTFP__
	)
@IF "%MX_FAMILY%" == "F1" (
	@SET MX_CORE=cortex-m3
	@SET MX_FPUType=-mfloat-abi=soft -D__SOFTFP__
	)
@IF "%MX_FAMILY%" == "F2" (@SET MX_CORE=cortex-m3)
@IF "%MX_FAMILY%" == "F3" (@SET MX_CORE=cortex-m4)
@IF "%MX_FAMILY%" == "F4" (@SET MX_CORE=cortex-m4)
@IF "%MX_FAMILY%" == "F7" (@SET MX_CORE=cortex-m7)

@IF "%MX_FAMILY%" == "L0" (@SET MX_CORE=cortex-l0)
@IF "%MX_FAMILY%" == "L1" (@SET MX_CORE=cortex-l1)
@IF "%MX_FAMILY%" == "L4" (@SET MX_CORE=cortex-l4)

@SET MX_CC=arm-none-eabi-gcc
@SET MX_COPY=arm-none-eabi-objcopy
@SET MX_DUMP=arm-none-eabi-objdump
@SET MX_SIZE=arm-none-eabi-size
@SET MX_CFLAGS=-mcpu=%MX_CORE% -mthumb %MX_FPUType% -Os
@SET MX_DEFINES=-DSTM32 -DSTM32%MX_FAMILY% -D%MX_DEVICE% -DUSE_HAL_DRIVER -DHSE_VALUE=%MX_HSE_VALUE%
@SET MX_DRIVERS=%~dp0..\stm32cube%MX_FAMILY%\Drivers
@SET MX_HEADERS=-I%MX_DRIVERS%\CMSIS\Include -I%MX_DRIVERS%\CMSIS\Device\ST\STM32%MX_FAMILY%xx\Include -I%MX_DRIVERS%\STM32%MX_FAMILY%xx_HAL_Driver\Inc -I%MX_DRIVERS%\STM32%MX_FAMILY%xx_HAL_Driver\Inc\Legacy -I%~dp0..\inc
@SET MX_CTRL=-fmessage-length=0 -fdata-sections -ffunction-sections -w -c
@SET MX_HALSRC=%MX_DRIVERS%\STM32%MX_FAMILY%xx_HAL_Driver\Src
@SET MX_OBJECTS=%MX_PROJECT%_%MX_DEVICE%_%MX_HSE_VALUE%
@ECHO.
@ECHO Project %MX_PROJECT% 
@ECHO Device %MX_DEVICE%
@ECHO.

@REM Look for Additional headers ...
@if not exist "include.txt" goto :skip_headers 
@for /F "delims= " %%G in (include.txt) do @(call :add_header %%G)
:skip_headers 

@MKDIR "%MX_OBJECTS%" >nul 2>&1
@REM Compile the project ...
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_PROJECT%.c" -o "%MX_OBJECTS%\%MX_PROJECT%.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error

::HAL Files
::@if not %CompileHAL% == 1 goto :HALdone
@set SrcPath="%MX_HALSRC%\"
@for %%G in (%SrcPath%*.c) do @(set srcFile=%%G
call :MakeObj "%%G"
)
::HALdone

@REM Look for Additional sources ...
@if not exist "source.txt" goto :skip_sources 
@for /F "delims= " %%G in (source.txt) do @(set srcFile=%%G
call :MakeObj "%%G"
)
:skip_sources 

@REM Build the startup objects ...
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_DRIVERS%\CMSIS\Device\ST\STM32%MX_FAMILY%xx\Source\Templates\gcc\startup_%MX_DEVICE%.s" -o "%MX_OBJECTS%\startup.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_DRIVERS%\CMSIS\Device\ST\STM32%MX_FAMILY%xx\Source\Templates\system_stm32%MX_FAMILY%xx.c" -o "%MX_OBJECTS%\system.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%~dp0..\src\syscalls.c" -o "%MX_OBJECTS%\syscalls.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%~dp0..\src\MX_IRQs.c" -o "%MX_OBJECTS%\MX_IRQs.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error

@REM Link ...

@cd /D %MX_OBJECTS%

::Make .o file list
@set ObjFileList=
@for %%G in (*.o) do @(set ObjFileName=%%G
call :ListObj
)

@SET MX_LFLAGS=-O -g -w -Wl,-T"%~dp0..\link\%MX_LSCRIPT%",--gc-sections %MX_CFLAGS% -Xlinker --defsym=_ROMSIZE=%MX_ROMSIZE% -Xlinker --defsym=_RAMSIZE=%MX_RAMSIZE%
%MX_CC% %MX_LFLAGS% %ObjFileList% -o "..\%MX_PROJECT%.elf" -lm 
@IF %ERRORLEVEL% NEQ 0 GOTO Error

@REM elf to hex ...
@REM 
%MX_COPY% -O ihex "..\%MX_PROJECT%.elf" "..\%MX_PROJECT%.hex"
@IF %ERRORLEVEL% NEQ 0 GOTO Error

@REM elf to bin ...
@REM 
%MX_COPY% -O binary "..\%MX_PROJECT%.elf" "..\%MX_PROJECT%.bin"
@IF %ERRORLEVEL% NEQ 0 GOTO Error

@REM Create a list file ...
@REM 
%MX_DUMP% -t -d  -h "..\%MX_PROJECT%.elf" > "%MX_PROJECT%.lst"
@IF %ERRORLEVEL% NEQ 0 GOTO Error

@REM Display memory usage ...
@REM 
%MX_SIZE% -B "..\%MX_PROJECT%.elf"

@ECHO Compilation successful!
@PATH=%MX_PATH%
@POPD
@EXIT 0

@:Error
@ECHO Error(s) in build!
@PATH=%MX_PATH%
@POPD
@EXIT 1


:MakeObj
@set srcFile=%srcFile:/=\%
::Resolve path to filename only
@set ObjFileName=%~n1

::Ignore files ending in template
@set IsTemplate=%ObjFileName:~-8%
@if %IsTemplate% == template goto :FileDone

::Change .c extension to .o
@set ObjFileName=%ObjFileName%.o

::Skip if object already exists
@if exist "%MX_OBJECTS%\%ObjFileName%" goto :FileDone

::Compile .c file and add resulting .o file to project folder
"%MX_CC%" %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% -O%OptLevel% %MX_CTRL% -o "%MX_OBJECTS%\%ObjFileName%" "%SrcFile%"

:FileDone
@goto :eof


:ListObj
@set ObjFileList=%ObjFileList% "%ObjFileName%"
:ObjDone
@goto :eof

:add_header
@set incfile=%1
@set incfile=%incfile:/=\%
@set MX_HEADERS=%MX_HEADERS% %incfile%
@GOTO :eof

