#!/usr/bin/env python from __future__ import print_function import locale import subprocess from collections import defaultdict locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') header = """ # # ##### ####### # # # # # # # ## # # # # # # # # # # # # # ## # # # # # # # # # # # # ## #### # # # # # # # # # # # ## # # # ####### # # # ####### # ### # ## # # # # # # # # # # # ### # # ##### ####### # # ## ## # # # ### # # Seriously. You shouldn't even be looking at this file unless you're # debugging generate_mozbuild.py. # # DO NOT MODIFY THIS FILE IT IS AUTOGENERATED. # skia_opt_flags = [] if CONFIG['MOZ_OPTIMIZE']: if CONFIG['CC_TYPE'] == 'clang-cl': skia_opt_flags += ['-O2'] elif CONFIG['CC_TYPE'] in ('clang', 'gcc'): skia_opt_flags += ['-O3'] """ footer = """ # We allow warnings for third-party code that can be updated from upstream. AllowCompilerWarnings() FINAL_LIBRARY = 'gkmedias' LOCAL_INCLUDES += [ 'skia', 'skia/include/third_party/skcms', ] if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows': DEFINES['UNICODE'] = True DEFINES['_UNICODE'] = True UNIFIED_SOURCES += [ 'skia/src/fonts/SkFontMgr_indirect.cpp', 'skia/src/fonts/SkRemotableFontMgr.cpp', ] # We should autogenerate these SSE related flags. if CONFIG['INTEL_ARCHITECTURE']: SOURCES['skia/src/opts/SkOpts_ssse3.cpp'].flags += ['-mssse3'] SOURCES['skia/src/opts/SkOpts_sse41.cpp'].flags += ['-msse4.1'] SOURCES['skia/src/opts/SkOpts_sse42.cpp'].flags += ['-msse4.2'] SOURCES['skia/src/opts/SkOpts_avx.cpp'].flags += ['-mavx'] SOURCES['skia/src/opts/SkOpts_hsw.cpp'].flags += ['-mavx2', '-mf16c', '-mfma'] elif CONFIG['CPU_ARCH'] == 'arm' and CONFIG['CC_TYPE'] in ('clang', 'gcc'): CXXFLAGS += CONFIG['NEON_FLAGS'] elif CONFIG['CPU_ARCH'] == 'aarch64' and CONFIG['CC_TYPE'] in ('clang', 'gcc'): SOURCES['skia/src/opts/SkOpts_crc32.cpp'].flags += ['-march=armv8-a+crc'] DEFINES['SKIA_IMPLEMENTATION'] = 1 if CONFIG['MOZ_ENABLE_SKIA_PDF_SFNTLY']: DEFINES['SK_PDF_USE_SFNTLY'] = 1 if CONFIG['MOZ_TREE_FREETYPE']: DEFINES['SK_CAN_USE_DLOPEN'] = 0 # Reduce strength of synthetic-emboldening used in the freetype backend # (see bug 1600470). DEFINES['SK_OUTLINE_EMBOLDEN_DIVISOR'] = 48 # Suppress warnings in third-party code. CXXFLAGS += [ '-Wno-deprecated-declarations', '-Wno-overloaded-virtual', '-Wno-shadow', '-Wno-sign-compare', '-Wno-unreachable-code', '-Wno-unused-function', ] if CONFIG['CC_TYPE'] == 'gcc': CXXFLAGS += [ '-Wno-logical-op', '-Wno-maybe-uninitialized', ] if CONFIG['CC_TYPE'] in ('clang', 'clang-cl'): CXXFLAGS += [ '-Wno-implicit-fallthrough', '-Wno-inconsistent-missing-override', '-Wno-macro-redefined', '-Wno-unused-private-field', ] if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk', 'android'): CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS'] CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS'] if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk': CXXFLAGS += CONFIG['MOZ_PANGO_CFLAGS'] if CONFIG['MOZ_ENABLE_SKIA_PDF_SFNTLY']: LOCAL_INCLUDES += CONFIG['SFNTLY_INCLUDES'] """ import json platforms = ['linux', 'mac', 'android', 'win'] def parse_sources(output): return set(v.replace('//', 'skia/') for v in output.split() if v.endswith('.cpp') or v.endswith('.S')) def generate_opt_sources(): cpus = [('intel', 'x86', [':sse2', ':ssse3', ':sse41', ':sse42', ':avx', ':hsw']), ('arm', 'arm', [':armv7']), ('arm64', 'arm64', [':arm64', ':crc32']), ('none', 'none', [':none'])] opt_sources = {} for key, cpu, deps in cpus: subprocess.check_output('cd skia && bin/gn gen out/{0} --args=\'target_cpu="{1}"\''.format(key, cpu), shell=True) opt_sources[key] = set() for dep in deps: try: output = subprocess.check_output('cd skia && bin/gn desc out/{0} {1} sources'.format(key, dep), shell=True) if output: opt_sources[key].update(parse_sources(output)) except subprocess.CalledProcessError as e: if e.output.find('source_set') < 0: raise return opt_sources def generate_platform_sources(): sources = {} platform_args = { 'win' : 'win_vc="C:/" win_sdk_version="00.0.00000.0" win_toolchain_version="00.00.00000"' } for plat in platforms: args = platform_args.get(plat, '') output = subprocess.check_output('cd skia && bin/gn gen out/{0} --args=\'target_os="{0}" {1}\' > /dev/null && bin/gn desc out/{0} :skia sources'.format(plat, args), shell=True) if output: sources[plat] = parse_sources(output) plat_deps = {':fontmgr_win' : 'win', ':fontmgr_win_gdi' : 'win'} for dep, key in plat_deps.items(): output = subprocess.check_output('cd skia && bin/gn desc out/{1} {0} sources'.format(dep, key), shell=True) if output: sources[key].update(parse_sources(output)) deps = {':pdf' : 'pdf'} for dep, key in deps.items(): output = subprocess.check_output('cd skia && bin/gn desc out/linux {} sources'.format(dep), shell=True) if output: sources[key] = parse_sources(output) return dict(sources.items() + generate_opt_sources().items()) def generate_separated_sources(platform_sources): blacklist = [ 'skia/src/android/', 'skia/src/atlastext/', 'skia/src/c/', 'skia/src/effects/', 'skia/src/fonts/', 'skia/src/ports/SkImageEncoder', 'skia/src/ports/SkImageGenerator', 'SkBitmapRegion', 'SkLite', 'SkLight', 'SkNormal', 'codec', 'SkWGL', 'SkMemory_malloc', 'third_party', 'Sk3D', 'SkAnimCodecPlayer', 'SkCamera', 'SkCanvasStack', 'SkCanvasStateUtils', 'SkFrontBufferedStream', 'SkInterpolator', 'JSON', 'SkMultiPictureDocument', 'SkNullCanvas', 'SkNWayCanvas', 'SkOverdrawCanvas', 'SkPaintFilterCanvas', 'SkParseColor', 'SkWhitelistTypefaces', 'SkXPS', 'SkCreateCGImageRef', 'skia/src/ports/SkGlobalInitialization', ] def isblacklisted(value): for item in blacklist: if value.find(item) >= 0: return True return False separated = defaultdict(set, { 'common': { 'skia/src/codec/SkMasks.cpp', 'skia/src/effects/imagefilters/SkBlurImageFilter.cpp', 'skia/src/effects/imagefilters/SkComposeImageFilter.cpp', 'skia/src/effects/SkDashPathEffect.cpp', 'skia/src/ports/SkDiscardableMemory_none.cpp', 'skia/src/ports/SkGlobalInitialization_default.cpp', 'skia/src/ports/SkMemory_mozalloc.cpp', 'skia/src/ports/SkImageGenerator_none.cpp', 'skia/third_party/skcms/skcms.cc', }, 'android': { # 'skia/src/ports/SkDebug_android.cpp', 'skia/src/ports/SkFontHost_cairo.cpp', # 'skia/src/ports/SkFontHost_FreeType.cpp', 'skia/src/ports/SkFontHost_FreeType_common.cpp', # 'skia/src/ports/SkTime_Unix.cpp', # 'skia/src/utils/SkThreadUtils_pthread.cpp', }, 'linux': { 'skia/src/ports/SkFontHost_cairo.cpp', 'skia/src/ports/SkFontHost_FreeType_common.cpp', }, 'intel': set(), 'arm': set(), 'arm64': set(), 'none': set(), 'pdf': set() }) for plat in platform_sources.keys(): for value in platform_sources[plat]: if isblacklisted(value): continue if value in separated['common']: continue key = plat if all(value in platform_sources.get(p, {}) for p in platforms if p != plat): key = 'common' separated[key].add(value) return separated def uniq(seq): seen = set() seen_add = seen.add return [ x for x in seq if x not in seen and not seen_add(x)] def write_cflags(f, values, subsearch, cflag, indent): def write_indent(indent): for _ in range(indent): f.write(' ') if isinstance(subsearch, str): subsearch = [ subsearch ] def iswhitelisted(value): for item in subsearch: if value.find(item) >= 0: return True return False val_list = uniq(sorted(values, key=lambda x: x.lower())) if len(val_list) == 0: return for val in val_list: if iswhitelisted(val): write_indent(indent) f.write("SOURCES[\'" + val + "\'].flags += " + cflag + "\n") opt_whitelist = [ 'SkOpts', 'SkBitmapProcState', 'SkBitmapScaler', 'SkBlitRow', 'SkBlitter', 'SkSpriteBlitter', 'SkMatrix.cpp', 'skcms', ] # Unfortunately for now the gpu and pathops directories are # non-unifiable. Keep track of this and fix it. unified_blacklist = [ 'FontHost', 'SkBitmapProcState_matrixProcs.cpp', 'SkBlitter_A8.cpp', 'SkBlitter_ARGB32.cpp', 'SkBlitter_RGB16.cpp', 'SkBlitter_Sprite.cpp', 'SkScan_Antihair.cpp', 'SkScan_AntiPath.cpp', 'SkScan_DAAPath.cpp', 'SkParse.cpp', 'SkPDFFont.cpp', 'SkPDFDevice.cpp', 'SkPDFType1Font.cpp', 'SkPictureData.cpp', 'SkColorSpace', 'SkPathOpsDebug.cpp', 'SkParsePath.cpp', 'SkRecorder.cpp', 'SkMiniRecorder.cpp', 'SkXfermode', 'SkMatrix44.cpp', 'SkRTree.cpp', 'SkVertices.cpp', 'SkSLHCodeGenerator.cpp', 'SkSLLexer.cpp', ] + opt_whitelist def write_sources(f, values, indent): def isblacklisted(value): for item in unified_blacklist: if value.find(item) >= 0: return True return False sources = {} sources['nonunified'] = set() sources['unified'] = set() for item in values: if isblacklisted(item): sources['nonunified'].add(item) else: sources['unified'].add(item) write_list(f, "UNIFIED_SOURCES", sources['unified'], indent) write_list(f, "SOURCES", sources['nonunified'], indent) def write_list(f, name, values, indent): def write_indent(indent): for _ in range(indent): f.write(' ') val_list = uniq(sorted(values, key=lambda x: x.lower())) if len(val_list) == 0: return write_indent(indent) f.write(name + ' += [\n') for val in val_list: write_indent(indent + 4) f.write('\'' + val + '\',\n') write_indent(indent) f.write(']\n') def write_mozbuild(sources): filename = 'moz.build' f = open(filename, 'w') f.write(header) write_sources(f, sources['common'], 0) write_cflags(f, sources['common'], opt_whitelist, 'skia_opt_flags', 0) f.write("if CONFIG['MOZ_ENABLE_SKIA_PDF']:\n") write_sources(f, sources['pdf'], 4) f.write("if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':\n") write_sources(f, sources['android'], 4) f.write("if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('cocoa', 'uikit'):\n") write_sources(f, sources['mac'], 4) f.write("if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk':\n") write_sources(f, sources['linux'], 4) f.write("if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':\n") write_list(f, "SOURCES", sources['win'], 4) f.write("if CONFIG['INTEL_ARCHITECTURE']:\n") write_sources(f, sources['intel'], 4) write_cflags(f, sources['intel'], opt_whitelist, 'skia_opt_flags', 4) if sources['arm']: f.write("elif CONFIG['CPU_ARCH'] == 'arm' and CONFIG['CC_TYPE'] in ('clang', 'gcc'):\n") write_sources(f, sources['arm'], 4) write_cflags(f, sources['arm'], opt_whitelist, 'skia_opt_flags', 4) if sources['arm64']: f.write("elif CONFIG['CPU_ARCH'] == 'aarch64':\n") write_sources(f, sources['arm64'], 4) write_cflags(f, sources['arm64'], opt_whitelist, 'skia_opt_flags', 4) if sources['none']: f.write("else:\n") write_sources(f, sources['none'], 4) f.write(footer) f.close() print('Wrote ' + filename) def main(): platform_sources = generate_platform_sources() separated_sources = generate_separated_sources(platform_sources) write_mozbuild(separated_sources) if __name__ == '__main__': main()