1
0
mirror of https://github.com/systemd/systemd synced 2025-10-06 00:13:24 +02:00

tree-wide: several cleanups for generating symbol lists and gperf files

- pass our system include directories to make generators use our libc
  wrappers and latest kernel headers,
- include relevant headers in generated gperf file,
- use files() rather than find_program(), as the result of
  find_program() cannot be passed to 'input' of custom_target(),
- move generate-bpf-delegate-configs.py to src/core/, as it is only used
  by libcore.
This commit is contained in:
Yu Watanabe
2025-07-08 13:07:32 +09:00
parent 1a60b97524
commit 2b912d2066
20 changed files with 147 additions and 91 deletions

View File

@@ -41,7 +41,7 @@ jobs:
- uses: systemd/mkosi@184472f0f1f831ca29953546ec01fd941ff763a6
- name: Check that tabs are not used in Python code
run: sh -c '! git grep -P "\\t" -- src/basic/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py'
run: sh -c '! git grep -P "\\t" -- src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py'
- name: Build tools tree
run: |
@@ -56,20 +56,20 @@ jobs:
- name: Run mypy
run: |
mkosi box -- mypy --version
mkosi box -- mypy src/basic/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py
mkosi box -- mypy src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py
- name: Run ruff check
run: |
mkosi box -- ruff --version
mkosi box -- ruff check src/basic/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py
mkosi box -- ruff check src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py
- name: Run ruff format
run: |
mkosi box -- ruff --version
if ! mkosi box -- ruff format --check src/basic/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py
if ! mkosi box -- ruff format --check src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py
then
echo "Please run 'ruff format' on the above files or apply the diffs below manually"
mkosi box -- ruff format --check --quiet --diff src/basic/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py
mkosi box -- ruff format --check --quiet --diff src/core/generate-bpf-delegate-configs.py src/boot/generate-hwids-section.py src/test/generate-sym-test.py src/ukify/ukify.py test/integration-tests/integration-test-wrapper.py
fi
- name: Configure meson

View File

@@ -20,9 +20,10 @@ xsltproc_flags = [
'--stringparam', 'man.copyright.section.enabled', '0',
'--stringparam', 'systemd.version', '@0@'.format(meson.project_version()),
'--path',
'@0@:@1@:@2@'.format(meson.current_build_dir(),
'@0@:@1@:@2@:@3@'.format(meson.current_build_dir(),
meson.current_source_dir(),
libshared_build_dir)]
libshared_build_dir,
libcore_build_dir)]
custom_man_xsl = files('custom-man.xsl')
custom_html_xsl = files('custom-html.xsl')
@@ -35,17 +36,6 @@ custom_entities_ent = custom_target(
man_page_depends += custom_entities_ent
generate_bpf_delegate_configs = find_program('../src/basic/generate-bpf-delegate-configs.py')
bpf_delegate_xml = custom_target(
input : files('../src/include/uapi/linux/bpf.h'),
output : 'bpf-delegate.xml',
command : [generate_bpf_delegate_configs,
'doc',
'@INPUT@'],
capture : true)
man_page_depends += bpf_delegate_xml
man_pages = []
html_pages = []
source_xml_files = []

View File

@@ -2008,6 +2008,14 @@ dbus_programs = []
# A list of boot stubs. Required for testing of ukify.
boot_stubs = []
# This is similar to system_includes below, but for passing custom_target().
system_include_args = [
'-isystem', meson.project_build_root() / 'src/include/override',
'-isystem', meson.project_source_root() / 'src/include/override',
'-isystem', meson.project_build_root() / 'src/include/uapi',
'-isystem', meson.project_source_root() / 'src/include/uapi',
]
system_includes = [
include_directories(
# gcc(1) says
@@ -2048,6 +2056,7 @@ includes = [libsystemd_includes, include_directories('src/shared')]
subdir('po')
subdir('catalog')
subdir('src/include')
subdir('src/fundamental')
subdir('src/basic')
subdir('src/libsystemd')

View File

@@ -3,6 +3,9 @@
set -eu
set -o pipefail
${1:?} -E -dM -include sys/socket.h -include "${2:?}" - </dev/null | \
CC=${1:?}
shift
$CC -E -dM -include sys/socket.h "$@" - </dev/null | \
grep -Ev 'AF_UNSPEC|AF_MAX' | \
awk '/^#define[ \t]+AF_[^ \t]+[ \t]+[AP]F_[^ \t]/ { print $2; }'

View File

@@ -3,6 +3,9 @@
set -eu
set -o pipefail
${1:?} -dM -include "${2:?}" - </dev/null | \
CC=${1:?}
shift
$CC -dM -include linux/if_arp.h "$@" - </dev/null | \
awk '/^#define[ \t]+ARPHRD_[^ \t]+[ \t]+[^ \t]/ { print $2; }' | \
sed -e 's/ARPHRD_//'

View File

@@ -3,6 +3,9 @@
set -eu
set -o pipefail
${1:?} -dM -include "${2:?}" - </dev/null | \
CC=${1:?}
shift
$CC -dM -include linux/capability.h "$@" - </dev/null | \
awk '/^#define[ \t]+CAP_[A-Z_]+[ \t]+/ { print $2; }' | \
grep -v CAP_LAST_CAP

View File

@@ -6,6 +6,9 @@ set -o pipefail
# In kernel's arch/parisc/include/uapi/asm/errno.h, ECANCELLED and EREFUSED are defined as aliases of
# ECANCELED and ECONNREFUSED, respectively. Let's drop them.
${1:?} -dM -include errno.h - </dev/null | \
CC=${1:?}
shift
$CC -dM -include errno.h "$@" - </dev/null | \
grep -Ev '^#define[[:space:]]+(ECANCELLED|EREFUSED)' | \
awk '/^#define[ \t]+E[^ _]+[ \t]+/ { print $2; }'

View File

@@ -124,39 +124,26 @@ missing_audit_h = files('missing_audit.h')
missing_syscall_def_h = files('missing_syscall_def.h')
basic_sources += missing_syscall_def_h
generate_af_list = find_program('generate-af-list.sh')
af_list_txt = custom_target(
output : 'af-list.txt',
command : [generate_af_list, cpp, files('../include/override/sys/socket.h')],
capture : true)
generate_arphrd_list = find_program('generate-arphrd-list.sh')
arphrd_list_txt = custom_target(
output : 'arphrd-list.txt',
command : [generate_arphrd_list, cpp, files('../include/uapi/linux/if_arp.h')],
capture : true)
generate_cap_list = find_program('generate-cap-list.sh')
cap_list_txt = custom_target(
output : 'cap-list.txt',
command : [generate_cap_list, cpp, files('../include/uapi/linux/capability.h')],
capture : true)
generate_errno_list = find_program('generate-errno-list.sh')
errno_list_txt = custom_target(
output : 'errno-list.txt',
command : [generate_errno_list, cpp],
capture : true)
generated_gperf_headers = []
foreach item : [['af', af_list_txt, 'af', '', ['<sys/socket.h>']],
['arphrd', arphrd_list_txt, 'arphrd', 'ARPHRD_', []],
['cap', cap_list_txt, 'capability', '', []],
['errno', errno_list_txt, 'errno', '', []]]
foreach item : [
# name, source, struct name, prefix, headers
['af', af_sources, 'af', '', ['<sys/socket.h>'], ],
['arphrd', arphrd_sources, 'arphrd', 'ARPHRD_', ['<linux/if_arp.h>'], ],
['cap', cap_sources, 'capability', '', ['<linux/capability.h>'], ],
['errno', [], 'errno', '', ['<errno.h>'], ],
]
fname = '@0@-list.txt'.format(item[0])
generate_list = files('generate-@0@-list.sh'.format(item[0]))
list_txt = custom_target(
input : [generate_list, item[1]],
output : fname,
command : [env, 'bash', generate_list, cpp, system_include_args],
capture : true)
fname = '@0@-from-name.gperf'.format(item[0])
gperf_file = custom_target(
input : item[1],
input : list_txt,
output : fname,
command : [generate_gperfs, item[2], item[3], '@INPUT@'] + item[4],
capture : true)
@@ -176,7 +163,7 @@ foreach item : [['af', af_list_txt, 'af', '', ['<sys/sock
fname = '@0@-to-name.inc'.format(item[0])
awkscript = '@0@-to-name.awk'.format(item[0])
target2 = custom_target(
input : [awkscript, item[1]],
input : [awkscript, list_txt],
output : fname,
command : [awk, '-f', '@INPUT0@', '@INPUT1@'],
capture : true)
@@ -273,17 +260,8 @@ filesystem_switch_case_inc = custom_target(
'@INPUT@'],
capture : true)
generate_bpf_delegate_configs = find_program('generate-bpf-delegate-configs.py')
bpf_delegate_configs_inc = custom_target(
input : files('../include/uapi/linux/bpf.h'),
output : 'bpf-delegate-configs.inc',
command : [generate_bpf_delegate_configs,
'code',
'@INPUT@'],
capture : true)
generated_sources += [filesystem_list_inc, filesystem_switch_case_inc, filesystems_gperf_h, bpf_delegate_configs_inc]
basic_sources += [filesystem_list_inc, filesystem_switch_case_inc, filesystems_gperf_h, bpf_delegate_configs_inc]
generated_sources += [filesystem_list_inc, filesystem_switch_case_inc, filesystems_gperf_h]
basic_sources += [filesystem_list_inc, filesystem_switch_case_inc, filesystems_gperf_h]
libbasic_static = static_library(
'basic',

View File

@@ -100,15 +100,34 @@ load_fragment_gperf_nulstr_c = custom_target(
command : [awk, '-f', '@INPUT0@', '@INPUT1@'],
capture : true)
generated_sources += [load_fragment_gperf_c, load_fragment_gperf_nulstr_c]
generate_bpf_delegate_configs = files('generate-bpf-delegate-configs.py')
bpf_delegate_configs_inc = custom_target(
input : [generate_bpf_delegate_configs, bpf_delegate_sources],
output : 'bpf-delegate-configs.inc',
command : [python,
generate_bpf_delegate_configs,
'code',
bpf_delegate_sources],
capture : true)
bpf_delegate_xml = custom_target(
input : [generate_bpf_delegate_configs, bpf_delegate_sources],
output : 'bpf-delegate.xml',
command : [python,
generate_bpf_delegate_configs,
'doc',
bpf_delegate_sources],
capture : true)
man_page_depends += bpf_delegate_xml
generated_sources += [load_fragment_gperf_c, load_fragment_gperf_nulstr_c, bpf_delegate_configs_inc]
libcore_sources += [load_fragment_gperf_c, load_fragment_gperf_nulstr_c, bpf_delegate_configs_inc]
libcore_build_dir = meson.current_build_dir()
libcore_name = 'systemd-core-@0@'.format(shared_lib_tag)
libcore_static = static_library(
libcore_name,
libcore_sources,
load_fragment_gperf_c,
load_fragment_gperf_nulstr_c,
include_directories : [includes, include_directories('.')],
implicit_include_directories : false,
c_args : ['-fvisibility=default'],

38
src/include/meson.build Normal file
View File

@@ -0,0 +1,38 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
# Source files that provides AF_XYZ
af_sources = files(
'override/sys/socket.h',
)
# Source files that provides ARPHRD_XYZ
arphrd_sources = files(
'uapi/linux/if_arp.h',
)
# Source files that provides CAP_XYZ
cap_sources = files(
'uapi/linux/capability.h',
)
# Source files that provides BPF delegate options
bpf_delegate_sources = files(
'uapi/linux/bpf.h',
)
# Source files that provides ETHTOOL_LINK_MODE_XYZ
ethtool_link_mode_sources = files(
'uapi/linux/ethtool.h',
)
# Source files that provides IPPROTO_XYZ
ipproto_sources = files(
'override/netinet/in.h',
'uapi/linux/in.h',
)
# Source files that provides KEY_XYZ
keyboard_sources = files(
'uapi/linux/input.h',
'uapi/linux/input-event-codes.h',
)

View File

@@ -3,15 +3,13 @@
set -eu
set -o pipefail
cpp="${1:?}"
CC="${1:?}"
shift
includes=()
for i in "$@"; do
includes+=(-include "$i")
done
HEADER="${1:?}"
shift
$cpp -dM "${includes[@]}" - </dev/null | \
$CC -dM -include "$HEADER" "$@" - </dev/null | \
grep -vE 'AUDIT_.*(FIRST|LAST)_' | \
sed -r -n 's/^#define\s+AUDIT_(\w+)\s+([0-9]{4})\s*$$/\1\t\2/p' | \
sort -k2

View File

@@ -12,10 +12,11 @@
# the custom_target() has to be defined here in src/libsystemd/sd-journal
# in the source directory.
generate_audit_type_list = find_program('generate-audit_type-list.sh')
generate_audit_type_list = files('generate-audit_type-list.sh')
audit_type_list_txt = custom_target(
input : [generate_audit_type_list, missing_audit_h],
output : 'audit_type-list.txt',
command : [generate_audit_type_list, cpp, missing_audit_h],
command : [env, 'bash', generate_audit_type_list, cpp, missing_audit_h, system_include_args],
capture : true)
audit_type_to_name = custom_target(

View File

@@ -10,10 +10,12 @@ OVERRIDES = {
'autoneg' : 'autonegotiation',
}
mode, cpp, header = sys.argv[1:]
mode = sys.argv[1]
cpp = sys.argv[2]
include_dirs = sys.argv[3:]
xml = mode == '--xml'
command = [*shlex.split(cpp), '-include', header, '-']
command = [*shlex.split(cpp), '-include', 'linux/ethtool.h'] + include_dirs + ['-']
out = subprocess.check_output(command, stdin=subprocess.DEVNULL, universal_newlines=True)
lines = iter(out.splitlines())

View File

@@ -4,6 +4,9 @@
set -eu
set -o pipefail
${1:?} -dM -include netinet/in.h - </dev/null | \
CC=${1:?}
shift
$CC -dM -include netinet/in.h "$@" - </dev/null | \
awk '/^#define[ \t]+IPPROTO_[^ \t]+[ \t]+[^ \t]/ { print $2; }' | \
sed -e 's/IPPROTO_//'

View File

@@ -258,10 +258,11 @@ if conf.get('HAVE_PAM') == 1
shared_sources += files('pam-util.c')
endif
generate_ip_protocol_list = find_program('generate-ip-protocol-list.sh')
generate_ip_protocol_list = files('generate-ip-protocol-list.sh')
ip_protocol_list_txt = custom_target(
input : [generate_ip_protocol_list, ipproto_sources],
output : 'ip-protocol-list.txt',
command : [generate_ip_protocol_list, cpp],
command : [env, 'bash', generate_ip_protocol_list, cpp, system_include_args],
capture : true)
fname = 'ip-protocol-from-name.gperf'
@@ -294,11 +295,12 @@ target2 = custom_target(
generated_sources += [target1, target2]
shared_sources += [target1, target2]
ethtool_link_mode_py = files('ethtool-link-mode.py')
fname = 'ethtool-link-mode.inc'
ethtool_link_mode_inc = custom_target(
input : ['ethtool-link-mode.py', '../include/uapi/linux/ethtool.h'],
input : [ethtool_link_mode_py, ethtool_link_mode_sources],
output : fname,
command : [python, '@INPUT0@', '--header', cpp, '@INPUT1@'],
command : [python, ethtool_link_mode_py, '--header', cpp, system_include_args],
capture : true)
generated_sources += ethtool_link_mode_inc
@@ -307,9 +309,9 @@ sources += shared_sources
fname = 'ethtool-link-mode.xml'
ethtool_link_mode_xml = custom_target(
input : ['ethtool-link-mode.py', '../include/uapi/linux/ethtool.h'],
input : [ethtool_link_mode_py, ethtool_link_mode_sources],
output : fname,
command : [python, '@INPUT0@', '--xml', cpp, '@INPUT1@'],
command : [python, ethtool_link_mode_py, '--xml', cpp, system_include_args],
capture : true)
man_page_depends += ethtool_link_mode_xml

View File

@@ -10,6 +10,7 @@ _Pragma(\"GCC diagnostic ignored \\\"-Wimplicit-fallthrough\\\"\")\n\
#if __GNUC__ >= 15\n\
_Pragma(\"GCC diagnostic ignored \\\"-Wzero-as-null-pointer-constant\\\"\")\n\
#endif\n\
#include <linux/input.h>\n\
%}"
print "struct key_name { const char* name; unsigned short id; };"
print "%null-strings"

View File

@@ -3,7 +3,10 @@
set -eu
set -o pipefail
${1:?} -dM -include "${2:?}" - </dev/null | awk '
CC=${1:?}
shift
$CC -dM -include linux/input.h "$@" - </dev/null | awk '
/\<(KEY_(MAX|MIN_INTERESTING))|(BTN_(MISC|MOUSE|JOYSTICK|GAMEPAD|DIGI|WHEEL|TRIGGER_HAPPY))\>/ { next }
/^#define[ \t]+(KEY|BTN)_[^ ]+[ \t]+[0-9BK]/ { print $2 }
'

View File

@@ -61,19 +61,19 @@ endif
############################################################
generate_keyboard_keys_list = find_program('generate-keyboard-keys-list.sh')
generate_keyboard_keys_list = files('generate-keyboard-keys-list.sh')
keyboard_keys_list_txt = custom_target(
input : files('../include/uapi/linux/input.h'),
input : [generate_keyboard_keys_list, keyboard_sources],
output : 'keyboard-keys-list.txt',
command : [generate_keyboard_keys_list, cpp, '@INPUT@'],
command : [env, 'bash', generate_keyboard_keys_list, cpp, system_include_args],
capture : true)
generate_keyboard_keys_gperf = find_program('generate-keyboard-keys-gperf.sh')
generate_keyboard_keys_gperf = files('generate-keyboard-keys-gperf.sh')
fname = 'keyboard-keys-from-name.gperf'
gperf_file = custom_target(
input : keyboard_keys_list_txt,
input : [generate_keyboard_keys_gperf, keyboard_keys_list_txt],
output : fname,
command : [generate_keyboard_keys_gperf, '@INPUT@'],
command : [env, 'bash', '@INPUT@'],
capture : true)
fname = 'keyboard-keys-from-name.inc'

View File

@@ -11,7 +11,7 @@ class CustomResolver(tree.Resolver):
if 'ethtool-link-mode' in url:
return self.resolve_filename('src/shared/ethtool-link-mode.xml', context)
if 'bpf-delegate' in url:
return self.resolve_filename('man/bpf-delegate.xml', context)
return self.resolve_filename('src/core/bpf-delegate.xml', context)
return None