gecko-dev/gfx/skia/generate_mozbuild.py
Tom Ritter 6499172d8e Bug 1364560 Add support for disabling Skia Jumper assembly code r=lsalzman
The assembly code is not working in the MinGW build, so we
rebase and pull in the upstream commit that adds support for
not using the optimized jumper assembly code.

https://skia.googlesource.com/skia/+/6492afa7971cf295a3c3cb92a85218917c02bb4a

MozReview-Commit-ID: CARHRTHmQ0i

--HG--
extra : rebase_source : c6d9f19f8742a337e6ab3342d34118f37da71ae7
2017-09-25 23:02:35 -05:00

477 lines
14 KiB
Python
Executable File

#!/usr/bin/env python
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['_MSC_VER']:
skia_opt_flags += ['-O2']
elif CONFIG['GNU_CC']:
skia_opt_flags += ['-O3']
"""
footer = """
# We allow warnings for third-party code that can be updated from upstream.
ALLOW_COMPILER_WARNINGS = True
FINAL_LIBRARY = 'gkmedias'
LOCAL_INCLUDES += [
'skia/include/c',
'skia/include/config',
'skia/include/core',
'skia/include/effects',
'skia/include/gpu',
'skia/include/pathops',
'skia/include/ports',
'skia/include/private',
'skia/include/utils',
'skia/include/utils/mac',
'skia/include/views',
'skia/src/core',
'skia/src/gpu',
'skia/src/gpu/effects',
'skia/src/gpu/gl',
'skia/src/gpu/glsl',
'skia/src/image',
'skia/src/lazy',
'skia/src/opts',
'skia/src/sfnt',
'skia/src/sksl',
'skia/src/utils',
'skia/src/utils/mac',
'skia/src/utils/win',
]
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
if CONFIG['CC_TYPE'] == 'gcc':
DEFINES['SK_JUMPER_USE_ASSEMBLY'] = False
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'] and (CONFIG['GNU_CC'] or CONFIG['CLANG_CL']):
SOURCES['skia/src/opts/SkBitmapProcState_opts_SSE2.cpp'].flags += CONFIG['SSE2_FLAGS']
SOURCES['skia/src/opts/SkBitmapProcState_opts_SSSE3.cpp'].flags += ['-mssse3']
SOURCES['skia/src/opts/SkBlitRow_opts_SSE2.cpp'].flags += CONFIG['SSE2_FLAGS']
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']
elif CONFIG['_MSC_VER']:
# MSVC doesn't need special compiler flags, but Skia needs to be told that these files should
# be built with the required SSE level or it will simply compile in stubs and cause runtime crashes
SOURCES['skia/src/opts/SkBitmapProcState_opts_SSE2.cpp'].flags += ['-DSK_CPU_SSE_LEVEL=20']
SOURCES['skia/src/opts/SkBitmapProcState_opts_SSSE3.cpp'].flags += ['-DSK_CPU_SSE_LEVEL=31']
SOURCES['skia/src/opts/SkBlitRow_opts_SSE2.cpp'].flags += ['-DSK_CPU_SSE_LEVEL=20']
SOURCES['skia/src/opts/SkOpts_ssse3.cpp'].flags += ['-DSK_CPU_SSE_LEVEL=31']
SOURCES['skia/src/opts/SkOpts_sse41.cpp'].flags += ['-DSK_CPU_SSE_LEVEL=41']
SOURCES['skia/src/opts/SkOpts_sse42.cpp'].flags += ['-DSK_CPU_SSE_LEVEL=42']
SOURCES['skia/src/opts/SkOpts_avx.cpp'].flags += ['-DSK_CPU_SSE_LEVEL=51']
SOURCES['skia/src/opts/SkOpts_hsw.cpp'].flags += ['-DSK_CPU_SSE_LEVEL=52']
elif CONFIG['CPU_ARCH'] == 'arm' and CONFIG['GNU_CC']:
CXXFLAGS += CONFIG['NEON_FLAGS']
elif CONFIG['CPU_ARCH'] == 'aarch64' and CONFIG['GNU_CC']:
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 not CONFIG['MOZ_ENABLE_SKIA_GPU']:
DEFINES['SK_SUPPORT_GPU'] = 0
if CONFIG['MOZ_TREE_FREETYPE']:
DEFINES['SK_CAN_USE_DLOPEN'] = 0
# Suppress warnings in third-party code.
if CONFIG['GNU_CXX'] or CONFIG['CLANG_CL']:
CXXFLAGS += [
'-Wno-deprecated-declarations',
'-Wno-overloaded-virtual',
'-Wno-shadow',
'-Wno-sign-compare',
'-Wno-unreachable-code',
'-Wno-unused-function',
]
if CONFIG['GNU_CXX'] and not CONFIG['CLANG_CXX'] and not CONFIG['CLANG_CL']:
CXXFLAGS += [
'-Wno-logical-op',
'-Wno-maybe-uninitialized',
]
if CONFIG['CLANG_CXX'] or CONFIG['CLANG_CL']:
CXXFLAGS += [
'-Wno-implicit-fallthrough',
'-Wno-inconsistent-missing-override',
'-Wno-macro-redefined',
'-Wno-unused-private-field',
]
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3', 'android'):
CXXFLAGS += CONFIG['MOZ_CAIRO_CFLAGS']
CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
if CONFIG['MOZ_WIDGET_TOOLKIT'] in ('gtk2', 'gtk3'):
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:
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))
return opt_sources
def generate_platform_sources():
sources = {}
for plat in platforms:
output = subprocess.check_output('cd skia && bin/gn gen out/{0} --args=\'target_os="{0}"\' > /dev/null && bin/gn desc out/{0} :skia sources'.format(plat), shell=True)
if output:
sources[plat] = parse_sources(output)
deps = {':effects' : 'common', ':gpu' : 'gpu', ':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 = [
'GrGLCreateNativeInterface',
'GrGLCreateNullInterface',
'GrGLAssembleInterface',
'GrGLTestInterface',
'ImageEncoder',
'skia/src/c/',
'skia/src/effects/Gr',
'skia/src/effects/Sk',
'skia/src/fonts/',
'skia/src/images/',
'skia/src/jumper/SkJumper_generated_win.S',
'skia/src/ports/SkImageGenerator',
'skia/src/gpu/vk/',
'SkBitmapRegion',
'SkLight',
'SkRadialShadow',
'SkShadow',
'SkNormal',
'SkLite',
'codec',
'SkWGL',
'SkMemory_malloc',
'third_party',
'SkCamera',
'SkCanvasStack',
'SkCanvasStateUtils',
'SkCurveMeasure',
'SkDeferredCanvas',
'SkDumpCanvas',
'SkFrontBufferedStream',
'SkInterpolator',
'SkMD5',
'SkMultiPictureDocument',
'SkNullCanvas',
'SkNWayCanvas',
'SkOverdrawCanvas',
'SkPaintFilterCanvas',
'SkParseColor',
'SkTextBox',
'SkWhitelistTypefaces',
'SkXPS',
'SkCreateCGImageRef',
]
def isblacklisted(value):
for item in blacklist:
if value.find(item) >= 0:
return True
return False
separated = defaultdict(set, {
'common': {
'skia/src/core/SkBlurImageFilter.cpp',
'skia/src/core/SkGpuBlurUtils.cpp',
'skia/src/effects/SkDashPathEffect.cpp',
'skia/src/effects/SkImageSource.cpp',
'skia/src/effects/SkLayerRasterizer.cpp',
'skia/src/gpu/gl/GrGLCreateNativeInterface_none.cpp',
'skia/src/ports/SkDiscardableMemory_none.cpp',
'skia/src/ports/SkMemory_mozalloc.cpp',
'skia/src/ports/SkImageEncoder_none.cpp',
'skia/src/ports/SkImageGenerator_none.cpp',
},
'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',
},
'no-mingw': {
'skia/src/jumper/SkJumper_generated_win.S',
},
'intel': set(),
'arm': set(),
'arm64': set(),
'none': set(),
'pdf': {
'skia/src/core/SkMD5.cpp',
},
'gpu': 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 = [
'skia/src/opts/Sk',
'SkOpts',
'SkBitmapProcState',
'SkBlitMask',
'SkBlitRow',
'SkBlitter',
'SkSpriteBlitter',
'SkMatrix.cpp',
]
# Unfortunately for now the gpu and pathops directories are
# non-unifiable. Keep track of this and fix it.
unified_blacklist = [
'FontHost',
'SkAdvancedTypefaceMetrics',
'SkBitmapProcState_matrixProcs.cpp',
'SkBlitter_A8.cpp',
'SkBlitter_ARGB32.cpp',
'SkBlitter_RGB16.cpp',
'SkBlitter_Sprite.cpp',
'SkScan_Antihair.cpp',
'SkScan_AntiPath.cpp',
'SkParse.cpp',
'SkPDFFont.cpp',
'SkPictureData.cpp',
'GrResourceCache',
'GrResourceProvider',
'GrAA',
'GrGL',
'GrMSAAPathRenderer.cpp',
'GrNonAAFillRect',
'GrPathUtils',
'GrShadowRRectOp',
'SkColorSpace',
'SkImage_Gpu.cpp',
'SkPathOpsDebug.cpp',
'SkParsePath.cpp',
'SkRecorder.cpp',
'SkMiniRecorder.cpp',
'SkXfermode',
'SkMatrix44.cpp',
'SkRTree.cpp',
'SkVertices.cpp',
'SkJumper',
'lex.layout.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_ENABLE_SKIA_GPU']:\n")
write_sources(f, sources['gpu'], 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'] in ('gtk2', 'gtk3'):\n")
write_sources(f, sources['linux'], 4)
f.write("if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':\n")
f.write(" if CONFIG['CC_TYPE'] != 'gcc':\n")
write_list(f, "SOURCES", sources['no-mingw'], 8)
# Windows-specific files don't get unification because of nasty headers.
# Luckily there are not many files in this.
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)
f.write("elif CONFIG['CPU_ARCH'] == 'arm' and CONFIG['GNU_CC']:\n")
write_sources(f, sources['arm'], 4)
write_cflags(f, sources['arm'], opt_whitelist, 'skia_opt_flags', 4)
f.write("elif CONFIG['CPU_ARCH'] == 'aarch64' and CONFIG['GNU_CC']:\n")
write_sources(f, sources['arm64'], 4)
write_cflags(f, sources['arm64'], opt_whitelist, 'skia_opt_flags', 4)
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()