// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
using System.Collections.Generic;
using System.IO;
using Flax.Build.Graph;
using Flax.Build.NativeCpp;
namespace Flax.Build.Platforms
{
///
/// The Linux build toolchain implementation.
///
///
///
public class LinuxToolchain : UnixToolchain
{
///
/// Initializes a new instance of the class.
///
/// The platform.
/// The target architecture.
public LinuxToolchain(LinuxPlatform platform, TargetArchitecture architecture)
: base(platform, architecture, platform.ToolchainRoot, platform.UseSystemCompiler)
{
// Setup system paths
SystemIncludePaths.Add(Path.Combine(ToolsetRoot, "usr", "include"));
SystemIncludePaths.Add(Path.Combine(ToolsetRoot, "include", "c++", "5.2.0"));
SystemIncludePaths.Add(Path.Combine(ToolsetRoot, "lib", "clang", "7.0.1", "include"));
}
///
public override void SetupEnvironment(BuildOptions options)
{
base.SetupEnvironment(options);
options.CompileEnv.PreprocessorDefinitions.Add("PLATFORM_LINUX");
if (Architecture == TargetArchitecture.x64)
options.CompileEnv.PreprocessorDefinitions.Add("_LINUX64");
}
///
protected override void SetupCompileCppFilesArgs(TaskGraph graph, BuildOptions options, List args, string outputPath)
{
base.SetupCompileCppFilesArgs(graph, options, args, outputPath);
args.Add(string.Format("-target {0}", ArchitectureName));
args.Add(string.Format("--sysroot=\"{0}\"", ToolsetRoot.Replace('\\', '/')));
}
///
protected override void SetupLinkFilesArgs(TaskGraph graph, BuildOptions options, List args, string outputFilePath)
{
base.SetupLinkFilesArgs(graph, options, args, outputFilePath);
// Speed up build
//args.Add("-Wl,--as-needed");
args.Add("-Wl,--hash-style=gnu");
//args.Add("-Wl,--build-id");
if (options.LinkEnv.Output == LinkerOutput.SharedLibrary)
{
args.Add("-shared");
args.Add(string.Format("-soname=\"{0}\"", Path.GetFileNameWithoutExtension(outputFilePath)));
}
args.Add(string.Format("-target {0}", ArchitectureName));
args.Add(string.Format("--sysroot=\"{0}\"", ToolsetRoot.Replace('\\', '/')));
// Link core libraries
args.Add("-pthread");
args.Add("-ldl");
args.Add("-lrt");
// Link X11
args.Add("-L/usr/X11R6/lib");
args.Add("-lX11");
args.Add("-lXcursor");
args.Add("-lXinerama");
}
///
protected override Task CreateBinary(TaskGraph graph, BuildOptions options, string outputFilePath)
{
var task = base.CreateBinary(graph, options, outputFilePath);
task.CommandPath = ClangPath;
return task;
}
}
}