Files
buildroot/support/dependencies/dependencies.sh
Peter Korsgaard 3a51b577ce support/dependencies/dependencies.sh: reject buggy uutils install
uutils install 0.8.0 as used in Ubuntu 26.04 has a bug in the install
applet, breaking a number of packages:

https://github.com/uutils/coreutils/pull/11505
https://bugs.launchpad.net/ubuntu/+source/rust-coreutils/+bug/2151454

The fix has been merged upstream but not yet released or packaged in Ubuntu,
so detect and reject the buggy version and explain how to change to the
coreutils version. Once fixed the version output will hopefully change.

For simplicity, only check for the exact 0.8.0 version string. Hopefully
when it is fixed in Ubuntu, they also update the version string. Note
that earlier versions of uutils have the same issue of course, but those
versions were never the default "install" on Ubuntu (or anywhere else).

Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
Signed-off-by: Arnout Vandecappelle <arnout@rnout.be>
(cherry picked from commit 64cb69f155)
Signed-off-by: Thomas Perale <thomas.perale@mind.be>
2026-06-04 11:45:58 +02:00

351 lines
12 KiB
Bash
Executable File

#!/bin/sh
# vi: set sw=4 ts=4:
export LC_ALL=C
TAB="$(printf '\t')"
NL="
"
# Verify that grep works
echo "WORKS" | grep "WORKS" >/dev/null 2>&1
if test $? != 0 ; then
echo
echo "grep doesn't work"
exit 1
fi
# Sanity check for CWD in LD_LIBRARY_PATH
case ":${LD_LIBRARY_PATH:-unset}:" in
(*::*|*:.:*)
echo
echo "You seem to have the current working directory in your"
echo "LD_LIBRARY_PATH environment variable. This doesn't work."
exit 1
;;
esac
# Sanity check for CWD in PATH. Having the current working directory
# in the PATH makes various packages (e.g. toolchain, coreutils...)
# build process break.
# PATH should not contain a newline, otherwise it fails in spectacular
# ways as soon as PATH is referenced in a package rule
# An empty PATH is technically possible, but in practice we would not
# even arrive here if that was the case.
case ":${PATH:-unset}:" in
(*::*|*:.:*)
echo
echo "You seem to have the current working directory in your"
echo "PATH environment variable. This doesn't work."
exit 1
;;
(*" "*|*"${TAB}"*|*"${NL}"*)
printf "\n"
printf "Your PATH contains spaces, TABs, and/or newline (\\\n) characters.\n"
printf "This doesn't work. Fix your PATH environment variable.\n"
exit 1
;;
esac
check_prog_host()
{
prog="$1"
if ! which $prog > /dev/null ; then
echo >&2
echo "You must install '$prog' on your build machine" >&2
exit 1
fi
}
# Verify that which is installed
check_prog_host "which"
# Verify that sed is installed
check_prog_host "sed"
# 'file' must be present and must be exactly /usr/bin/file,
# otherwise libtool fails in incomprehensible ways.
check_prog_host "/usr/bin/file"
# Check make
MAKE=$(which make 2> /dev/null)
if [ -z "$MAKE" ] ; then
echo
echo "You must install 'make' on your build machine";
exit 1;
fi;
MAKE_VERSION=$($MAKE --version 2>&1 | sed -e 's/^.* \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q')
if [ -z "$MAKE_VERSION" ] ; then
echo
echo "You must install 'make' on your build machine";
exit 1;
fi;
MAKE_MAJOR=$(echo $MAKE_VERSION | sed -e "s/\..*//g")
MAKE_MINOR=$(echo $MAKE_VERSION | sed -e "s/^$MAKE_MAJOR\.//g" -e "s/\..*//g" -e "s/[a-zA-Z].*//g")
if [ $MAKE_MAJOR -lt 3 ] || [ $MAKE_MAJOR -eq 3 -a $MAKE_MINOR -lt 81 ] ; then
echo
echo "You have make '$MAKE_VERSION' installed. GNU make >=3.81 is required"
exit 1;
fi;
# Check host gcc
COMPILER=$(which $HOSTCC_NOCCACHE 2> /dev/null)
if [ -z "$COMPILER" ] ; then
COMPILER=$(which cc 2> /dev/null)
fi;
if [ -z "$COMPILER" ] ; then
echo
echo "You must install 'gcc' on your build machine";
exit 1;
fi;
COMPILER_VERSION=$($COMPILER -v 2>&1 | sed -n '/^gcc version/p' |
sed -e 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q')
if [ -z "$COMPILER_VERSION" ] ; then
echo
echo "You must install 'gcc' on your build machine";
exit 1;
fi;
COMPILER_MAJOR=$(echo $COMPILER_VERSION | sed -e "s/\..*//g")
COMPILER_MINOR=$(echo $COMPILER_VERSION | sed -e "s/^$COMPILER_MAJOR\.//g" -e "s/\..*//g")
if [ $COMPILER_MAJOR -lt 4 -o $COMPILER_MAJOR -eq 4 -a $COMPILER_MINOR -lt 8 ] ; then
echo
echo "You have gcc '$COMPILER_VERSION' installed. gcc >= 4.8 is required"
exit 1;
fi;
# check for host CXX
CXXCOMPILER=$(which $HOSTCXX_NOCCACHE 2> /dev/null)
if [ -z "$CXXCOMPILER" ] ; then
CXXCOMPILER=$(which c++ 2> /dev/null)
fi
if [ -z "$CXXCOMPILER" ] ; then
echo
echo "You may have to install 'g++' on your build machine"
fi
if [ ! -z "$CXXCOMPILER" ] ; then
CXXCOMPILER_VERSION=$($CXXCOMPILER -v 2>&1 | sed -n '/^gcc version/p' |
sed -e 's/^gcc version \([0-9\.]\)/\1/g' -e 's/[-\ ].*//g' -e '1q')
if [ -z "$CXXCOMPILER_VERSION" ] ; then
echo
echo "You may have to install 'g++' on your build machine"
fi
fi
if [ -n "$CXXCOMPILER_VERSION" ] ; then
CXXCOMPILER_MAJOR=$(echo $CXXCOMPILER_VERSION | sed -e "s/\..*//g")
CXXCOMPILER_MINOR=$(echo $CXXCOMPILER_VERSION | sed -e "s/^$CXXCOMPILER_MAJOR\.//g" -e "s/\..*//g")
if [ $CXXCOMPILER_MAJOR -lt 4 -o $CXXCOMPILER_MAJOR -eq 4 -a $CXXCOMPILER_MINOR -lt 8 ] ; then
echo
echo "You have g++ '$CXXCOMPILER_VERSION' installed. g++ >= 4.8 is required"
exit 1
fi
fi
# Check bash
# We only check bash is available, setting SHELL appropriately is done
# in the top-level Makefile, and we mimic the same sequence here
if [ -n "${BASH}" ]; then :
elif [ -x /bin/bash ]; then :
elif [ -z "$( sh -c 'echo $BASH' )" ]; then
echo
echo "You must install 'bash' on your build machine"
exit 1
fi
# Check that a few mandatory programs are installed
missing_progs="no"
for prog in perl tar wget cpio unzip rsync bc cmp find xargs awk ${DL_TOOLS} ; do
if ! which $prog > /dev/null ; then
echo "You must install '$prog' on your build machine";
missing_progs="yes"
if test $prog = "svn" ; then
echo " svn is usually part of the subversion package in your distribution"
elif test $prog = "hg" ; then
echo " hg is usually part of the mercurial package in your distribution"
elif test $prog = "zcat" ; then
echo " zcat is usually part of the gzip package in your distribution"
elif test $prog = "bzcat" ; then
echo " bzcat is usually part of the bzip2 package in your distribution"
elif test $prog = "cmp" ; then
echo " cmp is usually part of the diffutils package in your distribution"
elif test $prog = "find" ; then
echo " find is usually part of the findutils package in your distribution"
elif test $prog = "xargs" ; then
echo " xargs is usually part of the findutils package in your distribution"
fi
fi
# we need git >= 2.0.0 for shallow clones / vendoring
if test $prog = "git" ; then
GIT_VERSION="$(git --version | sed -n 's/^git version \(.*\)/\1/p')"
GIT_MAJOR="$(echo "${GIT_VERSION}" | cut -d . -f 1)"
if [ "${GIT_MAJOR}" -lt 2 ]; then
echo "You have git '${GIT_VERSION}' installed. Git >= 2.0.0 is required"
exit 1
fi
fi
done
if test "${missing_progs}" = "yes" ; then
exit 1
fi
INSTALL_VERSION="$(install --version | sed -n 's/^install \(.*\)/\1/p')"
if [ "${INSTALL_VERSION}" = "(uutils coreutils) 0.8.0" ]; then
echo
echo "You have an uutils 'install' version installed which is affected by:"
echo " https://github.com/uutils/coreutils/issues/12166"
echo
echo "Please change to coreutils install with:"
echo "update-alternatives --install /usr/bin/install install /usr/bin/gnuinstall 100"
exit 1
fi
PATCH_VERSION="$(patch -v 2>/dev/null | sed -n 's/^GNU patch \(.*\)/\1/p')"
if [ -z "${PATCH_VERSION}" ] ; then
echo
echo "You must install GNU patch"
exit 1
fi
PATCH_MAJOR="$(echo "${PATCH_VERSION}" | cut -d . -f 1)"
PATCH_MINOR="$(echo "${PATCH_VERSION}" | cut -d . -f 2)"
if [ "${PATCH_MAJOR}" -lt 2 ] || [ "${PATCH_MAJOR}" -eq 2 -a "${PATCH_MINOR}" -lt 7 ] ; then
echo
echo "You have GNU patch '${PATCH_VERSION}' installed. GNU patch >= 2.7 is required"
exit 1;
fi
if grep -q ^BR2_NEEDS_HOST_UTF8_LOCALE=y $BR2_CONFIG ; then
if ! which locale > /dev/null ; then
echo
echo "You need locale support on your build machine to build a toolchain supporting locales"
exit 1 ;
fi
if ! locale -a | grep -q -i -E 'utf-?8$' ; then
echo
echo "You need at least one UTF8 locale to build a toolchain supporting locales"
exit 1 ;
fi
fi
if grep -q ^BR2_NEEDS_HOST_JAVA=y $BR2_CONFIG ; then
check_prog_host "java"
JAVA_GCJ=$(java -version 2>&1 | grep gcj)
if [ ! -z "$JAVA_GCJ" ] ; then
echo
echo "$JAVA_GCJ is not sufficient to compile your package selection."
echo "Please install an OpenJDK/IcedTea/Oracle Java."
exit 1 ;
fi
fi
if grep -q ^BR2_HOSTARCH_NEEDS_IA32_LIBS=y $BR2_CONFIG ; then
if test ! -f /lib/ld-linux.so.2 ; then
echo
echo "Your Buildroot configuration uses pre-built tools for the x86 architecture,"
echo "but your build machine uses the x86-64 architecture without the 32 bits compatibility"
echo "library."
echo "If you're running a Debian/Ubuntu distribution, install the libc6-i386,"
echo "lib32stdc++6, and lib32z1 packages (or alternatively libc6:i386,"
echo "libstdc++6:i386, and zlib1g:i386)."
echo "If you're running a RedHat/Fedora distribution, install the glibc.i686 and"
echo "zlib.i686 packages."
echo "If you're running an ArchLinux distribution, install lib32-glibc."
echo "For other distributions, refer to the documentation on how to install the 32 bits"
echo "compatibility libraries."
exit 1
fi
fi
if grep -q ^BR2_HOSTARCH_NEEDS_IA32_COMPILER=y $BR2_CONFIG ; then
if ! echo "int main(void) {}" | gcc -m32 -x c - -o /dev/null 2>/dev/null; then
echo
echo "Your Buildroot configuration needs a compiler capable of building 32 bits binaries."
echo "If you're running a Debian/Ubuntu distribution, install the gcc-multilib package."
echo "For other distributions, refer to their documentation."
exit 1
fi
if ! echo "int main(void) {}" | g++ -m32 -x c++ - -o /dev/null 2>/dev/null; then
echo
echo "Your Buildroot configuration needs a compiler capable of building 32 bits binaries."
echo "If you're running a Debian/Ubuntu distribution, install the g++-multilib package."
echo "For other distributions, refer to their documentation."
exit 1
fi
fi
if grep -q ^BR2_NEEDS_HOST_GCC_PLUGIN_SUPPORT=y $BR2_CONFIG ; then
if ! echo "#include <gcc-plugin.h>" | $HOSTCXX_NOCCACHE -I$($HOSTCXX_NOCCACHE -print-file-name=plugin)/include -x c++ -c - -o /dev/null ; then
echo
echo "Your Buildroot configuration needs a host compiler capable of building gcc plugins."
echo "If you're running a Debian/Ubuntu distribution, install gcc-X-plugin-dev package."
echo "For other distributions, refer to their documentation."
exit 1 ;
fi
fi
# Check that the Perl installation is complete enough for Buildroot.
required_perl_modules="Data::Dumper" # Needed to build host-autoconf
required_perl_modules="$required_perl_modules English" # Used by host-libxml-parser-perl
required_perl_modules="$required_perl_modules ExtUtils::MakeMaker" # Used by host-libxml-parser-perl
required_perl_modules="$required_perl_modules Thread::Queue" # Used by host-automake
required_perl_modules="$required_perl_modules FindBin" # Used by (host-)libopenssl
required_perl_modules="$required_perl_modules IPC::Cmd" # Used by (host-)libopenssl
if grep -q ^BR2_PACKAGE_LIBOPENSSL=y $BR2_CONFIG && grep -q ^BR2_s390x=y $BR2_CONFIG ; then
required_perl_modules="$required_perl_modules bigint"
fi
if grep -q ^BR2_PACKAGE_MOSH=y $BR2_CONFIG ; then
required_perl_modules="$required_perl_modules diagnostics"
fi
if grep -q ^BR2_PACKAGE_MPV=y $BR2_CONFIG ; then
required_perl_modules="$required_perl_modules Math::BigInt"
required_perl_modules="$required_perl_modules Math::BigRat"
fi
if grep -q ^BR2_PACKAGE_NETSURF=y $BR2_CONFIG ; then
required_perl_modules="$required_perl_modules Digest::MD5"
fi
if grep -q ^BR2_PACKAGE_WHOIS=y $BR2_CONFIG ; then
required_perl_modules="$required_perl_modules autodie"
fi
if grep -q -E '^BR2_PACKAGE_(WEBKITGTK|WPEWEBKIT)=y' $BR2_CONFIG ; then
required_perl_modules="${required_perl_modules} JSON::PP"
fi
if grep -q -E '^BR2_(PACKAGE_ACE|TARGET_SYSLINUX)=y' $BR2_CONFIG ; then
required_perl_modules="$required_perl_modules FileHandle"
fi
# This variable will keep the modules that are missing in your system.
missing_perl_modules=""
if grep -q ^BR2_PACKAGE_LIBXCRYPT=y $BR2_CONFIG ; then
# open cannot be used with require
if ! perl -e "use open ':std'" > /dev/null 2>&1 ; then
missing_perl_modules="$missing_perl_modules open"
fi
fi
for pm in $required_perl_modules ; do
if ! perl -e "require $pm" > /dev/null 2>&1 ; then
missing_perl_modules="$missing_perl_modules $pm"
fi
done
if [ -n "$missing_perl_modules" ] ; then
echo "Your Perl installation is not complete enough; at least the following"
echo "modules are missing:"
echo
for pm in $missing_perl_modules ; do
printf "\t $pm\n"
done
echo
exit 1
fi