зеркало из https://github.com/mozilla/gecko-dev.git
424 строки
12 KiB
Python
Executable File
424 строки
12 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['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
|
|
|
|
DEFINES['SK_PDF_USE_HARFBUZZ_SUBSETTING'] = 1
|
|
|
|
if CONFIG['MOZ_TREE_FREETYPE']:
|
|
DEFINES['SK_CAN_USE_DLOPEN'] = 0
|
|
|
|
# Suppress warnings in third-party code.
|
|
CXXFLAGS += [
|
|
'-Wno-deprecated-declarations',
|
|
'-Wno-overloaded-virtual',
|
|
'-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'):
|
|
LOCAL_INCLUDES += [
|
|
"/gfx/cairo/cairo/src",
|
|
]
|
|
CXXFLAGS += CONFIG['CAIRO_FT_CFLAGS']
|
|
|
|
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gtk':
|
|
CXXFLAGS += CONFIG['MOZ_PANGO_CFLAGS']
|
|
"""
|
|
|
|
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):
|
|
ignorelist = [
|
|
'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',
|
|
'skia/src/sksl/SkSLJIT',
|
|
]
|
|
|
|
def isignorelisted(value):
|
|
for item in ignorelist:
|
|
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',
|
|
'skia/src/core/SkBitmapScaler.cpp',
|
|
'skia/src/core/SkGlyphBuffer.cpp',
|
|
'skia/src/core/SkConvolver.cpp',
|
|
'skia/src/core/SkImageFilterTypes.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',
|
|
},
|
|
'win': set (),
|
|
'intel': set(),
|
|
'arm': set(),
|
|
'arm64': set(),
|
|
'none': set(),
|
|
'pdf': set()
|
|
})
|
|
|
|
for plat in platform_sources.keys():
|
|
for value in platform_sources[plat]:
|
|
if isignorelisted(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 isallowlisted(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 isallowlisted(val):
|
|
write_indent(indent)
|
|
f.write("SOURCES[\'" + val + "\'].flags += " + cflag + "\n")
|
|
|
|
opt_allowlist = [
|
|
'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_ignorelist = [
|
|
'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_allowlist
|
|
|
|
def write_sources(f, values, indent):
|
|
def isignorelisted(value):
|
|
for item in unified_ignorelist:
|
|
if value.find(item) >= 0:
|
|
return True
|
|
|
|
return False
|
|
|
|
sources = {}
|
|
sources['nonunified'] = set()
|
|
sources['unified'] = set()
|
|
|
|
for item in values:
|
|
if isignorelisted(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_allowlist, '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_allowlist, '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_allowlist, '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_allowlist, '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()
|