Skip to content

Commit

Permalink
Add Mac Catalyst, use frameworks and move things into the gn files (d…
Browse files Browse the repository at this point in the history
…evelop edition) (#1681)
  • Loading branch information
mattleibow authored Apr 13, 2021
1 parent 41105e6 commit 1a7b9c7
Show file tree
Hide file tree
Showing 38 changed files with 974 additions and 693 deletions.
8 changes: 4 additions & 4 deletions VERSIONS.txt
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ SkiaSharp file 2.88.0.0

# HarfBuzzSharp.dll
HarfBuzzSharp assembly 1.0.0.0
HarfBuzzSharp file 2.6.1.7
HarfBuzzSharp file 2.6.1.8

# nuget versions
SkiaSharp nuget 2.88.0
Expand All @@ -63,9 +63,9 @@ SkiaSharp.Views.Forms.GTK nuget 2.88.0
SkiaSharp.Views.Uno nuget 2.88.0
SkiaSharp.HarfBuzz nuget 2.88.0
SkiaSharp.Vulkan.SharpVk nuget 2.88.0
HarfBuzzSharp nuget 2.6.1.7
HarfBuzzSharp.NativeAssets.Linux nuget 2.6.1.7
HarfBuzzSharp.NativeAssets.WebAssembly nuget 2.6.1.7
HarfBuzzSharp nuget 2.6.1.8
HarfBuzzSharp.NativeAssets.Linux nuget 2.6.1.8
HarfBuzzSharp.NativeAssets.WebAssembly nuget 2.6.1.8

# nuget replacement versions
Xamarin.Forms nuget 4.6.0.772
Expand Down
6 changes: 3 additions & 3 deletions binding/HarfBuzzSharp.Shared/HarfBuzzApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ namespace HarfBuzzSharp
internal unsafe partial class HarfBuzzApi
{
#if __TVOS__ && __UNIFIED__
private const string HARFBUZZ = "__Internal";
private const string HARFBUZZ = "@rpath/libHarfBuzzSharp.framework/libHarfBuzzSharp";
#elif __WATCHOS__ && __UNIFIED__
private const string HARFBUZZ = "__Internal";
private const string HARFBUZZ = "@rpath/libHarfBuzzSharp.framework/libHarfBuzzSharp";
#elif __IOS__ && __UNIFIED__
private const string HARFBUZZ = "__Internal";
private const string HARFBUZZ = "@rpath/libHarfBuzzSharp.framework/libHarfBuzzSharp";
#elif __ANDROID__
private const string HARFBUZZ = "libHarfBuzzSharp.so";
#elif __MACOS__
Expand Down
4 changes: 2 additions & 2 deletions binding/HarfBuzzSharp.iOS/HarfBuzzSharp.iOS.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
<DefineConstants>$(DefineConstants);HARFBUZZ</DefineConstants>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\output\native\ios\libHarfBuzzSharp.a" Link="nuget\build\$(TargetFramework)\libHarfBuzzSharp.a" />
<None Include="..\..\output\native\ios\libHarfBuzzSharp.framework\**" Link="nuget\build\$(TargetFramework)\libHarfBuzzSharp.framework\%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<None Include="nuget\build\$(TargetFramework)\HarfBuzzSharp.targets" Link="nuget\build\$(TargetFramework)\HarfBuzzSharp.targets" />
<None Include="nuget\build\xamarinios1.0\HarfBuzzSharp.targets" Link="nuget\build\$(TargetFramework)\HarfBuzzSharp.targets" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
</PropertyGroup>

<ItemGroup Condition=" '$(ShouldIncludeNativeHarfBuzzSharp)' != 'False' ">
<NativeReference Include="$(_HarfBuzzSharpNativeLibraryRootDir)libHarfBuzzSharp.a" Kind="Static" IsCxx="true" ForceLoad="True" SmartLink="true" />
<NativeReference Include="$(_HarfBuzzSharpNativeLibraryRootDir)libHarfBuzzSharp.framework" Kind="Framework" />
</ItemGroup>

</Project>
4 changes: 2 additions & 2 deletions binding/HarfBuzzSharp.tvOS/HarfBuzzSharp.tvOS.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
<DefineConstants>$(DefineConstants);HARFBUZZ</DefineConstants>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\output\native\tvos\libHarfBuzzSharp.a" Link="nuget\build\$(TargetFramework)\libHarfBuzzSharp.a" />
<None Include="..\..\output\native\tvos\libHarfBuzzSharp.framework\**" Link="nuget\build\$(TargetFramework)\libHarfBuzzSharp.framework\%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<None Include="nuget\build\$(TargetFramework)\HarfBuzzSharp.targets" Link="nuget\build\$(TargetFramework)\HarfBuzzSharp.targets" />
<None Include="nuget\build\xamarintvos1.0\HarfBuzzSharp.targets" Link="nuget\build\$(TargetFramework)\HarfBuzzSharp.targets" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
</PropertyGroup>

<ItemGroup Condition=" '$(ShouldIncludeNativeHarfBuzzSharp)' != 'False' ">
<NativeReference Include="$(_HarfBuzzSharpNativeLibraryRootDir)libHarfBuzzSharp.a" Kind="Static" IsCxx="true" ForceLoad="True" SmartLink="true" />
<NativeReference Include="$(_HarfBuzzSharpNativeLibraryRootDir)libHarfBuzzSharp.framework" Kind="Framework" />
</ItemGroup>

</Project>
4 changes: 2 additions & 2 deletions binding/HarfBuzzSharp.watchOS/HarfBuzzSharp.watchOS.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
<DefineConstants>$(DefineConstants);HARFBUZZ</DefineConstants>
</PropertyGroup>
<ItemGroup>
<None Include="..\..\output\native\watchos\libHarfBuzzSharp.a" Link="nuget\build\$(TargetFramework)\libHarfBuzzSharp.a" />
<None Include="..\..\output\native\watchos\libHarfBuzzSharp.framework\**" Link="nuget\build\$(TargetFramework)\libHarfBuzzSharp.framework\%(RecursiveDir)%(Filename)%(Extension)" />
</ItemGroup>
<ItemGroup>
<None Include="nuget\build\$(TargetFramework)\HarfBuzzSharp.targets" Link="nuget\build\$(TargetFramework)\HarfBuzzSharp.targets" />
<None Include="nuget\build\xamarinwatchos1.0\HarfBuzzSharp.targets" Link="nuget\build\$(TargetFramework)\HarfBuzzSharp.targets" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
</PropertyGroup>

<ItemGroup Condition=" '$(ShouldIncludeNativeHarfBuzzSharp)' != 'False' ">
<NativeReference Include="$(_HarfBuzzSharpNativeLibraryRootDir)libHarfBuzzSharp.a" Kind="Static" IsCxx="true" ForceLoad="True" SmartLink="true" />
<NativeReference Include="$(_HarfBuzzSharpNativeLibraryRootDir)libHarfBuzzSharp.framework" Kind="Framework" />
</ItemGroup>

</Project>
10 changes: 8 additions & 2 deletions cake/externals.cake
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ foreach (var cake in GetFiles("native/*/build.cake"))
Task("externals-osx")
.IsDependentOn("externals-macos");

Task("externals-catalyst")
.IsDependentOn("externals-maccatalyst");

////////////////////////////////////////////////////////////////////////////////////////////////////
// EXTERNALS DOWNLOAD - download any externals that are needed
////////////////////////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -67,8 +70,11 @@ bool ShouldBuildExternal(string platform)

switch (platform) {
case "mac":
case "macos":
platform = "osx";
case "osx":
platform = "macos";
break;
case "catalyst":
platform = "maccatalyst";
break;
case "win":
platform = "windows";
Expand Down
36 changes: 0 additions & 36 deletions cake/native-shared.cake
Original file line number Diff line number Diff line change
Expand Up @@ -80,42 +80,6 @@ void GnNinja(DirectoryPath outDir, string target, string skiaArgs)
});
}

void StripSign(FilePath target)
{
if (!IsRunningOnMac())
throw new InvalidOperationException("lipo is only available on macOS.");

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 macOS.");

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() ?? "";
Expand Down
119 changes: 106 additions & 13 deletions cake/xcode.cake
Original file line number Diff line number Diff line change
@@ -1,25 +1,118 @@
#addin nuget:?package=Cake.XCode&version=4.2.0

void RunXCodeBuild(FilePath project, string target, string sdk, string arch)
void RunXCodeBuild(FilePath project, string scheme, string sdk, string arch, string platform = null)
{
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 {
var settings = new XCodeBuildSettings {
Project = project.FullPath,
Target = target,
Scheme = scheme,
Sdk = sdk,
Arch = arch,
Archive = true,
Configuration = CONFIGURATION,
DerivedDataPath = dir.Combine($"obj/{CONFIGURATION}/{sdk}/{arch}"),
ArchivePath = dir.Combine($"bin/{CONFIGURATION}/{sdk}/{arch}"),
BuildSettings = new Dictionary<string, string> {
{ "SKIP_INSTALL", "NO" },
{ "BUILD_LIBRARIES_FOR_DISTRIBUTION", "YES" },
},
};
if (platform != null) {
settings.BuildSettings["PLATFORM"] = platform;
}

XCodeBuild(settings);
}

void StripSign(FilePath target)
{
if (!IsRunningOnMac())
throw new InvalidOperationException("strip and codesign are only available on macOS.");

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 macOS.");

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,
});
}

void RunLipo(FilePath output, FilePath[] inputs)
{
if (!IsRunningOnMac())
throw new InvalidOperationException("lipo is only available on macOS.");

var inputString = string.Join(" ", inputs.Select(i => string.Format("\"{0}\"", i)));
RunProcess("lipo", new ProcessSettings {
Arguments = string.Format("-create -output \"{0}\" {1}", output, inputString),
});
}

void CreateFatDylib(DirectoryPath archives)
{
var libName = archives.GetDirectoryName();

var binaries = GetFiles($"{archives}/*.xcarchive/Products/@rpath/{libName}.dylib").ToArray();
RunLipo($"{archives}.dylib", binaries);

StripSign($"{archives}.dylib");
}

void CreateFatFramework(DirectoryPath archives)
{
var libName = archives.GetDirectoryName();

var frameworks = GetDirectories($"{archives}/*.xcarchive/Products/Library/Frameworks/{libName}.framework").ToArray();
SafeCopy(frameworks[0], $"{archives}.framework");
DeleteFile($"{archives}.framework/{libName}");

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}"));
var binaries = GetFiles($"{archives}/*.xcarchive/Products/Library/Frameworks/{libName}.framework/{libName}").ToArray();
RunLipo($"{archives}.framework/{libName}", binaries);

StripSign($"{archives}.framework");
}

void CreateFatVersionedFramework(DirectoryPath archives)
{
var libName = archives.GetDirectoryName();

var frameworks = GetDirectories($"{archives}/*.xcarchive/Products/Library/Frameworks/{libName}.framework").ToArray();
SafeCopy(frameworks[0], $"{archives}.framework");
DeleteFile($"{archives}.framework/Versions/A/{libName}");

var binaries = GetFiles($"{archives}/*.xcarchive/Products/Library/Frameworks/{libName}.framework/Versions/A/{libName}").ToArray();
RunLipo($"{archives}.framework/Versions/A/{libName}", binaries);

StripSign($"{archives}.framework");
}

void SafeCopy(DirectoryPath src, DirectoryPath dst)
{
EnsureDirectoryExists(dst);
DeleteDirectory(dst, new DeleteDirectorySettings { Recursive = true, Force = true });
RunProcess("cp", $"-R {src} {dst}");
}
2 changes: 1 addition & 1 deletion externals/skia
Submodule skia updated 2 files
+46 −2 gn/BUILD.gn
+8 −1 gn/BUILDCONFIG.gn
Loading

0 comments on commit 1a7b9c7

Please sign in to comment.