skia2/tools/check-headers-self-sufficient
Mike Klein f2526331b4 move SFDot6 inverse table into SkAnalyticEdge
The 8K table in SkFDot6Constants.cpp is only used by SkAnalyticEdge and
its unit test, so to help LTO trim this when SkAnalyticEdge isn't used,
move it to SkAnalyticEdge.cpp and delete the unit test.  (I suspect the
table is never going to change.)

I've also moved setLine() out-of-line into SkAnalyticEdge.cpp to make
this work, and done a little bit of refactoring and renaming.

Change-Id: If1d234f387d100dd58d8860dccac000e5493a2c1
Reviewed-on: https://skia-review.googlesource.com/c/164182
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
2018-10-22 15:22:55 +00:00

180 lines
4.8 KiB
Python
Executable File

#!/usr/bin/env python
# Copyright 2017 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import fnmatch
import multiprocessing
import os
import subprocess
import sys
'''
If called with arguments, this script will verify that those headers are
self-sufficient and idempotent.
Otherwise, test all checked-in headers except for those in the ignore list.
'''
public_header_args = [
'-Iinclude/core',
'-Iinclude/config',
'-Iinclude/android',
'-Iinclude/codec',
'-Iinclude/effects',
'-Iinclude/gpu',
'-Iinclude/gpu/gl',
'-Iinclude/pathops',
'-Iinclude/ports',
'-Iinclude/private',
'-Iinclude/svg',
'-Iinclude/utils',
'-Iinclude/utils/mac',
'-Iinclude/views',
'-Ithird_party/vulkan',
]
all_header_args = [
'-Iinclude/core',
'-Iinclude/config',
'-Iinclude/android',
'-Iinclude/c',
'-Iinclude/codec',
'-Iinclude/effects',
'-Iinclude/gpu',
'-Iinclude/gpu/gl',
'-Iinclude/pathops',
'-Iinclude/ports',
'-Iinclude/private',
'-Iinclude/svg',
'-Iinclude/utils',
'-Iinclude/utils/mac',
'-Iinclude/views',
'-Isrc/codec',
'-Isrc/core',
'-Isrc/effects',
'-Isrc/effects/gradients',
'-Isrc/fonts',
'-Isrc/gpu',
'-Isrc/image',
'-Isrc/images',
'-Isrc/lazy',
'-Isrc/opts',
'-Isrc/pathops',
'-Isrc/ports',
'-Isrc/sfnt',
'-Isrc/shaders',
'-Isrc/sksl',
'-Isrc/utils',
'-Isrc/utils/win',
'-Isrc/xml',
'-Igm',
'-Itests',
'-Itools',
'-Itools/debugger',
'-Itools/flags',
'-Itools/gpu',
'-Itools/timer',
'-Ithird_party/externals/jsoncpp/include',
'-Ithird_party/externals/libjpeg-turbo',
'-Ithird_party/externals/sfntly/cpp/src',
'-Ithird_party/externals/zlib',
'-Ithird_party/gif',
'-Ithird_party/vulkan',
]
ignore = [
'*/lex.*.h',
'*/osmesa_wrapper.h',
'debugger/QT/*',
'example/*',
'experimental/*',
'include/config/*',
'include/core/SkPostConfig.h',
'include/gpu/vk/*',
'include/ports/SkFontMgr_android.h',
'include/ports/SkFontMgr_fontconfig.h',
'include/ports/SkTypeface_win.h',
'include/private/*_impl.h',
'include/utils/mac/SkCGUtils.h',
'include/views/SkOSWindow_*.h',
'src/c/sk_c_from_to.h',
'src/core/*Template.h',
'src/core/SkBitmapProcState_*.h',
'src/core/SkLinearBitmapPipeline.h',
'src/core/SkLinearBitmapPipeline_*.h',
'src/core/SkUnPreMultiplyPriv.h',
'src/gpu/vk/*',
'src/opts/*_SSE2.h',
'src/opts/*_SSSE3.h',
'src/opts/*_neon.h',
'src/opts/*_sse.h',
'src/opts/Sk4px_*.h',
'src/ports/*',
'src/utils/*_win.h',
'src/utils/win/*',
'src/views/*',
'third_party/*',
'tools/fiddle/*',
'tools/viewer/*',
]
# test header for self-sufficiency and idempotency.
# Returns a string containing errors, or None iff there are no errors.
def compile_header(header):
args = ([] if fnmatch.fnmatch(header, 'include/c/*') else
public_header_args if fnmatch.fnmatch(header, 'include/*') else
all_header_args)
cmd = ['c++', '--std=c++14'] + args + [ '-o', '/dev/null', '-c', '-x', 'c++', '-']
proc = subprocess.Popen(cmd, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
proc.stdin.write('#include "%s"\n#include "%s"\n' % (header, header))
proc.stdin.close()
errors = proc.stdout.read().strip()
if proc.wait() != 0 or len(errors) > 0:
return '\n\033[7m ERROR: %s \033[0m\n%s\n\n' % (header, errors)
return None
# for h in headers:
# compile_header(h)
# ...Except use a multiprocessing pool.
# Exit at first error.
def compile_headers(headers):
class N: good = True
# N.good is a global scoped to this function to make a print_and_exit_if() a closure
pool = multiprocessing.Pool()
def print_and_exit_if(r):
if r is not None:
sys.stdout.write(r)
N.good = False
pool.terminate()
for path in headers:
assert os.path.exists(path)
pool.apply_async(compile_header, args=(path, ), callback=print_and_exit_if)
pool.close()
pool.join()
if N.good:
sys.stdout.write('all good :)\n')
else:
exit(1)
def main(argv):
skia_dir = os.path.join(os.path.dirname(__file__), os.pardir)
if len(argv) > 1:
paths = [os.path.relpath(os.path.abspath(arg), skia_dir) for arg in argv[1:]]
os.chdir(skia_dir)
else:
os.chdir(skia_dir)
paths = [path for path in subprocess.check_output(['git', 'ls-files']).splitlines()
if path.endswith('.h')
and not any(fnmatch.fnmatch(path, pattern) for pattern in ignore)]
compile_headers(paths)
if __name__ == '__main__':
main(sys.argv)