From 53074916a2ccb2dad8ae1fc7eec7a112348b179e Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Tue, 3 Sep 2019 13:31:11 +0200 Subject: initial support for different qcow handlers --- builder/modules.d/dnbd3-rootfs/helper/build.inc | 240 ++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 builder/modules.d/dnbd3-rootfs/helper/build.inc (limited to 'builder/modules.d/dnbd3-rootfs/helper/build.inc') diff --git a/builder/modules.d/dnbd3-rootfs/helper/build.inc b/builder/modules.d/dnbd3-rootfs/helper/build.inc new file mode 100644 index 00000000..b7710985 --- /dev/null +++ b/builder/modules.d/dnbd3-rootfs/helper/build.inc @@ -0,0 +1,240 @@ +#!/usr/bin/env bash +# -*- coding: utf-8 -*- +# shellcheck source=./rebash/core.sh + +declare -rg _moddir="$(dirname "${BASH_SOURCE[0]}")/.." + +source "${_moddir}/scripts/rebash/core.sh" +core.import logging + +declare -rg _supported_qcow_handlers=("xmount" "kernel") +initialize_components() { + local qcow_handler="$1" + IFS='|' _pattern="^(${_supported_qcow_handlers[*]})$" export _pattern + if [[ ! "$qcow_handler" =~ $_pattern ]] ; then + logging.warn "Unknown qcow handler '$1' - will built all known." + logging.warn "Supported handlers: ${_supported_qcow_handlers[*]}" + fi + _deps_base_dir="${_moddir}/binaries" + # We might want to move the "binaries" repos from the dnbd3-rootfs module to main repo one day... + # TODO check for its existence using modinfo -k + if [[ ! -f "${_deps_base_dir}/dnbd3/build/dnbd3.ko" ]] || \ + [[ ! -f "${_deps_base_dir}/dnbd3/build/dnbd3-client" ]]; then + logging.info "Could not find dnbd3, building it..." + if ! CMAKE_FLAGS="-DKERNEL_DIR=${kernel_headers}" \ + build_compile_dnbd3 "${_deps_base_dir}/dnbd3/"; then + logging.error "Failed to build dnbd3." + return 1 + fi + fi + # take care of the qcow handler + if [ -z "$qcow_handler" ] || [ "$qcow_handler" = "xmount" ]; then + if [[ ! -f "${_deps_base_dir}/xmount/trunk/build/src/xmount" ]]; then + logging.info "Could not find xmount binary, building it..." + if ! build_compile_xmount "${_deps_base_dir}/xmount/"; then + logging.error "Failed to build xmount binary." + return 1 + fi + fi + if [[ ! -f "${_deps_base_dir}/qemu-xmount/libxmount_input_qemu.so" ]]; then + logging.info "Could not find xmount qemu library, building it..." + if ! build_compile_qemu_xmount "${_deps_base_dir}/qemu-xmount/"; then + logging error "Failed to build xmount qemu library." + return 1 + fi + fi + fi + if [ -z "$qcow_handler" ] || [ "$qcow_handler" = "kernel" ]; then + # TODO check if the given kernel supports it, bail otherwise + if [ ! -f "${_deps_base_dir}/kernel-qcow2-util-linux/losetup" ]; then + logging.info "Could not find losetup with qcow2 support, building it..." + if ! build_compile_losetup_qcow "${_deps_base_dir}/kernel-qcow2-util-linux"; then + logging.error "Failed to build losetup with qcow support." + return 1 + fi + fi + fi + + # always compile this helper since it does not cost much to do so + if [[ ! -f "${_deps_base_dir}/systemd-preserve-process-marker/systemd-preserve-process-marker" ]]; then + logging.info "Could not find systemd-preserve-process-marker binary, building it ..." + if ! build_compile_systemd_preserve_process_marker \ + "${_deps_base_dir}/systemd-preserve-process-marker/"; then + logging.error "Failed to build systemd-preserve-process-marker" + return 1 + fi + fi + logging.info "Compilation of dnbd3-rootfs dependencies succeeded." + return 0 +} + +clean_components() { + local __doc__=' + Removes all compiled kernel specific files. + NOTE: This method is triggered manually and not supported by dracut itself. + + Example: + + `clean` + ' + build_clean_xmount "${_moddir}/binaries/xmount/" + build_clean_qemu_xmount "${_moddir}/binaries/qemu-xmount/" + build_clean_dnbd3 "${_moddir}/binaries/dnbd3/" + build_clean_losetup_qcow "${_moddir}/binaries/kernel-qcow2-util-linux" + build_clean_dnbd3 "${_moddir}/binaries/dnbd3/" + build_clean_systemd_preserve_process_marker \ + "${_moddir}/binaries/systemd-preserve-process-marker/" + return 0 +} +# endregion + +build_compile_qemu_xmount() { + local __doc__=' + Compiles qemu libxmount. + NOTE: expects xmount installation under + $1/../xmount/trunk/build/release_build/ + + Provides the following file: + "$1/libxmount_input_qemu.so" + + Example: + + `build_compile_qemu_xmount /qemu_source /xmount/installation` + ' + pushd "$1" + local xmount_installation="../xmount/trunk/build/release_build/usr" + [ ! -z "$2" ] && xmount_installation="$2" + ./configure --enable-xmount-input --python="$(which python2)" \ + --extra-cflags="-fPIC" \ + --extra-cflags="-std=gnu99" \ + --extra-cflags="-I${xmount_installation}/include" \ + --extra-cflags="-I${xmount_installation}/include/xmount" \ + --disable-fdt --target-list="" + make -j libxmount_input_qemu.so + local ret=$? + popd + return $ret +} +build_clean_qemu_xmount() { + local __doc__='Clean the build of `build_compile_qemu_xmount`.' + pushd "$1" + make clean + local ret=$? + popd + return $ret +} +build_compile_xmount() { + local __doc__=' + Compiles xmount. + + Provides the xmount installation under: + "$1/trunk/build/release_build/" + + Example: + + `build_compile_xmount /xmount_source /xmount_source/build /usr` + ' + pushd "$1" + + local destination_directory="./release_build" + [ ! -z "$2" ] && destination_directory="$2" + local install_prefix="/usr" + [ ! -z "$3" ] && install_prefix="$3" + + mkdir --parents trunk/build + cd trunk/build || return 1 + cmake -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="$install_prefix" .. + make -j + make install DESTDIR="$destination_directory" + local ret=$? + popd + return $ret +} +build_clean_xmount() { + local __doc__='Clean the build of `build_compile_xmount`.' + rm --recursive --force "$1/trunk/build" +} +build_compile_dnbd3() { + local __doc__=' + Compiles dnbd3 kernel module and client. + + Provides the following file: + "$1/build/dnbd3.ko" + "$1/build/dnbd3-client" + + Examples: + + `build_compile_dnbd3 path/to/dnbd3/source/` + + Passing the kernel version to cmake: + `CMAKE_FLAGS="-DKERNEL_VERSION=4.14.6-openslx+" \ + build_compile_dnbd3 path/to/dnbd3/source/` + ' + pushd "$1" + # NOTE: The generic way would be: "./build.sh" but this tries to build + # more than we really need and takes more time. + mkdir --parents build + pushd build + # Inject CMAKE_FLAGS as a way to control how cmake is called, + # e.g. to pass the kernel version + cmake ${CMAKE_FLAGS} ../ + make -j dnbd3 dnbd3-client + local ret=$? + popd + return $ret +} +build_clean_dnbd3() { + local __doc__='Clean the build of `build_compile_dnbd3`.' + rm --recursive --force "$1/build" + return $? +} +# needs autopoint bison automake libtool +build_compile_losetup_qcow() { + pushd "$1" + ( + set -o errexit + ./autogen.sh + ./configure + make -j losetup + ) + local ret=$? + popd + return $ret +} +build_clean_losetup_qcow() { + pushd "$1" + make clean + local ret=$? + popd + return $ret +} +build_compile_systemd_preserve_process_marker() { + local __doc__=' + Compiles simple c program. + + Examples: + + `build_compile_systemd_preserve_process_marker path/to/program/folder` + ' + pushd "$1" + make + local ret=$? + popd + return $ret +} +build_clean_systemd_preserve_process_marker() { + local __doc__=' + Clean the build of + `build_compile_systemd_preserve_process_marker`. + ' + pushd "$1" + make clean + local ret=$? + popd + return $ret +} +# region vim modline +# vim: set tabstop=4 shiftwidth=4 expandtab: +# vim: foldmethod=marker foldmarker=region,endregion: +# endregion -- cgit v1.2.3-55-g7522