blob: 2d5929dce9ed470f016d7f31682ea96500b8dd3d [file] [log] [blame]
Mike Klein308b5ac2016-12-06 16:03:52 -05001#!/usr/bin/env python
2#
3# Copyright 2016 Google Inc.
4#
5# Use of this source code is governed by a BSD-style license that can be
6# found in the LICENSE file.
7
8# Generate Android.bp for Skia from GN configuration.
9
Mike Klein308b5ac2016-12-06 16:03:52 -050010import os
11import pprint
12import string
13import subprocess
Mike Klein308b5ac2016-12-06 16:03:52 -050014import tempfile
15
Derek Sollenberger5d3f7702018-02-01 09:22:53 -050016import gn_to_bp_utils
17
Mike Klein308b5ac2016-12-06 16:03:52 -050018# First we start off with a template for Android.bp,
19# with holes for source lists and include directories.
20bp = string.Template('''// This file is autogenerated by gn_to_bp.py.
21
Derek Sollenberger5a932162017-09-21 14:25:14 -040022cc_library_static {
Mike Kleinee43f6f2016-12-12 14:09:38 -050023 name: "libskia",
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -050024 host_supported: true,
Mike Kleinee43f6f2016-12-12 14:09:38 -050025 cflags: [
Leon Scroggins III981a31e2017-10-06 11:53:53 -040026 $cflags
27 ],
28
29 cppflags:[
30 $cflags_cc
Mike Kleinee43f6f2016-12-12 14:09:38 -050031 ],
Mike Klein308b5ac2016-12-06 16:03:52 -050032
Mike Kleinee43f6f2016-12-12 14:09:38 -050033 export_include_dirs: [
34 $export_includes
35 ],
Mike Klein27eb22b2016-12-07 12:27:56 -050036
Mike Kleinee43f6f2016-12-12 14:09:38 -050037 local_include_dirs: [
38 $local_includes
39 ],
Mike Klein27eb22b2016-12-07 12:27:56 -050040
Mike Kleinee43f6f2016-12-12 14:09:38 -050041 srcs: [
42 $srcs
43 ],
Mike Klein308b5ac2016-12-06 16:03:52 -050044
Mike Kleinee43f6f2016-12-12 14:09:38 -050045 arch: {
46 arm: {
47 srcs: [
48 $arm_srcs
49 ],
Mike Klein27eb22b2016-12-07 12:27:56 -050050
Leon Scroggins IIIf7332d32017-08-10 09:09:54 -040051 neon: {
Mike Kleinee43f6f2016-12-12 14:09:38 -050052 srcs: [
53 $arm_neon_srcs
54 ],
55 },
56 },
57
58 arm64: {
59 srcs: [
60 $arm64_srcs
61 ],
62 },
63
64 mips: {
65 srcs: [
Mike Klein40a82bd2016-12-20 17:34:29 -050066 $none_srcs
Mike Kleinee43f6f2016-12-12 14:09:38 -050067 ],
68 },
69
70 mips64: {
71 srcs: [
Mike Klein40a82bd2016-12-20 17:34:29 -050072 $none_srcs
Mike Kleinee43f6f2016-12-12 14:09:38 -050073 ],
74 },
75
76 x86: {
77 srcs: [
78 $x86_srcs
79 ],
80 },
81
82 x86_64: {
83 srcs: [
84 $x86_srcs
85 ],
86 },
Mike Klein308b5ac2016-12-06 16:03:52 -050087 },
Mike Klein27eb22b2016-12-07 12:27:56 -050088
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -050089 target: {
90 android: {
91 srcs: [
92 $android_srcs
93 "third_party/vulkanmemoryallocator/GrVulkanMemoryAllocator.cpp",
94 ],
95 local_include_dirs: [
96 "include/config/android",
97 "third_party/vulkanmemoryallocator/",
98 ],
99 export_include_dirs: [
100 "include/config/android",
101 ],
102 },
103 linux_glibc: {
104 cflags: [
105 "-mssse3",
106 ],
107 srcs: [
108 $linux_srcs
109 ],
110 local_include_dirs: [
111 "include/config/linux",
112 ],
113 export_include_dirs: [
114 "include/config/linux",
115 ],
116 },
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500117 darwin: {
118 cflags: [
119 "-mssse3",
120 ],
121 srcs: [
122 $mac_srcs
123 ],
124 local_include_dirs: [
125 "include/config/mac",
126 ],
127 export_include_dirs: [
128 "include/config/mac",
129 ],
130 },
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500131 },
132
Zhizhou Yange18b7792017-12-11 10:37:44 -0800133 defaults: ["skia_deps",
134 "skia_pgo",
135 ],
136}
137
138// Build libskia with PGO by default.
139// Location of PGO profile data is defined in build/soong/cc/pgo.go
140// and is separate from skia.
141// To turn it off, set ANDROID_PGO_NO_PROFILE_USE environment variable
142// or set enable_profile_use property to false.
143cc_defaults {
144 name: "skia_pgo",
145 pgo: {
146 instrumentation: true,
Pirama Arumuga Nainar068ccaa2018-03-05 10:20:38 -0800147 profile_file: "hwui/hwui.profdata",
Zhizhou Yange18b7792017-12-11 10:37:44 -0800148 benchmarks: ["hwui", "skia"],
Pirama Arumuga Nainar068ccaa2018-03-05 10:20:38 -0800149 enable_profile_use: true,
Zhizhou Yange18b7792017-12-11 10:37:44 -0800150 },
Derek Sollenberger5a932162017-09-21 14:25:14 -0400151}
152
Pirama Arumuga Nainarde2b95e2017-12-13 11:07:39 -0800153// "defaults" property to disable profile use for Skia tools and benchmarks.
154cc_defaults {
155 name: "skia_pgo_no_profile_use",
156 defaults: [
157 "skia_pgo",
158 ],
159 pgo: {
160 enable_profile_use: false,
161 },
162}
163
Derek Sollenberger5a932162017-09-21 14:25:14 -0400164cc_defaults {
165 name: "skia_deps",
Mike Kleinee43f6f2016-12-12 14:09:38 -0500166 shared_libs: [
Mike Kleinee43f6f2016-12-12 14:09:38 -0500167 "libdng_sdk",
168 "libexpat",
169 "libft2",
170 "libicui18n",
171 "libicuuc",
172 "libjpeg",
173 "liblog",
174 "libpiex",
175 "libpng",
Mike Kleinee43f6f2016-12-12 14:09:38 -0500176 "libz",
Derek Sollenberger488f0d62017-03-03 15:48:33 -0500177 "libcutils",
Mike Kleinee43f6f2016-12-12 14:09:38 -0500178 ],
179 static_libs: [
Matt Saretta3091092017-02-20 12:50:52 -0500180 "libarect",
Mike Kleinee43f6f2016-12-12 14:09:38 -0500181 "libsfntly",
182 "libwebp-decode",
183 "libwebp-encode",
184 ],
Derek Sollenberger5a932162017-09-21 14:25:14 -0400185 group_static_libs: true,
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500186 target: {
187 android: {
188 shared_libs: [
189 "libEGL",
190 "libGLESv2",
191 "libheif",
192 "libvulkan",
193 "libnativewindow",
194 ],
195 },
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500196 darwin: {
197 host_ldlibs: [
198 "-framework AppKit",
199 ],
200 },
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500201 },
Derek Sollenberger5a932162017-09-21 14:25:14 -0400202}
203
204cc_defaults {
205 name: "skia_tool_deps",
206 defaults: [
Pirama Arumuga Nainarde2b95e2017-12-13 11:07:39 -0800207 "skia_deps",
208 "skia_pgo_no_profile_use"
Derek Sollenberger5a932162017-09-21 14:25:14 -0400209 ],
210 static_libs: [
211 "libjsoncpp",
212 "libskia",
213 ],
214 cflags: [
Derek Sollenberger1821a5b2018-09-11 14:48:36 -0400215 "-Wno-implicit-fallthrough",
Derek Sollenberger9a72ae12017-12-14 13:01:30 -0500216 "-Wno-unused-parameter",
217 "-Wno-unused-variable",
Derek Sollenberger5a932162017-09-21 14:25:14 -0400218 ],
Leon Scroggins III6ccd2ca2017-01-26 17:21:27 -0500219}
220
221cc_test {
222 name: "skia_dm",
223
Derek Sollenberger5a932162017-09-21 14:25:14 -0400224 defaults: [
225 "skia_tool_deps"
Leon Scroggins III6ccd2ca2017-01-26 17:21:27 -0500226 ],
227
228 local_include_dirs: [
229 $dm_includes
230 ],
231
232 srcs: [
233 $dm_srcs
234 ],
Dongwon Kang0c7861f2018-02-16 10:55:21 -0800235
236 shared_libs: [
237 "libbinder",
238 "libutils",
239 ],
Leon Scroggins III6ccd2ca2017-01-26 17:21:27 -0500240}
241
242cc_test {
243 name: "skia_nanobench",
244
Derek Sollenberger5a932162017-09-21 14:25:14 -0400245 defaults: [
246 "skia_tool_deps"
Leon Scroggins III6ccd2ca2017-01-26 17:21:27 -0500247 ],
248
249 local_include_dirs: [
250 $nanobench_includes
251 ],
252
253 srcs: [
254 $nanobench_srcs
255 ],
Pirama Arumuga Nainar68c3fac2018-01-09 21:05:55 -0800256
257 data: [
258 "resources/*",
259 ],
Mike Kleinee43f6f2016-12-12 14:09:38 -0500260}''')
Mike Klein308b5ac2016-12-06 16:03:52 -0500261
262# We'll run GN to get the main source lists and include directories for Skia.
Leon Scroggins IIIa55445e2018-11-28 16:09:35 -0500263def generate_args(target_os, enable_gpu):
264 d = {
265 'is_official_build': 'true',
Mike Klein308b5ac2016-12-06 16:03:52 -0500266
Leon Scroggins IIIa55445e2018-11-28 16:09:35 -0500267 # gn_to_bp_utils' GetArchSources will take care of architecture-specific
268 # files.
269 'target_cpu': '"none"',
Hal Canary23564b92018-09-07 14:33:14 -0400270
Leon Scroggins IIIa55445e2018-11-28 16:09:35 -0500271 # Use the custom FontMgr, as the framework will handle fonts.
272 'skia_enable_fontmgr_custom': 'false',
273 'skia_enable_fontmgr_custom_empty': 'true',
274 'skia_enable_fontmgr_android': 'false',
275 'skia_use_fonthost_mac': 'false',
276
277 'skia_use_freetype': 'true',
278 'skia_use_fontconfig': 'false',
279 'skia_use_fixed_gamma_text': 'true',
280 }
281 d['target_os'] = target_os
282 if target_os == '"android"':
283 d['skia_enable_tools'] = 'true'
284 d['skia_use_libheif'] = 'true'
285 else:
286 d['skia_use_libheif'] = 'false'
287
288 if enable_gpu:
289 d['skia_use_vulkan'] = 'true'
290 else:
291 d['skia_use_vulkan'] = 'false'
292 d['skia_enable_gpu'] = 'false'
293 return d
294
295gn_args = generate_args('"android"', True)
296gn_args_linux = generate_args('"linux"', False)
297gn_args_mac = generate_args('"mac"', False)
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500298
Derek Sollenberger5d3f7702018-02-01 09:22:53 -0500299js = gn_to_bp_utils.GenerateJSONFromGN(gn_args)
Mike Klein308b5ac2016-12-06 16:03:52 -0500300
301def strip_slashes(lst):
Ben Wagnere1275232017-02-23 18:00:06 -0500302 return {str(p.lstrip('/')) for p in lst}
Mike Klein27eb22b2016-12-07 12:27:56 -0500303
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500304android_srcs = strip_slashes(js['targets']['//:skia']['sources'])
Leon Scroggins III981a31e2017-10-06 11:53:53 -0400305cflags = strip_slashes(js['targets']['//:skia']['cflags'])
306cflags_cc = strip_slashes(js['targets']['//:skia']['cflags_cc'])
Mike Klein308b5ac2016-12-06 16:03:52 -0500307local_includes = strip_slashes(js['targets']['//:skia']['include_dirs'])
308export_includes = strip_slashes(js['targets']['//:public']['include_dirs'])
309
Leon Scroggins III6ccd2ca2017-01-26 17:21:27 -0500310dm_srcs = strip_slashes(js['targets']['//:dm']['sources'])
311dm_includes = strip_slashes(js['targets']['//:dm']['include_dirs'])
312
313nanobench_target = js['targets']['//:nanobench']
314nanobench_srcs = strip_slashes(nanobench_target['sources'])
315nanobench_includes = strip_slashes(nanobench_target['include_dirs'])
316
Derek Sollenberger5d3f7702018-02-01 09:22:53 -0500317gn_to_bp_utils.GrabDependentValues(js, '//:dm', 'sources', dm_srcs, 'skia')
318gn_to_bp_utils.GrabDependentValues(js, '//:nanobench', 'sources',
319 nanobench_srcs, 'skia')
Mike Klein27eb22b2016-12-07 12:27:56 -0500320
Mike Kleinf536c452018-05-01 10:36:42 -0400321# skcms is a little special, kind of a second-party library.
Mike Kleinf536c452018-05-01 10:36:42 -0400322local_includes.add("third_party/skcms")
323dm_includes .add("third_party/skcms")
324
Mike Kleind505b192018-09-05 15:55:25 -0400325# Android's build will choke if we list headers.
326def strip_headers(sources):
327 return {s for s in sources if not s.endswith('.h')}
328
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500329gn_to_bp_utils.GrabDependentValues(js, '//:skia', 'sources', android_srcs, None)
330android_srcs = strip_headers(android_srcs)
331
332js_linux = gn_to_bp_utils.GenerateJSONFromGN(gn_args_linux)
333linux_srcs = strip_slashes(js_linux['targets']['//:skia']['sources'])
334gn_to_bp_utils.GrabDependentValues(js_linux, '//:skia', 'sources', linux_srcs,
335 None)
336linux_srcs = strip_headers(linux_srcs)
337
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500338js_mac = gn_to_bp_utils.GenerateJSONFromGN(gn_args_mac)
339mac_srcs = strip_slashes(js_mac['targets']['//:skia']['sources'])
340gn_to_bp_utils.GrabDependentValues(js_mac, '//:skia', 'sources', mac_srcs,
341 None)
342mac_srcs = strip_headers(mac_srcs)
343
344srcs = android_srcs.intersection(linux_srcs).intersection(mac_srcs)
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500345android_srcs = android_srcs.difference(srcs)
346linux_srcs = linux_srcs.difference(srcs)
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500347mac_srcs = mac_srcs.difference(srcs)
Mike Kleind505b192018-09-05 15:55:25 -0400348dm_srcs = strip_headers(dm_srcs)
349nanobench_srcs = strip_headers(nanobench_srcs)
Mike Klein27eb22b2016-12-07 12:27:56 -0500350
Derek Sollenberger5d3f7702018-02-01 09:22:53 -0500351cflags = gn_to_bp_utils.CleanupCFlags(cflags)
352cflags_cc = gn_to_bp_utils.CleanupCCFlags(cflags_cc)
Leon Scroggins III981a31e2017-10-06 11:53:53 -0400353
Leon Scroggins III4f8a4672016-12-19 09:32:21 -0500354here = os.path.dirname(__file__)
Derek Sollenberger5d3f7702018-02-01 09:22:53 -0500355defs = gn_to_bp_utils.GetArchSources(os.path.join(here, 'opts.gni'))
Mike Klein308b5ac2016-12-06 16:03:52 -0500356
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500357def get_defines(json):
358 return {str(d) for d in json['targets']['//:skia']['defines']}
359android_defines = get_defines(js)
360linux_defines = get_defines(js_linux)
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500361mac_defines = get_defines(js_mac)
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500362
363def mkdir_if_not_exists(path):
364 if not os.path.exists(path):
365 os.mkdir(path)
366mkdir_if_not_exists('include/config/android/')
367mkdir_if_not_exists('include/config/linux/')
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500368mkdir_if_not_exists('include/config/mac/')
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500369
370platforms = { 'IOS', 'MAC', 'WIN', 'ANDROID', 'UNIX' }
371
372def disallow_platforms(config, desired):
373 with open(config, 'a') as f:
374 p = sorted(platforms.difference({ desired }))
375 s = '#if '
376 for i in range(len(p)):
377 s = s + 'defined(SK_BUILD_FOR_%s)' % p[i]
378 if i < len(p) - 1:
379 s += ' || '
380 if i % 2 == 1:
381 s += '\\\n '
382 print >>f, s
383 print >>f, ' #error "Only SK_BUILD_FOR_%s should be defined!"' % desired
384 print >>f, '#endif'
385
386def append_to_file(config, s):
387 with open(config, 'a') as f:
388 print >>f, s
389
390android_config = 'include/config/android/SkUserConfig.h'
391gn_to_bp_utils.WriteUserConfig(android_config, android_defines)
392append_to_file(android_config, '''
393#ifndef SK_BUILD_FOR_ANDROID
394 #error "SK_BUILD_FOR_ANDROID must be defined!"
395#endif''')
396disallow_platforms(android_config, 'ANDROID')
397
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500398def write_config(config_path, defines, platform):
399 gn_to_bp_utils.WriteUserConfig(config_path, defines)
400 append_to_file(config_path, '''
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500401// Correct SK_BUILD_FOR flags that may have been set by
402// SkPreConfig.h/Android.bp
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500403#ifndef SK_BUILD_FOR_%s
404 #define SK_BUILD_FOR_%s
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500405#endif
406#ifdef SK_BUILD_FOR_ANDROID
407 #undef SK_BUILD_FOR_ANDROID
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500408#endif''' % (platform, platform))
409 disallow_platforms(config_path, platform)
410
411write_config('include/config/linux/SkUserConfig.h', linux_defines, 'UNIX')
412write_config('include/config/mac/SkUserConfig.h', mac_defines, 'MAC')
Mike Klein308b5ac2016-12-06 16:03:52 -0500413
Mike Kleinee43f6f2016-12-12 14:09:38 -0500414# Turn a list of strings into the style bpfmt outputs.
Leon Scroggins III6ccd2ca2017-01-26 17:21:27 -0500415def bpfmt(indent, lst, sort=True):
416 if sort:
417 lst = sorted(lst)
418 return ('\n' + ' '*indent).join('"%s",' % v for v in lst)
Mike Klein308b5ac2016-12-06 16:03:52 -0500419
420# OK! We have everything to fill in Android.bp...
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500421with open('Android.bp', 'w') as Android_bp:
422 print >>Android_bp, bp.substitute({
Mike Kleinee43f6f2016-12-12 14:09:38 -0500423 'export_includes': bpfmt(8, export_includes),
424 'local_includes': bpfmt(8, local_includes),
425 'srcs': bpfmt(8, srcs),
Leon Scroggins III981a31e2017-10-06 11:53:53 -0400426 'cflags': bpfmt(8, cflags, False),
427 'cflags_cc': bpfmt(8, cflags_cc),
Mike Klein308b5ac2016-12-06 16:03:52 -0500428
Mike Kleind505b192018-09-05 15:55:25 -0400429 'arm_srcs': bpfmt(16, strip_headers(defs['armv7'])),
430 'arm_neon_srcs': bpfmt(20, strip_headers(defs['neon'])),
431 'arm64_srcs': bpfmt(16, strip_headers(defs['arm64'] +
432 defs['crc32'])),
433 'none_srcs': bpfmt(16, strip_headers(defs['none'])),
434 'x86_srcs': bpfmt(16, strip_headers(defs['sse2'] +
435 defs['ssse3'] +
436 defs['sse41'] +
437 defs['sse42'] +
438 defs['avx' ] +
439 defs['hsw' ])),
Leon Scroggins III6ccd2ca2017-01-26 17:21:27 -0500440
Leon Scroggins III6ccd2ca2017-01-26 17:21:27 -0500441 'dm_includes' : bpfmt(8, dm_includes),
442 'dm_srcs' : bpfmt(8, dm_srcs),
443
444 'nanobench_includes' : bpfmt(8, nanobench_includes),
445 'nanobench_srcs' : bpfmt(8, nanobench_srcs),
Leon Scroggins IIIc41a5f52018-11-15 15:54:59 -0500446
447 'android_srcs': bpfmt(10, android_srcs),
448 'linux_srcs': bpfmt(10, linux_srcs),
Leon Scroggins III85e22fc2018-11-28 08:58:47 -0500449 'mac_srcs': bpfmt(10, mac_srcs),
Mike Klein308b5ac2016-12-06 16:03:52 -0500450 })