133 lines
3.3 KiB
Python
Executable File
133 lines
3.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright 2021 The Chromium Authors
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import argparse
|
|
|
|
from util import build_utils
|
|
from util import diff_utils
|
|
|
|
IGNORE_FLAG_PREFIXES = [
|
|
# For cflags.
|
|
'-DANDROID_NDK_VERSION_ROLL',
|
|
'-DCR_LIBCXX_REVISION',
|
|
'-I',
|
|
'-g',
|
|
'-fcrash-diagnostics-dir=',
|
|
'-fprofile',
|
|
'--no-system-header-prefix',
|
|
'--system-header-prefix',
|
|
'-isystem',
|
|
'-iquote',
|
|
'-fmodule-map',
|
|
'-frandom-seed',
|
|
'-c ',
|
|
'-o ',
|
|
'-fmodule-name=',
|
|
'--sysroot=',
|
|
'-fcolor-diagnostics',
|
|
'-MF ',
|
|
'-MD',
|
|
|
|
# For ldflags.
|
|
'-Wl,--thinlto-cache-dir',
|
|
'-Wl,--thinlto-cache-policy',
|
|
'-Wl,--thinlto-jobs',
|
|
'-Wl,--start-lib',
|
|
'-Wl,--end-lib',
|
|
'-Wl,-whole-archive',
|
|
'-Wl,-no-whole-archive',
|
|
'-l',
|
|
'-L',
|
|
'-Wl,-soname',
|
|
'-Wl,-version-script',
|
|
'-Wl,--version-script',
|
|
'-fdiagnostics-color',
|
|
'-Wl,--color-diagnostics',
|
|
'-B',
|
|
'-Wl,--dynamic-linker',
|
|
'-DCR_CLANG_REVISION=',
|
|
]
|
|
|
|
FLAGS_WITH_PARAMS = (
|
|
'-Xclang',
|
|
'-mllvm',
|
|
'-Xclang -fdebug-compilation-dir',
|
|
'-Xclang -add-plugin',
|
|
)
|
|
|
|
|
|
def KeepFlag(flag):
|
|
return not any(flag.startswith(prefix) for prefix in IGNORE_FLAG_PREFIXES)
|
|
|
|
|
|
def MergeFlags(flags):
|
|
flags = _MergeFlagsHelper(flags)
|
|
# For double params eg: -Xclang -fdebug-compilation-dir
|
|
flags = _MergeFlagsHelper(flags)
|
|
return flags
|
|
|
|
|
|
def _MergeFlagsHelper(flags):
|
|
merged_flags = []
|
|
while flags:
|
|
current_flag = flags.pop(0)
|
|
if flags:
|
|
next_flag = flags[0]
|
|
else:
|
|
next_flag = None
|
|
merge_flags = False
|
|
|
|
# Special case some flags that always come with params.
|
|
if current_flag in FLAGS_WITH_PARAMS:
|
|
merge_flags = True
|
|
# Assume flags without '-' are a param.
|
|
if next_flag and not next_flag.startswith('-'):
|
|
merge_flags = True
|
|
# Special case -plugin-arg prefix because it has the plugin name.
|
|
if current_flag.startswith('-Xclang -plugin-arg'):
|
|
merge_flags = True
|
|
if merge_flags:
|
|
merged_flag = '{} {}'.format(current_flag, next_flag)
|
|
merged_flags.append(merged_flag)
|
|
flags.pop(0)
|
|
else:
|
|
merged_flags.append(current_flag)
|
|
return merged_flags
|
|
|
|
|
|
def ParseFlags(flag_file_path):
|
|
flags = []
|
|
with open(flag_file_path) as f:
|
|
for flag in f.read().splitlines():
|
|
if KeepFlag(flag):
|
|
flags.append(flag)
|
|
return flags
|
|
|
|
|
|
def main():
|
|
"""Compare the flags with the checked in list."""
|
|
parser = argparse.ArgumentParser()
|
|
diff_utils.AddCommandLineFlags(parser)
|
|
parser.add_argument('--current-flags',
|
|
help='Path to flags to check against expectations.')
|
|
options = parser.parse_args()
|
|
|
|
flags = ParseFlags(options.current_flags)
|
|
flags = MergeFlags(flags)
|
|
|
|
msg = """
|
|
This expectation file is meant to inform the build team about changes to
|
|
flags used when building native libraries in chrome (most importantly any
|
|
that relate to security). This is to ensure the flags are replicated when
|
|
building native libraries outside of the repo. Please update the .expected
|
|
files and a WATCHLIST entry will alert the build team to your change."""
|
|
diff_utils.CheckExpectations('\n'.join(sorted(flags)),
|
|
options,
|
|
custom_msg=msg)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|