[TOOL] Project Packager for Unreal Engine 4


I wrote scripts for package my game.
I decided to share it with the community.

github repo

Repository contain batch files for project packaging without using Unreal Editor using command line. Analog of Project Launcher in Unreal Editor. Used UAT in command line with configurable params. This batch files may be run manual, or run by timer using scheduler.

Opportunities of package

  • packaging for all platforms - Android, IOS, Win64, Win32, Mac, Linux, etc.
  • packaging any configuration - Development, Shipping, Debug, DebugGame, Test.
  • ability to use the value of the “For Distribution” flag" (see Project Settings -> Project -> Packaging -> Project - For Distribution).
  • for Android builds you can optionally specify the Android Texture Format.


  • tested only on Windows;
  • when packaging for macOS/iOS you need to select the certificate/provision you need in Project Setting;

Project build settings by default

  • Full rebuild, option “-clean”;
  • Creating compressed coocked packages, option “-compressed”;
  • Does not cook editor content, option “-SkipCookingEditorContent”;
  • Used pack files, option “-pak”;
  • Packaging without crash reporter;
  • Packaging without debug files;

Packaging options may be change.

More information in repo.

How this is working?

Go to repo and read section “Installation”:

Repository: GitHub - GSAero/UEProjectPackager: Project Packager for Unreal Engine 4

@GS_Aero Interesting set of scripts. I had only tried building plugins and c++ code when target platform == host platform, so this was a new experience.

Using a shipping config for Linux target with your UAT options, the log shows undefined symbols (which seems more like a Windows problem when exporting libs). Here’s what my current output says. Any thoughts/suggestions?

Running AutomationTool...
Parsing command line: BuildCookRun -nocompile -nocompileeditor -installed -nop4 -project=C:\code\GamsPlugins\GamsPlugins.uproject -cook -stage -archive -archivedirectory=C:\code\GamsPlugins\ship_linux -package -clientconfig=Shipping -ue4exe=UE4Editor-Cmd.exe -clean -compressed -SkipCookingEditorContent -pak -prereqs -distribution -nodebuginfo -targetplatform=Linux -build -utf8output
  Building 16 actions with 12 processes...
    [1/16] PCH.GamsPlugins.h
    [2/16] SharedPCH.Core.Exceptions.h
    [3/16] GamsPlugins.cpp
    [4/16] GamsPlugins.init.gen.cpp
    [5/16] GamsPluginsGameModeBase.cpp
    [6/16] GamsPluginsGameModeBase.gen.cpp
    [7/16] MadaraLibrary.cpp
    [8/16] GamsLibrary.cpp
    [9/16] SharedPCH.Engine.h
    [10/16] SharedPCH.Engine.Exceptions.h
    [11/16] Module.GamsEnvironments.cpp
    [12/16] Module.GamsEnvironments.gen.cpp
    [13/16] Module.GamsAgents.gen.cpp
    [14/16] Module.GamsAgents.cpp
    [15/16] GamsPlugins-Linux-Shipping
    ld.lld: error: undefined symbol: madara::knowledge::ThreadSafeContext::get_ref(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, madara::knowledge::KnowledgeReferenceSettings const&)
    >>> referenced by Integer.inl:64 (C:/code/GamsPlugins/Plugins/MadaraLibrary/Source/ThirdParty\madara/knowledge/containers\Integer.inl:64)
    >>>               C:/code/GamsPlugins/Plugins/GamsAgents/Intermediate/Build/Linux/B4D820EA/UE4/Shipping/GamsAgents/Module.GamsAgents.cpp.o:(madara::knowledge::containers::Integer::set_name(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, madara::knowledge::KnowledgeBase&))

    ld.lld: error: undefined symbol: gams::platforms::PlatformFactoryRepository::add(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, gams::platforms::PlatformFactory*)
    >>> referenced by GamsGameInstance.cpp:108 (C:/code/GamsPlugins/Plugins/GamsAgents/Source/GamsAgents/Private\GamsGameInstance.cpp:108)

It spits out a number of symbol errors until it hits the error limit. Now, this same project builds fine on Linux when target is Linux, and the .so files for dynamic libs have been built on Linux and then moved into the repo. Same UE4.24, and everything works there with UAT. Any idea what I might need to do to be able to package for Linux and Mac from Windows command line with what you see here? Any ideas on how to use this kind of packaging for different target platforms when you have to include shared libraries? Thanks!

Hi, james.edmondson.
Sorry for the late response.
May be truble is in your plugin - you are using STL.