Skip to content

Commit

Permalink
Build for Linux ARM32 (armhf) and ARM64 (aarch64) (#1382)
Browse files Browse the repository at this point in the history
Co-authored-by: jp2masa <jp2masa@users.noreply.github.com>
  • Loading branch information
mattleibow and jp2masa authored Jul 7, 2020
1 parent 35a7522 commit a3472b0
Show file tree
Hide file tree
Showing 27 changed files with 462 additions and 494 deletions.
5 changes: 5 additions & 0 deletions build.cake
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ var TRACKED_NUGETS = new Dictionary<string, Version> {
{ "SkiaSharp.Vulkan.SharpVk", new Version (1, 57, 0) },
};

Information("Arguments:");
foreach (var arg in CAKE_ARGUMENTS) {
Information($" {arg.Key.PadRight(30)} {{0}}", arg.Value);
}

#load "cake/msbuild.cake"
#load "cake/UtilsManaged.cake"
#load "cake/externals.cake"
Expand Down
10 changes: 2 additions & 8 deletions cake/native-shared.cake
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
#load "shared.cake"

var BUILD_ARCH = Argument("arch", Argument("buildarch", EnvironmentVariable("BUILD_ARCH") ?? ""))
.ToLower().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

var BUILD_VARIANT = Argument("variant", EnvironmentVariable("BUILD_VARIANT"));
var ADDITIONAL_GN_ARGS = Argument("gnArgs", EnvironmentVariable("ADDITIONAL_GN_ARGS"));

var PYTHON_EXE = Argument("python", EnvironmentVariable("PYTHON_EXE") ?? "python");

if (!string.IsNullOrEmpty(PYTHON_EXE) && FileExists(PYTHON_EXE)) {
Expand Down Expand Up @@ -85,7 +79,7 @@ void GnNinja(DirectoryPath outDir, string target, string skiaArgs)
void StripSign(FilePath target)
{
if (!IsRunningOnMac())
throw new InvalidOperationException("lipo is only available on Unix.");
throw new InvalidOperationException("lipo is only available on macOS.");

target = MakeAbsolute(target);
var archive = target;
Expand All @@ -107,7 +101,7 @@ void StripSign(FilePath target)
void RunLipo(DirectoryPath directory, FilePath output, FilePath[] inputs)
{
if (!IsRunningOnMac())
throw new InvalidOperationException("lipo is only available on Unix.");
throw new InvalidOperationException("lipo is only available on macOS.");

EnsureDirectoryExists(directory.CombineWithFilePath(output).GetDirectory());

Expand Down
6 changes: 6 additions & 0 deletions cake/shared.cake
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ var CAKE_ARGUMENTS = (IReadOnlyDictionary<string, string>)Context.Arguments
.GetProperty("Arguments")
.GetValue(Context.Arguments);

var BUILD_ARCH = Argument("arch", Argument("buildarch", EnvironmentVariable("BUILD_ARCH") ?? ""))
.ToLower().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

var BUILD_VARIANT = Argument("variant", EnvironmentVariable("BUILD_VARIANT"));
var ADDITIONAL_GN_ARGS = Argument("gnArgs", EnvironmentVariable("ADDITIONAL_GN_ARGS"));

DirectoryPath PROFILE_PATH = EnvironmentVariable("USERPROFILE") ?? EnvironmentVariable("HOME");

void RunCake(FilePath cake, string target = null, Dictionary<string, string> arguments = null)
Expand Down
2 changes: 1 addition & 1 deletion externals/skia
Submodule skia updated 3 files
+105 −30 BUILD.gn
+1 −1 DEPS
+8 −4 gn/BUILD.gn
61 changes: 61 additions & 0 deletions native/linux-clang-cross/build.cake
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
DirectoryPath ROOT_PATH = MakeAbsolute(Directory("../.."));

#load "../../cake/shared.cake"

if (BUILD_ARCH.Length == 0)
BUILD_ARCH = new [] { "arm" };

string GetGnArgs(string arch)
{
var toolchainArch = arch == "arm"
? "arm-linux-gnueabihf"
: "aarch64-linux-gnu";
var targetArch = arch == "arm"
? "armv7a-linux-gnueabihf"
: "aarch64-linux-gnu";

var sysroot = $"/usr/{toolchainArch}";
var init = $"'--sysroot={sysroot}', '--target={targetArch}'";
var bin = $"'-B{sysroot}/bin/' ";
var libs = $"'-L{sysroot}/lib/' ";
var includes =
$"'-I{sysroot}/include', " +
$"'-I{sysroot}/include/c++/current', " +
$"'-I{sysroot}/include/c++/current/{toolchainArch}' ";

return
$"extra_asmflags+=[ {init}, '-no-integrated-as', {bin}, {includes} ] " +
$"extra_cflags+=[ {init}, {bin}, {includes} ] " +
$"extra_ldflags+=[ {init}, {bin}, {libs} ] " +
ADDITIONAL_GN_ARGS;
}

Task("libSkiaSharp")
.WithCriteria(IsRunningOnLinux())
.Does(() =>
{
foreach (var arch in BUILD_ARCH) {
RunCake("../linux/build.cake", "libSkiaSharp", new Dictionary<string, string> {
{ "arch", arch },
{ "gnArgs", GetGnArgs(arch) },
});
}
});

Task("libHarfBuzzSharp")
.WithCriteria(IsRunningOnLinux())
.Does(() =>
{
foreach (var arch in BUILD_ARCH) {
RunCake("../linux/build.cake", "libHarfBuzzSharp", new Dictionary<string, string> {
{ "arch", arch },
{ "gnArgs", GetGnArgs(arch) },
});
}
});

Task("Default")
.IsDependentOn("libSkiaSharp")
.IsDependentOn("libHarfBuzzSharp");

RunTarget(TARGET);
84 changes: 51 additions & 33 deletions native/linux/build.cake
Original file line number Diff line number Diff line change
Expand Up @@ -6,32 +6,35 @@ DirectoryPath OUTPUT_PATH = MakeAbsolute(ROOT_PATH.Combine("output/native"));
string SUPPORT_GPU_VAR = Argument("supportGpu", EnvironmentVariable("SUPPORT_GPU") ?? "true").ToLower();
bool SUPPORT_GPU = SUPPORT_GPU_VAR == "1" || SUPPORT_GPU_VAR == "true";

string SUPPORT_VULKAN_VAR = Argument ("supportVulkan", EnvironmentVariable ("SUPPORT_VULKAN") ?? "true");
bool SUPPORT_VULKAN = SUPPORT_VULKAN_VAR == "1" || SUPPORT_VULKAN_VAR.ToLower () == "true";
string SUPPORT_VULKAN_VAR = Argument("supportVulkan", EnvironmentVariable("SUPPORT_VULKAN") ?? "true");
bool SUPPORT_VULKAN = SUPPORT_VULKAN_VAR == "1" || SUPPORT_VULKAN_VAR.ToLower() == "true";

var VERIFY_EXCLUDED = Argument("verifyExcluded", "")
.ToLower().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

string CC = Argument("cc", EnvironmentVariable("CC"));
string CXX = Argument("cxx", EnvironmentVariable("CXX"));
string AR = Argument("ar", EnvironmentVariable("AR"));

string VARIANT = BUILD_VARIANT ?? "linux";
string VARIANT = string.IsNullOrEmpty(BUILD_VARIANT) ? "linux" : BUILD_VARIANT?.Trim();

if (BUILD_ARCH.Length == 0)
BUILD_ARCH = new [] { "x64" };

var COMPILERS = "";
if (!string.IsNullOrEmpty(CC))
COMPILERS += $"cc='{CC}' ";
if (!string.IsNullOrEmpty(CXX))
COMPILERS += $"cxx='{CXX}' ";
if (!string.IsNullOrEmpty(AR))
COMPILERS += $"ar='{AR}' ";

Task("libSkiaSharp")
.IsDependentOn("git-sync-deps")
.WithCriteria(IsRunningOnLinux())
.Does(() =>
{
var COMPILERS = "";
if (!string.IsNullOrEmpty(CC))
COMPILERS += $"cc='{CC}' ";
if (!string.IsNullOrEmpty(CXX))
COMPILERS += $"cxx='{CXX}' ";
if (!string.IsNullOrEmpty(AR))
COMPILERS += $"ar='{AR}' ";

Build("x64", "x64", "x64");

void Build(string arch, string skiaArch, string dir)
{
foreach (var arch in BUILD_ARCH) {
if (Skip(arch)) return;

var soname = GetVersion("libSkiaSharp", "soname");
Expand All @@ -52,49 +55,64 @@ Task("libSkiaSharp")
$"skia_use_system_libpng=false " +
$"skia_use_system_libwebp=false " +
$"skia_use_system_zlib=false " +
$"skia_use_vulkan={SUPPORT_VULKAN} ".ToLower () +
$"skia_use_vulkan={SUPPORT_VULKAN} ".ToLower() +
$"extra_asmflags=[] " +
$"extra_cflags=[ '-DSKIA_C_DLL', '-DHAVE_SYSCALL_GETRANDOM', '-DXML_DEV_URANDOM' ] " +
$"extra_ldflags=[ '-static-libstdc++', '-static-libgcc', '-Wl,--version-script={map}' ] " +
COMPILERS +
$"linux_soname_version='{soname}' " +
ADDITIONAL_GN_ARGS);

var outDir = OUTPUT_PATH.Combine($"{VARIANT}/{dir}");
var outDir = OUTPUT_PATH.Combine($"{VARIANT}/{arch}");
EnsureDirectoryExists(outDir);
var so = SKIA_PATH.CombineWithFilePath($"out/{VARIANT}/{arch}/libSkiaSharp.so.{soname}");
CopyFileToDirectory(so, outDir);
CopyFile(so, outDir.CombineWithFilePath("libSkiaSharp.so"));

foreach (var exclude in VERIFY_EXCLUDED) {
RunProcess("readelf", $"-d {so}", out var stdout);

if (stdout.Any(o => o.Contains($"[{exclude}.")))
throw new Exception($"libSkiaSharp.so contained a dependency on {exclude}.");
}
}
});

Task("libHarfBuzzSharp")
.IsDependentOn("git-sync-deps")
.WithCriteria(IsRunningOnLinux())
.Does(() =>
{
var COMPILERS = "";
if (!string.IsNullOrEmpty(CC))
COMPILERS += $"CC='{CC}' ";
if (!string.IsNullOrEmpty(CXX))
COMPILERS += $"CXX='{CXX}' ";

Build("x64", "x64");

void Build(string arch, string dir)
{
foreach (var arch in BUILD_ARCH) {
if (Skip(arch)) return;

var soname = GetVersion("HarfBuzz", "soname");
var map = MakeAbsolute((FilePath)"libHarfBuzzSharp/libHarfBuzzSharp.map");

RunProcess("make", new ProcessSettings {
Arguments = $"{COMPILERS} ARCH={arch} SONAME_VERSION={soname} VARIANT={VARIANT} LDFLAGS=-static-libstdc++",
WorkingDirectory = "libHarfBuzzSharp",
});
GnNinja($"{VARIANT}/{arch}", "HarfBuzzSharp",
$"target_os='linux' " +
$"target_cpu='{arch}' " +
$"is_official_build=true " +
$"visibility_hidden=false " +
$"extra_asmflags=[] " +
$"extra_cflags=[] " +
$"extra_ldflags=[ '-static-libstdc++', '-static-libgcc', '-Wl,--version-script={map}' ] " +
COMPILERS +
$"linux_soname_version='{soname}' " +
ADDITIONAL_GN_ARGS);

var outDir = OUTPUT_PATH.Combine($"{VARIANT}/{dir}");
var outDir = OUTPUT_PATH.Combine($"{VARIANT}/{arch}");
EnsureDirectoryExists(outDir);
var so = $"libHarfBuzzSharp/bin/{VARIANT}/{arch}/libHarfBuzzSharp.so.{soname}";
var so = SKIA_PATH.CombineWithFilePath($"out/{VARIANT}/{arch}/libHarfBuzzSharp.so.{soname}");
CopyFileToDirectory(so, outDir);
CopyFile(so, outDir.CombineWithFilePath("libHarfBuzzSharp.so"));

foreach (var exclude in VERIFY_EXCLUDED) {
RunProcess("readelf", $"-d {so}", out var stdout);

if (stdout.Any(o => o.Contains($"[{exclude}.")))
throw new Exception($"libHarfBuzzSharp.so contained a dependency on {exclude}.");
}
}
});

Expand Down
125 changes: 0 additions & 125 deletions native/linux/libHarfBuzzSharp/Makefile

This file was deleted.

Loading

0 comments on commit a3472b0

Please sign in to comment.