diff --git a/VERSIONS.txt b/VERSIONS.txt
index 9c42394ce1..af781fe498 100644
--- a/VERSIONS.txt
+++ b/VERSIONS.txt
@@ -37,6 +37,7 @@ HarfBuzzSharp file 2.6.1.1
SkiaSharp nuget 1.68.1.1
SkiaSharp.NativeAssets.Linux nuget 1.68.1.1
SkiaSharp.NativeAssets.Linux.NoDependencies nuget 1.68.1.1
+SkiaSharp.NativeAssets.NanoServer nuget 1.68.1.1
SkiaSharp.Views nuget 1.68.1.1
SkiaSharp.Views.Desktop.Common nuget 1.68.1.1
SkiaSharp.Views.Gtk2 nuget 1.68.1.1
diff --git a/binding/HarfBuzzSharp.Desktop/HarfBuzzSharp.Desktop.csproj b/binding/HarfBuzzSharp.Desktop/HarfBuzzSharp.Desktop.csproj
index 51a7e1bd04..bb71f213d9 100644
--- a/binding/HarfBuzzSharp.Desktop/HarfBuzzSharp.Desktop.csproj
+++ b/binding/HarfBuzzSharp.Desktop/HarfBuzzSharp.Desktop.csproj
@@ -22,8 +22,10 @@
+
+
diff --git a/binding/HarfBuzzSharp.NetStandard/HarfBuzzSharp.NetStandard.csproj b/binding/HarfBuzzSharp.NetStandard/HarfBuzzSharp.NetStandard.csproj
index 0481fdf59e..aea3af6ce5 100644
--- a/binding/HarfBuzzSharp.NetStandard/HarfBuzzSharp.NetStandard.csproj
+++ b/binding/HarfBuzzSharp.NetStandard/HarfBuzzSharp.NetStandard.csproj
@@ -23,8 +23,10 @@
+
+
diff --git a/binding/SkiaSharp.Desktop/SkiaSharp.Desktop.csproj b/binding/SkiaSharp.Desktop/SkiaSharp.Desktop.csproj
index fd5830ea94..718e604eda 100644
--- a/binding/SkiaSharp.Desktop/SkiaSharp.Desktop.csproj
+++ b/binding/SkiaSharp.Desktop/SkiaSharp.Desktop.csproj
@@ -22,8 +22,10 @@
+
+
diff --git a/binding/SkiaSharp.NetStandard/SkiaSharp.NetStandard.csproj b/binding/SkiaSharp.NetStandard/SkiaSharp.NetStandard.csproj
index f7a1710650..843daf35eb 100644
--- a/binding/SkiaSharp.NetStandard/SkiaSharp.NetStandard.csproj
+++ b/binding/SkiaSharp.NetStandard/SkiaSharp.NetStandard.csproj
@@ -23,8 +23,10 @@
+
+
diff --git a/build.cake b/build.cake
index 1d4fe0c5fc..07263fa1d3 100644
--- a/build.cake
+++ b/build.cake
@@ -22,83 +22,79 @@ using Mono.ApiTools;
using NuGet.Packaging;
using NuGet.Versioning;
-#load "cake/Utils.cake"
+DirectoryPath ROOT_PATH = MakeAbsolute(Directory("."));
+
+#load "cake/shared.cake"
+#load "cake/native-shared.cake"
-var TARGET = Argument ("t", Argument ("target", "Default"));
-var VERBOSITY = Argument ("v", Argument ("verbosity", Verbosity.Normal));
-var BUILD_ARCH = Argument ("buildarch", EnvironmentVariable ("BUILD_ARCH") ?? "")
- .ToLower ().Split (new [] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var SKIP_EXTERNALS = Argument ("skipexternals", "")
.ToLower ().Split (new [] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var PACK_ALL_PLATFORMS = Argument ("packall", Argument ("PackAllPlatforms", false));
+var BUILD_ALL_PLATFORMS = Argument ("buildall", Argument ("BuildAllPlatforms", false));
var PRINT_ALL_ENV_VARS = Argument ("printAllEnvVars", false);
var AZURE_BUILD_ID = Argument ("azureBuildId", "");
var UNSUPPORTED_TESTS = Argument ("unsupportedTests", "");
-var ADDITIONAL_GN_ARGS = Argument ("additionalGnArgs", "");
-var CONFIGURATION = Argument ("c", Argument ("configuration", "Release"));
-var NuGetSources = new [] { MakeAbsolute (Directory ("./output/nugets")).FullPath, "https://api.nuget.org/v3/index.json" };
var NuGetToolPath = Context.Tools.Resolve ("nuget.exe");
var CakeToolPath = Context.Tools.Resolve ("Cake.exe");
var MDocPath = Context.Tools.Resolve ("mdoc.exe");
-var MSBuildToolPath = GetMSBuildToolPath (EnvironmentVariable ("MSBUILD_EXE"));
-var PythonToolPath = EnvironmentVariable ("PYTHON_EXE") ?? "python";
-
-DirectoryPath PROFILE_PATH = EnvironmentVariable ("USERPROFILE") ?? EnvironmentVariable ("HOME");
-DirectoryPath NUGET_PACKAGES = EnvironmentVariable ("NUGET_PACKAGES") ?? PROFILE_PATH.Combine (".nuget/packages");
-DirectoryPath ANDROID_SDK_ROOT = EnvironmentVariable ("ANDROID_SDK_ROOT") ?? EnvironmentVariable ("ANDROID_HOME") ?? PROFILE_PATH.Combine ("android-sdk");
-DirectoryPath ANDROID_NDK_HOME = EnvironmentVariable ("ANDROID_NDK_HOME") ?? EnvironmentVariable ("ANDROID_NDK_ROOT") ?? PROFILE_PATH.Combine ("android-ndk");
-DirectoryPath TIZEN_STUDIO_HOME = EnvironmentVariable ("TIZEN_STUDIO_HOME") ?? PROFILE_PATH.Combine ("tizen-studio");
-DirectoryPath LLVM_HOME = EnvironmentVariable ("LLVM_HOME") ?? (IsRunningOnWindows () ? "C:/Program Files/LLVM" : null);
-
-DirectoryPath ROOT_PATH = MakeAbsolute(Directory("."));
-DirectoryPath DEPOT_PATH = MakeAbsolute(ROOT_PATH.Combine("externals/depot_tools"));
-DirectoryPath SKIA_PATH = MakeAbsolute(ROOT_PATH.Combine("externals/skia"));
-DirectoryPath ANGLE_PATH = MakeAbsolute(ROOT_PATH.Combine("externals/angle"));
-DirectoryPath HARFBUZZ_PATH = MakeAbsolute(ROOT_PATH.Combine("externals/harfbuzz"));
DirectoryPath DOCS_PATH = MakeAbsolute(ROOT_PATH.Combine("docs/SkiaSharpAPI"));
-DirectoryPath PACKAGE_CACHE_PATH = MakeAbsolute(ROOT_PATH.Combine("externals/package_cache"));
var PREVIEW_LABEL = EnvironmentVariable ("PREVIEW_LABEL") ?? "preview";
var FEATURE_NAME = EnvironmentVariable ("FEATURE_NAME") ?? "";
var BUILD_NUMBER = EnvironmentVariable ("BUILD_NUMBER") ?? "0";
-if (!string.IsNullOrEmpty (PythonToolPath) && FileExists (PythonToolPath)) {
- var dir = MakeAbsolute ((FilePath) PythonToolPath).GetDirectory ();
- var oldPath = EnvironmentVariable ("PATH");
- System.Environment.SetEnvironmentVariable ("PATH", dir.FullPath + System.IO.Path.PathSeparator + oldPath);
-}
-
var AZURE_BUILD_SUCCESS = "https://dev.azure.com/xamarin/6fd3d886-57a5-4e31-8db7-52a1b47c07a8/_apis/build/builds?statusFilter=completed&resultFilter=succeeded&definitions=4&branchName=refs/heads/master&$top=1&api-version=5.1";
var AZURE_BUILD_URL = "https://dev.azure.com/xamarin/6fd3d886-57a5-4e31-8db7-52a1b47c07a8/_apis/build/builds/{0}/artifacts?artifactName={1}&%24format=zip&api-version=5.1";
var TRACKED_NUGETS = new Dictionary {
- { "SkiaSharp", new Version (1, 57, 0) },
- { "SkiaSharp.NativeAssets.Linux", new Version (1, 57, 0) },
- { "SkiaSharp.Views", new Version (1, 57, 0) },
- { "SkiaSharp.Views.Desktop.Common", new Version (1, 57, 0) },
- { "SkiaSharp.Views.Gtk2", new Version (1, 57, 0) },
- { "SkiaSharp.Views.Gtk3", new Version (1, 57, 0) },
- { "SkiaSharp.Views.WindowsForms", new Version (1, 57, 0) },
- { "SkiaSharp.Views.WPF", new Version (1, 57, 0) },
- { "SkiaSharp.Views.Forms", new Version (1, 57, 0) },
- { "SkiaSharp.Views.Forms.WPF", new Version (1, 57, 0) },
- { "HarfBuzzSharp", new Version (1, 0, 0) },
- { "HarfBuzzSharp.NativeAssets.Linux", new Version (1, 0, 0) },
- { "SkiaSharp.HarfBuzz", new Version (1, 57, 0) },
+ { "SkiaSharp", new Version (1, 57, 0) },
+ { "SkiaSharp.NativeAssets.Linux", new Version (1, 57, 0) },
+ { "SkiaSharp.NativeAssets.Linux.NoDependencies", new Version (1, 57, 0) },
+ { "SkiaSharp.NativeAssets.NanoServer", new Version (1, 57, 0) },
+ { "SkiaSharp.Views", new Version (1, 57, 0) },
+ { "SkiaSharp.Views.Desktop.Common", new Version (1, 57, 0) },
+ { "SkiaSharp.Views.Gtk2", new Version (1, 57, 0) },
+ { "SkiaSharp.Views.Gtk3", new Version (1, 57, 0) },
+ { "SkiaSharp.Views.WindowsForms", new Version (1, 57, 0) },
+ { "SkiaSharp.Views.WPF", new Version (1, 57, 0) },
+ { "SkiaSharp.Views.Forms", new Version (1, 57, 0) },
+ { "SkiaSharp.Views.Forms.WPF", new Version (1, 57, 0) },
+ { "HarfBuzzSharp", new Version (1, 0, 0) },
+ { "HarfBuzzSharp.NativeAssets.Linux", new Version (1, 0, 0) },
+ { "SkiaSharp.HarfBuzz", new Version (1, 57, 0) },
};
+#load "cake/msbuild.cake"
#load "cake/UtilsManaged.cake"
-#load "cake/BuildExternals.cake"
+#load "cake/externals.cake"
#load "cake/UpdateDocs.cake"
+Task ("determine-last-successful-build")
+ .WithCriteria (string.IsNullOrEmpty (AZURE_BUILD_ID))
+ .Does (() =>
+{
+ Warning ("A build ID (--azureBuildId=) was not specified, using the last successful build.");
+
+ var successUrl = string.Format(AZURE_BUILD_SUCCESS);
+ var json = ParseJson (FileReadText (DownloadFile (successUrl)));
+
+ AZURE_BUILD_ID = (string)json ["value"] [0] ["id"];
+
+ Information ($"Using last successful build ID {AZURE_BUILD_ID}");
+});
+
+Task ("__________________________________")
+ .Description ("__________________________________________________");
+
////////////////////////////////////////////////////////////////////////////////////////////////////
// EXTERNALS - the native C and C++ libraries
////////////////////////////////////////////////////////////////////////////////////////////////////
// this builds all the externals
Task ("externals")
+ .Description ("Build all external dependencies.")
.IsDependentOn ("externals-native");
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -106,20 +102,20 @@ Task ("externals")
////////////////////////////////////////////////////////////////////////////////////////////////////
Task ("libs")
+ .Description ("Build all managed assemblies.")
.IsDependentOn ("externals")
- .IsDependentOn ("libs-only");
-
-Task ("libs-only")
.Does (() =>
{
// build the managed libraries
var platform = "";
- if (IsRunningOnWindows ()) {
- platform = ".Windows";
- } else if (IsRunningOnMac ()) {
- platform = ".Mac";
- } else if (IsRunningOnLinux ()) {
- platform = ".Linux";
+ if (!BUILD_ALL_PLATFORMS) {
+ if (IsRunningOnWindows ()) {
+ platform = ".Windows";
+ } else if (IsRunningOnMac ()) {
+ platform = ".Mac";
+ } else if (IsRunningOnLinux ()) {
+ platform = ".Linux";
+ }
}
RunMSBuild ($"./source/SkiaSharpSource{platform}.sln");
@@ -136,10 +132,8 @@ Task ("libs-only")
////////////////////////////////////////////////////////////////////////////////////////////////////
Task ("tests")
+ .Description ("Run all tests.")
.IsDependentOn ("externals")
- .IsDependentOn ("tests-only");
-
-Task ("tests-only")
.Does (() =>
{
var RunDesktopTest = new Action (arch => {
@@ -169,11 +163,32 @@ Task ("tests-only")
// SAMPLES - the demo apps showing off the work
////////////////////////////////////////////////////////////////////////////////////////////////////
-Task ("samples")
+Task ("samples-generate")
+ .Description ("Generate and zip the samples directory structure.")
.Does (() =>
{
EnsureDirectoryExists ("./output/");
+ // create the workbooks archive
+ Zip ("./workbooks", "./output/workbooks.zip");
+
+ // create the samples archive
+ CreateSamplesDirectory ("./samples/", "./output/samples/");
+ Zip ("./output/samples/", "./output/samples.zip");
+
+ // create the preview samples archive
+ var suffix = string.IsNullOrEmpty (BUILD_NUMBER)
+ ? $"{PREVIEW_LABEL}"
+ : $"{PREVIEW_LABEL}.{BUILD_NUMBER}";
+ CreateSamplesDirectory ("./samples/", "./output/samples-preview/", suffix);
+ Zip ("./output/samples-preview/", "./output/samples-preview.zip");
+});
+
+Task ("samples")
+ .Description ("Build all samples.")
+ .IsDependentOn ("samples-generate")
+ .Does(() =>
+{
var isLinux = IsRunningOnLinux ();
var isMac = IsRunningOnMac ();
var isWin = IsRunningOnWindows ();
@@ -198,7 +213,8 @@ Task ("samples")
{ "xamarin.forms.windows", "x86" },
};
- var buildSample = new Action (sln => {
+ void BuildSample (FilePath sln)
+ {
var platform = sln.GetDirectory ().GetDirectoryName ().ToLower ();
var name = sln.GetFilenameWithoutExtension ();
var slnPlatform = name.GetExtension ();
@@ -219,25 +235,12 @@ Task ("samples")
RunMSBuild (sln, platform: buildPlatform);
}
- });
-
- // create the workbooks archive
- Zip ("./workbooks", "./output/workbooks.zip");
-
- // create the samples archive
- CreateSamplesDirectory ("./samples/", "./output/samples/");
- Zip ("./output/samples/", "./output/samples.zip");
-
- // create the preview samples archive
- var suffix = string.IsNullOrEmpty (BUILD_NUMBER)
- ? $"{PREVIEW_LABEL}"
- : $"{PREVIEW_LABEL}.{BUILD_NUMBER}";
- CreateSamplesDirectory ("./samples/", "./output/samples-preview/", suffix);
- Zip ("./output/samples-preview/", "./output/samples-preview.zip");
+ };
// build the newly migrated samples
CleanDirectories ($"{PACKAGE_CACHE_PATH}/skiasharp*");
CleanDirectories ($"{PACKAGE_CACHE_PATH}/harfbuzzsharp*");
+
var solutions = GetFiles ("./output/samples/**/*.sln");
foreach (var sln in solutions) {
var name = sln.GetFilenameWithoutExtension ();
@@ -248,7 +251,7 @@ Task ("samples")
var variants = GetFiles (sln.GetDirectory ().CombineWithFilePath (name) + ".*.sln");
if (!variants.Any ()) {
// there is no platform variant
- buildSample (sln);
+ BuildSample (sln);
} else {
// skip as there is a platform variant
}
@@ -260,12 +263,13 @@ Task ("samples")
(isMac && slnPlatform == ".mac") ||
(isWin && slnPlatform == ".windows");
if (shouldBuild) {
- buildSample (sln);
+ BuildSample (sln);
} else {
// skip this as this is not the correct platform
}
}
}
+
CleanDirectory ("./output/samples/");
DeleteDirectory ("./output/samples/");
CleanDirectory ("./output/samples-preview/");
@@ -277,10 +281,8 @@ Task ("samples")
////////////////////////////////////////////////////////////////////////////////////////////////////
Task ("nuget")
+ .Description ("Pack all NuGets (build all required dependencies).")
.IsDependentOn ("libs")
- .IsDependentOn ("nuget-only");
-
-Task ("nuget-only")
.Does (() =>
{
var platform = "";
@@ -394,12 +396,7 @@ Task ("nuget-only")
foreach (var nuspec in GetFiles ("./output/*/nuget/*.nuspec")) {
PackageNuGet (nuspec, "./output/nugets/");
}
-});
-Task ("nuget-validation")
- .IsDependentOn ("nuget")
- .Does(() =>
-{
// setup validation options
var options = new Xamarin.Nuget.Validator.NugetValidatorOptions {
Copyright = "© Microsoft Corporation. All rights reserved.",
@@ -411,7 +408,7 @@ Task ("nuget-validation")
ValidPackageNamespace = new [] { "SkiaSharp", "HarfBuzzSharp" },
};
- var nupkgFiles = GetFiles ("./output/*.nupkg");
+ var nupkgFiles = GetFiles ("./output/**/*.nupkg");
Information ("Found ({0}) Nuget's to validate", nupkgFiles.Count ());
@@ -434,21 +431,8 @@ Task ("nuget-validation")
// DOCS - creating the xml, markdown and other documentation
////////////////////////////////////////////////////////////////////////////////////////////////////
-Task ("download-last-successful-build")
- .WithCriteria (string.IsNullOrEmpty (AZURE_BUILD_ID))
- .Does (() =>
-{
- Warning ("A build ID (--azureBuildId=) was not specified, using the last successful build.");
-
- var successUrl = string.Format(AZURE_BUILD_SUCCESS);
- var json = ParseJson (FileReadText (DownloadFile (successUrl)));
-
- AZURE_BUILD_ID = (string)json ["value"] [0] ["id"];
-
- Information ($"Using last successful build ID {AZURE_BUILD_ID}");
-});
-
Task ("update-docs")
+ .Description ("Regenerate all docs.")
.IsDependentOn ("docs-api-diff")
.IsDependentOn ("docs-update-frameworks")
.IsDependentOn ("docs-format-docs");
@@ -458,9 +442,12 @@ Task ("update-docs")
////////////////////////////////////////////////////////////////////////////////////////////////////
Task ("clean")
+ .Description ("Clean up.")
.IsDependentOn ("clean-externals")
.IsDependentOn ("clean-managed");
+
Task ("clean-managed")
+ .Description ("Clean up (managed only).")
.Does (() =>
{
CleanDirectories ("./binding/*/bin");
@@ -497,121 +484,24 @@ Task ("clean-managed")
// DEFAULT - target for common development
////////////////////////////////////////////////////////////////////////////////////////////////////
+Task ("----------------------------------")
+ .Description ("--------------------------------------------------");
+
Task ("Default")
+ .Description ("Build all managed assemblies and external dependencies.")
.IsDependentOn ("externals")
.IsDependentOn ("libs");
Task ("Everything")
+ .Description ("Build, pack and test everything.")
.IsDependentOn ("externals")
.IsDependentOn ("libs")
.IsDependentOn ("nuget")
.IsDependentOn ("tests")
.IsDependentOn ("samples");
-Task ("Nothing");
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// CI - the master target to build everything
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-Task ("CI")
- .IsDependentOn ("externals")
- .IsDependentOn ("libs")
- .IsDependentOn ("nuget")
- .IsDependentOn ("docs-api-diff")
- .IsDependentOn ("nuget-validation")
- .IsDependentOn ("tests")
- .IsDependentOn ("samples");
-
-Task ("Mac-CI")
- .IsDependentOn ("CI");
-
-Task ("Windows-CI")
- .IsDependentOn ("CI");
-
-Task ("Linux-CI")
- .IsDependentOn ("CI");
-
////////////////////////////////////////////////////////////////////////////////////////////////////
// BUILD NOW
////////////////////////////////////////////////////////////////////////////////////////////////////
-Information ("");
-
-Information ("Arguments:");
-Information (" Target: {0}", TARGET);
-Information (" Verbosity: {0}", VERBOSITY);
-Information (" Skip externals: {0}", string.Join (", ", SKIP_EXTERNALS));
-Information (" Build architectures: {0}", string.Join (", ", BUILD_ARCH));
-Information (" Print all environment variables: {0}", PRINT_ALL_ENV_VARS);
-Information (" Pack all platforms: {0}", PACK_ALL_PLATFORMS);
-Information (" Azure build ID: {0}", AZURE_BUILD_ID);
-Information (" Unsupported Tests: {0}", UNSUPPORTED_TESTS);
-Information (" Configuration: {0}", CONFIGURATION);
-Information (" Additional GN Arguments: {0}", ADDITIONAL_GN_ARGS);
-Information ("");
-
-Information ("Tool Paths:");
-Information (" Cake.exe: {0}", CakeToolPath);
-Information (" mdoc: {0}", MDocPath);
-Information (" msbuild: {0}", MSBuildToolPath);
-Information (" nuget.exe: {0}", NuGetToolPath);
-Information (" python: {0}", PythonToolPath);
-Information ("");
-
-Information ("Build Paths:");
-Information (" ~: {0}", PROFILE_PATH);
-Information (" NuGet Cache: {0}", NUGET_PACKAGES);
-Information (" root: {0}", ROOT_PATH);
-Information (" docs: {0}", DOCS_PATH);
-Information (" package_cache: {0}", PACKAGE_CACHE_PATH);
-Information (" ANGLE: {0}", ANGLE_PATH);
-Information (" depot_tools: {0}", DEPOT_PATH);
-Information (" harfbuzz: {0}", HARFBUZZ_PATH);
-Information (" skia: {0}", SKIA_PATH);
-Information ("");
-
-Information ("SDK Paths:");
-Information (" Android SDK: {0}", ANDROID_SDK_ROOT);
-Information (" Android NDK: {0}", ANDROID_NDK_HOME);
-Information (" Tizen Studio: {0}", TIZEN_STUDIO_HOME);
-Information (" LLVM/Clang: {0}", LLVM_HOME);
-Information ("");
-
-Information ("Environment Variables (whitelisted):");
-var envVarsWhitelist = new [] {
- "path", "psmodulepath", "pwd", "shell", "processor_architecture",
- "processor_identifier", "node_name", "node_labels", "branch_name",
- "os", "build_url", "build_number", "number_of_processors",
- "node_label", "build_id", "git_sha", "git_branch_name",
- "feature_name", "msbuild_exe", "python_exe", "preview_label",
- "home", "userprofile", "nuget_packages", "build_arch",
- "android_sdk_root", "android_ndk_root", "llvm_home",
- "android_home", "android_ndk_home", "tizen_studio_home"
-};
-var envVars = EnvironmentVariables ();
-var max = envVars.Max (v => v.Key.Length) + 2;
-foreach (var envVar in envVars.OrderBy (e => e.Key.ToLower ())) {
- if (!PRINT_ALL_ENV_VARS && !envVarsWhitelist.Contains (envVar.Key.ToLower ()))
- continue;
- var spaces = string.Concat (Enumerable.Repeat (" ", max - envVar.Key.Length));
- var toSplit = new [] { "path", "psmodulepath" };
- if (toSplit.Contains (envVar.Key.ToLower ())) {
- var paths = new string [0];
- if (IsRunningOnWindows ()) {
- paths = envVar.Value.Split (';');
- } else {
- paths = envVar.Value.Split (':');
- }
- Information ($" {envVar.Key}:{spaces}{{0}}", paths.FirstOrDefault ());
- var keySpaces = string.Concat (Enumerable.Repeat (" ", envVar.Key.Length));
- foreach (var path in paths.Skip (1)) {
- Information ($" {keySpaces} {spaces}{{0}}", path);
- }
- } else {
- Information ($" {envVar.Key}:{spaces}{{0}}", envVar.Value);
- }
-}
-Information ("");
-
RunTarget (TARGET);
diff --git a/cake/BuildExternals.cake b/cake/BuildExternals.cake
deleted file mode 100644
index 2fac8443e6..0000000000
--- a/cake/BuildExternals.cake
+++ /dev/null
@@ -1,812 +0,0 @@
-
-void GnNinja (DirectoryPath outDir, string target, string skiaArgs)
-{
- var exe = IsRunningOnWindows () ? ".exe" : "";
- var quote = IsRunningOnWindows () ? "\"" : "'";
- var innerQuote = IsRunningOnWindows () ? "\\\"" : "\"";
-
- if (!string.IsNullOrEmpty(ADDITIONAL_GN_ARGS)) {
- skiaArgs += " " + ADDITIONAL_GN_ARGS;
- }
-
- // generate native skia build files
- RunProcess (SKIA_PATH.CombineWithFilePath($"bin/gn{exe}"), new ProcessSettings {
- Arguments = $"gen out/{outDir} --args={quote}{skiaArgs.Replace("'", innerQuote)}{quote}",
- WorkingDirectory = SKIA_PATH.FullPath,
- });
-
- // build native skia
- RunProcess (DEPOT_PATH.CombineWithFilePath ($"ninja{exe}"), new ProcessSettings {
- Arguments = $"{target} -C out/{outDir}",
- WorkingDirectory = SKIA_PATH.FullPath,
- });
-}
-
-void StripSign (FilePath target)
-{
- target = MakeAbsolute (target);
- var archive = target;
- if (target.FullPath.EndsWith (".framework")) {
- archive = $"{target}/{target.GetFilenameWithoutExtension()}";
- }
-
- // strip anything we can
- RunProcess ("strip", new ProcessSettings {
- Arguments = $"-x -S {archive}",
- });
-
- // re-sign with empty
- RunProcess ("codesign", new ProcessSettings {
- Arguments = $"--force --sign - --timestamp=none {target}",
- });
-}
-
-void RunLipo (DirectoryPath directory, FilePath output, FilePath[] inputs)
-{
- if (!IsRunningOnMac ()) {
- throw new InvalidOperationException ("lipo is only available on Unix.");
- }
-
- EnsureDirectoryExists (directory.CombineWithFilePath (output).GetDirectory ());
-
- var inputString = string.Join(" ", inputs.Select (i => string.Format ("\"{0}\"", i)));
- RunProcess ("lipo", new ProcessSettings {
- Arguments = string.Format("-create -output \"{0}\" {1}", output, inputString),
- WorkingDirectory = directory,
- });
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// EXTERNALS - the native C and C++ libraries
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-Task ("externals-init")
- .Does (() =>
-{
- RunProcess (PythonToolPath, new ProcessSettings {
- Arguments = SKIA_PATH.CombineWithFilePath ("tools/git-sync-deps").FullPath,
- WorkingDirectory = SKIA_PATH.FullPath,
- });
-});
-
-// this builds the native C and C++ externals
-Task ("externals-native");
-Task ("externals-native-skip");
-
-// this builds the native C and C++ externals for Windows
-Task ("externals-windows")
- .IsDependentOn ("externals-init")
- .IsDependeeOf (ShouldBuildExternal ("windows") ? "externals-native" : "externals-native-skip")
- .WithCriteria (ShouldBuildExternal ("windows"))
- .WithCriteria (IsRunningOnWindows ())
- .Does (() =>
-{
- // libSkiaSharp
-
- var buildArch = new Action ((arch, skiaArch, dir) => {
- if (!ShouldBuildArch (arch)) {
- Warning ($"Skipping architecture: {arch}.");
- return;
- }
-
- var clang = string.IsNullOrEmpty(LLVM_HOME.FullPath) ? "" : $"clang_win='{LLVM_HOME}' ";
-
- // generate native skia build files
- GnNinja ($"win/{arch}", "SkiaSharp",
- $"is_official_build=true skia_enable_tools=false " +
- $"target_os='win' target_cpu='{skiaArch}' " +
- clang +
- $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true skia_use_dng_sdk=true " +
- $"skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
- $"extra_cflags=[ '-DSKIA_C_DLL', '/MT', '/EHsc', '/Z7' ] " +
- $"extra_ldflags=[ '/DEBUG:FULL' ]");
-
- // copy libSkiaSharp to output
- var outDir = $"output/native/windows/{dir}";
- EnsureDirectoryExists (outDir);
- CopyFileToDirectory (SKIA_PATH.CombineWithFilePath ($"out/win/{arch}/libSkiaSharp.dll"), outDir);
- CopyFileToDirectory (SKIA_PATH.CombineWithFilePath ($"out/win/{arch}/libSkiaSharp.pdb"), outDir);
- });
-
- buildArch ("Win32", "x86", "x86");
- buildArch ("x64", "x64", "x64");
-
- // libHarfBuzzSharp
-
- var buildHarfBuzzArch = new Action ((arch, dir) => {
- if (!ShouldBuildArch (arch)) {
- Warning ($"Skipping architecture: {arch}.");
- return;
- }
-
- // build libHarfBuzzSharp
- RunMSBuild ("native-builds/libHarfBuzzSharp_windows/libHarfBuzzSharp.sln", platformTarget: arch);
-
- // copy libHarfBuzzSharp to output
- var outDir = $"output/native/windows/{dir}";
- EnsureDirectoryExists (outDir);
- CopyFileToDirectory ($"native-builds/libHarfBuzzSharp_windows/bin/{arch}/{CONFIGURATION}/libHarfBuzzSharp.dll", outDir);
- CopyFileToDirectory ($"native-builds/libHarfBuzzSharp_windows/bin/{arch}/{CONFIGURATION}/libHarfBuzzSharp.pdb", outDir);
- });
-
- buildHarfBuzzArch ("Win32", "x86");
- buildHarfBuzzArch ("x64", "x64");
-});
-
-// this builds the native C and C++ externals for Windows UWP
-Task ("externals-uwp")
- .IsDependentOn ("externals-init")
- .IsDependentOn ("externals-angle-uwp")
- .IsDependeeOf (ShouldBuildExternal ("uwp") ? "externals-native" : "externals-native-skip")
- .WithCriteria (ShouldBuildExternal ("uwp"))
- .WithCriteria (IsRunningOnWindows ())
- .Does (() =>
-{
- // libSkiaSharp
-
- var buildArch = new Action ((arch, skiaArch, dir) => {
- if (!ShouldBuildArch (arch)) {
- Warning ($"Skipping architecture: {arch}.");
- return;
- }
-
- // generate native skia build files
- GnNinja ($"winrt/{arch}", "SkiaSharp",
- $"is_official_build=true skia_enable_tools=false " +
- $"target_os='winrt' target_cpu='{skiaArch}' " +
- $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
- $"skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
- $"extra_cflags=[ " +
- $" '-DSKIA_C_DLL', '/MD', '/EHsc', '/Z7', " +
- $" '-DWINAPI_FAMILY=WINAPI_FAMILY_APP', '-DSK_BUILD_FOR_WINRT', '-DSK_HAS_DWRITE_1_H', '-DSK_HAS_DWRITE_2_H', '-DNO_GETENV' ] " +
- $"extra_ldflags=[ '/DEBUG:FULL', '/APPCONTAINER', 'WindowsApp.lib' ]");
-
- // copy libSkiaSharp to output
- var outDir = $"output/native/uwp/{dir}";
- EnsureDirectoryExists (outDir);
- CopyFileToDirectory (SKIA_PATH.CombineWithFilePath ($"out/winrt/{arch}/libSkiaSharp.dll"), outDir);
- CopyFileToDirectory (SKIA_PATH.CombineWithFilePath ($"out/winrt/{arch}/libSkiaSharp.pdb"), outDir);
- });
-
- buildArch ("x64", "x64", "x64");
- buildArch ("Win32", "x86", "x86");
- buildArch ("ARM", "arm", "ARM");
-
- // libHarfBuzzSharp
-
- var buildHarfBuzzArch = new Action ((arch, dir) => {
- if (!ShouldBuildArch (arch)) {
- Warning ($"Skipping architecture: {arch}.");
- return;
- }
-
- // build libHarfBuzzSharp
- RunMSBuild ("native-builds/libHarfBuzzSharp_uwp/libHarfBuzzSharp.sln", platformTarget: arch);
-
- // copy libHarfBuzzSharp to output
- var outDir = $"output/native/uwp/{dir}";
- EnsureDirectoryExists (outDir);
- CopyFileToDirectory ($"native-builds/libHarfBuzzSharp_uwp/bin/{arch}/{CONFIGURATION}/libHarfBuzzSharp.dll", outDir);
- CopyFileToDirectory ($"native-builds/libHarfBuzzSharp_uwp/bin/{arch}/{CONFIGURATION}/libHarfBuzzSharp.pdb", outDir);
- });
-
- buildHarfBuzzArch ("Win32", "x86");
- buildHarfBuzzArch ("x64", "x64");
- buildHarfBuzzArch ("ARM", "arm");
-
- // SkiaSharp.Views.Interop.UWP
-
- var buildInteropArch = new Action ((arch, dir) => {
- if (!ShouldBuildArch (arch)) {
- Warning ($"Skipping architecture: {arch}.");
- return;
- }
-
- // build SkiaSharp.Views.Interop.UWP
- RunMSBuild ("source/SkiaSharp.Views.Interop.UWP.sln", platformTarget: arch);
-
- // copy SkiaSharp.Views.Interop.UWP to native
- var outDir = $"./output/native/uwp/{dir}";
- EnsureDirectoryExists (outDir);
- CopyFileToDirectory ($"source/SkiaSharp.Views.Interop.UWP/bin/{arch}/{CONFIGURATION}/SkiaSharp.Views.Interop.UWP.dll", outDir);
- CopyFileToDirectory ($"source/SkiaSharp.Views.Interop.UWP/bin/{arch}/{CONFIGURATION}/SkiaSharp.Views.Interop.UWP.pdb", outDir);
- });
-
- buildInteropArch ("Win32", "x86");
- buildInteropArch ("x64", "x64");
- buildInteropArch ("ARM", "arm");
-
- // copy ANGLE externals
- EnsureDirectoryExists ("./output/native/uwp/arm/");
- EnsureDirectoryExists ("./output/native/uwp/x86/");
- EnsureDirectoryExists ("./output/native/uwp/x64/");
- CopyFileToDirectory (ANGLE_PATH.CombineWithFilePath ("uwp/bin/UAP/ARM/libEGL.dll"), "./output/native/uwp/arm/");
- CopyFileToDirectory (ANGLE_PATH.CombineWithFilePath ("uwp/bin/UAP/ARM/libGLESv2.dll"), "./output/native/uwp/arm/");
- CopyFileToDirectory (ANGLE_PATH.CombineWithFilePath ("uwp/bin/UAP/Win32/libEGL.dll"), "./output/native/uwp/x86/");
- CopyFileToDirectory (ANGLE_PATH.CombineWithFilePath ("uwp/bin/UAP/Win32/libGLESv2.dll"), "./output/native/uwp/x86/");
- CopyFileToDirectory (ANGLE_PATH.CombineWithFilePath ("uwp/bin/UAP/x64/libEGL.dll"), "./output/native/uwp/x64/");
- CopyFileToDirectory (ANGLE_PATH.CombineWithFilePath ("uwp/bin/UAP/x64/libGLESv2.dll"), "./output/native/uwp/x64/");
-});
-
-// this builds the native C and C++ externals for Mac OS X
-Task ("externals-macos")
- .IsDependentOn ("externals-osx");
-Task ("externals-osx")
- .IsDependentOn ("externals-init")
- .IsDependeeOf (ShouldBuildExternal ("osx") ? "externals-native" : "externals-native-skip")
- .WithCriteria (ShouldBuildExternal ("osx"))
- .WithCriteria (IsRunningOnMac ())
- .Does (() =>
-{
- // SkiaSharp
-
- var buildArch = new Action ((arch, skiaArch) => {
- // generate native skia build files
- GnNinja ($"mac/{arch}", "skia",
- $"is_official_build=true skia_enable_tools=false " +
- $"target_os='mac' target_cpu='{skiaArch}' " +
- $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
- $"skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
- $"extra_cflags=[ '-DSKIA_C_DLL', '-mmacosx-version-min=10.7', '-stdlib=libc++' ] " +
- $"extra_ldflags=[ '-Wl,macosx_version_min=10.7', '-stdlib=libc++' ]");
-
- // build libSkiaSharp
- XCodeBuild (new XCodeBuildSettings {
- Project = "native-builds/libSkiaSharp_osx/libSkiaSharp.xcodeproj",
- Target = "libSkiaSharp",
- Sdk = "macosx",
- Arch = arch,
- Configuration = CONFIGURATION,
- });
-
- // copy libSkiaSharp to output
- EnsureDirectoryExists ($"output/native/osx/{arch}");
- CopyDirectory ($"native-builds/libSkiaSharp_osx/build/{CONFIGURATION}/", $"output/native/osx/{arch}");
-
- StripSign ($"output/native/osx/{arch}/libSkiaSharp.dylib");
- });
-
- buildArch ("x86_64", "x64");
-
- // create the fat dylib
- RunLipo ("output/native/osx/", "libSkiaSharp.dylib", new [] {
- (FilePath) "x86_64/libSkiaSharp.dylib"
- });
-
- // HarfBuzzSharp
-
- var buildHarfBuzzArch = new Action ((arch, skiaArch) => {
- // build libHarfBuzzSharp
- XCodeBuild (new XCodeBuildSettings {
- Project = "native-builds/libHarfBuzzSharp_osx/libHarfBuzzSharp.xcodeproj",
- Target = "libHarfBuzzSharp",
- Sdk = "macosx",
- Arch = arch,
- Configuration = CONFIGURATION,
- });
-
- // copy libHarfBuzzSharp to output
- EnsureDirectoryExists ($"output/native/osx/{arch}");
- CopyFileToDirectory ($"native-builds/libHarfBuzzSharp_osx/build/{CONFIGURATION}/libHarfBuzzSharp.dylib", $"output/native/osx/{arch}");
-
- StripSign ($"output/native/osx/{arch}/libHarfBuzzSharp.dylib");
- });
-
- buildHarfBuzzArch ("x86_64", "x64");
-
- // create the fat dylib
- RunLipo ("output/native/osx/", "libHarfBuzzSharp.dylib", new [] {
- (FilePath) "x86_64/libHarfBuzzSharp.dylib"
- });
-});
-
-// this builds the native C and C++ externals for iOS
-Task ("externals-ios")
- .IsDependentOn ("externals-init")
- .IsDependeeOf (ShouldBuildExternal ("ios") ? "externals-native" : "externals-native-skip")
- .WithCriteria (ShouldBuildExternal ("ios"))
- .WithCriteria (IsRunningOnMac ())
- .Does (() =>
-{
- // SkiaSharp
-
- var buildArch = new Action ((sdk, arch, skiaArch) => {
- // generate native skia build files
- GnNinja ($"ios/{arch}", "skia",
- $"is_official_build=true skia_enable_tools=false " +
- $"target_os='ios' target_cpu='{skiaArch}' " +
- $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
- $"skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
- $"extra_cflags=[ '-DSKIA_C_DLL', '-mios-version-min=8.0' ] " +
- $"extra_ldflags=[ '-Wl,ios_version_min=8.0' ]");
-
- // build libSkiaSharp
- XCodeBuild (new XCodeBuildSettings {
- Project = "native-builds/libSkiaSharp_ios/libSkiaSharp.xcodeproj",
- Target = "libSkiaSharp",
- Sdk = sdk,
- Arch = arch,
- Configuration = CONFIGURATION,
- });
-
- // copy libSkiaSharp to output
- EnsureDirectoryExists ($"output/native/ios/{arch}");
- CopyDirectory ($"native-builds/libSkiaSharp_ios/build/{CONFIGURATION}-{sdk}", $"output/native/ios/{arch}");
-
- StripSign ($"output/native/ios/{arch}/libSkiaSharp.framework");
- });
-
- buildArch ("iphonesimulator", "i386", "x86");
- buildArch ("iphonesimulator", "x86_64", "x64");
- buildArch ("iphoneos", "armv7", "arm");
- buildArch ("iphoneos", "arm64", "arm64");
-
- // create the fat framework
- CopyDirectory ("output/native/ios/armv7/libSkiaSharp.framework/", "output/native/ios/libSkiaSharp.framework/");
- DeleteFile ("output/native/ios/libSkiaSharp.framework/libSkiaSharp");
- RunLipo ("output/native/ios/", "libSkiaSharp.framework/libSkiaSharp", new [] {
- (FilePath) "i386/libSkiaSharp.framework/libSkiaSharp",
- (FilePath) "x86_64/libSkiaSharp.framework/libSkiaSharp",
- (FilePath) "armv7/libSkiaSharp.framework/libSkiaSharp",
- (FilePath) "arm64/libSkiaSharp.framework/libSkiaSharp"
- });
-
- // HarfBuzzSharp
-
- var buildHarfBuzzArch = new Action ((sdk, arch) => {
- // build libHarfBuzzSharp
- XCodeBuild (new XCodeBuildSettings {
- Project = "native-builds/libHarfBuzzSharp_ios/libHarfBuzzSharp.xcodeproj",
- Target = "libHarfBuzzSharp",
- Sdk = sdk,
- Arch = arch,
- Configuration = CONFIGURATION,
- });
-
- // copy libHarfBuzzSharp_ios to output
- EnsureDirectoryExists ($"output/native/ios/{arch}");
- CopyFileToDirectory ($"native-builds/libHarfBuzzSharp_ios/build/{CONFIGURATION}-{sdk}/libHarfBuzzSharp.a", $"output/native/ios/{arch}");
-
- StripSign ($"output/native/ios/{arch}/libHarfBuzzSharp.a");
- });
-
- buildHarfBuzzArch ("iphonesimulator", "i386");
- buildHarfBuzzArch ("iphonesimulator", "x86_64");
- buildHarfBuzzArch ("iphoneos", "armv7");
- buildHarfBuzzArch ("iphoneos", "arm64");
-
- // create the fat archive
- RunLipo ("output/native/ios/", "libHarfBuzzSharp.a", new [] {
- (FilePath) "i386/libHarfBuzzSharp.a",
- (FilePath) "x86_64/libHarfBuzzSharp.a",
- (FilePath) "armv7/libHarfBuzzSharp.a",
- (FilePath) "arm64/libHarfBuzzSharp.a"
- });
-});
-
-// this builds the native C and C++ externals for tvOS
-Task ("externals-tvos")
- .IsDependentOn ("externals-init")
- .IsDependeeOf (ShouldBuildExternal ("tvos") ? "externals-native" : "externals-native-skip")
- .WithCriteria (ShouldBuildExternal ("tvos"))
- .WithCriteria (IsRunningOnMac ())
- .Does (() =>
-{
- // SkiaSharp
-
- var buildArch = new Action ((sdk, arch, skiaArch) => {
- // generate native skia build files
- GnNinja ($"tvos/{arch}", "skia",
- $"is_official_build=true skia_enable_tools=false " +
- $"target_os='tvos' target_cpu='{skiaArch}' " +
- $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
- $"skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
- $"extra_cflags=[ '-DSK_BUILD_FOR_TVOS', '-DSKIA_C_DLL', '-mtvos-version-min=9.0' ] " +
- $"extra_ldflags=[ '-Wl,tvos_version_min=9.0' ]");
-
- // build libSkiaSharp
- XCodeBuild (new XCodeBuildSettings {
- Project = "native-builds/libSkiaSharp_tvos/libSkiaSharp.xcodeproj",
- Target = "libSkiaSharp",
- Sdk = sdk,
- Arch = arch,
- Configuration = CONFIGURATION,
- });
-
- // copy libSkiaSharp to output
- EnsureDirectoryExists ($"output/native/tvos/{arch}");
- CopyDirectory ($"native-builds/libSkiaSharp_tvos/build/{CONFIGURATION}-{sdk}", $"output/native/tvos/{arch}");
-
- StripSign ($"output/native/tvos/{arch}/libSkiaSharp.framework");
- });
-
- buildArch ("appletvsimulator", "x86_64", "x64");
- buildArch ("appletvos", "arm64", "arm64");
-
- // create the fat framework
- CopyDirectory ("output/native/tvos/arm64/libSkiaSharp.framework/", "output/native/tvos/libSkiaSharp.framework/");
- DeleteFile ("output/native/tvos/libSkiaSharp.framework/libSkiaSharp");
- RunLipo ("output/native/tvos/", "libSkiaSharp.framework/libSkiaSharp", new [] {
- (FilePath) "x86_64/libSkiaSharp.framework/libSkiaSharp",
- (FilePath) "arm64/libSkiaSharp.framework/libSkiaSharp"
- });
-
- // HarfBuzzSharp
-
- var buildHarfBuzzArch = new Action ((sdk, arch) => {
- // build libHarfBuzzSharp
- XCodeBuild (new XCodeBuildSettings {
- Project = "native-builds/libHarfBuzzSharp_tvos/libHarfBuzzSharp.xcodeproj",
- Target = "libHarfBuzzSharp",
- Sdk = sdk,
- Arch = arch,
- Configuration = CONFIGURATION,
- });
-
- // copy libHarfBuzzSharp to output
- EnsureDirectoryExists ($"output/native/tvos/{arch}");
- CopyFileToDirectory ($"native-builds/libHarfBuzzSharp_tvos/build/{CONFIGURATION}-{sdk}/libHarfBuzzSharp.a", $"output/native/tvos/{arch}");
-
- StripSign ($"output/native/tvos/{arch}/libHarfBuzzSharp.a");
- });
-
- buildHarfBuzzArch ("appletvsimulator", "x86_64");
- buildHarfBuzzArch ("appletvos", "arm64");
-
- // create the fat framework
- RunLipo ("output/native/tvos/", "libHarfBuzzSharp.a", new [] {
- (FilePath) "x86_64/libHarfBuzzSharp.a",
- (FilePath) "arm64/libHarfBuzzSharp.a"
- });
-});
-
-// this builds the native C and C++ externals for watchOS
-Task ("externals-watchos")
- .IsDependentOn ("externals-init")
- .IsDependeeOf (ShouldBuildExternal ("watchos") ? "externals-native" : "externals-native-skip")
- .WithCriteria (ShouldBuildExternal ("watchos"))
- .WithCriteria (IsRunningOnMac ())
- .Does (() =>
-{
- // SkiaSharp
-
- var buildArch = new Action ((sdk, arch, skiaArch) => {
- // generate native skia build files
- GnNinja ($"watchos/{arch}", "skia",
- $"is_official_build=true skia_enable_tools=false " +
- $"target_os='watchos' target_cpu='{skiaArch}' " +
- $"skia_enable_gpu=false " +
- $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
- $"skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
- $"extra_cflags=[ '-DSK_BUILD_FOR_WATCHOS', '-DSKIA_C_DLL', '-mwatchos-version-min=2.0' ] " +
- $"extra_ldflags=[ '-Wl,watchos_version_min=2.0' ]");
-
- // build libSkiaSharp
- XCodeBuild (new XCodeBuildSettings {
- Project = "native-builds/libSkiaSharp_watchos/libSkiaSharp.xcodeproj",
- Target = "libSkiaSharp",
- Sdk = sdk,
- Arch = arch,
- Configuration = CONFIGURATION,
- });
-
- // copy libSkiaSharp to output
- EnsureDirectoryExists ($"output/native/watchos/{arch}");
- CopyDirectory ($"native-builds/libSkiaSharp_watchos/build/{CONFIGURATION}-{sdk}", $"output/native/watchos/{arch}");
-
- StripSign ($"output/native/watchos/{arch}/libSkiaSharp.framework");
- });
-
- buildArch ("watchsimulator", "i386", "x86");
- buildArch ("watchos", "armv7k", "arm");
- buildArch ("watchos", "arm64_32", "arm64");
-
- // create the fat framework
- CopyDirectory ("output/native/watchos/armv7k/libSkiaSharp.framework/", "output/native/watchos/libSkiaSharp.framework/");
- DeleteFile ("output/native/watchos/libSkiaSharp.framework/libSkiaSharp");
- RunLipo ("output/native/watchos/", "libSkiaSharp.framework/libSkiaSharp", new [] {
- (FilePath) "i386/libSkiaSharp.framework/libSkiaSharp",
- (FilePath) "armv7k/libSkiaSharp.framework/libSkiaSharp",
- (FilePath) "arm64_32/libSkiaSharp.framework/libSkiaSharp"
- });
-
- // HarfBuzzSharp
-
- var buildHarfBuzzArch = new Action ((sdk, arch) => {
- // build libHarfBuzzSharp
- XCodeBuild (new XCodeBuildSettings {
- Project = "native-builds/libHarfBuzzSharp_watchos/libHarfBuzzSharp.xcodeproj",
- Target = "libHarfBuzzSharp",
- Sdk = sdk,
- Arch = arch,
- Configuration = CONFIGURATION,
- });
-
- // copy libHarfBuzzSharp to output
- EnsureDirectoryExists ($"output/native/watchos/{arch}");
- CopyFileToDirectory ($"native-builds/libHarfBuzzSharp_watchos/build/{CONFIGURATION}-{sdk}/libHarfBuzzSharp.a", $"output/native/watchos/{arch}");
-
- StripSign ($"output/native/watchos/{arch}/libHarfBuzzSharp.a");
- });
-
- buildHarfBuzzArch ("watchsimulator", "i386");
- buildHarfBuzzArch ("watchos", "armv7k");
- buildHarfBuzzArch ("watchos", "arm64_32");
-
- // create the fat framework
- RunLipo ("output/native/watchos/", "libHarfBuzzSharp.a", new [] {
- (FilePath) "i386/libHarfBuzzSharp.a",
- (FilePath) "armv7k/libHarfBuzzSharp.a",
- (FilePath) "arm64_32/libHarfBuzzSharp.a"
- });
-});
-
-// this builds the native C and C++ externals for Android
-Task ("externals-android")
- .IsDependentOn ("externals-init")
- .IsDependeeOf (ShouldBuildExternal ("android") ? "externals-native" : "externals-native-skip")
- .WithCriteria (ShouldBuildExternal ("android"))
- .WithCriteria (IsRunningOnMac () || IsRunningOnWindows ())
- .Does (() =>
-{
- var cmd = IsRunningOnWindows () ? ".cmd" : "";
- var ndkbuild = ANDROID_NDK_HOME.CombineWithFilePath ($"ndk-build{cmd}").FullPath;
-
- // SkiaSharp
-
- var buildArch = new Action ((arch, skiaArch) => {
- if (!ShouldBuildArch (arch)) {
- Warning ($"Skipping architecture: {arch}.");
- return;
- }
-
- // generate native skia build files
- GnNinja ($"android/{arch}", "SkiaSharp",
- $"is_official_build=true skia_enable_tools=false " +
- $"target_os='android' target_cpu='{skiaArch}' " +
- $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
- $"skia_use_system_expat=false skia_use_system_freetype2=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
- $"extra_cflags=[ '-DSKIA_C_DLL' ] " +
- $"ndk='{ANDROID_NDK_HOME}' " +
- $"ndk_api={(skiaArch == "x64" || skiaArch == "arm64" ? 21 : 9)}");
-
- var outDir = $"output/native/android/{arch}";
- EnsureDirectoryExists (outDir);
- CopyFileToDirectory (SKIA_PATH.CombineWithFilePath ($"out/android/{arch}/libSkiaSharp.so"), outDir);
- });
-
- buildArch ("x86", "x86");
- buildArch ("x86_64", "x64");
- buildArch ("armeabi-v7a", "arm");
- buildArch ("arm64-v8a", "arm64");
-
- // HarfBuzzSharp
-
- var buildHarfBuzzArch = new Action ((arch) => {
- if (!ShouldBuildArch (arch)) {
- Warning ($"Skipping architecture: {arch}.");
- return;
- }
-
- // build libHarfBuzzSharp
- RunProcess (ndkbuild, new ProcessSettings {
- Arguments = $"APP_ABI={arch}",
- WorkingDirectory = ROOT_PATH.Combine ("native-builds/libHarfBuzzSharp_android").FullPath,
- });
-
- // copy libSkiaSharp to output
- var outDir = $"output/native/android/{arch}";
- EnsureDirectoryExists (outDir);
- CopyFileToDirectory ($"native-builds/libHarfBuzzSharp_android/libs/{arch}/libHarfBuzzSharp.so", outDir);
- });
-
- buildHarfBuzzArch ("x86");
- buildHarfBuzzArch ("x86_64");
- buildHarfBuzzArch ("armeabi-v7a");
- buildHarfBuzzArch ("arm64-v8a");
-});
-
-// this builds the native C and C++ externals for Linux
-Task ("externals-linux")
- .IsDependentOn ("externals-init")
- .IsDependeeOf (ShouldBuildExternal ("linux") ? "externals-native" : "externals-native-skip")
- .WithCriteria (ShouldBuildExternal ("linux"))
- .WithCriteria (IsRunningOnLinux ())
- .Does (() =>
-{
- var SUPPORT_GPU = (EnvironmentVariable ("SUPPORT_GPU") ?? "1") == "1"; // 1 == true, 0 == false
-
- var CC = EnvironmentVariable ("CC");
- var CXX = EnvironmentVariable ("CXX");
- var AR = EnvironmentVariable ("AR");
- var CUSTOM_COMPILERS = "";
- if (!string.IsNullOrEmpty (CC))
- CUSTOM_COMPILERS += $"cc='{CC}' ";
- if (!string.IsNullOrEmpty (CXX))
- CUSTOM_COMPILERS += $"cxx='{CXX}' ";
- if (!string.IsNullOrEmpty (AR))
- CUSTOM_COMPILERS += $"ar='{AR}' ";
-
- // libSkiaSharp
-
- var buildArch = new Action ((arch) => {
- var soname = GetVersion ("libSkiaSharp", "soname");
-
- // generate native skia build files
- GnNinja ($"linux/{arch}", "SkiaSharp",
- $"is_official_build=true skia_enable_tools=false " +
- $"target_os='linux' target_cpu='{arch}' " +
- $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
- $"skia_use_system_expat=false skia_use_system_freetype2=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
- $"skia_enable_gpu={(SUPPORT_GPU ? "true" : "false")} " +
- $"extra_cflags=[ '-DSKIA_C_DLL' ] " +
- $"extra_ldflags=[ '-static-libstdc++', '-static-libgcc', '-Wl,--version-script={ROOT_PATH.CombineWithFilePath("native-builds/libSkiaSharp_linux/libSkiaSharp.map")}' ] " +
- $"{CUSTOM_COMPILERS} " +
- $"linux_soname_version='{soname}'");
-
- // copy libSkiaSharp to output
- var outDir = $"output/native/linux/{arch}";
- var libSkiaSharp = SKIA_PATH.CombineWithFilePath ($"out/linux/{arch}/libSkiaSharp.so.{soname}");
- EnsureDirectoryExists (outDir);
- CopyFileToDirectory (libSkiaSharp, outDir);
- CopyFile (libSkiaSharp, $"{outDir}/libSkiaSharp.so");
- });
-
- buildArch ("x64");
-
- // libHarfBuzzSharp
-
- var buildHarfBuzzArch = new Action ((arch) => {
- // build libHarfBuzzSharp
- // RunProcess ("make", new ProcessSettings {
- // Arguments = "clean",
- // WorkingDirectory = "native-builds/libHarfBuzzSharp_linux",
- // });
- RunProcess ("make", new ProcessSettings {
- Arguments = $"ARCH={arch} SONAME_VERSION={GetVersion ("HarfBuzz", "soname")} LDFLAGS=-static-libstdc++",
- WorkingDirectory = "native-builds/libHarfBuzzSharp_linux",
- });
-
- // copy libHarfBuzzSharp to output
- EnsureDirectoryExists ($"output/native/linux/{arch}");
- var so = $"native-builds/libHarfBuzzSharp_linux/bin/{arch}/libHarfBuzzSharp.so.{GetVersion ("HarfBuzz", "soname")}";
- CopyFileToDirectory (so, $"output/native/linux/{arch}");
- CopyFile (so, $"output/native/linux/{arch}/libHarfBuzzSharp.so");
- });
-
- buildHarfBuzzArch ("x64");
-});
-
-Task ("externals-tizen")
- .IsDependentOn ("externals-init")
- .IsDependeeOf (ShouldBuildExternal ("tizen") ? "externals-native" : "externals-native-skip")
- .WithCriteria (ShouldBuildExternal ("tizen"))
- .Does (() =>
-{
- var bat = IsRunningOnWindows () ? ".bat" : "";
- var tizen = TIZEN_STUDIO_HOME.CombineWithFilePath ($"tools/ide/bin/tizen{bat}").FullPath;
-
- // libSkiaSharp
-
- var buildArch = new Action ((arch, skiaArch) => {
- // generate native skia build files
- GnNinja ($"tizen/{arch}", "skia",
- $"is_official_build=true skia_enable_tools=false " +
- $"target_os='tizen' target_cpu='{skiaArch}' " +
- $"skia_enable_gpu=true " +
- $"skia_use_icu=false " +
- $"skia_use_sfntly=false " +
- $"skia_use_piex=true " +
- $"skia_use_system_expat=false " +
- $"skia_use_system_freetype2=true " +
- $"skia_use_system_libjpeg_turbo=false " +
- $"skia_use_system_libpng=false " +
- $"skia_use_system_libwebp=false " +
- $"skia_use_system_zlib=true " +
- $"extra_cflags=[ '-DSKIA_C_DLL', '-DSK_BUILD_FOR_TIZEN' ] " +
- $"ncli='{TIZEN_STUDIO_HOME}' " +
- $"ncli_version='4.0'");
-
- // build libSkiaSharp
- RunProcess (tizen, new ProcessSettings {
- Arguments = $"build-native -a {skiaArch} -c llvm -C {CONFIGURATION}" ,
- WorkingDirectory = ROOT_PATH.Combine ("native-builds/libSkiaSharp_tizen").FullPath,
- });
-
- // copy libSkiaSharp to output
- var outDir = $"output/native/tizen/{arch}";
- var libSkiaSharp = $"native-builds/libSkiaSharp_tizen/{CONFIGURATION}/libskiasharp.so";
- EnsureDirectoryExists (outDir);
- CopyFile (libSkiaSharp, $"{outDir}/libSkiaSharp.so");
- });
-
- buildArch ("armel", "arm");
- buildArch ("i386", "x86");
-
- // libHarfBuzzSharp
-
- var buildHarfBuzzArch = new Action ((arch, skiaArch) => {
- // build libHarfBuzzSharp
- RunProcess(tizen, new ProcessSettings {
- Arguments = $"build-native -a {skiaArch} -c llvm -C {CONFIGURATION}",
- WorkingDirectory = ROOT_PATH.Combine ("native-builds/libHarfBuzzSharp_tizen").FullPath
- });
-
- // copy libHarfBuzzSharp to output
- var outDir = $"output/native/tizen/{arch}";
- var so = $"native-builds/libHarfBuzzSharp_tizen/{CONFIGURATION}/libharfbuzzsharp.so";
- EnsureDirectoryExists ($"output/native/tizen/{arch}");
- CopyFile (so, $"{outDir}/libHarfBuzzSharp.so");
- });
-
- buildHarfBuzzArch ("armel", "arm");
- buildHarfBuzzArch ("i386", "x86");
-});
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// EXTERNALS DOWNLOAD - download any externals that are needed
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-Task ("externals-download")
- .IsDependentOn ("download-last-successful-build")
- .Does (() =>
-{
- var artifactName = "native-default";
- var artifactFilename = $"{artifactName}.zip";
- var url = string.Format(AZURE_BUILD_URL, AZURE_BUILD_ID, artifactName);
-
- var outputPath = "./output";
- EnsureDirectoryExists (outputPath);
- CleanDirectories (outputPath);
-
- DownloadFile (url, $"{outputPath}/{artifactFilename}");
- Unzip ($"{outputPath}/{artifactFilename}", outputPath);
- MoveDirectory ($"{outputPath}/{artifactName}", $"{outputPath}/native");
-});
-
-Task ("externals-angle-uwp")
- .WithCriteria (!FileExists (ANGLE_PATH.CombineWithFilePath ("uwp/ANGLE.WindowsStore.nuspec")))
- .Does (() =>
-{
- var id = "ANGLE.WindowsStore";
- var version = GetVersion (id, "release");
- var angleUrl = $"https://api.nuget.org/v3-flatcontainer/{id.ToLower ()}/{version}/{id.ToLower ()}.{version}.nupkg";
- var angleRoot = ANGLE_PATH.Combine ("uwp");
- var angleNupkg = angleRoot.CombineWithFilePath ($"angle_{version}.nupkg");
-
- EnsureDirectoryExists (angleRoot);
- CleanDirectory (angleRoot);
-
- DownloadFile (angleUrl, angleNupkg);
- Unzip (angleNupkg, angleRoot);
-});
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-// CLEAN - remove all the build artefacts
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-Task ("clean-externals")
- .Does (() =>
-{
- // skia
- CleanDirectories ("externals/skia/out");
- CleanDirectories ("externals/skia/xcodebuild");
-
- // angle
- CleanDirectories ("externals/angle");
-
- // all
- CleanDirectories ("output/native");
- // ios
- CleanDirectories ("native-builds/libSkiaSharp_ios/build");
- CleanDirectories ("native-builds/libHarfBuzzSharp_ios/build");
- // tvos
- CleanDirectories ("native-builds/libSkiaSharp_tvos/build");
- CleanDirectories ("native-builds/libHarfBuzzSharp_tvos/build");
- // watchos
- CleanDirectories ("native-builds/libSkiaSharp_watchos/build");
- CleanDirectories ("native-builds/libHarfBuzzSharp_watchos/build");
- // osx
- CleanDirectories ("native-builds/libSkiaSharp_osx/build");
- CleanDirectories ("native-builds/libHarfBuzzSharp_osx/build");
-});
diff --git a/cake/UpdateDocs.cake b/cake/UpdateDocs.cake
index 096f56c83e..17dde5ccfe 100644
--- a/cake/UpdateDocs.cake
+++ b/cake/UpdateDocs.cake
@@ -36,7 +36,7 @@ void CopyChangelogs (DirectoryPath diffRoot, string id, string version)
}
Task ("docs-download-build-artifact")
- .IsDependentOn ("download-last-successful-build")
+ .IsDependentOn ("determine-last-successful-build")
.Does (() =>
{
var url = string.Format(AZURE_BUILD_URL, AZURE_BUILD_ID, "nuget");
diff --git a/cake/Utils.cake b/cake/Utils.cake
deleted file mode 100644
index ec749ee4ac..0000000000
--- a/cake/Utils.cake
+++ /dev/null
@@ -1,118 +0,0 @@
-
-internal static class MacPlatformDetector
-{
- internal static readonly Lazy IsMac = new Lazy (IsRunningOnMac);
-
- [DllImport ("libc")]
- static extern int uname (IntPtr buf);
-
- static bool IsRunningOnMac ()
- {
- IntPtr buf = IntPtr.Zero;
- try {
- buf = Marshal.AllocHGlobal (8192);
- // This is a hacktastic way of getting sysname from uname ()
- if (uname (buf) == 0) {
- string os = Marshal.PtrToStringAnsi (buf);
- if (os == "Darwin")
- return true;
- }
- } catch {
- } finally {
- if (buf != IntPtr.Zero)
- Marshal.FreeHGlobal (buf);
- }
- return false;
- }
-}
-
-bool IsRunningOnMac ()
-{
- return System.Environment.OSVersion.Platform == PlatformID.MacOSX || MacPlatformDetector.IsMac.Value;
-}
-
-bool IsRunningOnLinux ()
-{
- return IsRunningOnUnix () && !IsRunningOnMac ();
-}
-
-string GetMSBuildToolPath (string possible)
-{
- if (string.IsNullOrEmpty (possible)) {
- if (IsRunningOnLinux ()) {
- possible = "/usr/bin/msbuild";
- } else if (IsRunningOnMac ()) {
- possible = "/Library/Frameworks/Mono.framework/Versions/Current/Commands/msbuild";
- } else if (IsRunningOnWindows ()) {
- possible = null; // use the default
- }
- }
- return possible;
-}
-
-string GetVersion (string lib, string type = "nuget")
-{
- try {
- var contents = FileReadText ("./VERSIONS.txt");
- var match = Regex.Match(contents, $@"^{lib}\s*{type}\s*(.*)$", RegexOptions.IgnoreCase | RegexOptions.Multiline);
- return match.Groups[1].Value.Trim();
- } catch {
- return "";
- }
-}
-
-bool ShouldBuildExternal (string platform)
-{
- platform = platform?.ToLower() ?? "";
-
- if (SKIP_EXTERNALS.Contains ("all") || SKIP_EXTERNALS.Contains ("true"))
- return false;
-
- switch (platform) {
- case "mac":
- case "macos":
- platform = "osx";
- break;
- case "win":
- platform = "windows";
- break;
- }
-
- if (SKIP_EXTERNALS.Contains (platform))
- return false;
-
- return true;
-}
-
-bool ShouldBuildArch (string arch)
-{
- arch = arch?.ToLower() ?? "";
-
- if (BUILD_ARCH.Length == 0 || BUILD_ARCH.Contains ("all"))
- return true;
-
- switch (arch) {
- case "win32":
- case "i386":
- arch = "x86";
- break;
- case "x86_64":
- arch = "x64";
- break;
- case "armeabi-v7a":
- case "armel":
- case "armv7":
- case "armv7k":
- arch = "arm";
- break;
- case "arm64_32":
- case "arm64-v8a":
- arch = "arm64";
- break;
- }
-
- if (BUILD_ARCH.Contains (arch))
- return true;
-
- return false;
-}
diff --git a/cake/UtilsManaged.cake b/cake/UtilsManaged.cake
index d3be215ca7..9be1564aa8 100644
--- a/cake/UtilsManaged.cake
+++ b/cake/UtilsManaged.cake
@@ -1,51 +1,6 @@
var MSBuildNS = (XNamespace) "http://schemas.microsoft.com/developer/msbuild/2003";
-void RunMSBuild (
- FilePath solution,
- string platform = "Any CPU",
- string platformTarget = null,
- bool restore = true,
- bool restoreOnly = false)
-{
- EnsureDirectoryExists ("./output/nugets/");
-
- MSBuild (solution, c => {
- c.Configuration = CONFIGURATION;
- c.Verbosity = VERBOSITY;
- c.ToolVersion = MSBuildToolVersion.VS2017;
-
- if (restoreOnly) {
- c.Targets.Clear();
- c.Targets.Add("Restore");
- } else {
- c.Restore = restore;
- }
-
- if (!string.IsNullOrEmpty (platformTarget)) {
- platform = null;
- c.PlatformTarget = (PlatformTarget)Enum.Parse(typeof(PlatformTarget), platformTarget);
- } else {
- c.PlatformTarget = PlatformTarget.MSIL;
- c.MSBuildPlatform = MSBuildPlatform.x86;
- }
-
- if (!string.IsNullOrEmpty (platform)) {
- c.Properties ["Platform"] = new [] { "\"" + platform + "\"" };
- }
-
- c.Properties ["RestoreNoCache"] = new [] { "true" };
- c.Properties ["RestorePackagesPath"] = new [] { PACKAGE_CACHE_PATH.FullPath };
- // c.Properties ["RestoreSources"] = NuGetSources;
- var sep = IsRunningOnWindows () ? ";" : "%3B";
- c.ArgumentCustomization = args => args.Append ($"/p:RestoreSources=\"{string.Join (sep, NuGetSources)}\"");
-
- if (!string.IsNullOrEmpty (MSBuildToolPath)) {
- c.ToolPath = MSBuildToolPath;
- }
- });
-}
-
var PackageNuGet = new Action ((nuspecPath, outputPath) =>
{
EnsureDirectoryExists (outputPath);
@@ -57,14 +12,6 @@ var PackageNuGet = new Action ((nuspecPath, outputPath)
});
});
-var RunProcess = new Action ((process, settings) =>
-{
- var result = StartProcess (process, settings);
- if (result != 0) {
- throw new Exception ($"Process '{process}' failed with error: {result}");
- }
-});
-
void RunTests (FilePath testAssembly, bool is32)
{
var dir = testAssembly.GetDirectory ();
diff --git a/cake/externals.cake b/cake/externals.cake
new file mode 100644
index 0000000000..31fbce6623
--- /dev/null
+++ b/cake/externals.cake
@@ -0,0 +1,89 @@
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// EXTERNALS - the native C and C++ libraries
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+var externalsTask = Task("externals-native");
+
+foreach (var cake in GetFiles("native/*/build.cake"))
+{
+ var native = cake.GetDirectory().GetDirectoryName();
+ var should = ShouldBuildExternal(native);
+ var localCake = cake;
+
+ var task = Task($"externals-{native}")
+ .WithCriteria(should)
+ .Does(() => RunCake(localCake, "Default"));
+
+ externalsTask.IsDependentOn(task);
+}
+
+Task("externals-osx")
+ .IsDependentOn("externals-macos");
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// EXTERNALS DOWNLOAD - download any externals that are needed
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+Task("externals-download")
+ .IsDependentOn("determine-last-successful-build")
+ .Does(() =>
+{
+ var artifactName = "native";
+ var artifactFilename = $"{artifactName}.zip";
+ var url = string.Format(AZURE_BUILD_URL, AZURE_BUILD_ID, artifactName);
+
+ var outputPath = "./output";
+ EnsureDirectoryExists(outputPath);
+ CleanDirectories(outputPath);
+
+ DownloadFile(url, $"{outputPath}/{artifactFilename}");
+ Unzip($"{outputPath}/{artifactFilename}", outputPath);
+ MoveDirectory($"{outputPath}/{artifactName}", $"{outputPath}/native");
+});
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// CLEAN - remove all the build artefacts
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+Task("clean-externals")
+ .Does(() =>
+{
+ // skia
+ CleanDirectories("externals/skia/out");
+ CleanDirectories("externals/skia/xcodebuild");
+
+ // angle
+ CleanDirectories("externals/angle");
+
+ // all
+ CleanDirectories("output/native");
+
+ // intermediate
+ CleanDirectories("native/*/*/bin");
+ CleanDirectories("native/*/*/obj");
+ CleanDirectories("native/*/*/libs");
+ CleanDirectories("native/*/tools");
+});
+
+bool ShouldBuildExternal(string platform)
+{
+ platform = platform?.ToLower() ?? "";
+
+ if (SKIP_EXTERNALS.Contains("all") || SKIP_EXTERNALS.Contains("true"))
+ return false;
+
+ switch (platform) {
+ case "mac":
+ case "macos":
+ platform = "osx";
+ break;
+ case "win":
+ platform = "windows";
+ break;
+ }
+
+ if (SKIP_EXTERNALS.Contains(platform))
+ return false;
+
+ return true;
+}
diff --git a/cake/msbuild.cake b/cake/msbuild.cake
new file mode 100644
index 0000000000..daa77857d8
--- /dev/null
+++ b/cake/msbuild.cake
@@ -0,0 +1,47 @@
+DirectoryPath PACKAGE_CACHE_PATH = MakeAbsolute(ROOT_PATH.Combine("externals/package_cache"));
+
+void RunMSBuild(
+ FilePath solution,
+ string platform = "Any CPU",
+ string platformTarget = null,
+ bool restore = true,
+ bool restoreOnly = false)
+{
+ var nugets = MakeAbsolute(ROOT_PATH.Combine("output/nugets"));
+ var nugetSources = new [] { nugets.FullPath, "https://api.nuget.org/v3/index.json" };
+
+ EnsureDirectoryExists(nugets);
+
+ MSBuild(solution, c => {
+ c.Configuration = CONFIGURATION;
+ c.Verbosity = VERBOSITY;
+ c.ToolVersion = MSBuildToolVersion.VS2017;
+
+ c.NoLogo = VERBOSITY == Verbosity.Minimal;
+
+ if (restoreOnly) {
+ c.Targets.Clear();
+ c.Targets.Add("Restore");
+ } else {
+ c.Restore = restore;
+ }
+
+ if (!string.IsNullOrEmpty(platformTarget)) {
+ platform = null;
+ c.PlatformTarget = (PlatformTarget)Enum.Parse(typeof(PlatformTarget), platformTarget);
+ } else {
+ c.PlatformTarget = PlatformTarget.MSIL;
+ c.MSBuildPlatform = MSBuildPlatform.x86;
+ }
+
+ if (!string.IsNullOrEmpty(platform)) {
+ c.Properties ["Platform"] = new [] { $"\"{platform}\"" };
+ }
+
+ c.Properties ["RestoreNoCache"] = new [] { "true" };
+ c.Properties ["RestorePackagesPath"] = new [] { PACKAGE_CACHE_PATH.FullPath };
+ // c.Properties ["RestoreSources"] = nugetSources;
+ var sep = IsRunningOnWindows () ? ";" : "%3B";
+ c.ArgumentCustomization = args => args.Append ($"/p:RestoreSources=\"{string.Join (sep, nugetSources)}\"");
+ });
+}
diff --git a/cake/native-shared.cake b/cake/native-shared.cake
new file mode 100644
index 0000000000..7e6d2c97cd
--- /dev/null
+++ b/cake/native-shared.cake
@@ -0,0 +1,128 @@
+#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("gn", EnvironmentVariable("ADDITIONAL_GN_ARGS"));
+
+var PYTHON_EXE = Argument("python", EnvironmentVariable("PYTHON_EXE") ?? "python");
+
+if (!string.IsNullOrEmpty(PYTHON_EXE) && FileExists(PYTHON_EXE)) {
+ var dir = MakeAbsolute((FilePath)PYTHON_EXE).GetDirectory();
+ var oldPath = EnvironmentVariable("PATH");
+ System.Environment.SetEnvironmentVariable("PATH", dir.FullPath + System.IO.Path.PathSeparator + oldPath);
+}
+
+DirectoryPath DEPOT_PATH = MakeAbsolute(ROOT_PATH.Combine("externals/depot_tools"));
+DirectoryPath SKIA_PATH = MakeAbsolute(ROOT_PATH.Combine("externals/skia"));
+DirectoryPath HARFBUZZ_PATH = MakeAbsolute(ROOT_PATH.Combine("externals/harfbuzz"));
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// TASKS
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+Task("git-sync-deps")
+ .Does(() =>
+{
+ RunProcess(PYTHON_EXE, new ProcessSettings {
+ Arguments = SKIA_PATH.CombineWithFilePath("tools/git-sync-deps").FullPath,
+ WorkingDirectory = SKIA_PATH.FullPath,
+ });
+});
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// HELPERS
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void GnNinja(DirectoryPath outDir, string target, string skiaArgs)
+{
+ var isCore = Context.Environment.Runtime.IsCoreClr;
+
+ var exe = IsRunningOnWindows() ? ".exe" : "";
+ var quote = IsRunningOnWindows() || isCore ? "\"" : "'";
+ var innerQuote = IsRunningOnWindows() || isCore ? "\\\"" : "\"";
+
+ // generate native skia build files
+ RunProcess(SKIA_PATH.CombineWithFilePath($"bin/gn{exe}"), new ProcessSettings {
+ Arguments = $"gen out/{outDir} --args={quote}{skiaArgs.Replace("'", innerQuote)}{quote}",
+ WorkingDirectory = SKIA_PATH.FullPath,
+ });
+
+ // build native skia
+ RunProcess(DEPOT_PATH.CombineWithFilePath($"ninja{exe}"), new ProcessSettings {
+ Arguments = $"{target} -C out/{outDir}",
+ WorkingDirectory = SKIA_PATH.FullPath,
+ });
+}
+
+void StripSign(FilePath target)
+{
+ if (!IsRunningOnMac())
+ throw new InvalidOperationException("lipo is only available on Unix.");
+
+ target = MakeAbsolute(target);
+ var archive = target;
+ if (target.FullPath.EndsWith(".framework")) {
+ archive = $"{target}/{target.GetFilenameWithoutExtension()}";
+ }
+
+ // strip anything we can
+ RunProcess("strip", new ProcessSettings {
+ Arguments = $"-x -S {archive}",
+ });
+
+ // re-sign with empty
+ RunProcess("codesign", new ProcessSettings {
+ Arguments = $"--force --sign - --timestamp=none {target}",
+ });
+}
+
+void RunLipo(DirectoryPath directory, FilePath output, FilePath[] inputs)
+{
+ if (!IsRunningOnMac())
+ throw new InvalidOperationException("lipo is only available on Unix.");
+
+ EnsureDirectoryExists(directory.CombineWithFilePath(output).GetDirectory());
+
+ var inputString = string.Join(" ", inputs.Select(i => string.Format("\"{0}\"", i)));
+ RunProcess("lipo", new ProcessSettings {
+ Arguments = string.Format("-create -output \"{0}\" {1}", output, inputString),
+ WorkingDirectory = directory,
+ });
+}
+
+bool Skip(string arch)
+{
+ arch = arch?.ToLower() ?? "";
+
+ if (BUILD_ARCH.Length == 0 || BUILD_ARCH.Contains("all"))
+ return false;
+
+ switch (arch) {
+ case "win32":
+ case "i386":
+ arch = "x86";
+ break;
+ case "x86_64":
+ arch = "x64";
+ break;
+ case "armeabi-v7a":
+ case "armel":
+ case "armv7":
+ case "armv7k":
+ arch = "arm";
+ break;
+ case "arm64_32":
+ case "arm64-v8a":
+ arch = "arm64";
+ break;
+ }
+
+ if (BUILD_ARCH.Contains(arch))
+ return false;
+
+ Warning($"Skipping architecture: {arch}");
+
+ return true;
+}
diff --git a/cake/shared.cake b/cake/shared.cake
new file mode 100644
index 0000000000..c808400f15
--- /dev/null
+++ b/cake/shared.cake
@@ -0,0 +1,113 @@
+using System.Runtime.InteropServices;
+using System.Text.RegularExpressions;
+
+var TARGET = Argument("t", Argument("target", "Default"));
+var VERBOSITY = Argument("v", Argument("verbosity", Verbosity.Normal));
+var CONFIGURATION = Argument("c", Argument("configuration", "Release"));
+
+var CAKE_ARGUMENTS = (IReadOnlyDictionary)Context.Arguments
+ .GetType()
+ .GetProperty("Arguments")
+ .GetValue(Context.Arguments);
+
+DirectoryPath PROFILE_PATH = EnvironmentVariable("USERPROFILE") ?? EnvironmentVariable("HOME");
+
+void RunCake(FilePath cake, string target = null, Dictionary arguments = null)
+{
+ var args = new Dictionary();
+
+ foreach (var arg in CAKE_ARGUMENTS) {
+ args[arg.Key] = arg.Value;
+ }
+
+ args.Remove("t");
+ args["target"] = target;
+
+ if (arguments != null) {
+ foreach (var arg in arguments) {
+ args[arg.Key] = arg.Value;
+ }
+ }
+
+ CakeExecuteScript(cake, new CakeSettings {
+ WorkingDirectory = cake.GetDirectory(),
+ Arguments = args,
+ });
+}
+
+void RunProcess(FilePath process, string args)
+{
+ var result = StartProcess(process, args);
+ if (result != 0) {
+ throw new Exception($"Process '{process}' failed with error: {result}");
+ }
+}
+
+void RunProcess(FilePath process, string args, out IEnumerable stdout)
+{
+ var settings = new ProcessSettings {
+ RedirectStandardOutput = true,
+ Arguments = args,
+ };
+ var result = StartProcess(process, settings, out stdout);
+ if (result != 0) {
+ throw new Exception($"Process '{process}' failed with error: {result}");
+ }
+}
+
+void RunProcess(FilePath process, ProcessSettings settings)
+{
+ var result = StartProcess(process, settings);
+ if (result != 0) {
+ throw new Exception($"Process '{process}' failed with error: {result}");
+ }
+}
+
+bool IsRunningOnMac()
+{
+ return System.Environment.OSVersion.Platform == PlatformID.MacOSX || MacPlatformDetector.IsMac.Value;
+}
+
+bool IsRunningOnLinux()
+{
+ return IsRunningOnUnix() && !IsRunningOnMac();
+}
+
+string GetVersion(string lib, string type = "nuget")
+{
+ try {
+ var file = ROOT_PATH.CombineWithFilePath("VERSIONS.txt");
+ var contents = System.IO.File.ReadAllText(file.FullPath);
+ var match = Regex.Match(contents, $@"^{lib}\s*{type}\s*(.*)$", RegexOptions.IgnoreCase | RegexOptions.Multiline);
+ return match.Groups[1].Value.Trim();
+ } catch {
+ return "";
+ }
+}
+
+internal static class MacPlatformDetector
+{
+ internal static readonly Lazy IsMac = new Lazy(IsRunningOnMac);
+
+ [DllImport("libc")]
+ static extern int uname(IntPtr buf);
+
+ static bool IsRunningOnMac()
+ {
+ IntPtr buf = IntPtr.Zero;
+ try {
+ buf = Marshal.AllocHGlobal(8192);
+ // This is a hacktastic way of getting sysname from uname()
+ if (uname(buf) == 0) {
+ string os = Marshal.PtrToStringAnsi(buf);
+ if (os == "Darwin")
+ return true;
+ }
+ } catch {
+ } finally {
+ if (buf != IntPtr.Zero)
+ Marshal.FreeHGlobal(buf);
+ }
+ return false;
+ }
+}
diff --git a/cake/xcode.cake b/cake/xcode.cake
new file mode 100644
index 0000000000..8d34c53237
--- /dev/null
+++ b/cake/xcode.cake
@@ -0,0 +1,25 @@
+#addin nuget:?package=Cake.XCode&version=4.2.0
+
+void RunXCodeBuild(FilePath project, string target, string sdk, string arch)
+{
+ var dir = project.GetDirectory();
+
+ if (DirectoryExists(dir.Combine($"bin/{CONFIGURATION}/{arch}"))) {
+ if (DirectoryExists(dir.Combine("build")))
+ DeleteDirectory(dir.Combine("build"), true);
+ MoveDirectory(dir.Combine($"bin/{CONFIGURATION}/{arch}"), dir.Combine("build"));
+ }
+
+ XCodeBuild(new XCodeBuildSettings {
+ Project = project.FullPath,
+ Target = target,
+ Sdk = sdk,
+ Arch = arch,
+ Configuration = CONFIGURATION,
+ });
+
+ if (DirectoryExists(dir.Combine($"bin/{CONFIGURATION}/{arch}")))
+ DeleteDirectory(dir.Combine($"bin/{CONFIGURATION}/{arch}"), true);
+ EnsureDirectoryExists(dir.Combine($"bin/{CONFIGURATION}"));
+ MoveDirectory(dir.Combine("build"), dir.Combine($"bin/{CONFIGURATION}/{arch}"));
+}
diff --git a/native-builds/.gitignore b/native-builds/.gitignore
deleted file mode 100644
index 6040cd9490..0000000000
--- a/native-builds/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-xcuserdata/
-libskia_ios/build/
-libskia_tvos/build/
-libskia_watchos/build/
-libskia_osx/build/
-project.xcworkspace/
diff --git a/native-builds/libHarfBuzzSharp_android/jni/HarfBuzzSharp.mk b/native-builds/libHarfBuzzSharp_android/jni/HarfBuzzSharp.mk
deleted file mode 100644
index 949a8142b0..0000000000
--- a/native-builds/libHarfBuzzSharp_android/jni/HarfBuzzSharp.mk
+++ /dev/null
@@ -1,72 +0,0 @@
-
-include $(CLEAR_VARS)
-
-cmd-strip = $(PRIVATE_STRIP) --strip-all $(call host-path,$1)
-
-LOCAL_MODULE := HarfBuzzSharp
-
-LOCAL_C_INCLUDES := . \
- ../../externals/harfbuzz/src
-
-LOCAL_LDFLAGS := -s -Wl,--gc-sections
-
-LOCAL_CFLAGS := -DHAVE_CONFIG_H -DNDEBUG \
- -fno-rtti -fno-exceptions -fno-threadsafe-statics -fPIC \
- -g -Os -ffunction-sections -fdata-sections
-
-LOCAL_CPPFLAGS := -std=c++11
-
-LOCAL_SRC_FILES := ../../../externals/harfbuzz/src/hb-aat-layout.cc \
- ../../../externals/harfbuzz/src/hb-aat-map.cc \
- ../../../externals/harfbuzz/src/hb-blob.cc \
- ../../../externals/harfbuzz/src/hb-buffer-serialize.cc \
- ../../../externals/harfbuzz/src/hb-buffer.cc \
- ../../../externals/harfbuzz/src/hb-common.cc \
- ../../../externals/harfbuzz/src/hb-face.cc \
- ../../../externals/harfbuzz/src/hb-fallback-shape.cc \
- ../../../externals/harfbuzz/src/hb-font.cc \
- ../../../externals/harfbuzz/src/hb-map.cc \
- ../../../externals/harfbuzz/src/hb-ot-cff1-table.cc \
- ../../../externals/harfbuzz/src/hb-ot-cff2-table.cc \
- ../../../externals/harfbuzz/src/hb-ot-color.cc \
- ../../../externals/harfbuzz/src/hb-ot-face.cc \
- ../../../externals/harfbuzz/src/hb-ot-font.cc \
- ../../../externals/harfbuzz/src/hb-ot-layout.cc \
- ../../../externals/harfbuzz/src/hb-ot-map.cc \
- ../../../externals/harfbuzz/src/hb-ot-math.cc \
- ../../../externals/harfbuzz/src/hb-ot-meta.cc \
- ../../../externals/harfbuzz/src/hb-ot-metrics.cc \
- ../../../externals/harfbuzz/src/hb-ot-name.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-arabic.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-default.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-hangul.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-hebrew.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-indic-table.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-indic.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-khmer.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-myanmar.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-thai.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-use-table.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-use.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-fallback.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape-normalize.cc \
- ../../../externals/harfbuzz/src/hb-ot-shape.cc \
- ../../../externals/harfbuzz/src/hb-ot-tag.cc \
- ../../../externals/harfbuzz/src/hb-ot-var.cc \
- ../../../externals/harfbuzz/src/hb-set.cc \
- ../../../externals/harfbuzz/src/hb-shape-plan.cc \
- ../../../externals/harfbuzz/src/hb-shape.cc \
- ../../../externals/harfbuzz/src/hb-shaper.cc \
- ../../../externals/harfbuzz/src/hb-static.cc \
- ../../../externals/harfbuzz/src/hb-subset-cff-common.cc \
- ../../../externals/harfbuzz/src/hb-subset-cff1.cc \
- ../../../externals/harfbuzz/src/hb-subset-cff2.cc \
- ../../../externals/harfbuzz/src/hb-subset-input.cc \
- ../../../externals/harfbuzz/src/hb-subset-plan.cc \
- ../../../externals/harfbuzz/src/hb-subset.cc \
- ../../../externals/harfbuzz/src/hb-ucd.cc \
- ../../../externals/harfbuzz/src/hb-unicode.cc \
- ../../../externals/harfbuzz/src/hb-warning.cc
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/native-builds/libHarfBuzzSharp_tizen/project_def.prop b/native-builds/libHarfBuzzSharp_tizen/project_def.prop
deleted file mode 100755
index 96f2771c2d..0000000000
--- a/native-builds/libHarfBuzzSharp_tizen/project_def.prop
+++ /dev/null
@@ -1,65 +0,0 @@
-type = sharedLib
-profile = mobile-4.0
-
-APPNAME = HarfBuzzSharp
-
-USER_INC_DIRS = . \
- ../../externals/harfbuzz/src \
- ../../externals/harfbuzz
-
-USER_DEFS = HAVE_CONFIG_H NDEBUG
-
-USER_CPP_DEFS = $(USER_DEFS)
-
-USER_SRCS = ../../externals/harfbuzz/src/hb-aat-layout.cc \
- ../../externals/harfbuzz/src/hb-aat-map.cc \
- ../../externals/harfbuzz/src/hb-blob.cc \
- ../../externals/harfbuzz/src/hb-buffer-serialize.cc \
- ../../externals/harfbuzz/src/hb-buffer.cc \
- ../../externals/harfbuzz/src/hb-common.cc \
- ../../externals/harfbuzz/src/hb-face.cc \
- ../../externals/harfbuzz/src/hb-fallback-shape.cc \
- ../../externals/harfbuzz/src/hb-font.cc \
- ../../externals/harfbuzz/src/hb-map.cc \
- ../../externals/harfbuzz/src/hb-ot-cff1-table.cc \
- ../../externals/harfbuzz/src/hb-ot-cff2-table.cc \
- ../../externals/harfbuzz/src/hb-ot-color.cc \
- ../../externals/harfbuzz/src/hb-ot-face.cc \
- ../../externals/harfbuzz/src/hb-ot-font.cc \
- ../../externals/harfbuzz/src/hb-ot-layout.cc \
- ../../externals/harfbuzz/src/hb-ot-map.cc \
- ../../externals/harfbuzz/src/hb-ot-math.cc \
- ../../externals/harfbuzz/src/hb-ot-meta.cc \
- ../../externals/harfbuzz/src/hb-ot-metrics.cc \
- ../../externals/harfbuzz/src/hb-ot-name.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-arabic.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-default.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-hangul.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-hebrew.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-indic-table.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-indic.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-khmer.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-myanmar.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-thai.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-use-table.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-use.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-fallback.cc \
- ../../externals/harfbuzz/src/hb-ot-shape-normalize.cc \
- ../../externals/harfbuzz/src/hb-ot-shape.cc \
- ../../externals/harfbuzz/src/hb-ot-tag.cc \
- ../../externals/harfbuzz/src/hb-ot-var.cc \
- ../../externals/harfbuzz/src/hb-set.cc \
- ../../externals/harfbuzz/src/hb-shape-plan.cc \
- ../../externals/harfbuzz/src/hb-shape.cc \
- ../../externals/harfbuzz/src/hb-shaper.cc \
- ../../externals/harfbuzz/src/hb-static.cc \
- ../../externals/harfbuzz/src/hb-subset-cff-common.cc \
- ../../externals/harfbuzz/src/hb-subset-cff1.cc \
- ../../externals/harfbuzz/src/hb-subset-cff2.cc \
- ../../externals/harfbuzz/src/hb-subset-input.cc \
- ../../externals/harfbuzz/src/hb-subset-plan.cc \
- ../../externals/harfbuzz/src/hb-subset.cc \
- ../../externals/harfbuzz/src/hb-ucd.cc \
- ../../externals/harfbuzz/src/hb-unicode.cc \
- ../../externals/harfbuzz/src/hb-warning.cc
diff --git a/native-builds/libHarfBuzzSharp_uwp/libHarfBuzzSharp.vcxproj b/native-builds/libHarfBuzzSharp_uwp/libHarfBuzzSharp.vcxproj
deleted file mode 100644
index fcb0d84b11..0000000000
--- a/native-builds/libHarfBuzzSharp_uwp/libHarfBuzzSharp.vcxproj
+++ /dev/null
@@ -1,420 +0,0 @@
-
-
-
-
- Debug
- ARM
-
-
- Debug
- Win32
-
-
- Debug
- x64
-
-
- Release
- ARM
-
-
- Release
- Win32
-
-
- Release
- x64
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {25b54d3d-b0f8-4e7e-8928-ffaf116fcce9}
- DynamicLibrary
- libHarfBuzzSharp
- en-US
- 14.0
- true
- Windows Store
- 10.0.10240.0
- 10.0.10240.0
- 10.0
-
-
-
- DynamicLibrary
- true
- v141
-
-
- DynamicLibrary
- true
- v141
-
-
- DynamicLibrary
- true
- v141
-
-
- DynamicLibrary
- false
- true
- v141
-
-
- DynamicLibrary
- false
- true
- v141
-
-
- DynamicLibrary
- false
- true
- v141
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- false
- false
-
-
- false
- false
-
-
- false
- false
-
-
- false
- false
-
-
- false
- false
-
-
- false
- false
-
-
- $(SolutionDir)\bin\$(Platform)\$(Configuration)\
- $(SolutionDir)\obj\$(Platform)\$(Configuration)\$(ProjectName)\
-
-
-
- NotUsing
- false
-
- HAVE_CONFIG_H;HB_EXTERN=__declspec (dllexport) extern;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINDLL;%(PreprocessorDefinitions)
- $(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
- 4146;4267;4244
-
-
- Console
- false
- false
-
-
-
-
- NotUsing
- false
-
- HAVE_CONFIG_H;HB_EXTERN=__declspec (dllexport) extern;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINDLL;%(PreprocessorDefinitions)
- $(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
- 4146;4267;4244
-
-
- Console
- false
- false
-
-
-
-
- NotUsing
- false
-
- HAVE_CONFIG_H;HB_EXTERN=__declspec (dllexport) extern;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions)
- $(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
- 4146;4267;4244
-
-
- Console
- false
- false
-
-
-
-
- NotUsing
- false
-
- HAVE_CONFIG_H;HB_EXTERN=__declspec (dllexport) extern;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE=1;%(ClCompile.PreprocessorDefinitions)
- $(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
- 4146;4267;4244
-
-
- Console
- false
- false
-
-
-
-
- NotUsing
- false
-
- HAVE_CONFIG_H;HB_EXTERN=__declspec (dllexport) extern;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINDLL;%(PreprocessorDefinitions)
- $(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
- 4146;4267;4244
-
-
- Console
- false
- false
-
-
-
-
- NotUsing
- false
-
- HAVE_CONFIG_H;HB_EXTERN=__declspec (dllexport) extern;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_WINDLL;%(PreprocessorDefinitions)
- $(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
- 4146;4267;4244
-
-
- Console
- false
- false
-
-
-
-
-
-
\ No newline at end of file
diff --git a/native-builds/libHarfBuzzSharp_windows/libHarfBuzzSharp.vcxproj b/native-builds/libHarfBuzzSharp_windows/libHarfBuzzSharp.vcxproj
deleted file mode 100644
index e2d2fc757e..0000000000
--- a/native-builds/libHarfBuzzSharp_windows/libHarfBuzzSharp.vcxproj
+++ /dev/null
@@ -1,362 +0,0 @@
-
-
-
-
- Debug
- Win32
-
-
- Release
- Win32
-
-
- Debug
- x64
-
-
- Release
- x64
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 15.0
- {AFE6308E-9F79-4F9D-85BF-B68E8DEE2F13}
- Win32Proj
- libHarfBuzzSharp
- 8.1
-
-
-
- DynamicLibrary
- true
- v140
- Unicode
-
-
- DynamicLibrary
- false
- v140
- true
- Unicode
-
-
- DynamicLibrary
- true
- v140
- Unicode
-
-
- DynamicLibrary
- false
- v140
- true
- Unicode
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
-
-
- true
-
-
- false
-
-
- false
-
-
- $(SolutionDir)\bin\$(Platform)\$(Configuration)\
- $(SolutionDir)\obj\$(Platform)\$(Configuration)\$(ProjectName)\
-
-
-
-
-
- Level3
- Disabled
- HAVE_CONFIG_H;HB_EXTERN=__declspec (dllexport) extern;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;HARFBUZZ_EXPORTS;%(PreprocessorDefinitions)
- $(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
- 4267;4244
- MultiThreadedDebug
- $(IntDir)
-
-
- Windows
-
-
-
-
-
-
- Level3
- Disabled
- HAVE_CONFIG_H;HB_EXTERN=__declspec (dllexport) extern;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;_DEBUG;_WINDOWS;_USRDLL;HARFBUZZ_EXPORTS;%(PreprocessorDefinitions)
- $(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
- 4267;4244
- MultiThreadedDebug
-
-
- Windows
-
-
-
-
- Level3
-
-
- MaxSpeed
- true
- true
- HAVE_CONFIG_H;HB_EXTERN=__declspec (dllexport) extern;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;HARFBUZZ_EXPORTS;%(PreprocessorDefinitions)
- $(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
- 4267;4244
- MultiThreaded
-
-
- Windows
- true
- true
-
-
-
-
- Level3
-
-
- MaxSpeed
- true
- true
- HAVE_CONFIG_H;HB_EXTERN=__declspec (dllexport) extern;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;NDEBUG;_WINDOWS;_USRDLL;HARFBUZZ_EXPORTS;%(PreprocessorDefinitions)
- $(ProjectDir);$(GeneratedFilesDir);$(IntDir);%(AdditionalIncludeDirectories)
- 4267;4244
- MultiThreaded
-
-
- Windows
- true
- true
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/native-builds/libSkiaSharp_tizen/project_def.prop b/native-builds/libSkiaSharp_tizen/project_def.prop
deleted file mode 100755
index 96ab4fc21c..0000000000
--- a/native-builds/libSkiaSharp_tizen/project_def.prop
+++ /dev/null
@@ -1,50 +0,0 @@
-type = sharedLib
-profile = mobile-4.0
-
-USER_LIB_DIRS = ../../externals/skia/out/tizen/$(BUILD_ARCH)
-
-USER_LIBS = skia
-
-USER_LINK_OPTS = -Wl,--gc-sections
-
-APPNAME = SkiaSharp
-
-USER_INC_DIRS = ../../externals/skia/src/c \
- ../../externals/skia/src/core \
- ../../externals/skia/src/xml \
- ../../externals/skia/include/c \
- ../../externals/skia/include/core \
- ../../externals/skia/include/codec \
- ../../externals/skia/include/effects \
- ../../externals/skia/include/encode \
- ../../externals/skia/include/pathops \
- ../../externals/skia/include/gpu \
- ../../externals/skia/include/config \
- ../../externals/skia/include/xml \
- ../../externals/skia/include/svg \
- ../../externals/skia/include/utils \
- ../../externals/skia/include/ports \
- ../../externals/skia/include/private \
- ../../externals/skia/include/images \
- ../../externals/skia/include/xml \
- ../../externals/skia/include/xamarin
-
-USER_DEFS = SK_INTERNAL SK_GAMMA_APPLY_TO_A8 \
- SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=0 SK_SUPPORT_GPU=1 \
- SK_BUILD_FOR_UNIX SKIA_C_DLL SKIA_IMPLEMENTATION=1 \
- NDEBUG SK_BUILD_FOR_TIZEN
-
-USER_CPP_DEFS = $(USER_DEFS)
-
-USER_C_OPTS = -fPIC -g -fno-exceptions -fstrict-aliasing -Wall -Wextra \
- -Winit-self -Wpointer-arith -Wsign-compare -Wno-unused-parameter \
- -Werror -Os -ffunction-sections -fdata-sections -fno-rtti
-
-USER_CPP_OPTS = $(USER_C_OPTS) -std=c++11 -fno-threadsafe-statics -Wnon-virtual-dtor
-
-USER_SRCS = ../../externals/skia/src/xamarin/sk_xamarin.cpp \
- ../../externals/skia/src/xamarin/SkiaKeeper.c \
- ../../externals/skia/src/xamarin/sk_managedstream.cpp \
- ../../externals/skia/src/xamarin/SkManagedStream.cpp \
- ../../externals/skia/src/xamarin/sk_manageddrawable.cpp \
- ../../externals/skia/src/xamarin/SkManagedDrawable.cpp
diff --git a/native/.gitignore b/native/.gitignore
new file mode 100644
index 0000000000..56b68eaa98
--- /dev/null
+++ b/native/.gitignore
@@ -0,0 +1,2 @@
+xcuserdata/
+project.xcworkspace/
diff --git a/native/android/build.cake b/native/android/build.cake
new file mode 100644
index 0000000000..40df7d35e5
--- /dev/null
+++ b/native/android/build.cake
@@ -0,0 +1,68 @@
+DirectoryPath ROOT_PATH = MakeAbsolute(Directory("../.."));
+DirectoryPath OUTPUT_PATH = MakeAbsolute(ROOT_PATH.Combine("output/native/android"));
+
+#load "../../cake/native-shared.cake"
+
+DirectoryPath ANDROID_NDK_HOME = Argument("ndk", EnvironmentVariable("ANDROID_NDK_HOME") ?? EnvironmentVariable("ANDROID_NDK_ROOT") ?? PROFILE_PATH.Combine("android-ndk").FullPath);
+
+Task("libSkiaSharp")
+ .IsDependentOn("git-sync-deps")
+ .WithCriteria(IsRunningOnMac() || IsRunningOnWindows())
+ .Does(() =>
+{
+ Build("x86", "x86");
+ Build("x86_64", "x64");
+ Build("armeabi-v7a", "arm");
+ Build("arm64-v8a", "arm64");
+
+ void Build(string arch, string skiaArch)
+ {
+ if (Skip(arch)) return;
+
+ GnNinja($"android/{arch}", "SkiaSharp",
+ $"is_official_build=true skia_enable_tools=false " +
+ $"target_os='android' target_cpu='{skiaArch}' " +
+ $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
+ $"skia_use_system_expat=false skia_use_system_freetype2=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
+ $"extra_cflags=[ '-DSKIA_C_DLL' ] " +
+ $"ndk='{ANDROID_NDK_HOME}' " +
+ $"ndk_api={(skiaArch == "x64" || skiaArch == "arm64" ? 21 : 9)}");
+
+ var outDir = OUTPUT_PATH.Combine(arch);
+ EnsureDirectoryExists(outDir);
+ CopyFileToDirectory(SKIA_PATH.CombineWithFilePath($"out/android/{arch}/libSkiaSharp.so"), outDir);
+ }
+});
+
+Task("libHarfBuzzSharp")
+ .WithCriteria(IsRunningOnMac() || IsRunningOnWindows())
+ .Does(() =>
+{
+ var cmd = IsRunningOnWindows() ? ".cmd" : "";
+ var ndkbuild = ANDROID_NDK_HOME.CombineWithFilePath($"ndk-build{cmd}").FullPath;
+
+ Build("x86");
+ Build("x86_64");
+ Build("armeabi-v7a");
+ Build("arm64-v8a");
+
+ void Build(string arch)
+ {
+ if (Skip(arch)) return;
+
+ RunProcess(ndkbuild, new ProcessSettings {
+ Arguments = $"APP_ABI={arch}",
+ WorkingDirectory = "libHarfBuzzSharp",
+ });
+
+ var outDir = OUTPUT_PATH.Combine(arch);
+ EnsureDirectoryExists(outDir);
+ CopyFileToDirectory($"libHarfBuzzSharp/libs/{arch}/libHarfBuzzSharp.so", outDir);
+ }
+});
+
+Task("Default")
+ .IsDependentOn("libSkiaSharp")
+ .IsDependentOn("libHarfBuzzSharp");
+
+RunTarget(TARGET);
diff --git a/native-builds/libHarfBuzzSharp_android/.gitignore b/native/android/libHarfBuzzSharp/.gitignore
similarity index 100%
rename from native-builds/libHarfBuzzSharp_android/.gitignore
rename to native/android/libHarfBuzzSharp/.gitignore
diff --git a/native-builds/libHarfBuzzSharp_android/config.h b/native/android/libHarfBuzzSharp/config.h
similarity index 100%
rename from native-builds/libHarfBuzzSharp_android/config.h
rename to native/android/libHarfBuzzSharp/config.h
diff --git a/native-builds/libHarfBuzzSharp_android/jni/Android.mk b/native/android/libHarfBuzzSharp/jni/Android.mk
similarity index 100%
rename from native-builds/libHarfBuzzSharp_android/jni/Android.mk
rename to native/android/libHarfBuzzSharp/jni/Android.mk
diff --git a/native-builds/libHarfBuzzSharp_android/jni/Application.mk b/native/android/libHarfBuzzSharp/jni/Application.mk
similarity index 100%
rename from native-builds/libHarfBuzzSharp_android/jni/Application.mk
rename to native/android/libHarfBuzzSharp/jni/Application.mk
diff --git a/native/android/libHarfBuzzSharp/jni/HarfBuzzSharp.mk b/native/android/libHarfBuzzSharp/jni/HarfBuzzSharp.mk
new file mode 100644
index 0000000000..501f9bbaae
--- /dev/null
+++ b/native/android/libHarfBuzzSharp/jni/HarfBuzzSharp.mk
@@ -0,0 +1,73 @@
+
+include $(CLEAR_VARS)
+
+cmd-strip = $(PRIVATE_STRIP) --strip-all $(call host-path,$1)
+
+src_root = ../../../../externals/harfbuzz/src
+
+LOCAL_MODULE := HarfBuzzSharp
+
+LOCAL_C_INCLUDES := . $(src_root)
+
+LOCAL_LDFLAGS := -s -Wl,--gc-sections
+
+LOCAL_CFLAGS := -DHAVE_CONFIG_H -DNDEBUG \
+ -fno-rtti -fno-exceptions -fno-threadsafe-statics -fPIC \
+ -g -Os -ffunction-sections -fdata-sections
+
+LOCAL_CPPFLAGS := -std=c++11
+
+LOCAL_SRC_FILES := $(src_root)/hb-aat-layout.cc \
+ $(src_root)/hb-aat-map.cc \
+ $(src_root)/hb-blob.cc \
+ $(src_root)/hb-buffer-serialize.cc \
+ $(src_root)/hb-buffer.cc \
+ $(src_root)/hb-common.cc \
+ $(src_root)/hb-face.cc \
+ $(src_root)/hb-fallback-shape.cc \
+ $(src_root)/hb-font.cc \
+ $(src_root)/hb-map.cc \
+ $(src_root)/hb-ot-cff1-table.cc \
+ $(src_root)/hb-ot-cff2-table.cc \
+ $(src_root)/hb-ot-color.cc \
+ $(src_root)/hb-ot-face.cc \
+ $(src_root)/hb-ot-font.cc \
+ $(src_root)/hb-ot-layout.cc \
+ $(src_root)/hb-ot-map.cc \
+ $(src_root)/hb-ot-math.cc \
+ $(src_root)/hb-ot-meta.cc \
+ $(src_root)/hb-ot-metrics.cc \
+ $(src_root)/hb-ot-name.cc \
+ $(src_root)/hb-ot-shape-complex-arabic.cc \
+ $(src_root)/hb-ot-shape-complex-default.cc \
+ $(src_root)/hb-ot-shape-complex-hangul.cc \
+ $(src_root)/hb-ot-shape-complex-hebrew.cc \
+ $(src_root)/hb-ot-shape-complex-indic-table.cc \
+ $(src_root)/hb-ot-shape-complex-indic.cc \
+ $(src_root)/hb-ot-shape-complex-khmer.cc \
+ $(src_root)/hb-ot-shape-complex-myanmar.cc \
+ $(src_root)/hb-ot-shape-complex-thai.cc \
+ $(src_root)/hb-ot-shape-complex-use-table.cc \
+ $(src_root)/hb-ot-shape-complex-use.cc \
+ $(src_root)/hb-ot-shape-complex-vowel-constraints.cc \
+ $(src_root)/hb-ot-shape-fallback.cc \
+ $(src_root)/hb-ot-shape-normalize.cc \
+ $(src_root)/hb-ot-shape.cc \
+ $(src_root)/hb-ot-tag.cc \
+ $(src_root)/hb-ot-var.cc \
+ $(src_root)/hb-set.cc \
+ $(src_root)/hb-shape-plan.cc \
+ $(src_root)/hb-shape.cc \
+ $(src_root)/hb-shaper.cc \
+ $(src_root)/hb-static.cc \
+ $(src_root)/hb-subset-cff-common.cc \
+ $(src_root)/hb-subset-cff1.cc \
+ $(src_root)/hb-subset-cff2.cc \
+ $(src_root)/hb-subset-input.cc \
+ $(src_root)/hb-subset-plan.cc \
+ $(src_root)/hb-subset.cc \
+ $(src_root)/hb-ucd.cc \
+ $(src_root)/hb-unicode.cc \
+ $(src_root)/hb-warning.cc
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/native/ios/build.cake b/native/ios/build.cake
new file mode 100644
index 0000000000..35c1b96a2f
--- /dev/null
+++ b/native/ios/build.cake
@@ -0,0 +1,82 @@
+DirectoryPath ROOT_PATH = MakeAbsolute(Directory("../.."));
+DirectoryPath OUTPUT_PATH = MakeAbsolute(ROOT_PATH.Combine("output/native/ios"));
+
+#load "../../cake/native-shared.cake"
+#load "../../cake/xcode.cake"
+
+Task("libSkiaSharp")
+ .IsDependentOn("git-sync-deps")
+ .WithCriteria(IsRunningOnMac())
+ .Does(() =>
+{
+ Build("iphonesimulator", "i386", "x86");
+ Build("iphonesimulator", "x86_64", "x64");
+ Build("iphoneos", "armv7", "arm");
+ Build("iphoneos", "arm64", "arm64");
+
+ CopyDirectory(OUTPUT_PATH.Combine("armv7/libSkiaSharp.framework"), OUTPUT_PATH.Combine("libSkiaSharp.framework"));
+ DeleteFile(OUTPUT_PATH.CombineWithFilePath("libSkiaSharp.framework/libSkiaSharp"));
+ RunLipo(OUTPUT_PATH, "libSkiaSharp.framework/libSkiaSharp", new [] {
+ (FilePath) "i386/libSkiaSharp.framework/libSkiaSharp",
+ (FilePath) "x86_64/libSkiaSharp.framework/libSkiaSharp",
+ (FilePath) "armv7/libSkiaSharp.framework/libSkiaSharp",
+ (FilePath) "arm64/libSkiaSharp.framework/libSkiaSharp"
+ });
+
+ void Build(string sdk, string arch, string skiaArch)
+ {
+ if (Skip(arch)) return;
+
+ GnNinja($"ios/{arch}", "skia",
+ $"is_official_build=true skia_enable_tools=false " +
+ $"target_os='ios' target_cpu='{skiaArch}' " +
+ $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
+ $"skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
+ $"extra_cflags=[ '-DSKIA_C_DLL', '-mios-version-min=8.0' ] " +
+ $"extra_ldflags=[ '-Wl,ios_version_min=8.0' ]");
+
+ RunXCodeBuild("libSkiaSharp/libSkiaSharp.xcodeproj", "libSkiaSharp", sdk, arch);
+
+ var outDir = OUTPUT_PATH.Combine(arch);
+ EnsureDirectoryExists(outDir);
+ CopyDirectory($"libSkiaSharp/bin/{CONFIGURATION}/{arch}/{CONFIGURATION}-{sdk}", outDir);
+
+ StripSign(outDir.CombineWithFilePath("libSkiaSharp.framework"));
+ }
+});
+
+Task("libHarfBuzzSharp")
+ .WithCriteria(IsRunningOnMac())
+ .Does(() =>
+{
+ Build("iphonesimulator", "i386");
+ Build("iphonesimulator", "x86_64");
+ Build("iphoneos", "armv7");
+ Build("iphoneos", "arm64");
+
+ RunLipo(OUTPUT_PATH, "libHarfBuzzSharp.a", new [] {
+ (FilePath) "i386/libHarfBuzzSharp.a",
+ (FilePath) "x86_64/libHarfBuzzSharp.a",
+ (FilePath) "armv7/libHarfBuzzSharp.a",
+ (FilePath) "arm64/libHarfBuzzSharp.a"
+ });
+
+ void Build(string sdk, string arch)
+ {
+ if (Skip(arch)) return;
+
+ RunXCodeBuild("libHarfBuzzSharp/libHarfBuzzSharp.xcodeproj", "libHarfBuzzSharp", sdk, arch);
+
+ var outDir = OUTPUT_PATH.Combine(arch);
+ EnsureDirectoryExists(outDir);
+ CopyDirectory($"libHarfBuzzSharp/bin/{CONFIGURATION}/{arch}/{CONFIGURATION}-{sdk}", outDir);
+
+ StripSign(outDir.CombineWithFilePath("libHarfBuzzSharp.a"));
+ }
+});
+
+Task("Default")
+ .IsDependentOn("libSkiaSharp")
+ .IsDependentOn("libHarfBuzzSharp");
+
+RunTarget(TARGET);
diff --git a/native-builds/libHarfBuzzSharp_ios/config.h b/native/ios/libHarfBuzzSharp/config.h
similarity index 100%
rename from native-builds/libHarfBuzzSharp_ios/config.h
rename to native/ios/libHarfBuzzSharp/config.h
diff --git a/native-builds/libHarfBuzzSharp_ios/libHarfBuzzSharp.xcodeproj/project.pbxproj b/native/ios/libHarfBuzzSharp/libHarfBuzzSharp.xcodeproj/project.pbxproj
similarity index 84%
rename from native-builds/libHarfBuzzSharp_ios/libHarfBuzzSharp.xcodeproj/project.pbxproj
rename to native/ios/libHarfBuzzSharp/libHarfBuzzSharp.xcodeproj/project.pbxproj
index 3d0896f44b..e985af47a3 100644
--- a/native-builds/libHarfBuzzSharp_ios/libHarfBuzzSharp.xcodeproj/project.pbxproj
+++ b/native/ios/libHarfBuzzSharp/libHarfBuzzSharp.xcodeproj/project.pbxproj
@@ -74,64 +74,64 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 34B817BB22BD8F6F00508F73 /* hb-subset-cff2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset-cff2.cc"; path = "../../externals/harfbuzz/src/hb-subset-cff2.cc"; sourceTree = ""; };
- 34B817BC22BD8F6F00508F73 /* hb-subset-cff-common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset-cff-common.cc"; path = "../../externals/harfbuzz/src/hb-subset-cff-common.cc"; sourceTree = ""; };
- 34B817BD22BD8F6F00508F73 /* hb-subset-plan.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset-plan.cc"; path = "../../externals/harfbuzz/src/hb-subset-plan.cc"; sourceTree = ""; };
- 34B817BE22BD8F6F00508F73 /* hb-ucd.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ucd.cc"; path = "../../externals/harfbuzz/src/hb-ucd.cc"; sourceTree = ""; };
- 34B817BF22BD8F6F00508F73 /* hb-subset.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset.cc"; path = "../../externals/harfbuzz/src/hb-subset.cc"; sourceTree = ""; };
- 34B817C022BD8F6F00508F73 /* hb-subset-input.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset-input.cc"; path = "../../externals/harfbuzz/src/hb-subset-input.cc"; sourceTree = ""; };
- 34B817C122BD8F6F00508F73 /* hb-subset-cff1.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset-cff1.cc"; path = "../../externals/harfbuzz/src/hb-subset-cff1.cc"; sourceTree = ""; };
+ 34B817BB22BD8F6F00508F73 /* hb-subset-cff2.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset-cff2.cc"; path = "../../../externals/harfbuzz/src/hb-subset-cff2.cc"; sourceTree = ""; };
+ 34B817BC22BD8F6F00508F73 /* hb-subset-cff-common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset-cff-common.cc"; path = "../../../externals/harfbuzz/src/hb-subset-cff-common.cc"; sourceTree = ""; };
+ 34B817BD22BD8F6F00508F73 /* hb-subset-plan.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset-plan.cc"; path = "../../../externals/harfbuzz/src/hb-subset-plan.cc"; sourceTree = ""; };
+ 34B817BE22BD8F6F00508F73 /* hb-ucd.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ucd.cc"; path = "../../../externals/harfbuzz/src/hb-ucd.cc"; sourceTree = ""; };
+ 34B817BF22BD8F6F00508F73 /* hb-subset.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset.cc"; path = "../../../externals/harfbuzz/src/hb-subset.cc"; sourceTree = ""; };
+ 34B817C022BD8F6F00508F73 /* hb-subset-input.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset-input.cc"; path = "../../../externals/harfbuzz/src/hb-subset-input.cc"; sourceTree = ""; };
+ 34B817C122BD8F6F00508F73 /* hb-subset-cff1.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-subset-cff1.cc"; path = "../../../externals/harfbuzz/src/hb-subset-cff1.cc"; sourceTree = ""; };
34C92F8D21FA593F002D729C /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = SOURCE_ROOT; };
- 34C9307121FA5A76002D729C /* hb-shape-plan.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-shape-plan.cc"; path = "../../externals/harfbuzz/src/hb-shape-plan.cc"; sourceTree = ""; };
- 34C9307321FA5A76002D729C /* hb-ot-shape-complex-indic-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-indic-table.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-indic-table.cc"; sourceTree = ""; };
- 34C9307421FA5A76002D729C /* hb-ot-shape-complex-myanmar.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-myanmar.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-myanmar.cc"; sourceTree = ""; };
- 34C9307521FA5A76002D729C /* hb-ot-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-map.cc"; path = "../../externals/harfbuzz/src/hb-ot-map.cc"; sourceTree = ""; };
- 34C9307621FA5A76002D729C /* hb-buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-buffer.cc"; path = "../../externals/harfbuzz/src/hb-buffer.cc"; sourceTree = ""; };
- 34C9307721FA5A76002D729C /* hb-aat-layout.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-aat-layout.cc"; path = "../../externals/harfbuzz/src/hb-aat-layout.cc"; sourceTree = ""; };
- 34C9307821FA5A76002D729C /* hb-ot-color.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-color.cc"; path = "../../externals/harfbuzz/src/hb-ot-color.cc"; sourceTree = ""; };
- 34C9307921FA5A76002D729C /* hb-common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-common.cc"; path = "../../externals/harfbuzz/src/hb-common.cc"; sourceTree = ""; };
- 34C9307A21FA5A76002D729C /* hb-ot-font.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-font.cc"; path = "../../externals/harfbuzz/src/hb-ot-font.cc"; sourceTree = ""; };
- 34C9307B21FA5A76002D729C /* hb-ot-shape-complex-hebrew.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-hebrew.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-hebrew.cc"; sourceTree = ""; };
- 34C9307C21FA5A76002D729C /* hb-ot-cff1-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-cff1-table.cc"; path = "../../externals/harfbuzz/src/hb-ot-cff1-table.cc"; sourceTree = ""; };
- 34C9307D21FA5A76002D729C /* hb-ot-cff2-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-cff2-table.cc"; path = "../../externals/harfbuzz/src/hb-ot-cff2-table.cc"; sourceTree = ""; };
- 34C9307E21FA5A76002D729C /* hb-aat-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-aat-map.cc"; path = "../../externals/harfbuzz/src/hb-aat-map.cc"; sourceTree = ""; };
- 34C9307F21FA5A76002D729C /* hb-ot-shape-complex-khmer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-khmer.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-khmer.cc"; sourceTree = ""; };
- 34C9308021FA5A76002D729C /* hb-ot-shape-complex-default.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-default.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-default.cc"; sourceTree = ""; };
- 34C9308121FA5A76002D729C /* hb-ot-shape-complex-use.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-use.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-use.cc"; sourceTree = ""; };
- 34C9308221FA5A76002D729C /* hb-shaper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-shaper.cc"; path = "../../externals/harfbuzz/src/hb-shaper.cc"; sourceTree = ""; };
- 34C9308321FA5A76002D729C /* hb-buffer-serialize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-buffer-serialize.cc"; path = "../../externals/harfbuzz/src/hb-buffer-serialize.cc"; sourceTree = ""; };
- 34C9308421FA5A76002D729C /* hb-ot-shape-fallback.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-fallback.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-fallback.cc"; sourceTree = ""; };
- 34C9308521FA5A76002D729C /* hb-blob.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-blob.cc"; path = "../../externals/harfbuzz/src/hb-blob.cc"; sourceTree = ""; };
- 34C9308621FA5A76002D729C /* hb-ot-layout.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-layout.cc"; path = "../../externals/harfbuzz/src/hb-ot-layout.cc"; sourceTree = ""; };
- 34C9308721FA5A76002D729C /* hb-ot-face.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-face.cc"; path = "../../externals/harfbuzz/src/hb-ot-face.cc"; sourceTree = ""; };
- 34C9308821FA5A76002D729C /* hb-ot-shape-complex-indic.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-indic.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-indic.cc"; sourceTree = ""; };
- 34C9308921FA5A76002D729C /* hb-ot-shape-complex-thai.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-thai.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-thai.cc"; sourceTree = ""; };
- 34C9308A21FA5A76002D729C /* hb-ot-shape-normalize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-normalize.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-normalize.cc"; sourceTree = ""; };
- 34C9308B21FA5A76002D729C /* hb-ot-shape-complex-vowel-constraints.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-vowel-constraints.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc"; sourceTree = ""; };
- 34C9308C21FA5A76002D729C /* hb-ot-shape-complex-arabic.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-arabic.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-arabic.cc"; sourceTree = ""; };
- 34C9308D21FA5A76002D729C /* hb-static.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-static.cc"; path = "../../externals/harfbuzz/src/hb-static.cc"; sourceTree = ""; };
- 34C9308E21FA5A76002D729C /* hb-unicode.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-unicode.cc"; path = "../../externals/harfbuzz/src/hb-unicode.cc"; sourceTree = ""; };
- 34C9308F21FA5A77002D729C /* hb-ot-name.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-name.cc"; path = "../../externals/harfbuzz/src/hb-ot-name.cc"; sourceTree = ""; };
- 34C9309021FA5A77002D729C /* hb-ot-shape.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape.cc"; sourceTree = ""; };
- 34C9309121FA5A77002D729C /* hb-ot-shape-complex-hangul.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-hangul.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-hangul.cc"; sourceTree = ""; };
- 34C9309221FA5A77002D729C /* hb-face.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-face.cc"; path = "../../externals/harfbuzz/src/hb-face.cc"; sourceTree = ""; };
- 34C9309321FA5A77002D729C /* hb-ot-math.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-math.cc"; path = "../../externals/harfbuzz/src/hb-ot-math.cc"; sourceTree = ""; };
- 34C9309421FA5A77002D729C /* hb-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-map.cc"; path = "../../externals/harfbuzz/src/hb-map.cc"; sourceTree = ""; };
- 34C9309521FA5A77002D729C /* hb-font.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-font.cc"; path = "../../externals/harfbuzz/src/hb-font.cc"; sourceTree = ""; };
- 34C9309621FA5A77002D729C /* hb-set.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-set.cc"; path = "../../externals/harfbuzz/src/hb-set.cc"; sourceTree = ""; };
- 34C9309821FA5A77002D729C /* hb-ot-shape-complex-use-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-use-table.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-use-table.cc"; sourceTree = ""; };
- 34C9309921FA5A77002D729C /* hb-ot-tag.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-tag.cc"; path = "../../externals/harfbuzz/src/hb-ot-tag.cc"; sourceTree = ""; };
- 34C9309A21FA5A77002D729C /* hb-shape.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-shape.cc"; path = "../../externals/harfbuzz/src/hb-shape.cc"; sourceTree = ""; };
- 34C9309B21FA5A77002D729C /* hb-warning.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-warning.cc"; path = "../../externals/harfbuzz/src/hb-warning.cc"; sourceTree = ""; };
- 34C9309C21FA5A77002D729C /* hb-fallback-shape.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-fallback-shape.cc"; path = "../../externals/harfbuzz/src/hb-fallback-shape.cc"; sourceTree = ""; };
- 34C9309D21FA5A77002D729C /* hb-ot-var.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-var.cc"; path = "../../externals/harfbuzz/src/hb-ot-var.cc"; sourceTree = ""; };
+ 34C9307121FA5A76002D729C /* hb-shape-plan.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-shape-plan.cc"; path = "../../../externals/harfbuzz/src/hb-shape-plan.cc"; sourceTree = ""; };
+ 34C9307321FA5A76002D729C /* hb-ot-shape-complex-indic-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-indic-table.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-indic-table.cc"; sourceTree = ""; };
+ 34C9307421FA5A76002D729C /* hb-ot-shape-complex-myanmar.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-myanmar.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-myanmar.cc"; sourceTree = ""; };
+ 34C9307521FA5A76002D729C /* hb-ot-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-map.cc"; path = "../../../externals/harfbuzz/src/hb-ot-map.cc"; sourceTree = ""; };
+ 34C9307621FA5A76002D729C /* hb-buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-buffer.cc"; path = "../../../externals/harfbuzz/src/hb-buffer.cc"; sourceTree = ""; };
+ 34C9307721FA5A76002D729C /* hb-aat-layout.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-aat-layout.cc"; path = "../../../externals/harfbuzz/src/hb-aat-layout.cc"; sourceTree = ""; };
+ 34C9307821FA5A76002D729C /* hb-ot-color.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-color.cc"; path = "../../../externals/harfbuzz/src/hb-ot-color.cc"; sourceTree = ""; };
+ 34C9307921FA5A76002D729C /* hb-common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-common.cc"; path = "../../../externals/harfbuzz/src/hb-common.cc"; sourceTree = ""; };
+ 34C9307A21FA5A76002D729C /* hb-ot-font.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-font.cc"; path = "../../../externals/harfbuzz/src/hb-ot-font.cc"; sourceTree = ""; };
+ 34C9307B21FA5A76002D729C /* hb-ot-shape-complex-hebrew.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-hebrew.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-hebrew.cc"; sourceTree = ""; };
+ 34C9307C21FA5A76002D729C /* hb-ot-cff1-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-cff1-table.cc"; path = "../../../externals/harfbuzz/src/hb-ot-cff1-table.cc"; sourceTree = ""; };
+ 34C9307D21FA5A76002D729C /* hb-ot-cff2-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-cff2-table.cc"; path = "../../../externals/harfbuzz/src/hb-ot-cff2-table.cc"; sourceTree = ""; };
+ 34C9307E21FA5A76002D729C /* hb-aat-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-aat-map.cc"; path = "../../../externals/harfbuzz/src/hb-aat-map.cc"; sourceTree = ""; };
+ 34C9307F21FA5A76002D729C /* hb-ot-shape-complex-khmer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-khmer.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-khmer.cc"; sourceTree = ""; };
+ 34C9308021FA5A76002D729C /* hb-ot-shape-complex-default.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-default.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-default.cc"; sourceTree = ""; };
+ 34C9308121FA5A76002D729C /* hb-ot-shape-complex-use.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-use.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-use.cc"; sourceTree = ""; };
+ 34C9308221FA5A76002D729C /* hb-shaper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-shaper.cc"; path = "../../../externals/harfbuzz/src/hb-shaper.cc"; sourceTree = ""; };
+ 34C9308321FA5A76002D729C /* hb-buffer-serialize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-buffer-serialize.cc"; path = "../../../externals/harfbuzz/src/hb-buffer-serialize.cc"; sourceTree = ""; };
+ 34C9308421FA5A76002D729C /* hb-ot-shape-fallback.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-fallback.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-fallback.cc"; sourceTree = ""; };
+ 34C9308521FA5A76002D729C /* hb-blob.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-blob.cc"; path = "../../../externals/harfbuzz/src/hb-blob.cc"; sourceTree = ""; };
+ 34C9308621FA5A76002D729C /* hb-ot-layout.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-layout.cc"; path = "../../../externals/harfbuzz/src/hb-ot-layout.cc"; sourceTree = ""; };
+ 34C9308721FA5A76002D729C /* hb-ot-face.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-face.cc"; path = "../../../externals/harfbuzz/src/hb-ot-face.cc"; sourceTree = ""; };
+ 34C9308821FA5A76002D729C /* hb-ot-shape-complex-indic.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-indic.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-indic.cc"; sourceTree = ""; };
+ 34C9308921FA5A76002D729C /* hb-ot-shape-complex-thai.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-thai.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-thai.cc"; sourceTree = ""; };
+ 34C9308A21FA5A76002D729C /* hb-ot-shape-normalize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-normalize.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-normalize.cc"; sourceTree = ""; };
+ 34C9308B21FA5A76002D729C /* hb-ot-shape-complex-vowel-constraints.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-vowel-constraints.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc"; sourceTree = ""; };
+ 34C9308C21FA5A76002D729C /* hb-ot-shape-complex-arabic.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-arabic.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-arabic.cc"; sourceTree = ""; };
+ 34C9308D21FA5A76002D729C /* hb-static.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-static.cc"; path = "../../../externals/harfbuzz/src/hb-static.cc"; sourceTree = ""; };
+ 34C9308E21FA5A76002D729C /* hb-unicode.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-unicode.cc"; path = "../../../externals/harfbuzz/src/hb-unicode.cc"; sourceTree = ""; };
+ 34C9308F21FA5A77002D729C /* hb-ot-name.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-name.cc"; path = "../../../externals/harfbuzz/src/hb-ot-name.cc"; sourceTree = ""; };
+ 34C9309021FA5A77002D729C /* hb-ot-shape.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape.cc"; sourceTree = ""; };
+ 34C9309121FA5A77002D729C /* hb-ot-shape-complex-hangul.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-hangul.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-hangul.cc"; sourceTree = ""; };
+ 34C9309221FA5A77002D729C /* hb-face.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-face.cc"; path = "../../../externals/harfbuzz/src/hb-face.cc"; sourceTree = ""; };
+ 34C9309321FA5A77002D729C /* hb-ot-math.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-math.cc"; path = "../../../externals/harfbuzz/src/hb-ot-math.cc"; sourceTree = ""; };
+ 34C9309421FA5A77002D729C /* hb-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-map.cc"; path = "../../../externals/harfbuzz/src/hb-map.cc"; sourceTree = ""; };
+ 34C9309521FA5A77002D729C /* hb-font.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-font.cc"; path = "../../../externals/harfbuzz/src/hb-font.cc"; sourceTree = ""; };
+ 34C9309621FA5A77002D729C /* hb-set.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-set.cc"; path = "../../../externals/harfbuzz/src/hb-set.cc"; sourceTree = ""; };
+ 34C9309821FA5A77002D729C /* hb-ot-shape-complex-use-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-use-table.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-use-table.cc"; sourceTree = ""; };
+ 34C9309921FA5A77002D729C /* hb-ot-tag.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-tag.cc"; path = "../../../externals/harfbuzz/src/hb-ot-tag.cc"; sourceTree = ""; };
+ 34C9309A21FA5A77002D729C /* hb-shape.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-shape.cc"; path = "../../../externals/harfbuzz/src/hb-shape.cc"; sourceTree = ""; };
+ 34C9309B21FA5A77002D729C /* hb-warning.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-warning.cc"; path = "../../../externals/harfbuzz/src/hb-warning.cc"; sourceTree = ""; };
+ 34C9309C21FA5A77002D729C /* hb-fallback-shape.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-fallback-shape.cc"; path = "../../../externals/harfbuzz/src/hb-fallback-shape.cc"; sourceTree = ""; };
+ 34C9309D21FA5A77002D729C /* hb-ot-var.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-var.cc"; path = "../../../externals/harfbuzz/src/hb-ot-var.cc"; sourceTree = ""; };
34D723421EB385E900E6210E /* libHarfBuzzSharp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libHarfBuzzSharp.a; sourceTree = BUILT_PRODUCTS_DIR; };
- 34F6800B233ED0F70091C30D /* hb-ot-meta.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-meta.cc"; path = "../../externals/harfbuzz/src/hb-ot-meta.cc"; sourceTree = ""; };
- 34F6800C233ED0F70091C30D /* hb-ot-metrics.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = "hb-ot-metrics.hh"; path = "../../externals/harfbuzz/src/hb-ot-metrics.hh"; sourceTree = ""; };
- 34F6800D233ED0F70091C30D /* hb-ot-meta-table.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = "hb-ot-meta-table.hh"; path = "../../externals/harfbuzz/src/hb-ot-meta-table.hh"; sourceTree = ""; };
- 34F6800E233ED0F70091C30D /* hb-ot-meta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "hb-ot-meta.h"; path = "../../externals/harfbuzz/src/hb-ot-meta.h"; sourceTree = ""; };
- 34F6800F233ED0F70091C30D /* hb-ot-metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "hb-ot-metrics.h"; path = "../../externals/harfbuzz/src/hb-ot-metrics.h"; sourceTree = ""; };
- 34F68010233ED0F70091C30D /* hb-ot-metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-metrics.cc"; path = "../../externals/harfbuzz/src/hb-ot-metrics.cc"; sourceTree = ""; };
+ 34F6800B233ED0F70091C30D /* hb-ot-meta.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-meta.cc"; path = "../../../externals/harfbuzz/src/hb-ot-meta.cc"; sourceTree = ""; };
+ 34F6800C233ED0F70091C30D /* hb-ot-metrics.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = "hb-ot-metrics.hh"; path = "../../../externals/harfbuzz/src/hb-ot-metrics.hh"; sourceTree = ""; };
+ 34F6800D233ED0F70091C30D /* hb-ot-meta-table.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = "hb-ot-meta-table.hh"; path = "../../../externals/harfbuzz/src/hb-ot-meta-table.hh"; sourceTree = ""; };
+ 34F6800E233ED0F70091C30D /* hb-ot-meta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "hb-ot-meta.h"; path = "../../../externals/harfbuzz/src/hb-ot-meta.h"; sourceTree = ""; };
+ 34F6800F233ED0F70091C30D /* hb-ot-metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "hb-ot-metrics.h"; path = "../../../externals/harfbuzz/src/hb-ot-metrics.h"; sourceTree = ""; };
+ 34F68010233ED0F70091C30D /* hb-ot-metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-metrics.cc"; path = "../../../externals/harfbuzz/src/hb-ot-metrics.cc"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
diff --git a/native-builds/libSkiaSharp_ios/libSkiaSharp.xcodeproj/project.pbxproj b/native/ios/libSkiaSharp/libSkiaSharp.xcodeproj/project.pbxproj
similarity index 84%
rename from native-builds/libSkiaSharp_ios/libSkiaSharp.xcodeproj/project.pbxproj
rename to native/ios/libSkiaSharp/libSkiaSharp.xcodeproj/project.pbxproj
index 75636d0444..ff453a1dd0 100644
--- a/native-builds/libSkiaSharp_ios/libSkiaSharp.xcodeproj/project.pbxproj
+++ b/native/ios/libSkiaSharp/libSkiaSharp.xcodeproj/project.pbxproj
@@ -29,23 +29,23 @@
/* Begin PBXFileReference section */
21FD2B301C014C000023CFAE /* libSkiaSharp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = libSkiaSharp.framework; sourceTree = BUILT_PRODUCTS_DIR; };
21FD2B351C014C000023CFAE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- 3419BFDD21D405AA0067DAFB /* SkManagedDrawable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkManagedDrawable.h; path = ../../../externals/skia/include/xamarin/SkManagedDrawable.h; sourceTree = ""; };
- 3419BFDE21D405AA0067DAFB /* sk_manageddrawable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sk_manageddrawable.h; path = ../../../externals/skia/include/xamarin/sk_manageddrawable.h; sourceTree = ""; };
- 3419BFE121D405B20067DAFB /* SkManagedDrawable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkManagedDrawable.cpp; path = ../../../externals/skia/src/xamarin/SkManagedDrawable.cpp; sourceTree = ""; };
- 3419BFE221D405B20067DAFB /* sk_manageddrawable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sk_manageddrawable.cpp; path = ../../../externals/skia/src/xamarin/sk_manageddrawable.cpp; sourceTree = ""; };
+ 3419BFDD21D405AA0067DAFB /* SkManagedDrawable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkManagedDrawable.h; path = ../../../../externals/skia/include/xamarin/SkManagedDrawable.h; sourceTree = ""; };
+ 3419BFDE21D405AA0067DAFB /* sk_manageddrawable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sk_manageddrawable.h; path = ../../../../externals/skia/include/xamarin/sk_manageddrawable.h; sourceTree = ""; };
+ 3419BFE121D405B20067DAFB /* SkManagedDrawable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkManagedDrawable.cpp; path = ../../../../externals/skia/src/xamarin/SkManagedDrawable.cpp; sourceTree = ""; };
+ 3419BFE221D405B20067DAFB /* sk_manageddrawable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sk_manageddrawable.cpp; path = ../../../../externals/skia/src/xamarin/sk_manageddrawable.cpp; sourceTree = ""; };
345A7E571E7635B10046F543 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
345A7E591E7635B50046F543 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
345A7E5B1E7635B90046F543 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
34C0C90320573CBE00DFDB22 /* libSkiaSharp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libSkiaSharp.h; sourceTree = ""; };
- 34CB9AC3205699BC00BACCBA /* WinRTCompat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WinRTCompat.cpp; path = ../../../externals/skia/src/xamarin/WinRTCompat.cpp; sourceTree = ""; };
- 34CB9AC4205699BC00BACCBA /* sk_managedstream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sk_managedstream.cpp; path = ../../../externals/skia/src/xamarin/sk_managedstream.cpp; sourceTree = ""; };
- 34CB9AC5205699BC00BACCBA /* SkManagedStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkManagedStream.cpp; path = ../../../externals/skia/src/xamarin/SkManagedStream.cpp; sourceTree = ""; };
- 34CB9AC6205699BC00BACCBA /* sk_xamarin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sk_xamarin.cpp; path = ../../../externals/skia/src/xamarin/sk_xamarin.cpp; sourceTree = ""; };
- 34CB9AC8205699BC00BACCBA /* SkiaKeeper.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkiaKeeper.c; path = ../../../externals/skia/src/xamarin/SkiaKeeper.c; sourceTree = ""; };
- 34CB9AD2205699C300BACCBA /* SkManagedStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkManagedStream.h; path = ../../../externals/skia/include/xamarin/SkManagedStream.h; sourceTree = ""; };
- 34CB9AD3205699C400BACCBA /* sk_managedstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sk_managedstream.h; path = ../../../externals/skia/include/xamarin/sk_managedstream.h; sourceTree = ""; };
- 34CB9AD5205699C400BACCBA /* sk_xamarin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sk_xamarin.h; path = ../../../externals/skia/include/xamarin/sk_xamarin.h; sourceTree = ""; };
- 34CB9AD6205699C400BACCBA /* WinRTCompat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WinRTCompat.h; path = ../../../externals/skia/include/xamarin/WinRTCompat.h; sourceTree = ""; };
+ 34CB9AC3205699BC00BACCBA /* WinRTCompat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WinRTCompat.cpp; path = ../../../../externals/skia/src/xamarin/WinRTCompat.cpp; sourceTree = ""; };
+ 34CB9AC4205699BC00BACCBA /* sk_managedstream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sk_managedstream.cpp; path = ../../../../externals/skia/src/xamarin/sk_managedstream.cpp; sourceTree = ""; };
+ 34CB9AC5205699BC00BACCBA /* SkManagedStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkManagedStream.cpp; path = ../../../../externals/skia/src/xamarin/SkManagedStream.cpp; sourceTree = ""; };
+ 34CB9AC6205699BC00BACCBA /* sk_xamarin.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sk_xamarin.cpp; path = ../../../../externals/skia/src/xamarin/sk_xamarin.cpp; sourceTree = ""; };
+ 34CB9AC8205699BC00BACCBA /* SkiaKeeper.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = SkiaKeeper.c; path = ../../../../externals/skia/src/xamarin/SkiaKeeper.c; sourceTree = ""; };
+ 34CB9AD2205699C300BACCBA /* SkManagedStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkManagedStream.h; path = ../../../../externals/skia/include/xamarin/SkManagedStream.h; sourceTree = ""; };
+ 34CB9AD3205699C400BACCBA /* sk_managedstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sk_managedstream.h; path = ../../../../externals/skia/include/xamarin/sk_managedstream.h; sourceTree = ""; };
+ 34CB9AD5205699C400BACCBA /* sk_xamarin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sk_xamarin.h; path = ../../../../externals/skia/include/xamarin/sk_xamarin.h; sourceTree = ""; };
+ 34CB9AD6205699C400BACCBA /* WinRTCompat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WinRTCompat.h; path = ../../../../externals/skia/include/xamarin/WinRTCompat.h; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -334,27 +334,27 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_ENABLE_CPP_RTTI = NO;
HEADER_SEARCH_PATHS = (
- ../../externals/skia/src/c,
- ../../externals/skia/src/core,
- ../../externals/skia/src/xml,
- ../../externals/skia/include/private,
- ../../externals/skia/include/c,
- ../../externals/skia/include/core,
- ../../externals/skia/include/codec,
- ../../externals/skia/include/effects,
- ../../externals/skia/include/encode,
- ../../externals/skia/include/pathops,
- ../../externals/skia/include/utils,
- ../../externals/skia/include/gpu,
- ../../externals/skia/include/config,
- ../../externals/skia/include/ports,
- ../../externals/skia/include/xml,
- ../../externals/skia/include/svg,
+ ../../../externals/skia/src/c,
+ ../../../externals/skia/src/core,
+ ../../../externals/skia/src/xml,
+ ../../../externals/skia/include/private,
+ ../../../externals/skia/include/c,
+ ../../../externals/skia/include/core,
+ ../../../externals/skia/include/codec,
+ ../../../externals/skia/include/effects,
+ ../../../externals/skia/include/encode,
+ ../../../externals/skia/include/pathops,
+ ../../../externals/skia/include/utils,
+ ../../../externals/skia/include/gpu,
+ ../../../externals/skia/include/config,
+ ../../../externals/skia/include/ports,
+ ../../../externals/skia/include/xml,
+ ../../../externals/skia/include/svg,
);
INFOPLIST_FILE = libSkiaSharp/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- LIBRARY_SEARCH_PATHS = "../../externals/skia/out/ios/$(ARCHS)";
+ LIBRARY_SEARCH_PATHS = "../../../externals/skia/out/ios/$(ARCHS)";
OTHER_LDFLAGS = (
"-all_load",
"-lskia",
@@ -375,27 +375,27 @@
DYLIB_INSTALL_NAME_BASE = "@rpath";
GCC_ENABLE_CPP_RTTI = NO;
HEADER_SEARCH_PATHS = (
- ../../externals/skia/src/c,
- ../../externals/skia/src/core,
- ../../externals/skia/src/xml,
- ../../externals/skia/include/private,
- ../../externals/skia/include/c,
- ../../externals/skia/include/core,
- ../../externals/skia/include/codec,
- ../../externals/skia/include/effects,
- ../../externals/skia/include/encode,
- ../../externals/skia/include/pathops,
- ../../externals/skia/include/utils,
- ../../externals/skia/include/gpu,
- ../../externals/skia/include/config,
- ../../externals/skia/include/ports,
- ../../externals/skia/include/xml,
- ../../externals/skia/include/svg,
+ ../../../externals/skia/src/c,
+ ../../../externals/skia/src/core,
+ ../../../externals/skia/src/xml,
+ ../../../externals/skia/include/private,
+ ../../../externals/skia/include/c,
+ ../../../externals/skia/include/core,
+ ../../../externals/skia/include/codec,
+ ../../../externals/skia/include/effects,
+ ../../../externals/skia/include/encode,
+ ../../../externals/skia/include/pathops,
+ ../../../externals/skia/include/utils,
+ ../../../externals/skia/include/gpu,
+ ../../../externals/skia/include/config,
+ ../../../externals/skia/include/ports,
+ ../../../externals/skia/include/xml,
+ ../../../externals/skia/include/svg,
);
INFOPLIST_FILE = libSkiaSharp/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
- LIBRARY_SEARCH_PATHS = "../../externals/skia/out/ios/$(ARCHS)";
+ LIBRARY_SEARCH_PATHS = "../../../externals/skia/out/ios/$(ARCHS)";
OTHER_LDFLAGS = (
"-all_load",
"-lskia",
diff --git a/native-builds/libSkiaSharp_ios/libSkiaSharp/Info.plist b/native/ios/libSkiaSharp/libSkiaSharp/Info.plist
similarity index 100%
rename from native-builds/libSkiaSharp_ios/libSkiaSharp/Info.plist
rename to native/ios/libSkiaSharp/libSkiaSharp/Info.plist
diff --git a/native-builds/libSkiaSharp_ios/libSkiaSharp/libSkiaSharp.h b/native/ios/libSkiaSharp/libSkiaSharp/libSkiaSharp.h
similarity index 100%
rename from native-builds/libSkiaSharp_ios/libSkiaSharp/libSkiaSharp.h
rename to native/ios/libSkiaSharp/libSkiaSharp/libSkiaSharp.h
diff --git a/native/linux/build.cake b/native/linux/build.cake
new file mode 100644
index 0000000000..68f75f02cc
--- /dev/null
+++ b/native/linux/build.cake
@@ -0,0 +1,86 @@
+DirectoryPath ROOT_PATH = MakeAbsolute(Directory("../.."));
+DirectoryPath OUTPUT_PATH = MakeAbsolute(ROOT_PATH.Combine("output/native"));
+
+#load "../../cake/native-shared.cake"
+
+string SUPPORT_GPU_VAR = Argument("supportGpu", EnvironmentVariable("SUPPORT_GPU") ?? "true").ToLower();
+bool SUPPORT_GPU = SUPPORT_GPU_VAR == "1" || SUPPORT_GPU_VAR == "true";
+
+string CC = Argument("cc", EnvironmentVariable("CC"));
+string CXX = Argument("ccx", EnvironmentVariable("CXX"));
+string AR = Argument("ar", EnvironmentVariable("AR"));
+
+string VARIANT = BUILD_VARIANT ?? "linux";
+
+Task("libSkiaSharp")
+ .IsDependentOn("git-sync-deps")
+ .WithCriteria(IsRunningOnLinux())
+ .Does(() =>
+{
+ Build("x64", "x64", "x64");
+
+ void Build(string arch, string skiaArch, string dir)
+ {
+ if (Skip(arch)) return;
+
+ var compilers = "";
+ if (!string.IsNullOrEmpty(CC))
+ compilers += $"cc='{CC}' ";
+ if (!string.IsNullOrEmpty(CXX))
+ compilers += $"cxx='{CXX}' ";
+ if (!string.IsNullOrEmpty(AR))
+ compilers += $"ar='{AR}' ";
+
+ var soname = GetVersion("libSkiaSharp", "soname");
+ var map = MakeAbsolute((FilePath)"libSkiaSharp/libSkiaSharp.map");
+
+ GnNinja($"{VARIANT}/{arch}", "SkiaSharp",
+ $"is_official_build=true skia_enable_tools=false " +
+ $"target_os='linux' target_cpu='{arch}' " +
+ $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
+ $"skia_use_system_expat=false skia_use_system_freetype2=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
+ $"skia_enable_gpu={(SUPPORT_GPU ? "true" : "false")} " +
+ $"extra_cflags=[ '-DSKIA_C_DLL' ] " +
+ $"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}");
+ EnsureDirectoryExists(outDir);
+ var so = SKIA_PATH.CombineWithFilePath($"out/{VARIANT}/{arch}/libSkiaSharp.so.{soname}");
+ CopyFileToDirectory(so, outDir);
+ CopyFile(so, outDir.CombineWithFilePath("libSkiaSharp.so"));
+ }
+});
+
+Task("libHarfBuzzSharp")
+ .WithCriteria(IsRunningOnLinux())
+ .Does(() =>
+{
+ Build("x64", "x64");
+
+ void Build(string arch, string dir)
+ {
+ if (Skip(arch)) return;
+
+ var soname = GetVersion("HarfBuzz", "soname");
+
+ RunProcess("make", new ProcessSettings {
+ Arguments = $"ARCH={arch} SONAME_VERSION={soname} VARIANT={VARIANT} LDFLAGS=-static-libstdc++",
+ WorkingDirectory = "libHarfBuzzSharp",
+ });
+
+ var outDir = OUTPUT_PATH.Combine($"{VARIANT}/{dir}");
+ EnsureDirectoryExists(outDir);
+ var so = $"libHarfBuzzSharp/bin/{VARIANT}/{arch}/libHarfBuzzSharp.so.{soname}";
+ CopyFileToDirectory(so, outDir);
+ CopyFile(so, outDir.CombineWithFilePath("libHarfBuzzSharp.so"));
+ }
+});
+
+Task("Default")
+ .IsDependentOn("libSkiaSharp")
+ .IsDependentOn("libHarfBuzzSharp");
+
+RunTarget(TARGET);
diff --git a/native-builds/libHarfBuzzSharp_linux/Makefile b/native/linux/libHarfBuzzSharp/Makefile
similarity index 97%
rename from native-builds/libHarfBuzzSharp_linux/Makefile
rename to native/linux/libHarfBuzzSharp/Makefile
index 5bd57e4be4..68f9364a1b 100644
--- a/native-builds/libHarfBuzzSharp_linux/Makefile
+++ b/native/linux/libHarfBuzzSharp/Makefile
@@ -3,13 +3,14 @@ SONAME_VERSION ?= 0.0.0
CC ?= clang
CXX ?= clang++
LDFLAGS +=
+VARIANT ?= linux
noop =
space = ${noop} ${noop}
-src_root = ../../externals/harfbuzz/src
-obj_root = obj
-bin_root = bin
+src_root = ../../../externals/harfbuzz/src
+obj_root = obj/${VARIANT}
+bin_root = bin/${VARIANT}
objarch_root = ${obj_root}/${ARCH}
target_name = libHarfBuzzSharp.so
target = ${bin_root}/${ARCH}/${target_name}.${SONAME_VERSION}
diff --git a/native-builds/libHarfBuzzSharp_linux/config.h b/native/linux/libHarfBuzzSharp/config.h
similarity index 100%
rename from native-builds/libHarfBuzzSharp_linux/config.h
rename to native/linux/libHarfBuzzSharp/config.h
diff --git a/native-builds/libSkiaSharp_linux/libSkiaSharp.map b/native/linux/libSkiaSharp/libSkiaSharp.map
similarity index 100%
rename from native-builds/libSkiaSharp_linux/libSkiaSharp.map
rename to native/linux/libSkiaSharp/libSkiaSharp.map
diff --git a/native/linuxnodeps/build.cake b/native/linuxnodeps/build.cake
new file mode 100644
index 0000000000..ba8664ae53
--- /dev/null
+++ b/native/linuxnodeps/build.cake
@@ -0,0 +1,39 @@
+DirectoryPath ROOT_PATH = MakeAbsolute(Directory("../.."));
+DirectoryPath OUTPUT_PATH = MakeAbsolute(ROOT_PATH.Combine("output/native/linuxnodeps"));
+
+#load "../../cake/shared.cake"
+
+Task("libSkiaSharp")
+ .WithCriteria(IsRunningOnLinux())
+ .Does(() =>
+{
+ RunCake("../linux/build.cake", "libSkiaSharp", new Dictionary {
+ { "variant", "linuxnodeps" },
+ { "gn", "skia_use_fontconfig=false" },
+ });
+
+ RunProcess("ldd", OUTPUT_PATH.CombineWithFilePath($"x64/libSkiaSharp.so").FullPath, out var stdout);
+
+ if (stdout.Any(o => o.Contains("fontconfig")))
+ throw new Exception("libSkiaSharp.so contained a dependency on fontconfig.");
+});
+
+Task("libHarfBuzzSharp")
+ .WithCriteria(IsRunningOnLinux())
+ .Does(() =>
+{
+ RunCake("../linux/build.cake", "libHarfBuzzSharp", new Dictionary {
+ { "variant", "linuxnodeps" },
+ });
+
+ RunProcess("ldd", OUTPUT_PATH.CombineWithFilePath($"x64/libHarfBuzzSharp.so").FullPath, out var stdout);
+
+ if (stdout.Any(o => o.Contains("fontconfig")))
+ throw new Exception("libHarfBuzzSharp.so contained a dependency on fontconfig.");
+});
+
+Task("Default")
+ .IsDependentOn("libSkiaSharp")
+ .IsDependentOn("libHarfBuzzSharp");
+
+RunTarget(TARGET);
diff --git a/native/macos/build.cake b/native/macos/build.cake
new file mode 100644
index 0000000000..f94a6e0fcb
--- /dev/null
+++ b/native/macos/build.cake
@@ -0,0 +1,68 @@
+DirectoryPath ROOT_PATH = MakeAbsolute(Directory("../.."));
+DirectoryPath OUTPUT_PATH = MakeAbsolute(ROOT_PATH.Combine("output/native/osx"));
+
+#load "../../cake/native-shared.cake"
+#load "../../cake/xcode.cake"
+
+Task("libSkiaSharp")
+ .IsDependentOn("git-sync-deps")
+ .WithCriteria(IsRunningOnMac())
+ .Does(() =>
+{
+ Build("x86_64", "x64");
+
+ RunLipo(OUTPUT_PATH, "libSkiaSharp.dylib", new [] {
+ (FilePath) "x86_64/libSkiaSharp.dylib"
+ });
+
+ void Build(string arch, string skiaArch)
+ {
+ if (Skip(arch)) return;
+
+ GnNinja($"macos/{arch}", "skia",
+ $"is_official_build=true skia_enable_tools=false " +
+ $"target_os='mac' target_cpu='{skiaArch}' " +
+ $"skia_use_icu=false skia_use_sfntly=false skia_use_piex=true " +
+ $"skia_use_system_expat=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false " +
+ $"extra_cflags=[ '-DSKIA_C_DLL', '-mmacosx-version-min=10.7', '-stdlib=libc++' ] " +
+ $"extra_ldflags=[ '-Wl,macosx_version_min=10.7', '-stdlib=libc++' ]");
+
+ RunXCodeBuild("libSkiaSharp/libSkiaSharp.xcodeproj", "libSkiaSharp", "macosx", arch);
+
+ var outDir = OUTPUT_PATH.Combine(arch);
+ EnsureDirectoryExists(outDir);
+ CopyDirectory($"libSkiaSharp/bin/{CONFIGURATION}/{arch}/{CONFIGURATION}/", outDir);
+
+ StripSign(outDir.CombineWithFilePath("libSkiaSharp.dylib"));
+ }
+});
+
+Task("libHarfBuzzSharp")
+ .WithCriteria(IsRunningOnMac())
+ .Does(() =>
+{
+ Build("x86_64");
+
+ RunLipo(OUTPUT_PATH, "libHarfBuzzSharp.dylib", new [] {
+ (FilePath) "x86_64/libHarfBuzzSharp.dylib"
+ });
+
+ void Build(string arch)
+ {
+ if (Skip(arch)) return;
+
+ RunXCodeBuild("libHarfBuzzSharp/libHarfBuzzSharp.xcodeproj", "libHarfBuzzSharp", "macosx", arch);
+
+ var outDir = OUTPUT_PATH.Combine(arch);
+ EnsureDirectoryExists(outDir);
+ CopyDirectory($"libHarfBuzzSharp/bin/{CONFIGURATION}/{arch}/{CONFIGURATION}/", outDir);
+
+ StripSign(outDir.CombineWithFilePath("libHarfBuzzSharp.dylib"));
+ }
+});
+
+Task("Default")
+ .IsDependentOn("libSkiaSharp")
+ .IsDependentOn("libHarfBuzzSharp");
+
+RunTarget(TARGET);
diff --git a/native-builds/libHarfBuzzSharp_osx/config.h b/native/macos/libHarfBuzzSharp/config.h
similarity index 100%
rename from native-builds/libHarfBuzzSharp_osx/config.h
rename to native/macos/libHarfBuzzSharp/config.h
diff --git a/native-builds/libHarfBuzzSharp_osx/libHarfBuzzSharp.xcodeproj/project.pbxproj b/native/macos/libHarfBuzzSharp/libHarfBuzzSharp.xcodeproj/project.pbxproj
similarity index 84%
rename from native-builds/libHarfBuzzSharp_osx/libHarfBuzzSharp.xcodeproj/project.pbxproj
rename to native/macos/libHarfBuzzSharp/libHarfBuzzSharp.xcodeproj/project.pbxproj
index 2cb52bd0fa..925e7bab61 100644
--- a/native-builds/libHarfBuzzSharp_osx/libHarfBuzzSharp.xcodeproj/project.pbxproj
+++ b/native/macos/libHarfBuzzSharp/libHarfBuzzSharp.xcodeproj/project.pbxproj
@@ -68,63 +68,63 @@
/* Begin PBXFileReference section */
346E0AC51EB38F6300F3DE96 /* libHarfBuzzSharp.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libHarfBuzzSharp.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
- 34F57AB9233ED11B00427BE9 /* hb-ot-meta.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-meta.cc"; path = "../../externals/harfbuzz/src/hb-ot-meta.cc"; sourceTree = ""; };
- 34F57ABA233ED11B00427BE9 /* hb-ot-metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-metrics.cc"; path = "../../externals/harfbuzz/src/hb-ot-metrics.cc"; sourceTree = ""; };
- 34F57ABB233ED11B00427BE9 /* hb-ot-meta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "hb-ot-meta.h"; path = "../../externals/harfbuzz/src/hb-ot-meta.h"; sourceTree = ""; };
- 34F57ABC233ED11B00427BE9 /* hb-ot-metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "hb-ot-metrics.h"; path = "../../externals/harfbuzz/src/hb-ot-metrics.h"; sourceTree = ""; };
- 34F57ABD233ED11C00427BE9 /* hb-ot-metrics.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = "hb-ot-metrics.hh"; path = "../../externals/harfbuzz/src/hb-ot-metrics.hh"; sourceTree = ""; };
- 34F57ABE233ED11C00427BE9 /* hb-ot-meta-table.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = "hb-ot-meta-table.hh"; path = "../../externals/harfbuzz/src/hb-ot-meta-table.hh"; sourceTree = ""; };
- 34F64B3E21FA5EC1008FBDBD /* hb-ot-cff1-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-cff1-table.cc"; path = "../../externals/harfbuzz/src/hb-ot-cff1-table.cc"; sourceTree = ""; };
- 34F64B3F21FA5EC1008FBDBD /* hb-ot-shape-complex-indic-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-indic-table.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-indic-table.cc"; sourceTree = ""; };
- 34F64B4021FA5EC1008FBDBD /* hb-ot-font.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-font.cc"; path = "../../externals/harfbuzz/src/hb-ot-font.cc"; sourceTree = ""; };
- 34F64B4121FA5EC1008FBDBD /* hb-ot-color.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-color.cc"; path = "../../externals/harfbuzz/src/hb-ot-color.cc"; sourceTree = ""; };
- 34F64B4321FA5EC1008FBDBD /* hb-ot-shape-complex-thai.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-thai.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-thai.cc"; sourceTree = ""; };
- 34F64B4421FA5EC1008FBDBD /* hb-blob.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-blob.cc"; path = "../../externals/harfbuzz/src/hb-blob.cc"; sourceTree = ""; };
- 34F64B4521FA5EC1008FBDBD /* hb-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-map.cc"; path = "../../externals/harfbuzz/src/hb-map.cc"; sourceTree = ""; };
- 34F64B4621FA5EC1008FBDBD /* hb-ot-shape-complex-use-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-use-table.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-use-table.cc"; sourceTree = ""; };
- 34F64B4721FA5EC1008FBDBD /* hb-ot-shape-complex-use.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-use.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-use.cc"; sourceTree = ""; };
- 34F64B4821FA5EC1008FBDBD /* hb-buffer-serialize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-buffer-serialize.cc"; path = "../../externals/harfbuzz/src/hb-buffer-serialize.cc"; sourceTree = ""; };
- 34F64B4921FA5EC1008FBDBD /* hb-ot-shape-complex-vowel-constraints.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-vowel-constraints.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc"; sourceTree = ""; };
- 34F64B4A21FA5EC1008FBDBD /* hb-aat-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-aat-map.cc"; path = "../../externals/harfbuzz/src/hb-aat-map.cc"; sourceTree = ""; };
- 34F64B4B21FA5EC1008FBDBD /* hb-ot-shape-normalize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-normalize.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-normalize.cc"; sourceTree = ""; };
- 34F64B4C21FA5EC1008FBDBD /* hb-unicode.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-unicode.cc"; path = "../../externals/harfbuzz/src/hb-unicode.cc"; sourceTree = ""; };
- 34F64B4D21FA5EC1008FBDBD /* hb-warning.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-warning.cc"; path = "../../externals/harfbuzz/src/hb-warning.cc"; sourceTree = ""; };
- 34F64B4E21FA5EC1008FBDBD /* hb-ot-shape-complex-myanmar.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-myanmar.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-myanmar.cc"; sourceTree = ""; };
- 34F64B4F21FA5EC1008FBDBD /* hb-ot-shape-complex-hangul.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-hangul.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-hangul.cc"; sourceTree = ""; };
- 34F64B5021FA5EC1008FBDBD /* hb-ot-shape-fallback.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-fallback.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-fallback.cc"; sourceTree = ""; };
- 34F64B5121FA5EC1008FBDBD /* hb-ot-cff2-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-cff2-table.cc"; path = "../../externals/harfbuzz/src/hb-ot-cff2-table.cc"; sourceTree = ""; };
- 34F64B5221FA5EC1008FBDBD /* hb-ot-shape-complex-hebrew.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-hebrew.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-hebrew.cc"; sourceTree = ""; };
- 34F64B5321FA5EC1008FBDBD /* hb-ot-shape-complex-arabic.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-arabic.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-arabic.cc"; sourceTree = ""; };
- 34F64B5421FA5EC1008FBDBD /* hb-ot-shape.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape.cc"; sourceTree = ""; };
- 34F64B5521FA5EC1008FBDBD /* hb-ot-var.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-var.cc"; path = "../../externals/harfbuzz/src/hb-ot-var.cc"; sourceTree = ""; };
- 34F64B5621FA5EC1008FBDBD /* hb-shape.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-shape.cc"; path = "../../externals/harfbuzz/src/hb-shape.cc"; sourceTree = ""; };
- 34F64B5721FA5EC1008FBDBD /* hb-ot-shape-complex-khmer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-khmer.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-khmer.cc"; sourceTree = ""; };
- 34F64B5821FA5EC2008FBDBD /* hb-set.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-set.cc"; path = "../../externals/harfbuzz/src/hb-set.cc"; sourceTree = ""; };
- 34F64B5921FA5EC2008FBDBD /* hb-face.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-face.cc"; path = "../../externals/harfbuzz/src/hb-face.cc"; sourceTree = ""; };
- 34F64B5A21FA5EC2008FBDBD /* hb-shaper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-shaper.cc"; path = "../../externals/harfbuzz/src/hb-shaper.cc"; sourceTree = ""; };
- 34F64B5B21FA5EC2008FBDBD /* hb-ot-shape-complex-indic.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-indic.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-indic.cc"; sourceTree = ""; };
- 34F64B5C21FA5EC2008FBDBD /* hb-common.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-common.cc"; path = "../../externals/harfbuzz/src/hb-common.cc"; sourceTree = ""; };
- 34F64B5D21FA5EC2008FBDBD /* hb-ot-layout.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-layout.cc"; path = "../../externals/harfbuzz/src/hb-ot-layout.cc"; sourceTree = ""; };
- 34F64B5E21FA5EC2008FBDBD /* hb-aat-layout.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-aat-layout.cc"; path = "../../externals/harfbuzz/src/hb-aat-layout.cc"; sourceTree = ""; };
- 34F64B5F21FA5EC2008FBDBD /* hb-ot-face.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-face.cc"; path = "../../externals/harfbuzz/src/hb-ot-face.cc"; sourceTree = ""; };
- 34F64B6121FA5EC2008FBDBD /* hb-fallback-shape.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-fallback-shape.cc"; path = "../../externals/harfbuzz/src/hb-fallback-shape.cc"; sourceTree = ""; };
- 34F64B6221FA5EC2008FBDBD /* hb-shape-plan.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-shape-plan.cc"; path = "../../externals/harfbuzz/src/hb-shape-plan.cc"; sourceTree = ""; };
- 34F64B6321FA5EC2008FBDBD /* hb-ot-math.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-math.cc"; path = "../../externals/harfbuzz/src/hb-ot-math.cc"; sourceTree = ""; };
- 34F64B6421FA5EC2008FBDBD /* hb-ot-tag.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-tag.cc"; path = "../../externals/harfbuzz/src/hb-ot-tag.cc"; sourceTree = ""; };
- 34F64B6521FA5EC2008FBDBD /* hb-ot-shape-complex-default.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-default.cc"; path = "../../externals/harfbuzz/src/hb-ot-shape-complex-default.cc"; sourceTree = ""; };
- 34F64B6621FA5EC2008FBDBD /* hb-static.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-static.cc"; path = "../../externals/harfbuzz/src/hb-static.cc"; sourceTree = ""; };
- 34F64B6721FA5EC2008FBDBD /* hb-ot-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-map.cc"; path = "../../externals/harfbuzz/src/hb-ot-map.cc"; sourceTree = ""; };
- 34F64B6821FA5EC2008FBDBD /* hb-ot-name.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-name.cc"; path = "../../externals/harfbuzz/src/hb-ot-name.cc"; sourceTree = ""; };
- 34F64B6921FA5EC2008FBDBD /* hb-buffer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-buffer.cc"; path = "../../externals/harfbuzz/src/hb-buffer.cc"; sourceTree = ""; };
- 34F64B6A21FA5EC2008FBDBD /* hb-font.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-font.cc"; path = "../../externals/harfbuzz/src/hb-font.cc"; sourceTree = ""; };
+ 34F57AB9233ED11B00427BE9 /* hb-ot-meta.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-meta.cc"; path = "../../../externals/harfbuzz/src/hb-ot-meta.cc"; sourceTree = ""; };
+ 34F57ABA233ED11B00427BE9 /* hb-ot-metrics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-metrics.cc"; path = "../../../externals/harfbuzz/src/hb-ot-metrics.cc"; sourceTree = ""; };
+ 34F57ABB233ED11B00427BE9 /* hb-ot-meta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "hb-ot-meta.h"; path = "../../../externals/harfbuzz/src/hb-ot-meta.h"; sourceTree = ""; };
+ 34F57ABC233ED11B00427BE9 /* hb-ot-metrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "hb-ot-metrics.h"; path = "../../../externals/harfbuzz/src/hb-ot-metrics.h"; sourceTree = ""; };
+ 34F57ABD233ED11C00427BE9 /* hb-ot-metrics.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = "hb-ot-metrics.hh"; path = "../../../externals/harfbuzz/src/hb-ot-metrics.hh"; sourceTree = ""; };
+ 34F57ABE233ED11C00427BE9 /* hb-ot-meta-table.hh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = "hb-ot-meta-table.hh"; path = "../../../externals/harfbuzz/src/hb-ot-meta-table.hh"; sourceTree = ""; };
+ 34F64B3E21FA5EC1008FBDBD /* hb-ot-cff1-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-cff1-table.cc"; path = "../../../externals/harfbuzz/src/hb-ot-cff1-table.cc"; sourceTree = ""; };
+ 34F64B3F21FA5EC1008FBDBD /* hb-ot-shape-complex-indic-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-indic-table.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-indic-table.cc"; sourceTree = ""; };
+ 34F64B4021FA5EC1008FBDBD /* hb-ot-font.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-font.cc"; path = "../../../externals/harfbuzz/src/hb-ot-font.cc"; sourceTree = ""; };
+ 34F64B4121FA5EC1008FBDBD /* hb-ot-color.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-color.cc"; path = "../../../externals/harfbuzz/src/hb-ot-color.cc"; sourceTree = ""; };
+ 34F64B4321FA5EC1008FBDBD /* hb-ot-shape-complex-thai.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-thai.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-thai.cc"; sourceTree = ""; };
+ 34F64B4421FA5EC1008FBDBD /* hb-blob.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-blob.cc"; path = "../../../externals/harfbuzz/src/hb-blob.cc"; sourceTree = ""; };
+ 34F64B4521FA5EC1008FBDBD /* hb-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-map.cc"; path = "../../../externals/harfbuzz/src/hb-map.cc"; sourceTree = ""; };
+ 34F64B4621FA5EC1008FBDBD /* hb-ot-shape-complex-use-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-use-table.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-use-table.cc"; sourceTree = ""; };
+ 34F64B4721FA5EC1008FBDBD /* hb-ot-shape-complex-use.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-use.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-use.cc"; sourceTree = ""; };
+ 34F64B4821FA5EC1008FBDBD /* hb-buffer-serialize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-buffer-serialize.cc"; path = "../../../externals/harfbuzz/src/hb-buffer-serialize.cc"; sourceTree = ""; };
+ 34F64B4921FA5EC1008FBDBD /* hb-ot-shape-complex-vowel-constraints.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-vowel-constraints.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-vowel-constraints.cc"; sourceTree = ""; };
+ 34F64B4A21FA5EC1008FBDBD /* hb-aat-map.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-aat-map.cc"; path = "../../../externals/harfbuzz/src/hb-aat-map.cc"; sourceTree = ""; };
+ 34F64B4B21FA5EC1008FBDBD /* hb-ot-shape-normalize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-normalize.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-normalize.cc"; sourceTree = ""; };
+ 34F64B4C21FA5EC1008FBDBD /* hb-unicode.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-unicode.cc"; path = "../../../externals/harfbuzz/src/hb-unicode.cc"; sourceTree = ""; };
+ 34F64B4D21FA5EC1008FBDBD /* hb-warning.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-warning.cc"; path = "../../../externals/harfbuzz/src/hb-warning.cc"; sourceTree = ""; };
+ 34F64B4E21FA5EC1008FBDBD /* hb-ot-shape-complex-myanmar.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-myanmar.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-myanmar.cc"; sourceTree = ""; };
+ 34F64B4F21FA5EC1008FBDBD /* hb-ot-shape-complex-hangul.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-complex-hangul.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-complex-hangul.cc"; sourceTree = ""; };
+ 34F64B5021FA5EC1008FBDBD /* hb-ot-shape-fallback.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-shape-fallback.cc"; path = "../../../externals/harfbuzz/src/hb-ot-shape-fallback.cc"; sourceTree = ""; };
+ 34F64B5121FA5EC1008FBDBD /* hb-ot-cff2-table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "hb-ot-cff2-table.cc"; path = "../../../externals/harfbuzz/src/hb-ot-cff2-table.cc"; sourceTree = "