REM CRC: 1CECFE3DB3A1BD5169AEA98AD43ADE631EF0A88FFA736FBD84BE44176323F463C8515F4CD0D20BEBDFE06A9E70103FA105C640EF477B79E0C7881D2E5EEC9BD6A32B46A47AAB2D21848A68B9581D31BC91C05B2A7E3ADB3C4D00059D795899820E6BB7AE6771CE586954F191918D76F05058F85C62E78168DB2117B7F66DFFAB9D4CD39D9819A47B593E224EEC6BA2B1CF18B22880D87C51B667E8BA6E12E6B26FA06B6F4F108199331CCC4A9A2DADF899B5E4011DBDD5202C3050DA273BE4EE52BA4E2EEBD6468263A2A9E7E7860458A778383E9CF45D0F850400E5B608E745107C571680B732A8
REM REVISION: 3.0
REM GUID: E810EE73-4726-4718-B23E-B579C5ADBC40
REM DATE: 09\03\2021
REM DIR: FCD\ARM\batch\stm32comp.bat

@setlocal enabledelayedexpansion

@REM These are the calling parameters ...
@REM "$(target)" "$(outdir)" "$(chipalt)" "$(family)" "$(lscript)" "$(romsize)" "$(ramsize)" "$(compilerstarm)"
@PUSHD %~2

@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_STARM=%~9

@REM Save the cuurent path as we are going to change it
@SET MX_PATH=%PATH%
@REM Setup the path for the tools ...
@PATH=%MX_STARM%gcc\bin

@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=%MX_STARM%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"%MX_STARM%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.

@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 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% "%MX_STARM%src\syscalls.c" -o "%MX_OBJECTS%\syscalls.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_STARM%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"%MX_STARM%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
::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
