@echo off
setlocal ENABLEDELAYEDEXPANSION

::--------------------------------------------------------
::-- %1: board-name
::-- %2: app-dir
::-- %3: cfg-dir
::-- %4: lib-name
::--------------------------------------------------------
if "%2" == "" (
	@echo Usage:
	@echo     %~nx0 board-name app-dir cfg-dir [lib-name]
	@echo Example:
	@echo     %~nx0 lark_dvb_watch samples\hello_world .
	goto :eof
)

set lib=
if not "%4" == "" (
	set lib=%4
)

set tc=clang
set board=%1
set adir=%~2
set cfgdir=%3
set cfgfile=%cfgdir:\=/%/prj.conf
set bdir=%~2\outdir\%board%\mdk_%tc%
set sdir=%cd%
set zdir=%sdir%
set mdk=%sdir%\tools\mdk_%tc%

rmdir /S /Q %bdir% >nul 2>nul
call "%zdir%\zephyr-env.cmd"

cmake -GNinja -DBOARD=%board% -H%adir% -B%bdir% -DCONF_FILE=%cfgfile%

call :GET_SOC_NAME soc_name
call :GET_SYSCALL_INCS syscall_incs
python %zdir%/scripts/parse_syscalls.py %syscall_incs% --json-file %bdir%/zephyr/misc/generated/syscalls.json --tag-struct-file %bdir%/zephyr/misc/generated/struct_tags.json

python %zdir%/scripts/gen_kobject_list.py --validation-output %bdir%/zephyr/include/generated/driver-validation.h --include %bdir%/zephyr/misc/generated/struct_tags.json

python %zdir%/scripts/gen_kobject_list.py --kobj-types-output %bdir%/zephyr/include/generated/kobj-types-enum.h --kobj-otype-output %bdir%/zephyr/include/generated/otype-to-str.h --kobj-size-output %bdir%/zephyr/include/generated/otype-to-size.h --include %bdir%/zephyr/misc/generated/struct_tags.json

python %zdir%/scripts/gen_syscalls.py --json-file %bdir%/zephyr/misc/generated/syscalls.json --base-output %bdir%/zephyr/include/generated/syscalls --syscall-dispatch %bdir%/zephyr/include/generated/syscall_dispatch.c --syscall-list %bdir%/zephyr/include/generated/syscall_list.h --split-type k_timeout_t

set offs=arch/arm/core/offsets/offsets.c
%GNUARMEMB_TOOLCHAIN_PATH%\bin\arm-none-eabi-gcc.exe ^
	-DKERNEL -D_FORTIFY_SOURCE=2 -D__PROGRAM_START -D__ZEPHYR__=1 ^
	-I%zdir%/kernel/include -I%zdir%/arch/arm/include -I%zdir%/include -I%bdir%/zephyr/include/generated -I%zdir%/drivers -I%zdir%/subsys/tracing/include -I%zdir%/subsys/tracing/sysview -I%sdir%/soc/arm/actions/leopard -I%sdir%/../thirdparty/hal/cmsis/CMSIS/Core/Include -I%zdir%/modules/segger -I%zdir%/../thirdparty/debug/segger/SEGGER -I%zdir%/../thirdparty/debug/segger/Config -I%sdir%/../thirdparty/debug/segger/systemview -isystem %zdir%/lib/libc/minimal/include -isystem %GNUARMEMB_TOOLCHAIN_PATH%/lib/gcc/arm-none-eabi/9.3.1/include ^
	-Os -imacros%bdir%/zephyr/include/generated/autoconf.h -ffreestanding -fno-common -g -mcpu=cortex-m33+nodsp -mthumb -mabi=aapcs -imacros%zdir%/include/toolchain/zephyr_stdint.h -Wall -Wformat -Wformat-security -Wno-format-zero-length -Wno-main -Wno-address-of-packed-member -Wno-pointer-sign -Wpointer-arith -Wno-unused-but-set-variable -Werror=implicit-int -fno-asynchronous-unwind-tables -fno-pie -fno-pic -fno-strict-overflow -fno-reorder-functions -fno-defer-pop  -ffunction-sections -fdata-sections -std=c99 -nostdinc ^
	-MD -MT %bdir%/zephyr/CMakeFiles/offsets.dir/%offs%.obj -MF %bdir%/zephyr/CMakeFiles/offsets.dir/%offs%.obj.d ^
	-o %bdir%/zephyr/CMakeFiles/offsets.dir/%offs%.obj -c %zdir%/%offs%

python %zdir%/scripts/gen_offset_header.py -i %bdir%/zephyr/CMakeFiles/offsets.dir/%offs%.obj -o %bdir%/zephyr/include/generated/offsets.h

copy /Y %mdk%\common\* %bdir%\
copy /Y %mdk%\soc\%soc_name%\* %bdir%\
if exist %mdk%\boards\%board% (
	copy /Y %mdk%\boards\%board%\* %bdir%
)
call :GEN_PACK_BAT %board% %adir% %bdir%
if exist %adir%\mdk_%tc% (
	copy /Y %adir%\mdk_%tc%\* %bdir%
)
if exist %adir%\%cfgdir%\mdk_%tc% (
	copy /Y %adir%\%cfgdir%\mdk_%tc%\* %bdir%
)

%sdir%\tools\ninja2mdk.exe %bdir%\build.ninja %bdir%\template.uvprojx %bdir%\mdk_%tc%.uvprojx %lib%

del /S /Q %bdir%\template.* >nul 2>nul
mkdir %bdir%\tmp
move /Y %bdir%\zephyr\.config %bdir%\tmp\ >nul 2>nul
echo /*empty file*/ > %bdir%\tmp\ksyms.S
move /Y %bdir%\zephyr\include %bdir%\tmp\ >nul 2>nul
rmdir /S /Q %bdir%\app %bdir%\src %bdir%\CMakeFiles %bdir%\Kconfig %bdir%\thirdparty %bdir%\zephyr >nul 2>nul
del /S /Q %bdir%\cmake_install.cmake %bdir%\CMakeCache.txt %bdir%\zephyr_modules.txt %bdir%\zephyr_settings.txt >nul 2>nul
move /Y %bdir%\tmp %bdir%\zephyr >nul 2>nul

goto:eof

::--------------------------------------------------------
::-- get soc name
::-- %1: ret var
::--------------------------------------------------------
:GET_SOC_NAME
	for /f "tokens=1-3 delims= " %%a in (%bdir%\zephyr\include\generated\autoconf.h) do (
		if "%%b" == "CONFIG_SOC_SERIES" (
			set %1=%%~c
		)
	)
goto:eof

::--------------------------------------------------------
::-- get syscalls incs
::-- %1: ret var
::--------------------------------------------------------
:GET_SYSCALL_INCS
	for /f "tokens=1-3 delims= " %%a in (%bdir%\zephyr\include\generated\autoconf.h) do (
		if "%%b" == "CONFIG_ZTEST" (
			set ztestinc=--include %zdir%/subsys/testsuite/ztest/include
		)
		if "%%b" == "CONFIG_TRACING" (
			set tracinginc=--include %zdir%/subsys/tracing/include
		)
		if "%%b" == "CONFIG_APPLICATION_DEFINED_SYSCALL" (
			set appinc=--include %adir%
		)
	)
	set %1=--include %zdir%/include --include %zdir%/drivers --include %zdir%/subsys/net %ztestinc% %appinc% %tracinginc%
goto:eof

::--------------------------------------------------------
::-- gen pack bat
::-- %1: board
::-- %2: app dir
::-- %3: build dir
::--------------------------------------------------------
:GEN_PACK_BAT
	set zbase=..\..\..\..\..\..\zephyr
	echo @echo off > %3\PackCommand.bat
	echo copy /Y /B zephyr.bin %zbase%\boards\arm\%1\%~n2.bin >> %3\PackCommand.bat
goto:eof