
@setlocal enabledelayedexpansion

@REM These are the calling parameters ...
@REM "$(target)" "$(outdir)" "$(chipalt)" "$(family)" "$(lscript)" "$(romsize)" "$(ramsize)"

@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..\bin

@REM Setup the build parameters 
@SET MX_PROJECT=%~3
@SET MX_SRCDIR=%~2
@SET MX_DEVICE=%~1
@SET MX_FAMILY=%~4
::@SET MX_HSE_VALUE=%~3

@set OptLevel=1

@SET MX_CC=xc32-gcc
@SET MX_B2H=xc32-bin2hex
@SET MX_COPY=xc32-objcopy
@SET MX_DUMP=xc32-objdump
@SET MX_SIZE=xc32-size
@SET MX_CFLAGS=-mprocessor=%MX_DEVICE%

@IF "%MX_FAMILY%" == "32MX" SET MX_DEFINES=-DMX_USBFS
@IF "%MX_FAMILY%" == "32MZ" SET MX_DEFINES=-DMX_USBHS

@SET MX_CAL_USB=C:\ProgramData\MatrixTSL\FlowcodeV9\CAL\PIC32BIT\USB\CDC


@SET MX_HARMONY=C:\microchip\harmony\v1_11
::@SET MX_HEADERS=-I%MX_SRCDIR%. -I%MX_HARMONY% -I%MX_HARMONY%\framework -I%MX_HARMONY%\framework\system\clk
@SET MX_HEADERS=-I%MX_SRCDIR%. -I%MX_CAL_USB% -I%MX_HARMONY% -I%MX_HARMONY%\framework
::@SET MX_HEADERS=-I%MX_SRCDIR%.
@SET MX_CTRL=-w -c -ffunction-sections -O%OptLevel%
@SET MX_HMNYSRC=%MX_HARMONY%\framework\driver\usb\usbfs\src
@SET MX_OBJECTS=%MX_PROJECT%_%MX_DEVICE%
@ECHO.
@ECHO Project %MX_PROJECT% 
@ECHO Device %MX_DEVICE%
@ECHO Objects %MX_OBJECTS%
@ECHO.

@MKDIR "%MX_OBJECTS%" >nul 2>&1
@REM Compile the project ...
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% -o "%MX_OBJECTS%\%MX_PROJECT%.o" "%MX_PROJECT%.c" %MX_DEFINES%
@IF %ERRORLEVEL% NEQ 0 GOTO Error

::@REM Compile USB files ...
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\usb\src\dynamic\usb_device.c" -o "%MX_OBJECTS%\usb_device.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\usb\src\dynamic\usb_device_cdc.c" -o "%MX_OBJECTS%\usb_device_cdc.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\usb\src\dynamic\usb_device_cdc_acm.c" -o "%MX_OBJECTS%\usb_device_cdc_acm.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\system\int\src\sys_int_pic32.c" -o "%MX_OBJECTS%\sys_int_pic32.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\system\devcon\src\sys_devcon.c" -o "%MX_OBJECTS%\sys_devcon.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_CAL_USB%\CDCComp.c" -o "%MX_OBJECTS%\CDCComp.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error

@IF "%MX_FAMILY%" == "32MX" GOTO CompMX
@IF "%MX_FAMILY%" == "32MZ" GOTO CompMZ

:CompMX
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_CAL_USB%\CDC_FS_Desc.c" -o "%MX_OBJECTS%\CDC_Desc.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\driver\usb\usbfs\src\dynamic\drv_usbfs.c" -o "%MX_OBJECTS%\drv_usbxs.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\driver\usb\usbfs\src\dynamic\drv_usbfs_device.c" -o "%MX_OBJECTS%\drv_usbxs_device.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\system\devcon\src\sys_devcon_pic32mx.c" -o "%MX_OBJECTS%\sys_devcon_pic32mxz.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
@GOTO FilesDone

:CompMZ
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_CAL_USB%\CDC_HS_Desc.c" -o "%MX_OBJECTS%\CDC_Desc.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_CAL_USB%\SYS_TMR_PROXY.c" -o "%MX_OBJECTS%\SYS_TMR_PROXY.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\driver\usb\usbhs\src\dynamic\drv_usbhs.c" -o "%MX_OBJECTS%\drv_usbxs.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\driver\usb\usbhs\src\dynamic\drv_usbhs_device.c" -o "%MX_OBJECTS%\drv_usbxs_device.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% %MX_DEFINES% %MX_HEADERS% %MX_CTRL% "%MX_HARMONY%\framework\system\devcon\src\sys_devcon_pic32mz.c" -o "%MX_OBJECTS%\sys_devcon_pic32mxz.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
%MX_CC% %MX_CFLAGS% -c -I"%MX_HARMONY%\framework\system\devcon\src" "%MX_HARMONY%\framework\system\devcon\src\sys_devcon_cache_pic32mz.S" -o "%MX_OBJECTS%\sys_devcon_cache_pic32mz.o"
@IF %ERRORLEVEL% NEQ 0 GOTO Error
@GOTO FilesDone




::HAL Files
::@if not %CompileHAL% == 1 goto :HALdone
::@set SrcPath="%MX_HMNYSRC%\"
::@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% "%~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 ...

:FilesDone

@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%
::@SET MX_LFLAGS=-O -g -w -Wl,-T"%path%\..\pic32mx\lib\proc\%MX_DEVICE%\p%MX_DEVICE%.ld",--gc-sections %MX_CFLAGS%
::@SET MX_LFLAGS=-Wl,--defsym=__MPLAB_BUILD=1,--defsym=_min_heap_size=0,--gcc-sections,--no-code-in-dinit,--no-dinit-in-serial-mem
@SET MX_LFLAGS=-Wl,-T"%path%\..\pic32mx\lib\proc\%MX_DEVICE%\p%MX_DEVICE%.ld",--defsym=__MPLAB_BUILD=1,--defsym=_min_heap_size=0,--gc-sections
%MX_CC% %MX_CFLAGS% %MX_LFLAGS% %ObjFileList% -o "..\%MX_PROJECT%.elf"
@IF %ERRORLEVEL% NEQ 0 GOTO Error

@REM elf to hex ...
@REM
%MX_B2H% "..\%MX_PROJECT%.elf"
::%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%
@EXIT 0

@:Error
@ECHO Error(s) in build!
@PATH=%MX_PATH%
@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
