spport/check-bin-arch: accept arbitrary per-package ignore paths

Some packages (mostly, out-of-tree) may want to install binary blobs for
another architecture,  outside the locations we currently exclude, like
in /opt or whatever...

Add support in check-bin-arch to accept any arbitrary location, that
individual package can each request to excude from the check, when they
are installed.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Peter Korsgaard <peter@korsgaard.com>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
This commit is contained in:
Yann E. MORIN 2018-03-07 22:51:23 +01:00 committed by Peter Korsgaard
parent 7098ee7f61
commit 01d90f0d09
3 changed files with 42 additions and 22 deletions

View File

@ -453,6 +453,13 @@ information is (assuming the package name is +libfoo+) :
FLAT binary format is only 4k bytes. If the application consumes more stack, FLAT binary format is only 4k bytes. If the application consumes more stack,
append the required number here. append the required number here.
* +LIBFOO_BIN_ARCH_EXCLUDE+ is a space-separated list of paths (relative
to the target directory) to ignore when checking that the package
installs correctly cross-compiled binaries. You seldom need to set this
variable, unless the package installs binary blobs outside the default
locations, `/lib/firmware`, `/usr/lib/firmware`, `/lib/modules`, and
`/usr/share`, which are automatically excluded.
The recommended way to define these variables is to use the following The recommended way to define these variables is to use the following
syntax: syntax:

View File

@ -112,6 +112,7 @@ define check_bin_arch
$(if $(filter end-install-target,$(1)-$(2)),\ $(if $(filter end-install-target,$(1)-$(2)),\
support/scripts/check-bin-arch -p $(3) \ support/scripts/check-bin-arch -p $(3) \
-l $(BUILD_DIR)/packages-file-list.txt \ -l $(BUILD_DIR)/packages-file-list.txt \
$(foreach i,$($(PKG)_BIN_ARCH_EXCLUDE),-i "$(i)") \
-r $(TARGET_READELF) \ -r $(TARGET_READELF) \
-a $(BR2_READELF_ARCH_NAME)) -a $(BR2_READELF_ARCH_NAME))
endef endef

View File

@ -1,18 +1,45 @@
#!/usr/bin/env bash #!/usr/bin/env bash
while getopts p:l:r:a: OPT ; do # List of hardcoded paths that should be ignored, as they may
# contain binaries for an architecture different from the
# architecture of the target.
declare -a IGNORES=(
# Skip firmware files, they could be ELF files for other
# architectures
"/lib/firmware"
"/usr/lib/firmware"
# Skip kernel modules
# When building a 32-bit userland on 64-bit architectures, the kernel
# and its modules may still be 64-bit. To keep the basic
# check-bin-arch logic simple, just skip this directory.
"/lib/modules"
# Skip files in /usr/share, several packages (qemu,
# pru-software-support) legitimately install ELF binaries that
# are not for the target architecture
"/usr/share"
)
while getopts p:l:r:a:i: OPT ; do
case "${OPT}" in case "${OPT}" in
p) package="${OPTARG}";; p) package="${OPTARG}";;
l) pkg_list="${OPTARG}";; l) pkg_list="${OPTARG}";;
r) readelf="${OPTARG}";; r) readelf="${OPTARG}";;
a) arch_name="${OPTARG}";; a) arch_name="${OPTARG}";;
i)
# Ensure we do have single '/' as separators,
# and that we have a leading and a trailing one.
pattern="$(sed -r -e 's:/+:/:g; s:^/*:/:; s:/*$:/:;' <<<"${OPTARG}")"
IGNORES+=("${pattern}")
;;
:) error "option '%s' expects a mandatory argument\n" "${OPTARG}";; :) error "option '%s' expects a mandatory argument\n" "${OPTARG}";;
\?) error "unknown option '%s'\n" "${OPTARG}";; \?) error "unknown option '%s'\n" "${OPTARG}";;
esac esac
done done
if test -z "${package}" -o -z "${pkg_list}" -o -z "${readelf}" -o -z "${arch_name}" ; then if test -z "${package}" -o -z "${pkg_list}" -o -z "${readelf}" -o -z "${arch_name}" ; then
echo "Usage: $0 -p <pkg> -l <pkg-file-list> -r <readelf> -a <arch name>" echo "Usage: $0 -p <pkg> -l <pkg-file-list> -r <readelf> -a <arch name> [-i PATH ...]"
exit 1 exit 1
fi fi
@ -23,26 +50,11 @@ IFS="
" "
while read f; do while read f; do
# Skip firmware files, they could be ELF files for other for ignore in "${IGNORES[@]}"; do
# architectures if [[ "${f}" =~ ^"${ignore}" ]]; then
if [[ "${f}" =~ ^/(usr/)?lib/firmware/.* ]]; then continue 2
continue fi
fi done
# Skip kernel modules
# When building a 32-bit userland on 64-bit architectures, the kernel
# and its modules may still be 64-bit. To keep the basic
# check-bin-arch logic simple, just skip this directory.
if [[ "${f}" =~ ^/lib/modules/.* ]]; then
continue
fi
# Skip files in /usr/share, several packages (qemu,
# pru-software-support) legitimately install ELF binaries that
# are not for the target architecture
if [[ "${f}" =~ ^/usr/share/.* ]]; then
continue
fi
# Skip symlinks. Some symlinks may have absolute paths as # Skip symlinks. Some symlinks may have absolute paths as
# target, pointing to host binaries while we're building. # target, pointing to host binaries while we're building.