|
|
@ -1,11 +1,9 @@
|
|
|
|
command -nargs=1 -complete=dir DlcPro call s:ProjectSet('dlcpro', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DlcPro call s:ProjectSet('dlcpro', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DlcProShg call s:ProjectSet('shg', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DlcProShg call s:ProjectSet('shg', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DlcProGui call s:ProjectSet('dlcpro-gui', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DlcProGui call s:ProjectSet('dlcpro-gui', '<args>')
|
|
|
|
|
|
|
|
command -nargs=1 -complete=dir DlcProTui call s:ProjectSet('dlcpro-tui', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DlcProCan call s:ProjectSet('dlcpro-can', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DlcProCan call s:ProjectSet('dlcpro-can', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DlcProSpecalyser call s:ProjectSet('dlcpro-specalyser', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DlcProSpecalyser call s:ProjectSet('dlcpro-specalyser', '<args>')
|
|
|
|
command DlcproEmissionOn call s:DlcproEmission('1')
|
|
|
|
|
|
|
|
command DlcproEmissionOff call s:DlcproEmission('0')
|
|
|
|
|
|
|
|
command DlcproShutup call s:DlcproShutup()
|
|
|
|
|
|
|
|
command -nargs=1 -complete=dir Topmode call s:ProjectSet('topmode', '<args>')
|
|
|
|
command -nargs=1 -complete=dir Topmode call s:ProjectSet('topmode', '<args>')
|
|
|
|
command -nargs=1 -complete=dir TopmodeGui call s:ProjectSet('topmode-gui', '<args>')
|
|
|
|
command -nargs=1 -complete=dir TopmodeGui call s:ProjectSet('topmode-gui', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DigiFalc call s:ProjectSet('digifalc', '<args>')
|
|
|
|
command -nargs=1 -complete=dir DigiFalc call s:ProjectSet('digifalc', '<args>')
|
|
|
@ -28,6 +26,8 @@ function s:ProjectSet(project_type, project_base_dir)
|
|
|
|
" defaults
|
|
|
|
" defaults
|
|
|
|
if (g:project_type == 'dlcpro')
|
|
|
|
if (g:project_type == 'dlcpro')
|
|
|
|
let s:ProjectBaseDir = '/home/stefan/dlcpro/firmware'
|
|
|
|
let s:ProjectBaseDir = '/home/stefan/dlcpro/firmware'
|
|
|
|
|
|
|
|
elseif (g:project_type == 'dlcpro-tui')
|
|
|
|
|
|
|
|
let s:ProjectBaseDir = '/home/stefan/dlcpro/firmware'
|
|
|
|
elseif (g:project_type == 'dlcpro-can')
|
|
|
|
elseif (g:project_type == 'dlcpro-can')
|
|
|
|
let s:ProjectBaseDir = '/home/stefan/dlcpro/firmware'
|
|
|
|
let s:ProjectBaseDir = '/home/stefan/dlcpro/firmware'
|
|
|
|
elseif (g:project_type == 'dlcpro-specalyser')
|
|
|
|
elseif (g:project_type == 'dlcpro-specalyser')
|
|
|
@ -83,6 +83,27 @@ function s:ProjectSet(project_type, project_base_dir)
|
|
|
|
let g:SshOpts = ""
|
|
|
|
let g:SshOpts = ""
|
|
|
|
let g:SshOpts2 = ""
|
|
|
|
let g:SshOpts2 = ""
|
|
|
|
execute 'set path+=' . g:GccRoot . s:oselas_include
|
|
|
|
execute 'set path+=' . g:GccRoot . s:oselas_include
|
|
|
|
|
|
|
|
command DlcproEmissionOn call s:DlcproEmission('1')
|
|
|
|
|
|
|
|
command DlcproEmissionOff call s:DlcproEmission('0')
|
|
|
|
|
|
|
|
command DlcproShutup call s:DlcproShutup()
|
|
|
|
|
|
|
|
" let g:ycm_clangd_args = ['--all-scopes-completion', '--header-insertion=iwyu', '--suggest-missing-includes', '--enable-config', '-isystem '.g:GccRoot . s:oselas_include]
|
|
|
|
|
|
|
|
elseif (g:project_type == 'dlcpro-tui')
|
|
|
|
|
|
|
|
let s:Program = '/user-interface/src/user-interface'
|
|
|
|
|
|
|
|
let s:Elffile = s:Program
|
|
|
|
|
|
|
|
let g:ProgramRemote = '/opt/app/bin/user-interface'
|
|
|
|
|
|
|
|
set wildignore-=**/firmware/src/device-control/**
|
|
|
|
|
|
|
|
set wildignore+=**/shg-firmware/**
|
|
|
|
|
|
|
|
let s:makegoals = ['artifacts', 'device-control', 'user-interface', 'doxygen', 'fw-updates', 'shg-firmware', 'can-updater', 'specalyser', 'docu-ul0', 'code-generation', 'dependency-graphs', 'clean', 'distclean', 'help', 'jamplayer', 'dlcpro-slot']
|
|
|
|
|
|
|
|
let s:makeprg = 'make'
|
|
|
|
|
|
|
|
let g:DeviceIP = 'DLC_PRO__040083'
|
|
|
|
|
|
|
|
let g:GdbPort = '2345'
|
|
|
|
|
|
|
|
let g:GccRoot = "/opt/OSELAS.Toolchain-2012.12.1/arm-cortexa8-linux-gnueabi/gcc-4.7.3-glibc-2.16.0-binutils-2.22-kernel-3.6-sanitized"
|
|
|
|
|
|
|
|
let g:termdebugger = s:oselas_gdb
|
|
|
|
|
|
|
|
execute 'ConqueGdbExe '.g:GccRoot.'/bin/arm-cortexa8-linux-gnueabi-gdb'
|
|
|
|
|
|
|
|
let g:SshOpts = ""
|
|
|
|
|
|
|
|
let g:SshOpts2 = ""
|
|
|
|
|
|
|
|
execute 'set path+=' . g:GccRoot . s:oselas_include
|
|
|
|
|
|
|
|
command DlcproTuiStart execute('!cd user-interface/src && ../../../build/user-interface/src/user-interface&')
|
|
|
|
elseif (g:project_type == 'dlcpro-can')
|
|
|
|
elseif (g:project_type == 'dlcpro-can')
|
|
|
|
let s:Program = '/canopen/can-updater'
|
|
|
|
let s:Program = '/canopen/can-updater'
|
|
|
|
let s:Elffile = s:Program
|
|
|
|
let s:Elffile = s:Program
|
|
|
@ -239,7 +260,7 @@ function s:ProjectSet(project_type, project_base_dir)
|
|
|
|
command! DeviceStartGdbServerAttach call s:DeviceStartGdbServerAttach()
|
|
|
|
command! DeviceStartGdbServerAttach call s:DeviceStartGdbServerAttach()
|
|
|
|
|
|
|
|
|
|
|
|
" update device-contol.xml for Topas-GUI
|
|
|
|
" update device-contol.xml for Topas-GUI
|
|
|
|
command! DlcProUpdateTopasXml '!svnmucc put -m \'update "device-control.xml"\' ".g:ProjectBuildDir.'/device-control/device-control.xml https://svn.toptica.com/svn/topas_dlc_pro/trunk/res/device-control.xml'
|
|
|
|
command! DlcproUpdateTopasXml '!svnmucc put -m \'update "device-control.xml"\' ".g:ProjectBuildDir.'/device-control/device-control.xml https://svn.toptica.com/svn/topas_dlc_pro/trunk/res/device-control.xml'
|
|
|
|
|
|
|
|
|
|
|
|
" YouCompleteMe plugin
|
|
|
|
" YouCompleteMe plugin
|
|
|
|
"set completeopt-=preview
|
|
|
|
"set completeopt-=preview
|
|
|
@ -303,6 +324,9 @@ function s:Cmake(build_type, async_mode)
|
|
|
|
let args .= " -DCMAKE_TOOLCHAIN_FILE=../".g:ProjectSrcDirRel."/Toolchain-target.cmake"
|
|
|
|
let args .= " -DCMAKE_TOOLCHAIN_FILE=../".g:ProjectSrcDirRel."/Toolchain-target.cmake"
|
|
|
|
let args .= " -DBUILD_TARGET=target"
|
|
|
|
let args .= " -DBUILD_TARGET=target"
|
|
|
|
let args .= " -DQT5_INSTALL_PATH=dlcpro-sdk/sysroot-target/usr/local/Qt-5.4.1"
|
|
|
|
let args .= " -DQT5_INSTALL_PATH=dlcpro-sdk/sysroot-target/usr/local/Qt-5.4.1"
|
|
|
|
|
|
|
|
elseif (g:project_type == 'dlcpro-tui')
|
|
|
|
|
|
|
|
let args .= " -DBUILD_TARGET=simulation"
|
|
|
|
|
|
|
|
let args .= " -DQT5_INSTALL_PATH=/usr/lib/x86_64-linux-gnu/qt5"
|
|
|
|
elseif (g:project_type == 'topmode')
|
|
|
|
elseif (g:project_type == 'topmode')
|
|
|
|
let args .= " -DCMAKE_TOOLCHAIN_FILE=../".g:ProjectSrcDirRel."/Toolchain-target.cmake"
|
|
|
|
let args .= " -DCMAKE_TOOLCHAIN_FILE=../".g:ProjectSrcDirRel."/Toolchain-target.cmake"
|
|
|
|
let args .= " -DSYSROOT=~/topmode/topmode-sdk/sysroot-target"
|
|
|
|
let args .= " -DSYSROOT=~/topmode/topmode-sdk/sysroot-target"
|
|
|
@ -363,7 +387,8 @@ endfunction
|
|
|
|
function s:DeviceFirmwareUpdateStartLinux()
|
|
|
|
function s:DeviceFirmwareUpdateStartLinux()
|
|
|
|
let r = s:DeviceUpdateProgramLinux()
|
|
|
|
let r = s:DeviceUpdateProgramLinux()
|
|
|
|
if (r == 0)
|
|
|
|
if (r == 0)
|
|
|
|
call s:Call_and_log('ssh '.g:SshOpts.' -f root@'.g:DeviceIP.' "{ exec '.g:ProgramRemote.' 2>&1 | logger -t "'.g:ProgramRemote.'" -p user.err; } &"')
|
|
|
|
let workdir = 'cd /opt/app &&'
|
|
|
|
|
|
|
|
call s:Call_and_log('ssh '.g:SshOpts.' -f root@'.g:DeviceIP.' "{ '.workdir.' '.g:ProgramRemote.' 2>&1 | logger -t "'.g:ProgramRemote.'" -p user.err; } &"')
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
|
@ -422,7 +447,7 @@ function s:StartDebugger(elffile, attach)
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
|
|
let g:DlcProBasePath = "/jenkins/workspace/pro--firmware_release_1.9.0-DCESJ5C5R577IG5QFEWTML22UFDDZCJDGFLMDA4DCD3V2ZAGVEJA/source/"
|
|
|
|
let g:DlcproBasePath = "/jenkins/workspace/pro--firmware_release_1.9.0-DCESJ5C5R577IG5QFEWTML22UFDDZCJDGFLMDA4DCD3V2ZAGVEJA/source/"
|
|
|
|
function s:DeviceDebug(attach)
|
|
|
|
function s:DeviceDebug(attach)
|
|
|
|
if (a:attach == 0)
|
|
|
|
if (a:attach == 0)
|
|
|
|
" let r = s:DeviceFirmwareUpdate()
|
|
|
|
" let r = s:DeviceFirmwareUpdate()
|
|
|
@ -452,7 +477,7 @@ function s:DeviceDebug(attach)
|
|
|
|
call s:StartDebugger(a:attach)
|
|
|
|
call s:StartDebugger(a:attach)
|
|
|
|
call s:SendToDebugger('target remote localhost:'.g:GdbPort)
|
|
|
|
call s:SendToDebugger('target remote localhost:'.g:GdbPort)
|
|
|
|
" get remote src path with gdb: info sources or gdb: break main
|
|
|
|
" get remote src path with gdb: info sources or gdb: break main
|
|
|
|
call s:SendToDebugger('set substitute-path '.g:DlcProBasePath.' '.s:ProjectSrcDir)
|
|
|
|
call s:SendToDebugger('set substitute-path '.g:DlcproBasePath.' '.s:ProjectSrcDir)
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
" call s:SendToDebugger('set solib-search-path '.g:GccRoot.'/arm-cortexa8-linux-gnueabi/lib/'.':'.g:GccRoot.'/sysroot-arm-cortexa8-linux-gnueabi/lib/'.':'.g:GccRoot.'/sysroot-arm-cortexa8-linux-gnueabi/usr/lib/')
|
|
|
|
" call s:SendToDebugger('set solib-search-path '.g:GccRoot.'/arm-cortexa8-linux-gnueabi/lib/'.':'.g:GccRoot.'/sysroot-arm-cortexa8-linux-gnueabi/lib/'.':'.g:GccRoot.'/sysroot-arm-cortexa8-linux-gnueabi/usr/lib/')
|
|
|
@ -462,55 +487,55 @@ endfunction
|
|
|
|
" ================
|
|
|
|
" ================
|
|
|
|
" Regression Tests
|
|
|
|
" Regression Tests
|
|
|
|
" ================
|
|
|
|
" ================
|
|
|
|
function g:DlcProRegtestCmd(arguments)
|
|
|
|
function g:DlcproRegtestCmd(arguments)
|
|
|
|
return s:DlcProRegtestCmd('', '', '0', '1', '', '--capture=no', a:arguments)
|
|
|
|
return s:DlcproRegtestCmd('', '', '0', '1', '', '--capture=no', a:arguments)
|
|
|
|
endfunction
|
|
|
|
endfunction
|
|
|
|
function g:DlcProRegtestDlProCmd(arguments)
|
|
|
|
function g:DlcproRegtestDlProCmd(arguments)
|
|
|
|
return s:DlcProRegtestCmd('dlc_pro__040011', 'elab-dlcpro2', '2', '1', 'DLpro', '', a:arguments)
|
|
|
|
return s:DlcproRegtestCmd('dlc_pro__040011', 'elab-dlcpro2', '2', '1', 'DLpro', '', a:arguments)
|
|
|
|
endfunction
|
|
|
|
endfunction
|
|
|
|
function g:DlcProRegtestTaProCmd(arguments)
|
|
|
|
function g:DlcproRegtestTaProCmd(arguments)
|
|
|
|
return s:DlcProRegtestCmd('dlc_pro_020372', 'elab-dlcpro2', '3', '1', 'TApro', '-m "not usb and not usbstick"', a:arguments)
|
|
|
|
return s:DlcproRegtestCmd('dlc_pro_020372', 'elab-dlcpro2', '3', '1', 'TApro', '-m "not usb and not usbstick"', a:arguments)
|
|
|
|
endfunction
|
|
|
|
endfunction
|
|
|
|
function g:DlcProRegtestCtlCmd(arguments)
|
|
|
|
function g:DlcproRegtestCtlCmd(arguments)
|
|
|
|
return s:DlcProRegtestCmd('dlc_pro__040120', 'elab-dlcpro2', '1', '1', 'CTL', '-m "not usb and not usbstick"', a:arguments)
|
|
|
|
return s:DlcproRegtestCmd('dlc_pro__040120', 'elab-dlcpro2', '1', '1', 'CTL', '-m "not usb and not usbstick"', a:arguments)
|
|
|
|
endfunction
|
|
|
|
endfunction
|
|
|
|
function g:DlcProRegtestDualDlCmd(arguments)
|
|
|
|
function g:DlcproRegtestDualDlCmd(arguments)
|
|
|
|
return s:DlcProRegtestCmd('dlc_pro_041299', 'elab-dlcpro2', '4', '2', 'DLpro', '-m "not usb and not usbstick"', a:arguments)
|
|
|
|
return s:DlcproRegtestCmd('dlc_pro_041299', 'elab-dlcpro2', '4', '2', 'DLpro', '-m "not usb and not usbstick"', a:arguments)
|
|
|
|
endfunction
|
|
|
|
endfunction
|
|
|
|
function g:DlcProRegtestDualDl1Cmd(arguments)
|
|
|
|
function g:DlcproRegtestDualDl1Cmd(arguments)
|
|
|
|
return s:DlcProRegtestCmd('dlc_pro_041299', 'elab-dlcpro2', '4', '1', 'DLpro', '-m "not usb and not usbstick"', a:arguments)
|
|
|
|
return s:DlcproRegtestCmd('dlc_pro_041299', 'elab-dlcpro2', '4', '1', 'DLpro', '-m "not usb and not usbstick"', a:arguments)
|
|
|
|
endfunction
|
|
|
|
endfunction
|
|
|
|
function g:DlcProRegtestShgProCmd(arguments)
|
|
|
|
function g:DlcproRegtestShgProCmd(arguments)
|
|
|
|
return s:DlcProRegtestCmd('dlc_pro_041355', 'elab-dlcpro2', '7', '1', 'TA-SHGpro', '-m "not usb and not usbstick"', a:arguments)
|
|
|
|
return s:DlcproRegtestCmd('dlc_pro_041355', 'elab-dlcpro2', '7', '1', 'TA-SHGpro', '-m "not usb and not usbstick"', a:arguments)
|
|
|
|
endfunction
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
|
|
command -nargs=1 -complete=file DlcProRegtest call s:DlcProRegtest(g:DlcProRegtestCmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcproRegtest call s:DlcproRegtest(g:DlcproRegtestCmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcProRegtestDlPro call s:DlcProRegtest(g:DlcProRegtestDlProCmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcproRegtestDlPro call s:DlcproRegtest(g:DlcproRegtestDlProCmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcProRegtestTaPro call s:DlcProRegtest(g:DlcProRegtestTaProCmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcproRegtestTaPro call s:DlcproRegtest(g:DlcproRegtestTaProCmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcProRegtestCtl call s:DlcProRegtest(g:DlcProRegtestCtlCmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcproRegtestCtl call s:DlcproRegtest(g:DlcproRegtestCtlCmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcProRegtestDualDl call s:DlcProRegtest(g:DlcProRegtestDualDl1Cmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcproRegtestDualDl call s:DlcproRegtest(g:DlcproRegtestDualDl1Cmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcProRegtestDualDl1 call s:DlcProRegtest(g:DlcProRegtestDualDl1Cmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcproRegtestDualDl1 call s:DlcproRegtest(g:DlcproRegtestDualDl1Cmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcProRegtestShgPro call s:DlcProRegtest(g:DlcProRegtestShgProCmd('<args>'))
|
|
|
|
command -nargs=1 -complete=file DlcproRegtestShgPro call s:DlcproRegtest(g:DlcproRegtestShgProCmd('<args>'))
|
|
|
|
|
|
|
|
|
|
|
|
let g:DlcProRegtest_fast_restart = 1
|
|
|
|
let g:DlcproRegtest_fast_restart = 1
|
|
|
|
"let g:DlcProRegtest_marks = "-m (not not_yet_active and not usb and not usbstick and not si1 and not servo_control and not eom)"
|
|
|
|
"let g:DlcproRegtest_marks = '"-m (not usb and not usbstick and not si1 and not servo_control and not eom and not cavity and not cell_spectroscopy)"'
|
|
|
|
let g:DlcProRegtest_marks = ""
|
|
|
|
let g:DlcproRegtest_marks = ""
|
|
|
|
let g:DlcProRegtest_lasertype = "DLpro"
|
|
|
|
let g:DlcproRegtest_lasertype = "DLpro"
|
|
|
|
let g:DlcProRegtest_powerswitch_ip = ""
|
|
|
|
let g:DlcproRegtest_powerswitch_ip = ""
|
|
|
|
|
|
|
|
|
|
|
|
function s:DlcProRegtestCmd(ip, powerswitch_ip, powerplug, laser_count, laser_type, opts, arguments)
|
|
|
|
function s:DlcproRegtestCmd(ip, powerswitch_ip, powerplug, laser_count, laser_type, opts, arguments)
|
|
|
|
if (a:ip == '')
|
|
|
|
if (a:ip == '')
|
|
|
|
let ip = g:DeviceIP
|
|
|
|
let ip = g:DeviceIP
|
|
|
|
else
|
|
|
|
else
|
|
|
|
let ip = a:ip
|
|
|
|
let ip = a:ip
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
if (a:laser_type == '')
|
|
|
|
if (a:laser_type == '')
|
|
|
|
let laser_type = g:DlcProRegtest_lasertype
|
|
|
|
let laser_type = g:DlcproRegtest_lasertype
|
|
|
|
else
|
|
|
|
else
|
|
|
|
let laser_type = a:laser_type
|
|
|
|
let laser_type = a:laser_type
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
if (a:powerswitch_ip == '')
|
|
|
|
if (a:powerswitch_ip == '')
|
|
|
|
let powerswitch_ip = g:DlcProRegtest_powerswitch_ip
|
|
|
|
let powerswitch_ip = g:DlcproRegtest_powerswitch_ip
|
|
|
|
else
|
|
|
|
else
|
|
|
|
let powerswitch_ip = a:powerswitch_ip
|
|
|
|
let powerswitch_ip = a:powerswitch_ip
|
|
|
|
endif
|
|
|
|
endif
|
|
|
@ -543,19 +568,19 @@ function s:DlcProRegtestCmd(ip, powerswitch_ip, powerplug, laser_count, laser_ty
|
|
|
|
\"--log-file-level=DEBUG "
|
|
|
|
\"--log-file-level=DEBUG "
|
|
|
|
\""
|
|
|
|
\""
|
|
|
|
|
|
|
|
|
|
|
|
if (g:DlcProRegtest_fast_restart == 1)
|
|
|
|
if (g:DlcproRegtest_fast_restart == 1)
|
|
|
|
let test_cmd .= "--fast_restart "
|
|
|
|
let test_cmd .= "--fast_restart "
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
" hint: --collect-only
|
|
|
|
" hint: --collect-only
|
|
|
|
"--log-cli-level=DEBUG --log-file-level=DEBUG
|
|
|
|
"--log-cli-level=DEBUG --log-file-level=DEBUG
|
|
|
|
|
|
|
|
|
|
|
|
let test_cmd .= a:opts." ".a:arguments." ". g:DlcProRegtest_marks
|
|
|
|
let test_cmd .= a:opts." ". g:DlcproRegtest_marks." ".a:arguments
|
|
|
|
let @+ = test_cmd
|
|
|
|
let @+ = test_cmd
|
|
|
|
return test_cmd
|
|
|
|
return test_cmd
|
|
|
|
endfunction
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
|
|
|
|
function s:DlcProRegtest(test_cmd)
|
|
|
|
function s:DlcproRegtest(test_cmd)
|
|
|
|
execute "wa"
|
|
|
|
execute "wa"
|
|
|
|
|
|
|
|
|
|
|
|
" Build license tool
|
|
|
|
" Build license tool
|
|
|
|