# Note: not intended to be invoked directly, see rebuild.sh. # # Rebuilds Crosvm and its dependencies from a clean state.
: ${TOOLS_DIR:="$(pwd)/tools"}
# Stable is usually too old for crosvm, but make sure you bump this # up as far as you can each time this script is touched..
RUST_TOOLCHAIN_VER=1.65.0
# Gfxstream needs a new-ish version of CMake
mkdir -p "${TOOLS_DIR}/cmake"
cd "${TOOLS_DIR}/cmake"
curl -O -L https://cmake.org/files/v3.22/cmake-3.22.1-linux-$(uname -m).sh
chmod +x cmake-3.22.1-linux-$(uname -m).sh
sudo ./cmake-3.22.1-linux-$(uname -m).sh --skip-license --exclude-subdir --prefix=/usr/local
cmake --version
# Meson getting started guide mentions that the distro version is frequently # outdated and recommends installing via pip.
pip3 install --no-warn-script-location meson
# Tools for building gfxstream
pip3 install absl-py
pip3 install urlfetch
case "$(uname -m)" in
aarch64)
prepare_cargo
;;
x86_64) # Cross-compilation is x86_64 specific
sudo apt install -y crossbuild-essential-arm64
prepare_cargo aarch64-unknown-linux-gnu
;;
esac
}
retry() { for i in $(seq 5); do "$@" && return 0
sleep 1 done
return 1
}
fetch_source() { echo"Fetching source..."
mkdir -p "${SOURCE_DIR}"
cd "${SOURCE_DIR}"
if ! git config user.name; then
git config --global user.name "AOSP Crosvm Builder"
git config --global user.email "nobody@android.com"
git config --global color.ui false fi
if [[ -z "${CUSTOM_MANIFEST}" ]]; then # Building Crosvm currently depends using Chromium's directory scheme for subproject # directories ('third_party' vs 'external').
fatal_echo "CUSTOM_MANIFEST must be provided. You most likely want to provide a full path to" \ "a copy of device/google/cuttlefish_vmm/manifest.xml." fi
prepare_source() { if [ "$(ls -A $SOURCE_DIR)" ]; then echo"${SOURCE_DIR} is non empty. Run this from an empty directory if you wish to fetch the source."1>&2
exit 2 fi
fetch_source
}
cp -a "${WORKING_DIR}"/usr/lib/libdrm.so* "${OUTPUT_BIN_DIR}"
debuglink libdrm.so.2.4.0
}
compile_minijail() { echo"Compiling Minijail..."
cd "${SOURCE_DIR}/platform/minijail"
# Disable warnings that the old gcc does not know about...
sed -i "s|-Wstring-compare||" common.mk
if ! grep '^# cuttlefish_vmm-rebuild-mark' Makefile; then # Link minijail-sys rust crate dynamically to minijail
sed -i '/BUILD_STATIC_LIBS/d' rust/minijail-sys/build.rs
sed -i 's,static=minijail.pic,dylib=minijail,' rust/minijail-sys/build.rs
# Use Android prebuilt C files instead of generating them
sed -i 's,\(.*\.gen\.c: \),DISABLED_\1,' Makefile cat >>Makefile <<EOF
libconstants.gen.c: \$(SRC)/linux-x86/libconstants.gen.c
@cp \$< \$@
libsyscalls.gen.c: \$(SRC)/linux-x86/libsyscalls.gen.c
@cp \$< \$@ # cuttlefish_vmm-rebuild-mark
EOF fi
make -j OUT="${WORKING_DIR}" cp"${WORKING_DIR}"/libminijail.so "${WORKING_DIR}"/usr/lib
cp -a "${WORKING_DIR}"/usr/lib/libminijail.so "${OUTPUT_BIN_DIR}"
debuglink libminijail.so
}
compile_minigbm() { echo"Compiling Minigbm..."
cd "${SOURCE_DIR}/platform/minigbm"
# Minigbm's package config file has a default hard-coded path. Update here so # that dependent packages can find the files.
sed -i "s|prefix=/usr\$|prefix=${WORKING_DIR}/usr|" gbm.pc
# The gbm used by upstream linux distros is not compatible with crosvm, which must use Chrome OS's # minigbm.
local cpp_flags=(-I/working/usr/include -I/working/usr/include/libdrm)
local ld_flags=(-Wl,-soname,libgbm.so.1 -Wl,-rpath,\\\$\$ORIGIN -L/working/usr/lib)
local make_flags=()
local minigbm_drv=(${MINIGBM_DRV}) for drv in "${minigbm_drv[@]}"; do
cpp_flags+=(-D"DRV_${drv}")
make_flags+=("DRV_${drv}"=1) done
# Note: depends on libepoxy
cd "${SOURCE_DIR}/third_party/virglrenderer"
# Meson needs to have dependency information for header lookup.
sed -i "s|cc.has_header('epoxy/egl.h')|cc.has_header('epoxy/egl.h', dependencies: epoxy_dep)|" meson.build
cp -a "${dist_dir}"/libvk_swiftshader.so "${OUTPUT_BIN_DIR}"
debuglink libvk_swiftshader.so
cp -a "${dist_dir}"/Linux/vk_swiftshader_icd.json "${OUTPUT_BIN_DIR}"
}
compile_crosvm() { echo"Compiling Crosvm..."
source "${HOME}/.cargo/env"
# Workaround for aosp/1412815
cd "${SOURCE_DIR}/platform/crosvm/protos/src" if ! grep '^mod generated {$' lib.rs; then cat >>lib.rs <<EOF
mod generated { include!(concat!(env!("OUT_DIR"), "/generated.rs"));
}
EOF fi
sed -i "s/pub use cdisk_spec_proto::cdisk_spec/pub use generated::cdisk_spec/" lib.rs
cd "${SOURCE_DIR}/platform/crosvm"
# Workaround for minijail-sys prepending -L/usr/lib/$arch dir # which breaks the preferred search path for libdrm.so
sed -i '0,/pkg_config::Config::new().probe("libdrm")?;/{/pkg_config::Config::new().probe("libdrm")?;/d;}' rutabaga_gfx/build.rs
# Workaround rutabaga build thinking it needs at later version of virglrenderer.
sed -i 's/atleast_version("1.0.0")/atleast_version("0.10.0")/g' rutabaga_gfx/build.rs
local crosvm_features=audio,gdb,gpu,composite-disk,usb,virgl_renderer if [[ $BUILD_GFXSTREAM -eq 1 ]]; then
crosvm_features+=,gfxstream fi
cd "${SOURCE_DIR}/platform/crosvm"
case ${ARCH} in
x86_64) subdir="${ARCH}" ;;
amd64) subdir="x86_64" ;;
arm64) subdir="aarch64" ;;
aarch64) subdir="${ARCH}" ;;
*) echo"${ARCH} is not supported"
exit 15
esac
# b/277618912: glibc's aarch64 memcpy uses unaligned accesses which seems to # cause SIGBUS errors on some Nvidia GPUs.
compile_mem_routine_overrides() { if [ "${ARCH}" = "aarch64" ]; then echo"Compiling aligned mem routine overrides for ${ARCH}..."
mkdir -p "${SOURCE_DIR}/mem_override"
cd "${SOURCE_DIR}/mem_override"
if [[ $BUILD_CROSVM -eq 1 ]]; then
compile_libdrm
compile_minijail
compile_minigbm
compile_epoxy
compile_virglrenderer
compile_libffi # wayland depends on it
compile_wayland fi
if [[ $BUILD_GFXSTREAM -eq 1 ]]; then
compile_gfxstream fi
compile_crosvm
compile_crosvm_seccomp
if [[ $BUILD_SWIFTSHADER -eq 1 ]]; then
compile_swiftshader fi
compile_mem_routine_overrides
dpkg-query -W > "${OUTPUT_DIR}/builder-packages.txt" echo"Results in ${OUTPUT_DIR}"
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.