1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-22 17:35:35 +03:00

test: modernize generate-sym-test.py

This commit is contained in:
Yu Watanabe 2024-12-12 10:01:48 +09:00
parent 5fcabde35b
commit 6e399ece1f

View File

@ -1,78 +1,99 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# SPDX-License-Identifier: LGPL-2.1-or-later # SPDX-License-Identifier: LGPL-2.1-or-later
#
# ruff: noqa: E501 UP015
import os import os
import re import re
import sys import sys
from typing import IO
def process_sym_file(file):
def process_sym_file(file: IO[str]) -> None:
for line in file: for line in file:
m = re.search(r'^ +([a-zA-Z0-9_]+);', line) m = re.search(r'^ +([a-zA-Z0-9_]+);', line)
if m: if m:
if m[1] == 'sd_bus_object_vtable_format': if m[1] == 'sd_bus_object_vtable_format':
print(' {{"{0}", &{0}}},'.format(m[1])) print(f' {{ "{m[1]}", &{m[1]} }},')
else: else:
print(' {{"{0}", {0}}},'.format(m[1])) print(f' {{ "{m[1]}", {m[1]} }},')
def process_source_file(file):
def process_source_file(file: IO[str]) -> None:
for line in file: for line in file:
# Functions # Functions
m = re.search(r'^_public_\s+(\S+\s+)+\**(\w+)\s*\(', line) m = re.search(r'^_public_\s+(\S+\s+)+\**(\w+)\s*\(', line)
if m: if m:
print(' {{ "{0}", {0} }},'.format(m[2])) print(f' {{ "{m[2]}", {m[2]} }},')
continue
# Variables # Variables
m = re.search(r'^_public_\s+(\S+\s+)+\**(\w+)\s*=', line) m = re.search(r'^_public_\s+(\S+\s+)+\**(\w+)\s*=', line)
if m: if m:
print(' {{ "{0}", &{0} }},'.format(m[2])) print(f' {{ "{m[2]}", &{m[2]} }},')
continue
# Functions defined through a macro # Functions defined through a macro
m = re.search(r'^DEFINE_PUBLIC_TRIVIAL_REF_FUNC\([^,]+,\s*(\w+)\s*\)', line) m = re.search(r'^DEFINE_PUBLIC_TRIVIAL_REF_FUNC\([^,]+,\s*(\w+)\s*\)', line)
if m: if m:
print(' {{ "{0}_ref", {0}_ref }},'.format(m[1])) print(f' {{ "{m[1]}_ref", {m[1]}_ref }},')
continue
m = re.search(r'^DEFINE_PUBLIC_TRIVIAL_UNREF_FUNC\([^,]+,\s*(\w+)\s*,', line) m = re.search(r'^DEFINE_PUBLIC_TRIVIAL_UNREF_FUNC\([^,]+,\s*(\w+)\s*,', line)
if m: if m:
print(' {{ "{0}_unref", {0}_unref }},'.format(m[1])) print(f' {{ "{m[1]}_unref", {m[1]}_unref }},')
m = re.search(r"^DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC\([^,]+,\s*(\w+)\s*,", line) continue
if m:
print(' {{ "{0}_ref", {0}_ref }},'.format(m[1]))
print(' {{ "{0}_unref", {0}_unref }},'.format(m[1]))
print('''/* SPDX-License-Identifier: LGPL-2.1-or-later */ m = re.search(r'^DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC\([^,]+,\s*(\w+)\s*,', line)
if m:
print(f' {{ "{m[1]}_ref", {m[1]}_ref }},')
print(f' {{ "{m[1]}_unref", {m[1]}_unref }},')
continue
m = re.search(r'^_DEFINE_STRING_TABLE_LOOKUP\((\w+),\s*\w+,\s*_public_\s*\)', line)
if m:
print(f' {{ "{m[1]}_from_string", {m[1]}_from_string }},')
print(f' {{ "{m[1]}_to_string", {m[1]}_to_string }},')
continue
print("""/* SPDX-License-Identifier: LGPL-2.1-or-later */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
''') """)
for header in sys.argv[3:]: for header in sys.argv[3:]:
print('#include "{}"'.format(header.split('/')[-1])) print('#include "{}"'.format(header.split('/')[-1]))
print(''' print("""
/* We want to check deprecated symbols too, without complaining */ /* We want to check deprecated symbols too, without complaining */
#pragma GCC diagnostic ignored "-Wdeprecated-declarations" #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
''') """)
print(''' print("""
struct symbol { struct symbol {
const char *name; const char *name;
const void *symbol; const void *symbol;
}; };
static struct symbol symbols_from_sym[] = {''') static struct symbol symbols_from_sym[] = {""")
with open(sys.argv[1], "r") as f: with open(sys.argv[1], 'r') as f:
process_sym_file(f) process_sym_file(f)
print(''' {} print(""" {}
}, symbols_from_source[] = {''') }, symbols_from_source[] = {""")
for dirpath, _, filenames in sorted(os.walk(sys.argv[2])): for dirpath, _, filenames in sorted(os.walk(sys.argv[2])):
for filename in sorted(filenames): for filename in sorted(filenames):
if not filename.endswith(".c") and not filename.endswith(".h"): if not filename.endswith('.c') and not filename.endswith('.h'):
continue continue
with open(os.path.join(dirpath, filename), "r") as f: with open(os.path.join(dirpath, filename), 'r') as f:
process_source_file(f) process_source_file(f)
print(''' {} print(""" {}
}; };
static int sort_callback(const void *a, const void *b) { static int sort_callback(const void *a, const void *b) {
@ -81,34 +102,40 @@ static int sort_callback(const void *a, const void *b) {
} }
int main(void) { int main(void) {
size_t i, j; size_t size = sizeof(symbols_from_sym[0]),
n_sym = sizeof(symbols_from_sym)/sizeof(symbols_from_sym[0]) - 1,
n_source = sizeof(symbols_from_source)/sizeof(symbols_from_source[0]) - 1;
qsort(symbols_from_sym, sizeof(symbols_from_sym)/sizeof(symbols_from_sym[0])-1, sizeof(symbols_from_sym[0]), sort_callback); qsort(symbols_from_sym, n_sym, size, sort_callback);
qsort(symbols_from_source, sizeof(symbols_from_source)/sizeof(symbols_from_source[0])-1, sizeof(symbols_from_source[0]), sort_callback); qsort(symbols_from_source, n_source, size, sort_callback);
puts("From symbol file:"); puts("From symbol file:");
for (i = 0; symbols_from_sym[i].name; i++) for (size_t i = 0; i < n_sym; i++)
printf("%p: %s\\n", symbols_from_sym[i].symbol, symbols_from_sym[i].name); printf("%p: %s\\n", symbols_from_sym[i].symbol, symbols_from_sym[i].name);
puts("\\nFrom source files:"); puts("\\nFrom source files:");
for (j = 0; symbols_from_source[j].name; j++) for (size_t i = 0; i < n_source; i++)
printf("%p: %s\\n", symbols_from_source[j].symbol, symbols_from_source[j].name); printf("%p: %s\\n", symbols_from_source[i].symbol, symbols_from_source[i].name);
puts(""); puts("");
printf("Found %zu symbols from symbol file.\\n", i); printf("Found %zu symbols from symbol file.\\n", n_sym);
printf("Found %zu symbols from source files.\\n", j); printf("Found %zu symbols from source files.\\n", n_source);
for (i = 0; symbols_from_sym[i].name; i++) { unsigned n_error = 0;
struct symbol *n = bsearch(symbols_from_sym+i, symbols_from_source, sizeof(symbols_from_source)/sizeof(symbols_from_source[0])-1, sizeof(symbols_from_source[0]), sort_callback);
if (!n) for (size_t i = 0; i < n_sym; i++) {
if (!bsearch(symbols_from_sym+i, symbols_from_source, n_source, size, sort_callback)) {
printf("Found in symbol file, but not in sources: %s\\n", symbols_from_sym[i].name); printf("Found in symbol file, but not in sources: %s\\n", symbols_from_sym[i].name);
n_error++;
}
} }
for (j = 0; symbols_from_source[j].name; j++) { for (size_t i = 0; i < n_source; i++) {
struct symbol *n = bsearch(symbols_from_source+j, symbols_from_sym, sizeof(symbols_from_sym)/sizeof(symbols_from_sym[0])-1, sizeof(symbols_from_sym[0]), sort_callback); if (!bsearch(symbols_from_source+i, symbols_from_sym, n_sym, size, sort_callback)) {
if (!n) printf("Found in source file, but not in symbol file: %s\\n", symbols_from_source[i].name);
printf("Found in sources, but not in symbol file: %s\\n", symbols_from_source[j].name); n_error++;
}
} }
return i == j ? EXIT_SUCCESS : EXIT_FAILURE; return n_error == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}''') }""")