python-tools.sh, py-mod.mk: Use --symbol-filter
Some checks failed
CI / Packaging - Kali Linux (pull_request) Failing after 2m8s
CI / Packaging - OpenSUSE Tumbleweed (pull_request) Failing after 2m34s
CI / Packaging test (pull_request) Failing after 0s

Letting python-tools.sh rewrite symbols is more robust than rewriting an entire __init__.py with PY_INIT_FILTER in the including Makefile. The latter can break in non-obvious ways if python-tools.sh changes __init__.py's format.

Make python-tools.sh support --symbol-filter to remedy that. The option takes an sed script which should expect a string of two non-whitespace tokens: The module from which the symbol is imported, and the name of the symbol in that module. It's output will then be used as the symbol to be exported from __init__.py.

Also, support the PY_SYMBOL_FILTER variable in py-mod.mk. If it's defined, it is used for --symbol-filter.

Signed-off-by: Jan Lindemann <jan@janware.com>
This commit is contained in:
Jan Lindemann 2026-06-12 06:57:23 +02:00
commit 80248dec88
Signed by: Jan Lindemann
GPG key ID: 3750640C9E25DD61
2 changed files with 36 additions and 10 deletions

View file

@ -34,6 +34,12 @@ module_path()
cmd_create_init()
{
__add_seen() {
local type="$1"
[[ -n "${seen[$type]+x}" ]] && fatal "Duplicate symbol: $type"
seen["$type"]=1
}
local import_submodules=0
local files="$*"
local del="-------------------------- generated by $myname"
@ -42,26 +48,38 @@ cmd_create_init()
echo "from pkgutil import extend_path"
echo ""
echo "__path__ = extend_path(__path__, __name__)"
echo
local f
local -A seen=()
local dst_type
for f in $files; do
test -d $f && continue
local base=${f##*/}
base=${base%.py}
if [ "$sed_extract_command" ]; then
local type types=`sed "$sed_extract_command" $f`
for type in $types; do
echo "from `module_path $base` import $type as $type"
[[ -n "${seen[$type]+x}" ]] && fatal "Duplicate symbol: $type"
seen["$type"]=1
if [ "$sed_extract_cmd" ]; then
local src_type types=$(sed "$sed_extract_cmd" $f)
for src_type in $types; do
[ "$sed_symbol_filter_cmd" ] && dst_type=$(echo $base $src_type | sed "$sed_symbol_filter_cmd")
echo "from `module_path $base` import $src_type as $dst_type"
__add_seen $dst_type
done
fi
done
if [ "$import_submodules" = 1 ]; then
for f in $files; do
[ -f $f/__init__.py ] && echo "import `module_path $f` as $f"
[ -f $f/__init__.py ] || continue
echo "import `module_path $f` as $f"
__add_seen $f
done
fi
echo
echo "__all__ = ["
for dst_type in ${!seen[@]}; do
echo " \"$dst_type\","
done
echo "]"
echo "# << $del <<"
}
@ -69,11 +87,15 @@ cmd_create_init()
myname=`basename $0`
eval set -- `getopt -o 'he:m:' "$@"`
eval set -- `getopt -l 'symbol-filter:' -o 'he:m:' "$@"`
while [ "$1" != -- ]; do
case $1 in
-e)
sed_extract_command="$2"
sed_extract_cmd="$2"
shift
;;
--symbol-filter)
sed_symbol_filter_cmd="$2"
shift
;;
-m)