7 # This list contains symbols that _might_ be exported for some platforms
21 def get_symbols(nm
, lib
):
23 List all the (non platform-specific) symbols exported by the library
26 output
= subprocess
.check_output([nm
, '--format=bsd', '-D', '--defined-only', lib
],
27 stderr
=open(os
.devnull
, 'w')).decode("ascii")
28 for line
in output
.splitlines():
29 (_
, _
, symbol_name
) = line
.split()
30 symbols
.append(symbol_name
)
35 parser
= argparse
.ArgumentParser()
36 parser
.add_argument('--symbols-file',
39 help='path to file containing symbols')
40 parser
.add_argument('--lib',
43 help='path to library')
44 parser
.add_argument('--nm',
47 help='path to binary (or name in $PATH)')
48 args
= parser
.parse_args()
51 lib_symbols
= get_symbols(args
.nm
, args
.lib
)
53 # We can't run this test, but we haven't technically failed it either
54 # Return the GNU "skip" error code
56 mandatory_symbols
= []
58 with
open(args
.symbols_file
) as symbols_file
:
59 qualifier_optional
= '(optional)'
60 for line
in symbols_file
.readlines():
63 line
= line
.split('#')[0]
76 elif len(fields
) == 2:
80 print(args
.symbols_file
+ ': invalid format: ' + line
)
83 # The only supported qualifier is 'optional', which means the
84 # symbol doesn't have to be exported by the library
85 if qualifier
and not qualifier
== qualifier_optional
:
86 print(args
.symbols_file
+ ': invalid qualifier: ' + qualifier
)
89 if qualifier
== qualifier_optional
:
90 optional_symbols
.append(symbol
)
92 mandatory_symbols
.append(symbol
)
95 for symbol
in lib_symbols
:
96 if symbol
in mandatory_symbols
:
98 if symbol
in optional_symbols
:
100 if symbol
in PLATFORM_SYMBOLS
:
102 unknown_symbols
.append(symbol
)
105 sym
for sym
in mandatory_symbols
if sym
not in lib_symbols
108 for symbol
in unknown_symbols
:
109 print(args
.lib
+ ': unknown symbol exported: ' + symbol
)
111 for symbol
in missing_symbols
:
112 print(args
.lib
+ ': missing symbol: ' + symbol
)
114 if unknown_symbols
or missing_symbols
:
119 if __name__
== '__main__':