From 5d3f7704bf9f3b4a075dc55b6951eec6f574c333 Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Thu, 1 Feb 2018 09:22:53 -0500 Subject: Add gn_to_bp script for SkQP. This refactors the current gn_to_bp script and moves the common components into a utils class. Both gn_to_bp scripts now also accept an optional param (--gn ) to make it easier to run within the Android tree where we don't have the DEPS synced. Change-Id: Idc4de7b3993e63e21a5b7137b1873d82a8e1843e Reviewed-on: https://skia-review.googlesource.com/102184 Commit-Queue: Derek Sollenberger Reviewed-by: Mike Klein --- tools/skqp/gn_to_bp.py | 213 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 tools/skqp/gn_to_bp.py (limited to 'tools/skqp') diff --git a/tools/skqp/gn_to_bp.py b/tools/skqp/gn_to_bp.py new file mode 100644 index 0000000000..5f0ac9a26b --- /dev/null +++ b/tools/skqp/gn_to_bp.py @@ -0,0 +1,213 @@ +#!/usr/bin/env python +# +# Copyright 2016 Google Inc. +# +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Generate Android.bp for Skia from GN configuration. + +import argparse +import json +import os +import pprint +import string +import subprocess +import sys +import tempfile + +root_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), + os.pardir, os.pardir) +skia_gn_dir = os.path.join(root_dir, 'gn') +sys.path.insert(0, skia_gn_dir) + +import gn_to_bp_utils + +# First we start off with a template for Android.bp, +# with holes for source lists and include directories. +bp = string.Template('''// This file is autogenerated by tools/skqp/gn_to_bp.py. + +cc_library_shared { + name: "libskqp_app", + sdk_version: "26", + stl: "libc++_static", + tags: ["tests", "optional"], + + cflags: [ + $cflags + "-Wno-unused-parameter", + "-Wno-unused-variable", + ], + + cppflags:[ + $cflags_cc + ], + + local_include_dirs: [ + $local_includes + ], + + srcs: [ + $srcs + ], + + arch: { + arm: { + srcs: [ + $arm_srcs + ], + + neon: { + srcs: [ + $arm_neon_srcs + ], + }, + }, + + arm64: { + srcs: [ + $arm64_srcs + ], + }, + + mips: { + srcs: [ + $none_srcs + ], + }, + + mips64: { + srcs: [ + $none_srcs + ], + }, + + x86: { + srcs: [ + $x86_srcs + ], + cflags: [ + // Clang seems to think new/malloc will only be 4-byte aligned + // on x86 Android. We're pretty sure it's actually 8-byte + // alignment. tests/OverAlignedTest.cpp has more information, + // and should fail if we're wrong. + "-Wno-over-aligned" + ], + }, + + x86_64: { + srcs: [ + $x86_srcs + ], + }, + }, + + shared_libs: [ + "libandroid", + "libEGL", + "libGLESv2", + "liblog", + "libvulkan", + "libz", + ], + static_libs: [ + "libjpeg_static_ndk", + "libjsoncpp", + "libpng_ndk", + "libwebp-decode", + "libwebp-encode", + ] +}''') + +# We'll run GN to get the main source lists and include directories for Skia. +gn_args = { + 'is_debug': 'false', + 'target_cpu': '"none"', + 'target_os': '"android"', + 'ndk_api': '26', + + # setup vulkan + 'skia_use_vulkan': 'true', + 'skia_vulkan_header': '"Skia_Vulkan_Android.h"', + + # enable/disable skia subsystems + 'skia_enable_fontmgr_empty': 'true', + 'skia_enable_pdf': 'false', + 'skia_use_expat': 'false', + 'skia_use_dng_sdk': 'false', + 'skia_use_icu': 'false', + 'skia_use_lua': 'false', + 'skia_use_piex': 'false', + 'skia_use_skcms': 'false', + + # specify that the Android.bp will supply the necessary components + 'skia_use_system_expat': 'true', # removed this when gn is fixed + 'skia_use_system_libpng': 'true', + 'skia_use_system_jsoncpp': 'true', + 'skia_use_system_libwebp': 'true', + 'skia_use_system_libjpeg_turbo': 'true', + 'skia_use_system_zlib': 'true', +} + +js = gn_to_bp_utils.GenerateJSONFromGN(gn_args) + +def strip_slashes(lst): + return {str(p.lstrip('/')) for p in lst} + +srcs = strip_slashes(js['targets']['//:libskqp_app']['sources']) +cflags = strip_slashes(js['targets']['//:libskqp_app']['cflags']) +cflags_cc = strip_slashes(js['targets']['//:libskqp_app']['cflags_cc']) +local_includes = strip_slashes(js['targets']['//:libskqp_app']['include_dirs']) +defines = {str(d) for d in js['targets']['//:libskqp_app']['defines']} + +gn_to_bp_utils.GrabDependentValues(js, '//:libskqp_app', 'sources', srcs, None) +gn_to_bp_utils.GrabDependentValues(js, '//:libskqp_app', 'include_dirs', + local_includes, 'freetype') +gn_to_bp_utils.GrabDependentValues(js, '//:libskqp_app', 'defines', + defines, None) + +# No need to list headers or other extra flags. +srcs = {s for s in srcs if not s.endswith('.h')} +cflags = gn_to_bp_utils.CleanupCFlags(cflags) +cflags_cc = gn_to_bp_utils.CleanupCCFlags(cflags_cc) + +# We need to add the include path to the vulkan defines and header file set in +# then skia_vulkan_header gn arg that is used for framework builds. +local_includes.add("platform_tools/android/vulkan") + +# Get architecture specific source files +defs = gn_to_bp_utils.GetArchSources(os.path.join(skia_gn_dir, 'opts.gni')) + +# Add source file until fix lands in +# https://skia-review.googlesource.com/c/skia/+/101820 +srcs.add("src/ports/SkFontMgr_empty_factory.cpp") + +# Turn a list of strings into the style bpfmt outputs. +def bpfmt(indent, lst, sort=True): + if sort: + lst = sorted(lst) + return ('\n' + ' '*indent).join('"%s",' % v for v in lst) + +# Most defines go into SkUserConfig.h, where they're seen by Skia and its users. +gn_to_bp_utils.WriteUserConfig('include/config/SkUserConfig.h', defines) + +# OK! We have everything to fill in Android.bp... +with open('Android.bp', 'w') as f: + print >>f, bp.substitute({ + 'local_includes': bpfmt(8, local_includes), + 'srcs': bpfmt(8, srcs), + 'cflags': bpfmt(8, cflags, False), + 'cflags_cc': bpfmt(8, cflags_cc), + + 'arm_srcs': bpfmt(16, defs['armv7']), + 'arm_neon_srcs': bpfmt(20, defs['neon']), + 'arm64_srcs': bpfmt(16, defs['arm64'] + + defs['crc32']), + 'none_srcs': bpfmt(16, defs['none']), + 'x86_srcs': bpfmt(16, defs['sse2'] + + defs['ssse3'] + + defs['sse41'] + + defs['sse42'] + + defs['avx' ]), + }) + -- cgit v1.2.3