summaryrefslogtreecommitdiffstats
path: root/builder/modules.d/dnbd3-rootfs/helper/build.inc
diff options
context:
space:
mode:
Diffstat (limited to 'builder/modules.d/dnbd3-rootfs/helper/build.inc')
-rw-r--r--builder/modules.d/dnbd3-rootfs/helper/build.inc240
1 files changed, 240 insertions, 0 deletions
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 <kernel_version>
+ 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