@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 /s "!XCOPY_FROM!PythonAPI\carla\data\*" "!XCOPY_TO!PythonAPI\carla\data\" 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 call "%UE4_ROOT%/Engine/Binaries/Win64/UE4Editor.exe " "%CARLAUE4_ROOT_FOLDER%/CarlaUE4.uproject" -run=PrepareAssetsForCooking -PackageName=!PACKAGE_NAME! -OnlyPrepareMaps=false 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 REM # Cook maps echo call "%UE4_ROOT%/Engine/Binaries/Win64/UE4Editor.exe " "%CARLAUE4_ROOT_FOLDER%/CarlaUE4.uproject" -run=cook -map="!MAPS_TO_COOK!" -cooksinglepackage -targetplatform="WindowsNoEditor" -OutputDir="!BUILD_FOLDER!" call "%UE4_ROOT%/Engine/Binaries/Win64/UE4Editor.exe "^ "%CARLAUE4_ROOT_FOLDER%/CarlaUE4.uproject"^ -run=cook^ -map="!MAPS_TO_COOK!"^ -cooksinglepackage^ -targetplatform="WindowsNoEditor"^ -OutputDir="!BUILD_FOLDER!" 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!" ) ) 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