KGC_TEST/KGCAPP/3rdparty/qwindowkit/qmsetup/cmake/scripts/windeps.bat

271 lines
8.1 KiB
Batchfile

:: MIT License
:: Copyright (c) 2023 SineStriker
:: Description: This script calls `qmcorecmd` to deploy dependencies on Windows.
@echo off
setlocal enabledelayedexpansion
:: Initialize arguments
set "INPUT_DIR="
set "PLUGIN_DIR="
set "LIB_DIR="
set "QML_DIR="
set "QMAKE_PATH="
set "CORECMD_PATH="
set "VERBOSE="
set "FILES="
set "EXTRA_PLUGIN_PATHS="
set "PLUGINS=" & set /a "PLUGIN_COUNT=0"
set "QML_REL_PATHS="
set "ARGS="
:: Parse command line
:parse_args
if "%~1"=="" goto :end_parse_args
if "%1"=="-i" set "INPUT_DIR=%~2" & shift & shift & goto :parse_args
if "%1"=="-m" set "CORECMD_PATH=%~2" & shift & shift & goto :parse_args
if "%1"=="--plugindir" set "PLUGIN_DIR=%~2" & shift & shift & goto :parse_args
if "%1"=="--libdir" set "LIB_DIR=%~2" & shift & shift & goto :parse_args
if "%1"=="--qmldir" set "QML_DIR=%~2" & shift & shift & goto :parse_args
if "%1"=="--qmake" set "QMAKE_PATH=%~2" & shift & shift & goto :parse_args
if "%1"=="--extra" set "EXTRA_PLUGIN_PATHS=!EXTRA_PLUGIN_PATHS! %~2" & shift & shift & goto :parse_args
if "%1"=="--plugin" set /a "PLUGIN_COUNT+=1" & set "PLUGINS[!PLUGIN_COUNT!]=%~2" & shift & shift & goto :parse_args
if "%1"=="--qml" set "QML_REL_PATHS=!QML_REL_PATHS! %~2" & shift & shift & goto :parse_args
if "%1"=="--copy" set "ARGS=!ARGS! -c %~2 %~3" & shift & shift & shift & goto :parse_args
if "%1"=="-f" set "ARGS=!ARGS! -f" & shift & goto :parse_args
if "%1"=="-s" set "ARGS=!ARGS! -s" & shift & goto :parse_args
if "%1"=="-V" set "VERBOSE=-V" & shift & goto :parse_args
if "%1"=="-h" call :usage & exit /b
if "%1"=="-@" set "ARGS=!ARGS! -@ %~2" & shift & shift & goto :parse_args
if "%1"=="-L" set "ARGS=!ARGS! -L %~2" & shift & shift & goto :parse_args
shift
goto :parse_args
:end_parse_args
:: Check required arguments
if not defined INPUT_DIR echo Error: Missing required argument 'INPUT_DIR' & call :usage & exit /b
if not defined PLUGIN_DIR echo Error: Missing required argument 'PLUGIN_DIR' & call :usage & exit /b
if not defined LIB_DIR echo Error: Missing required argument 'LIB_DIR' & call :usage & exit /b
if not defined QML_DIR echo Error: Missing required argument 'QML_DIR' & call :usage & exit /b
if not defined CORECMD_PATH echo Error: Missing required argument 'CORECMD_PATH' & call :usage & exit /b
:: Normalize
set "INPUT_DIR=!INPUT_DIR:/=\!"
set "PLUGIN_DIR=!PLUGIN_DIR:/=\!"
set "LIB_DIR=!LIB_DIR:/=\!"
set "QML_DIR=!QML_DIR:/=\!"
set "CORECMD_PATH=!CORECMD_PATH:/=\!"
:: Get Qt plugin and QML paths
set "PLUGIN_PATHS="
set "QML_PATH="
if defined QMAKE_PATH (
for /f "tokens=*" %%a in ('!QMAKE_PATH! -query QT_INSTALL_PLUGINS') do set "QMAKE_PLUGIN_PATH=%%a"
set "PLUGIN_PATHS=!QMAKE_PLUGIN_PATH!"
for /f "tokens=*" %%a in ('!QMAKE_PATH! -query QT_INSTALL_QML') do set "QML_PATH=%%a"
set "QML_PATH=!QML_PATH:/=\!"
:: Add Qt bin directory
for /f "tokens=*" %%a in ('!QMAKE_PATH! -query QT_INSTALL_BINS') do set "QT_BIN_PATH=%%a"
set "ARGS=!ARGS! -L !QT_BIN_PATH!"
)
:: Add extra plugin searching paths
set "PLUGIN_PATHS=!PLUGIN_PATHS! !EXTRA_PLUGIN_PATHS!"
:: Ensure that the QML search path is not empty
:: when the QML related path is specified (qmake needs to be specified)
if not "%QML_REL_PATHS%"=="" (
if "%QML_PATH%"=="" (
echo Error: qmake path must be specified when QML paths are provided
exit /b
)
)
:: The type of file to be searched depends on the operating system
:: On Windows, search for.exe and.dll files
for /r "%INPUT_DIR%" %%f in (*.exe *.dll) do (
set "FILES=!FILES! %%f"
)
:: Find the full path to the Qt plugin
for /L %%i in (1,1,%PLUGIN_COUNT%) do (
set "plugin_path=!PLUGINS[%%i]!"
:: Check format
echo !plugin_path! | findstr /R "[^/]*\/[^/]*" >nul
if errorlevel 1 (
echo Error: Invalid plugin format '!plugin_path!'. Expected format: ^<category^>/^<name^>
exit /b
)
:: Extracts the category and name
for /f "tokens=1,2 delims=/" %%a in ("!plugin_path!") do (
set "category=%%a"
set "name=%%b"
:: Calculate destination directory
set "DESTINATION_DIR=!PLUGIN_DIR!\!category!"
set "DESTINATION_DIR=!DESTINATION_DIR:/=\!"
:: Traverse the path and find the specific plug-in file
set "FOUND_PLUGINS="
call :search_plugin
if not defined FOUND_PLUGINS (
echo Error: Plugin '!plugin_path!' not found in any search paths.
exit /b
)
)
)
:: Process QML directories
for %%q in (%QML_REL_PATHS%) do (
call :search_qml_dir "%%q"
)
:: Build and execute the deploy command
set "DEPLOY_CMD=!CORECMD_PATH! deploy !FILES! !ARGS! -o !LIB_DIR! !VERBOSE!"
if "!VERBOSE!"=="-V" echo Executing: !DEPLOY_CMD!
call !DEPLOY_CMD!
:: Check the deployment result
if %errorlevel% neq 0 exit /b
exit /b
:: ----------------------------------------------------------------------------------
:: Search plugins
:search_plugin
for %%d in (!PLUGIN_PATHS!) do (
for %%f in ("%%d\!category!\!name!.dll") do (
if exist "%%f" (
call :check_debug "%%f"
if "!ok!"=="0" (
call :add_plugin "%%f"
)
)
)
)
exit /b
:: ----------------------------------------------------------------------------------
:: ----------------------------------------------------------------------------------
:: Add plugin if not already found
:add_plugin
set "plugin=%~1"
set "plugin_name=%~nx1"
for %%i in (!FOUND_PLUGINS!) do (
if "%%i"=="!plugin_name!" (
exit /b
)
)
set "FOUND_PLUGINS=!FOUND_PLUGINS! !plugin_name!"
set "ARGS=!ARGS! -c !plugin! !DESTINATION_DIR!"
exit /b
:: ----------------------------------------------------------------------------------
:: ----------------------------------------------------------------------------------
:: Search QML directory
:search_qml_dir
set "full_path=%QML_PATH%\%~1"
if exist "%full_path%\" (
:: Directory
for /r "%full_path%" %%f in (*) do (
call :handle_qml_file "%%f"
)
) else if exist "%full_path%" (
:: File
call :handle_qml_file "%full_path%"
)
exit /b
:: ----------------------------------------------------------------------------------
:: ----------------------------------------------------------------------------------
:: Check debug version of a dll
:check_debug
set "ok=1"
set "file_path=%~1"
if "!file_path:~-4!"==".pdb" exit /b
if "!file_path:~-10!"==".dll.debug" exit /b
if "!file_path:~-5!" == "d.dll" (
set "prefix=!file_path:~0,-5!"
if exist "!prefix!.dll" (
exit /b
)
)
set "ok=0"
exit /b
:: ----------------------------------------------------------------------------------
:: ----------------------------------------------------------------------------------
:: Copy or add to a deployment command
:handle_qml_file
set "file=%~1"
set "file=!file:/=\!"
:: Ignore specific files (example)
call :check_debug "%file%"
if "!ok!"=="1" (
exit /b
)
:: Computes target file and folder in a very stupid way
set "rel_path=!file:%QML_PATH%\=!"
set "target=%QML_DIR%\%rel_path%"
for %%I in ("!file!") do (
set "file_dir=%%~dpI"
)
set "rel_dir_path=!file_dir:%QML_PATH%\=!"
set "target_dir=%QML_DIR%\%rel_dir_path%"
:: Determine whether it is an executable binary file and handle it accordingly
if "%file:~-4%"==".dll" (
set "ARGS=!ARGS! -c !file! !target_dir!"
) else if "%file:~-4%"==".exe" (
set "ARGS=!ARGS! -c !file! !target_dir!"
) else (
if not exist "%target%" (
mkdir "%target_dir%" >nul 2>&1
)
copy /Y "%file%" "%target%" >nul 2>&1
)
exit /b
:: ----------------------------------------------------------------------------------
:: ----------------------------------------------------------------------------------
:: Show usage
:usage
echo Usage: %~n0 -i ^<dir^> -m ^<path^>
echo --plugindir ^<plugin_dir^> --libdir ^<lib_dir^> --qmldir ^<qml_dir^>
echo [--qmake ^<qmake_path^>] [--extra ^<extra_path^>]...
echo [--qml ^<qml_module^>]... [--plugin ^<plugin^>]... [--copy ^<src^> ^<dest^>]...
echo [-@ ^<file^>]... [-L ^<path^>]...
echo [-f] [-s] [-V] [-h]
exit /b
:: ----------------------------------------------------------------------------------