-
Notifications
You must be signed in to change notification settings - Fork 550
/
Copy pathbuild.cake
140 lines (114 loc) · 5.22 KB
/
build.cake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
DirectoryPath ROOT_PATH = MakeAbsolute(Directory("../.."));
DirectoryPath OUTPUT_PATH = MakeAbsolute(ROOT_PATH.Combine("output/native"));
#load "../../scripts/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 SUPPORT_VULKAN_VAR = Argument("supportVulkan", EnvironmentVariable("SUPPORT_VULKAN") ?? "true");
bool SUPPORT_VULKAN = SUPPORT_VULKAN_VAR == "1" || SUPPORT_VULKAN_VAR.ToLower() == "true";
var VERIFY_EXCLUDED = Argument("verifyExcluded", Argument("verifyexcluded", ""))
.ToLower().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
string CC = Argument("cc", EnvironmentVariable("CC"));
string CXX = Argument("cxx", EnvironmentVariable("CXX"));
string AR = Argument("ar", EnvironmentVariable("AR"));
string VARIANT = string.IsNullOrEmpty(BUILD_VARIANT) ? "linux" : BUILD_VARIANT?.Trim();
if (BUILD_ARCH.Length == 0)
BUILD_ARCH = new [] { "x64" };
var COMPILERS = "";
if (!string.IsNullOrEmpty(CC))
COMPILERS += $"cc='{CC}' ";
if (!string.IsNullOrEmpty(CXX))
COMPILERS += $"cxx='{CXX}' ";
if (!string.IsNullOrEmpty(AR))
COMPILERS += $"ar='{AR}' ";
void CheckDeps(FilePath so)
{
if (VERIFY_EXCLUDED == null || VERIFY_EXCLUDED.Length == 0)
return;
Information($"Making sure that there are no dependencies on: {string.Join(", ", VERIFY_EXCLUDED)}");
RunProcess("readelf", $"-d {so}", out var stdout);
Information(String.Join(Environment.NewLine + " ", stdout));
var needed = stdout
.Where(l => l.Contains("(NEEDED)"))
.ToList();
foreach (var exclude in VERIFY_EXCLUDED) {
if (needed.Any(o => o.Contains(exclude.Trim(), StringComparison.OrdinalIgnoreCase)))
throw new Exception($"{so} contained a dependency on {exclude}.");
}
}
Task("libSkiaSharp")
.IsDependentOn("git-sync-deps")
.WithCriteria(IsRunningOnLinux())
.Does(() =>
{
foreach (var arch in BUILD_ARCH) {
if (Skip(arch)) return;
var soname = GetVersion("libSkiaSharp", "soname");
var map = MakeAbsolute((FilePath)"libSkiaSharp/libSkiaSharp.map");
// This is terrible! But, Alpine (musl) does not define this
// so we are forced to for dng_sdk. If this ever becomes a problem
// for other libraries, we will need to find a better solution.
var wordSize = ReduceArch(arch).EndsWith("64") ? "64" : "32";
var wordSizeDefine = VARIANT.ToLower().StartsWith("alpine")
? $", '-D__WORDSIZE={wordSize}'"
: $"";
GnNinja($"{VARIANT}/{arch}", "SkiaSharp",
$"target_os='linux' " +
$"target_cpu='{arch}' " +
$"skia_enable_ganesh={(SUPPORT_GPU ? "true" : "false")} " +
$"skia_use_harfbuzz=false " +
$"skia_use_icu=false " +
$"skia_use_piex=true " +
$"skia_use_sfntly=false " +
$"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_skottie=true " +
$"skia_use_vulkan={SUPPORT_VULKAN} ".ToLower() +
$"extra_asmflags=[] " +
$"extra_cflags=[ '-DSKIA_C_DLL', '-DHAVE_SYSCALL_GETRANDOM', '-DXML_DEV_URANDOM' {wordSizeDefine} ] " +
$"extra_ldflags=[ '-static-libstdc++', '-static-libgcc', '-Wl,--version-script={map}' ] " +
COMPILERS +
$"linux_soname_version='{soname}' " +
ADDITIONAL_GN_ARGS);
var outDir = OUTPUT_PATH.Combine($"{VARIANT}/{arch}");
EnsureDirectoryExists(outDir);
var so = SKIA_PATH.CombineWithFilePath($"out/{VARIANT}/{arch}/libSkiaSharp.so.{soname}");
CopyFileToDirectory(so, outDir);
CopyFile(so, outDir.CombineWithFilePath("libSkiaSharp.so"));
CheckDeps(so);
}
});
Task("libHarfBuzzSharp")
.IsDependentOn("git-sync-deps")
.WithCriteria(IsRunningOnLinux())
.Does(() =>
{
foreach (var arch in BUILD_ARCH) {
if (Skip(arch)) return;
var soname = GetVersion("HarfBuzz", "soname");
var map = MakeAbsolute((FilePath)"libHarfBuzzSharp/libHarfBuzzSharp.map");
GnNinja($"{VARIANT}/{arch}", "HarfBuzzSharp",
$"target_os='linux' " +
$"target_cpu='{arch}' " +
$"visibility_hidden=false " +
$"extra_asmflags=[] " +
$"extra_cflags=[] " +
$"extra_ldflags=[ '-static-libstdc++', '-static-libgcc', '-Wl,--version-script={map}' ] " +
COMPILERS +
$"linux_soname_version='{soname}' " +
ADDITIONAL_GN_ARGS);
var outDir = OUTPUT_PATH.Combine($"{VARIANT}/{arch}");
EnsureDirectoryExists(outDir);
var so = SKIA_PATH.CombineWithFilePath($"out/{VARIANT}/{arch}/libHarfBuzzSharp.so.{soname}");
CopyFileToDirectory(so, outDir);
CopyFile(so, outDir.CombineWithFilePath("libHarfBuzzSharp.so"));
CheckDeps(so);
}
});
Task("Default")
.IsDependentOn("libSkiaSharp")
.IsDependentOn("libHarfBuzzSharp");
RunTarget(TARGET);