Package.bat
@echo off
setlocal enabledelayedexpansion
rem don't remove next two empty lines after next
set LF=^
rem Bat script that compiles and exports the carla project (carla.org)
rem Run it through a cmd with the x64 Visual C++ Toolset enabled.
rem https://wiki.unrealengine.com/How_to_package_your_game_with_commands
set LOCAL_PATH=%~dp0
set FILE_N=-[%~n0]:
rem Print batch params (debug purpose)
echo %FILE_N% [Batch params]: %*
rem ==============================================================================
rem -- Parse arguments -----------------------------------------------------------
rem ==============================================================================
set DOC_STRING="Makes a packaged version of CARLA for distribution."
set USAGE_STRING="Usage: %FILE_N% [-h|--help] [--no-packaging] [--no-zip] [--clean] [--clean-intermediate] [--target-archive]"
set DO_PACKAGE=true
set DO_COPY_FILES=true
set DO_TARBALL=true
set DO_CLEAN=false
set PACKAGES=Carla
set USE_CARSIM=false
set SINGLE_PACKAGE=false
:arg-parse
if not "%1"=="" (
if "%1"=="--clean" (
set DO_CLEAN=true
set DO_TARBALL=false
set DO_PACKAGE=false
set DO_COPY_FILES=false
)
if "%1"=="--clean-intermediate" (
set DO_CLEAN=true
)
if "%1"=="--no-zip" (
set DO_TARBALL=false
)
if "%1"=="--no-packaging" (
set DO_PACKAGE=false
)
if "%1"=="--packages" (
set DO_PACKAGE=false
set DO_COPY_FILES=false
set PACKAGES=%*
shift
)
if "%1"=="--target-archive" (
set SINGLE_PACKAGE=true
set TARGET_ARCHIVE=%2
shift
)
if "%1"=="--carsim" (
set USE_CARSIM=true
)
if "%1"=="-h" (
echo %DOC_STRING%
echo %USAGE_STRING%
GOTO :eof
)
if "%1"=="--help" (
echo %DOC_STRING%
echo %USAGE_STRING%
GOTO :eof
)
shift
goto :arg-parse
)
rem Get Unreal Engine root path
if not defined UE4_ROOT (
set KEY_NAME="HKEY_LOCAL_MACHINE\SOFTWARE\EpicGames\Unreal Engine"
set VALUE_NAME=InstalledDirectory
for /f "usebackq tokens=1,2,*" %%A in (`reg query !KEY_NAME! /s /reg:64`) do (
if "%%A" == "!VALUE_NAME!" (
set UE4_ROOT=%%C
)
)
if not defined UE4_ROOT goto error_unreal_no_found
)
rem Set packaging paths
rem
for /f %%i in ('git describe --tags --dirty --always') do set CARLA_VERSION=%%i
if not defined CARLA_VERSION goto error_carla_version
set BUILD_FOLDER=%INSTALLATION_DIR%UE4Carla/%CARLA_VERSION%/
set DESTINATION_ZIP=%INSTALLATION_DIR%UE4Carla/CARLA_%CARLA_VERSION%.zip
set SOURCE=!BUILD_FOLDER!WindowsNoEditor/
rem ============================================================================
rem -- Create Carla package ----------------------------------------------------
rem ============================================================================
if %DO_PACKAGE%==true (
if %USE_CARSIM% == true (
py -3 %ROOT_PATH%Util/BuildTools/enable_carsim_to_uproject.py -f="%ROOT_PATH%Unreal/CarlaUE4/CarlaUE4.uproject" -e
echo CarSim ON > "%ROOT_PATH%Unreal/CarlaUE4/Config/CarSimConfig.ini"
) else (
py -3 %ROOT_PATH%Util/BuildTools/enable_carsim_to_uproject.py -f="%ROOT_PATH%Unreal/CarlaUE4/CarlaUE4.uproject"
echo CarSim OFF > "%ROOT_PATH%Unreal/CarlaUE4/Config/CarSimConfig.ini"
)
if not exist "!BUILD_FOLDER!" mkdir "!BUILD_FOLDER!"
call "%UE4_ROOT%\Engine\Build\BatchFiles\Build.bat"^
CarlaUE4Editor^
Win64^
Development^
-WaitMutex^
-FromMsBuild^
"%ROOT_PATH%Unreal/CarlaUE4/CarlaUE4.uproject"
if errorlevel 1 goto error_build_editor
call "%UE4_ROOT%\Engine\Build\BatchFiles\Build.bat"^
CarlaUE4^
Win64^
Shipping^
-WaitMutex^
-FromMsBuild^
"%ROOT_PATH%Unreal/CarlaUE4/CarlaUE4.uproject"
if errorlevel 1 goto error_build
call "%UE4_ROOT%\Engine\Build\BatchFiles\RunUAT.bat"^
BuildCookRun^
-nocompileeditor^
-TargetPlatform=Win64^
-Platform=Win64^
-installed^
-nop4^
-project="%ROOT_PATH%Unreal/CarlaUE4/CarlaUE4.uproject"^
-cook^
-stage^
-build^
-archive^
-archivedirectory="!BUILD_FOLDER!"^
-package^
-clientconfig=Shipping
if errorlevel 1 goto error_runUAT
)
rem ==============================================================================
rem -- Adding extra files to package ---------------------------------------------
rem ==============================================================================
if %DO_COPY_FILES%==true (
echo "%FILE_N% Adding extra files to package..."
set XCOPY_FROM=%ROOT_PATH:/=\%
set XCOPY_TO=%SOURCE:/=\%
echo f | xcopy /y "!XCOPY_FROM!LICENSE" "!XCOPY_TO!LICENSE"
echo f | xcopy /y "!XCOPY_FROM!CHANGELOG.md" "!XCOPY_TO!CHANGELOG"
echo f | xcopy /y "!XCOPY_FROM!Docs\release_readme.md" "!XCOPY_TO!README"
echo f | xcopy /y "!XCOPY_FROM!Util\Docker\Release.Dockerfile" "!XCOPY_TO!Dockerfile"
echo f | xcopy /y "!XCOPY_FROM!PythonAPI\carla\dist\*.egg" "!XCOPY_TO!PythonAPI\carla\dist\"
echo f | xcopy /y "!XCOPY_FROM!PythonAPI\carla\dist\*.whl" "!XCOPY_TO!PythonAPI\carla\dist\"
echo d | xcopy /y /s "!XCOPY_FROM!Co-Simulation" "!XCOPY_TO!Co-Simulation"
echo d | xcopy /y /s "!XCOPY_FROM!PythonAPI\carla\agents" "!XCOPY_TO!PythonAPI\carla\agents"
echo f | xcopy /y "!XCOPY_FROM!PythonAPI\carla\scene_layout.py" "!XCOPY_TO!PythonAPI\carla\"
echo f | xcopy /y "!XCOPY_FROM!PythonAPI\carla\requirements.txt" "!XCOPY_TO!PythonAPI\carla\"
echo f | xcopy /y "!XCOPY_FROM!PythonAPI\examples\*.py" "!XCOPY_TO!PythonAPI\examples\"
echo f | xcopy /y "!XCOPY_FROM!PythonAPI\examples\requirements.txt" "!XCOPY_TO!PythonAPI\examples\"
echo f | xcopy /y "!XCOPY_FROM!PythonAPI\util\*.py" "!XCOPY_TO!PythonAPI\util\"
echo d | xcopy /y /s "!XCOPY_FROM!PythonAPI\util\opendrive" "!XCOPY_TO!PythonAPI\util\opendrive"
echo f | xcopy /y "!XCOPY_FROM!PythonAPI\util\requirements.txt" "!XCOPY_TO!PythonAPI\util\"
echo f | xcopy /y "!XCOPY_FROM!Unreal\CarlaUE4\Content\Carla\HDMaps\*.pcd" "!XCOPY_TO!HDMaps\"
echo f | xcopy /y "!XCOPY_FROM!Unreal\CarlaUE4\Content\Carla\HDMaps\Readme.md" "!XCOPY_TO!HDMaps\README"
if exist "!XCOPY_FROM!Plugins" (
echo d | xcopy /y /s "!XCOPY_FROM!Plugins" "!XCOPY_TO!Plugins"
)
)
rem ==============================================================================
rem -- Zip the project -----------------------------------------------------------
rem ==============================================================================
if %DO_PACKAGE%==true if %DO_TARBALL%==true (
set SRC_PATH=%SOURCE:/=\%
echo %FILE_N% Building package...
if exist "!SRC_PATH!Manifest_NonUFSFiles_Win64.txt" del /Q "!SRC_PATH!Manifest_NonUFSFiles_Win64.txt"
if exist "!SRC_PATH!Manifest_DebugFiles_Win64.txt" del /Q "!SRC_PATH!Manifest_DebugFiles_Win64.txt"
if exist "!SRC_PATH!Manifest_UFSFiles_Win64.txt" del /Q "!SRC_PATH!Manifest_UFSFiles_Win64.txt"
if exist "!SRC_PATH!CarlaUE4/Saved" rmdir /S /Q "!SRC_PATH!CarlaUE4/Saved"
if exist "!SRC_PATH!Engine/Saved" rmdir /S /Q "!SRC_PATH!Engine/Saved"
set DST_ZIP=%DESTINATION_ZIP:/=\%
if exist "%ProgramW6432%/7-Zip/7z.exe" (
"%ProgramW6432%/7-Zip/7z.exe" a "!DST_ZIP!" "!SRC_PATH!" -tzip -mmt -mx5
) else (
pushd "!SRC_PATH!"
rem https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/compress-archive?view=powershell-6
powershell -command "& { Compress-Archive -Path * -CompressionLevel Fastest -DestinationPath '!DST_ZIP!' }"
popd
)
)
rem ==============================================================================
rem -- Remove intermediate files -------------------------------------------------
rem ==============================================================================
if %DO_CLEAN%==true (
echo %FILE_N% Removing intermediate build.
rmdir /S /Q "!BUILD_FOLDER!"
)
rem ==============================================================================
rem -- Cook other packages -------------------------------------------------------
rem ==============================================================================
rem Set some file locations
set CARLAUE4_ROOT_FOLDER=%ROOT_PATH%Unreal/CarlaUE4
set PACKAGE_PATH_FILE=%CARLAUE4_ROOT_FOLDER%/Content/PackagePath.txt
set MAP_LIST_FILE=%CARLAUE4_ROOT_FOLDER%/Content/MapPaths.txt
rem get the packages to cook from the arguments whole string
rem (to support multiple packages)
echo Parsing packages...
if not "%PACKAGES%" == "Carla" (
set ARGUMENTS=%PACKAGES:--=!LF!%
for /f "tokens=*" %%i in ("!ARGUMENTS!") do (
set a=%%i
if "!a:~0,9!" == "packages=" (
set RESULT=!a:~9!
) else (
if "!a:~0,9!" == "packages " (
set RESULT=!a:~9!
)
)
)
) else (
set RESULT=%PACKAGES%
)
rem through all maps to cook (parameter)
set PACKAGES=%RESULT:,=!LF!%
for /f "tokens=* delims=" %%i in ("!PACKAGES!") do (
set PACKAGE_NAME=%%i
if not !PACKAGE_NAME! == Carla (
echo Preparing environment for cooking '!PACKAGE_NAME!'.
set BUILD_FOLDER=%INSTALLATION_DIR%UE4Carla/!PACKAGE_NAME!_%CARLA_VERSION%\
set PACKAGE_PATH=%CARLAUE4_ROOT_FOLDER%/Content/!PACKAGE_NAME!
if not exist "!BUILD_FOLDER!" mkdir "!BUILD_FOLDER!"
echo Cooking package '!PACKAGE_NAME!'...
pushd "%CARLAUE4_ROOT_FOLDER%"
echo - prepare
REM # Prepare cooking of package
echo Prepare cooking of package: !PACKAGE_NAME!
call "%UE4_ROOT%/Engine/Binaries/Win64/UE4Editor.exe "^
"%CARLAUE4_ROOT_FOLDER%/CarlaUE4.uproject"^
-run=PrepareAssetsForCooking^
-PackageName=!PACKAGE_NAME!^
-OnlyPrepareMaps=false
set /p PACKAGE_FILE=<%PACKAGE_PATH_FILE%
set /p MAPS_TO_COOK=<%MAP_LIST_FILE%
echo - cook
for /f "tokens=*" %%a in (%MAP_LIST_FILE%) do (
REM # Cook maps
echo Cooking: %%a
call "%UE4_ROOT%/Engine/Binaries/Win64/UE4Editor.exe "^
"%CARLAUE4_ROOT_FOLDER%/CarlaUE4.uproject"^
-run=cook^
-map="%%a"^
-targetplatform="WindowsNoEditor"^
-OutputDir="!BUILD_FOLDER!"^
-iterate^
-cooksinglepackage^
)
REM remove the props folder if exist
set PROPS_MAP_FOLDER="%PACKAGE_PATH%/Maps/PropsMap"
if exist "%PROPS_MAP_FOLDER%" (
rmdir /S /Q "%PROPS_MAP_FOLDER%"
)
popd
echo Copying files to '!PACKAGE_NAME!'...
pushd "!BUILD_FOLDER!"
set SUBST_PATH=!BUILD_FOLDER!CarlaUE4
REM Copy the package config file to package
set TARGET="!SUBST_PATH!\Content\Carla\Config\"
mkdir !TARGET:/=\!
copy "!PACKAGE_FILE:/=\!" !TARGET:/=\!
REM Copy some files for each map to the package
REM MAPS_TO_COOK is read into an array as tokens separated by '+', we replace the '+' by a new line
REM We need the blank line after this line, don't remove it
set MAPS_TO_COOK=!MAPS_TO_COOK:+=^
!
set BASE_CONTENT=%INSTALLATION_DIR:/=\%..\Unreal\CarlaUE4\Content
for /f "tokens=1 delims=+" %%a in ("!MAPS_TO_COOK!") do (
REM Get path and name of map
for /f %%i in ("%%a") do (
set MAP_FOLDER=%%~pi
set MAP_NAME=%%~ni
REM Remove the '/Game' string
set MAP_FOLDER=!MAP_FOLDER:~5!
)
REM # copy the OpenDrive file
set SRC=!BASE_CONTENT!!MAP_FOLDER!\OpenDrive\!MAP_NAME!.xodr
set TRG=!BUILD_FOLDER!\CarlaUE4\Content\!MAP_FOLDER!\OpenDrive\
if exist "!SRC!" (
mkdir "!TRG!"
copy "!SRC!" "!TRG!"
)
REM # copy the navigation file
set SRC=!BASE_CONTENT!!MAP_FOLDER!\Nav\!MAP_NAME!.bin
set TRG=!BUILD_FOLDER!\CarlaUE4\Content\!MAP_FOLDER!\Nav\
if exist "!SRC!" (
mkdir "!TRG!"
copy "!SRC!" "!TRG!"
)
REM # copy the traffic manager map file
set SRC=!BASE_CONTENT!!MAP_FOLDER!\TM\!MAP_NAME!.bin
set TRG=!BUILD_FOLDER!\CarlaUE4\Content\!MAP_FOLDER!\TM\
if exist "!SRC!" (
mkdir "!TRG!"
copy "!SRC!" "!TRG!"
)
)
rmdir /S /Q "!BUILD_FOLDER!\CarlaUE4\Metadata"
rmdir /S /Q "!BUILD_FOLDER!\CarlaUE4\Plugins"
REM del "!BUILD_FOLDER!\CarlaUE4\Content\!PACKAGE_NAME!/Maps/!PROPS_MAP_NAME!"
del "!BUILD_FOLDER!\CarlaUE4\AssetRegistry.bin"
if %DO_TARBALL%==true (
if %SINGLE_PACKAGE%==true (
echo Packaging '%TARGET_ARCHIVE%'...
set DESTINATION_ZIP=%INSTALLATION_DIR%UE4Carla/%TARGET_ARCHIVE%_%CARLA_VERSION%.zip
) else (
echo Packaging '!PACKAGE_NAME!'...
set DESTINATION_ZIP=%INSTALLATION_DIR%UE4Carla/!PACKAGE_NAME!_%CARLA_VERSION%.zip
)
set SOURCE=!BUILD_FOLDER:/=\!\
set DST_ZIP=!DESTINATION_ZIP:/=\!
pushd "!SOURCE!"
if exist "%ProgramW6432%/7-Zip/7z.exe" (
"%ProgramW6432%/7-Zip/7z.exe" a "!DST_ZIP!" . -tzip -mmt -mx5
) else (
rem https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/compress-archive?view=powershell-6
powershell -command "& { Compress-Archive -Update -Path * -CompressionLevel Fastest -DestinationPath '!DST_ZIP!' }"
)
popd
if errorlevel 1 goto bad_exit
echo ZIP created at !DST_ZIP!
)
popd
if %DO_CLEAN%==true (
echo %FILE_N% Removing intermediate build.
rmdir /S /Q "!BUILD_FOLDER!"
)
)
)
rem ============================================================================
goto success
rem ============================================================================
rem -- Messages and Errors -----------------------------------------------------
rem ============================================================================
:success
echo.
if %DO_PACKAGE%==true echo %FILE_N% Carla project successful exported to "%BUILD_FOLDER:/=\%"!
if %DO_TARBALL%==true echo %FILE_N% Compress carla project exported to "%DESTINATION_ZIP%"!
goto good_exit
:error_carla_version
echo.
echo %FILE_N% [ERROR] Carla Version is not set
goto bad_exit
:error_unreal_no_found
echo.
echo %FILE_N% [ERROR] Unreal Engine not detected
goto bad_exit
:error_build_editor
echo.
echo %FILE_N% [ERROR] There was a problem while building the CarlaUE4Editor.
echo [ERROR] Please read the screen log for more information.
goto bad_exit
:error_build
echo.
echo %FILE_N% [ERROR] There was a problem while building the CarlaUE4.
echo [ERROR] Please read the screen log for more information.
goto bad_exit
:error_runUAT
echo.
echo %FILE_N% [ERROR] There was a problem while packaging Unreal project.
echo [ERROR] Please read the screen log for more information.
goto bad_exit
:good_exit
endlocal
exit /b 0
:bad_exit
endlocal
exit /b 1