Skip to content

feat: OutputDevice build support for Linux#1231

Open
UE4SS wants to merge 2 commits intomainfrom
linux-progress-1
Open

feat: OutputDevice build support for Linux#1231
UE4SS wants to merge 2 commits intomainfrom
linux-progress-1

Conversation

@UE4SS
Copy link
Copy Markdown
Collaborator

@UE4SS UE4SS commented Apr 7, 2026

Description

This PR adds some support for DynamicOutput.
I've decided a iterative method of adding Linux support may be more effective than doing it all in one chunk, so I might make more PRs similar to this with small-ish changes for Linux support.

Fixes # (issue) (if applicable)

Type of change

  • Other... Please describe: Build support for Linux

How has this been tested?

This has minimal testing.
Specifically, running UE4SS on Windows has been tested and still works, and using DynamicOutput on Linux has been tested and is working except FileDevice and NewFileDevice. Nothing else has been tested.
The File dependency on Linux is not implemented.

It's tested by making a program that utilizes each dependency independently of UE4SS.
CMakeLists.txt, manually change platforms by un/commenting the line near the bottom of the file.

cmake_minimum_required(VERSION 3.22)

set(TARGET TestsForUE4SS)
project(${TARGET})

add_executable(${TARGET} "src/main.cpp")
target_include_directories(${TARGET} PUBLIC "include")

# Check for MSVC-compatible compilers (MSVC or clang-cl)
get_filename_component(COMPILER_NAME "${CMAKE_CXX_COMPILER}" NAME)
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR
        COMPILER_NAME MATCHES "clang-cl" OR
(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC"))
    target_compile_options(${TARGET} PUBLIC /Zi)
endif()

target_compile_definitions(${TARGET} PRIVATE
        RC_ASM_HELPER_BUILD_STATIC
        RC_FILE_BUILD_STATIC
        RC_DYNAMIC_OUTPUT_BUILD_STATIC
        RC_SINGLE_PASS_SIG_SCANNER_BUILD_STATIC
        RC_SINGLE_PASS_SIG_SCANNER_STATIC
        RC_UNREAL_BUILD_STATIC
        RC_INPUT_BUILD_STATIC
        RC_LUA_MADE_SIMPLE_BUILD_STATIC
        RC_FUNCTION_TIMER_BUILD_STATIC
        RC_PARSER_BASE_BUILD_STATIC
        RC_INI_PARSER_BUILD_STATIC
        RC_JSON_BUILD_STATIC
        RC_JSON_PARSER_BUILD_STATIC
        RC_LUA_WRAPPER_GENERATOR_BUILD_STATIC
)

# Windows
#target_compile_definitions(${TARGET} PUBLIC _UNICODE UNICODE UE_GAME UE_BUILD_SHIPPING PLATFORM_WINDOWS PLATFORM_MICROSOFT OVERRIDE_PLATFORM_HEADER_NAME=Windows UBT_COMPILED_PLATFORM=Win64)

# Linux
target_compile_definitions(${TARGET} PUBLIC _UNICODE UNICODE UE_GAME UE_BUILD_SHIPPING PLATFORM_LINUX OVERRIDE_PLATFORM_HEADER_NAME=Clang UBT_COMPILED_PLATFORM=Linux)

target_link_libraries(${TARGET} PUBLIC DynamicOutput)

main.cpp:

#include <DynamicOutput/DynamicOutput.hpp>
#include <Helpers/Time.hpp>

#ifdef _WIN32
#include <Windows.h>
#endif

using namespace RC;

int main()
{
    Output::set_default_devices<Output::DebugConsoleDevice>();
    Output::set_default_log_level<LogLevel::Normal>();

    auto& device = Output::get_device<Output::DebugConsoleDevice>();
    device.set_formatter([](File::StringViewType string) -> File::StringType {
        return fmt::format(STR("[{}] {}"), get_now_as_string(STR("{:%X}")), string);
    });

#ifdef _WIN32
    if (AllocConsole())
    {
        FILE* stdin_filename;
        FILE* stdout_filename;
        FILE* stderr_filename;
        freopen_s(&stdin_filename, "CONIN$", "r", stdin);
        freopen_s(&stdout_filename, "CONOUT$", "w", stdout);
        freopen_s(&stderr_filename, "CONOUT$", "w", stderr);
    }
#endif

    Output::send<LogLevel::Verbose>(STR("HELLO\n"));
    Output::send<LogLevel::Verbose>(STR("Unicode chars 1: åäö ÅÄÖ\n"));
    Output::send<LogLevel::Verbose>(STR("Unicode chars 2: 语言处理\n"));

    return EXIT_SUCCESS;
}

Note that this has minimal testing.
Specifically, running UE4SS on Windows has been tested and still works, and using DynamicOutput on Linux has been tested and is working except FileDevice and NewFileDevice.
Nothing else has been tested.
The File dependency on Linux is not implemented.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 7, 2026

CMAKE-Game__Shipping__Win64 Download Logs
Build Details
Name Information
PR Commit 62ed88d
Merge Commit 6a43449
Size 34.41 MB
Last Updated Apr 7, 26, 9:02:24 AM UTC
Expires At Apr 21, 26, 9:02:20 AM UTC

CMAKE-Game__Debug__Win64 Download Logs
Build Details
Name Information
PR Commit 62ed88d
Merge Commit 6a43449
Size 41.62 MB
Last Updated Apr 7, 26, 8:57:12 AM UTC
Expires At Apr 21, 26, 8:57:07 AM UTC

@UE4SS
Copy link
Copy Markdown
Collaborator Author

UE4SS commented Apr 7, 2026

This patch is also required if you want to test this on Linux.
It will be added as part of a later PR when Linux is more ready to be used.

Index: cmake/modules/ProjectConfig.cmake
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/cmake/modules/ProjectConfig.cmake b/cmake/modules/ProjectConfig.cmake
--- a/cmake/modules/ProjectConfig.cmake	(revision 62ed88d93b860f26de88241d215a1e32df0de2eb)
+++ b/cmake/modules/ProjectConfig.cmake	(date 1775541918479)
@@ -11,7 +11,7 @@
 set(UE4SS_PROJECTS "UE4SS" "UVTD" CACHE STRING "List of main project targets")
 set(UE4SS_TARGET_TYPES "Game" "CasePreserving" "LessEqual421" CACHE STRING "UE4-style target types")
 set(UE4SS_CONFIGURATION_TYPES "Debug" "Dev" "Shipping" "Test" CACHE STRING "UE4-style configuration types")
-set(UE4SS_PLATFORM_TYPES "Win64" CACHE STRING "Supported platform types")
+set(UE4SS_PLATFORM_TYPES "Win64" "Linux" CACHE STRING "Supported platform types")
 
 # Feature toggles
 option(MAKE_DEPENDENCIES_SHARED "Make dependencies shared" OFF)
@@ -48,6 +48,8 @@
 # Platform definitions (UE4-style)
 set(UE4SS_Win64_DEFINITIONS PLATFORM_WINDOWS PLATFORM_MICROSOFT OVERRIDE_PLATFORM_HEADER_NAME=Windows UBT_COMPILED_PLATFORM=Win64)
 set(UE4SS_Win64_VARS CMAKE_SYSTEM_PROCESSOR=x86_64)
+set(UE4SS_Linux_DEFINITIONS PLATFORM_LINUX OVERRIDE_PLATFORM_HEADER_NAME=Clang UBT_COMPILED_PLATFORM=Linux)
+set(UE4SS_Linux_VARS CMAKE_SYSTEM_PROCESSOR=x86_64)
 
 # Initializes the project configuration
 #

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant