Allow sym_diff.py to report non-zero for non-breaking ABI changes
llvm-svn: 292297
diff --git a/libcxx/lib/abi/CMakeLists.txt b/libcxx/lib/abi/CMakeLists.txt
index e3eb3bf..41240d7 100644
--- a/libcxx/lib/abi/CMakeLists.txt
+++ b/libcxx/lib/abi/CMakeLists.txt
@@ -22,7 +22,8 @@
set(ABILIST_FILE "${CMAKE_CURRENT_LIST_DIR}/${TARGET_TRIPLE}.abilist")
set(SYMDIFF_EXE "${LIBCXX_SOURCE_DIR}/utils/sym_check/sym_diff.py")
add_custom_target(check-cxx-abilist
- ${SYMDIFF_EXE} --only-stdlib-symbols ${ABILIST_FILE} $<TARGET_SONAME_FILE:cxx_shared>
+ ${SYMDIFF_EXE} --only-stdlib-symbols --strict ${ABILIST_FILE}
+ $<TARGET_SONAME_FILE:cxx_shared>
DEPENDS cxx_shared
COMMENT "Testing ABI compatibility...")
endif()
diff --git a/libcxx/utils/sym_check/sym_check/diff.py b/libcxx/utils/sym_check/sym_check/diff.py
index 6502a48..c89c4ef 100644
--- a/libcxx/utils/sym_check/sym_check/diff.py
+++ b/libcxx/utils/sym_check/sym_check/diff.py
@@ -98,4 +98,6 @@
report += 'ABI BREAKAGE: SYMBOLS ADDED OR REMOVED!'
else:
report += 'Symbols match.'
- return report, int(abi_break)
+ is_different = abi_break or bool(len(added_syms)) \
+ or bool(len(changed_syms))
+ return report, abi_break, is_different
diff --git a/libcxx/utils/sym_check/sym_diff.py b/libcxx/utils/sym_check/sym_diff.py
index 842e908..631f9c6 100755
--- a/libcxx/utils/sym_check/sym_diff.py
+++ b/libcxx/utils/sym_check/sym_diff.py
@@ -30,6 +30,10 @@
parser.add_argument('--only-stdlib-symbols', dest='only_stdlib',
help="Filter all symbols not related to the stdlib",
action='store_true', default=False)
+ parser.add_argument('--strict', dest='strict',
+ help="Exit with a non-zero status if any symbols "
+ "differ",
+ action='store_true', default=False)
parser.add_argument(
'-o', '--output', dest='output',
help='The output file. stdout is used if not given',
@@ -54,16 +58,16 @@
added, removed, changed = diff.diff(old_syms_list, new_syms_list)
if args.removed_only:
added = {}
- report, is_break = diff.report_diff(added, removed, changed,
- names_only=args.names_only,
- demangle=args.demangle)
+ report, is_break, is_different = diff.report_diff(
+ added, removed, changed, names_only=args.names_only,
+ demangle=args.demangle)
if args.output is None:
print(report)
else:
with open(args.output, 'w') as f:
f.write(report + '\n')
- sys.exit(is_break)
-
+ exit_code = 1 if is_break or (args.strict and is_different) else 0
+ sys.exit(exit_code)
if __name__ == '__main__':
main()