123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- #!/usr/bin/env bash
- set -x
- set -euo pipefail
- # shellcheck disable=SC1091
- . lib.sh
- build_static_libffi () {
- local version=3.0.13
- local td
- td="$(mktemp -d)"
- pushd "${td}"
- curl --retry 3 -sSfL "https://github.com/libffi/libffi/archive/refs/tags/v${version}.tar.gz" -O -L
- tar --strip-components=1 -xzf "v${version}.tar.gz"
- ./configure --prefix="$td"/lib --disable-builddir --disable-shared --enable-static
- make "-j$(nproc)"
- install -m 644 ./.libs/libffi.a /usr/lib64/
- popd
- rm -rf "${td}"
- }
- build_static_libmount () {
- local version_spec=2.23.2
- local version=2.23
- local td
- td="$(mktemp -d)"
- pushd "${td}"
- curl --retry 3 -sSfL "https://kernel.org/pub/linux/utils/util-linux/v${version}/util-linux-${version_spec}.tar.xz" -O -L
- tar --strip-components=1 -xJf "util-linux-${version_spec}.tar.xz"
- ./configure --disable-shared --enable-static --without-ncurses
- make "-j$(nproc)" mount blkid
- install -m 644 ./.libs/*.a /usr/lib64/
- popd
- rm -rf "${td}"
- }
- build_static_libattr() {
- local version=2.4.46
- local td
- td="$(mktemp -d)"
- pushd "${td}"
- yum install -y gettext
- curl --retry 3 -sSfL "https://download.savannah.nongnu.org/releases/attr/attr-${version}.src.tar.gz" -O
- tar --strip-components=1 -xzf "attr-${version}.src.tar.gz"
- cp /usr/share/automake*/config.* .
- ./configure
- make "-j$(nproc)"
- install -m 644 ./libattr/.libs/libattr.a /usr/lib64/
- yum remove -y gettext
- popd
- rm -rf "${td}"
- }
- build_static_libcap() {
- local version=2.22
- local td
- td="$(mktemp -d)"
- pushd "${td}"
- curl --retry 3 -sSfL "https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-${version}.tar.xz" -O
- tar --strip-components=1 -xJf "libcap-${version}.tar.xz"
- make "-j$(nproc)"
- install -m 644 libcap/libcap.a /usr/lib64/
- popd
- rm -rf "${td}"
- }
- build_static_pixman() {
- local version=0.34.0
- local td
- td="$(mktemp -d)"
- pushd "${td}"
- curl --retry 3 -sSfL "https://www.cairographics.org/releases/pixman-${version}.tar.gz" -O
- tar --strip-components=1 -xzf "pixman-${version}.tar.gz"
- ./configure
- make "-j$(nproc)"
- install -m 644 ./pixman/.libs/libpixman-1.a /usr/lib64/
- popd
- rm -rf "${td}"
- }
- main() {
- local version=5.1.0
- if_centos version=4.2.1
- local arch="${1}" \
- softmmu="${2:-}"
- install_packages \
- autoconf \
- automake \
- bison \
- bzip2 \
- curl \
- flex \
- libtool \
- make \
- patch \
- python3 \
- if_centos install_packages \
- gcc-c++ \
- pkgconfig \
- xz \
- glib2-devel \
- glib2-static \
- glibc-static \
- libattr-devel \
- libcap-devel \
- libfdt-devel \
- pcre-static \
- pixman-devel \
- libselinux-devel \
- libselinux-static \
- libffi \
- libuuid-devel \
- libblkid-devel \
- libmount-devel \
- zlib-devel \
- zlib-static
- if_centos 'curl --retry 3 -sSfL "https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD" -o /usr/share/automake*/config.guess'
- if_centos 'curl --retry 3 -sSfL "https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD" -o /usr/share/automake*/config.sub'
- # these are not packaged as static libraries in centos; build them manually
- if_centos build_static_libffi
- if_centos build_static_libmount
- if_centos build_static_libattr
- if_centos build_static_libcap
- if_centos build_static_pixman
- if_ubuntu install_packages \
- g++ \
- pkg-config \
- xz-utils \
- libattr1-dev \
- libcap-ng-dev \
- libffi-dev \
- libglib2.0-dev \
- libpixman-1-dev \
- libselinux1-dev \
- zlib1g-dev
- # if we have python3.6+, we can install qemu 6.1.0, which needs ninja-build
- # ubuntu 16.04 only provides python3.5, so remove when we have a newer qemu.
- is_ge_python36=$(python3 -c "import sys; print(int(sys.version_info >= (3, 6)))")
- if [[ "${is_ge_python36}" == "1" ]]; then
- if_ubuntu version=6.1.0
- if_ubuntu install_packages ninja-build
- fi
- local td
- td="$(mktemp -d)"
- pushd "${td}"
- curl --retry 3 -sSfL "https://download.qemu.org/qemu-${version}.tar.xz" -O
- tar --strip-components=1 -xJf "qemu-${version}.tar.xz"
- local targets="${arch}-linux-user"
- local virtfs=""
- case "${softmmu}" in
- softmmu)
- if [ "${arch}" = "ppc64le" ]; then
- targets="${targets},ppc64-softmmu"
- else
- targets="${targets},${arch}-softmmu"
- fi
- virtfs="--enable-virtfs"
- ;;
- "")
- true
- ;;
- *)
- echo "Invalid softmmu option: ${softmmu}"
- exit 1
- ;;
- esac
- ./configure \
- --disable-kvm \
- --disable-vnc \
- --disable-guest-agent \
- --enable-linux-user \
- --static \
- ${virtfs} \
- --target-list="${targets}"
- make "-j$(nproc)"
- make install
- # HACK the binfmt_misc interpreter we'll use expects the QEMU binary to be
- # in /usr/bin. Create an appropriate symlink
- ln -s "/usr/local/bin/qemu-${arch}" "/usr/bin/qemu-${arch}-static"
- purge_packages
- popd
- rm -rf "${td}"
- rm "${0}"
- }
- main "${@}"
|