FaceFX / FaceFX-UE4

The FaceFX Unreal Engine 4 plugin.
Other
170 stars 63 forks source link

Add Linux support #13

Open jcredmond opened 9 years ago

jcredmond commented 9 years ago

The FaceFX Runtime ships with Linux libraries, so it should be pretty easy to add support for building the UE4 plugin on Linux.

jcredmond commented 6 years ago

There is still no Epic Launcher or marketplace support for Linux, so we still cannot build and distribute a pre-built plugin for Linux.

It looks like Epic has settled on clang 5.0.0+ for Linux, so we can move the FaceFX Runtime Linux tool chain to clang 5+ and hopefully create a .lib that can be linked in to UE4 when compiling the UE4 plugin from source on Linux.

jcredmond commented 6 years ago

Epic's documentation is pretty bad. The "cross compilation" documentation says clang 5.0.0, but the actual Linux build instructions in the README say clang 3.8. It's all behind the UBT black box, so who knows what their exact compiler and compilation settings are.

jcredmond commented 6 years ago

It looks like we can use clang 5.0, 4.0, 3.9, 3.8, 3.7, 3.6 and 3.5 (gcc is explicitly forbidden) [1]. This poses a problem, though, because the version of clang is determined at compile time based on what is installed on your Linux system.

In order to do this, we'd have to pick a version and enforce it. We'd have to pick 5.0 because 5.0 is the only version of clang that cross compiling to Linux from Windows supports [2]. This is also a moving target, because as you can see the version of clang changes with (almost) each version of UE4 [2].

Also, this issue is specific to x86_64 Linux. Everything is different for ARM Linux.

[1] https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Source/Programs/UnrealBuildTool/Platform/Linux/LinuxToolChain.cs

// refuse to use compilers that we know won't work
// disable that only if you are a dev and you know what you are doing
if (!UsingClang())
{
    throw new BuildException("This version of the engine can only be compiled by clang - refusing to register the Linux toolchain.");
}
else if (CompilerVersionMajor == 3 && CompilerVersionMinor == 4)
{
    throw new BuildException("clang 3.4.x is known to miscompile the engine - refusing to register the Linux toolchain.");
}
// prevent unknown clangs since the build is likely to fail on too old or too new compilers
else if ((CompilerVersionMajor * 10 + CompilerVersionMinor) > 50 || (CompilerVersionMajor * 10 + CompilerVersionMinor) < 35)
{
    throw new BuildException(
        string.Format("This version of the Unreal Engine can only be compiled with clang 5.0, 4.0, 3.9, 3.8, 3.7, 3.6 and 3.5. clang {0} may not build it - please use a different version.",
            CompilerVersionString)
        );
}

[2] https://wiki.unrealengine.com/Compiling_For_Linux

fxs-dbrady commented 5 years ago

I know this bug is kinda old, but we just got bit by it. But yeah, UE4 uses clang, and the version does change frequently. We've found that the best thing to do is just to cross-compile from Windows (unfortunately). That being said, does a UE4 compatible version exist? Can we request one?

jcredmond commented 5 years ago

We are releasing the 1.5.1 runtime in the next few weeks which switches the pre-compiled linux .lib of the runtime from gcc to clang, which should help for native linux builds of the ue4 plugin.

If you have a full license rather than the indie license you'll have source to the runtime and can simply modify our makefile to build the runtime with the exact compiler settings you need for your specific build.

fxs-dbrady commented 5 years ago

Thanks for the incredibly quick response. We're still working on getting an Enterprise license internally, the wheels are turning a little slower than I'd like. But that's great news for the future.