#!/usr/bin/env bash # SPDX-License-Identifier: (GPL-2.0-only OR MIT) # Copyright (C) 2026 Amlogic, Inc. All rights reserved ################################################################################ # Amlbian LibISP Compilation Module # # Purpose: LibISP user-space compilation with Hook support and aml-comp integration # Provides: LibISP user-space libraries and applications for S6 and A9 platforms ################################################################################ set -e # Get script directory And Set env SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" AMLBIAN_DIR="$(dirname "$(dirname "${SCRIPT_DIR}")")" BASE_DIR="$(dirname "$(dirname "${AMLBIAN_DIR}")")" # Determine chipset based on BOARD variable if [[ "${BOARD}" == *"a9"* ]]; then LIBISP_CHIPSET="a9" elif [[ "${BOARD}" == *"s6"* ]]; then LIBISP_CHIPSET="s6" else LIBISP_CHIPSET="${LIBISP_CHIPSET:-s6}" fi # Source common functions if [[ -f "${AMLBIAN_DIR}/lib/function-common.sh" ]]; then source "${AMLBIAN_DIR}/lib/function-common.sh" fi # ============================================================================== # Shared Helper Functions # ============================================================================== # ------------------------------------------------------------------------------ # Step 1: Version and Package Information Definition # ------------------------------------------------------------------------------ # Initialize common package metadata for LibISP function _libisp_init_package_info() { local chipset="$1" PKG_MAINTAINER="Armbian Build " PKG_DESCRIPTION="Amlogic LibISP user-space libraries for ${chipset} platform" PKG_NAME="aml-libisp" PKG_VERSION="6.12" PKG_ARCH="${ARCH:-arm64}" CROSS_COMPILE="${CROSS_COMPILE:-aarch64-linux-gnu-}" # Get kernel version for packaging local KERNEL_VERSION=$(make -s -C "${BASE_DIR}/aml-comp/kernel/aml-6.12/build" kernelrelease 2>/dev/null || true) KERNEL_VERSION="${KERNEL_VERSION:-unknown-$(date +%Y%m%d)}" # Source directory SRC_DIR="${BASE_DIR}/aml-comp/hardware/amlogic/arm-isp-6.12" FILE_DIR="${SCRIPT_DIR}/files" # Check if source exists if [[ ! -d "${SRC_DIR}" ]]; then display_alert "COMPILE-LIBISP" "LibISP source code not found. Expected at: ${SRC_DIR}" "err" exit 1 fi # Check for v4l2_test source directory (common for all platforms) if [[ ! -d "${SRC_DIR}/app/v4l2_test_arm" ]]; then display_alert "COMPILE-LIBISP" "v4l2_test source directory not found at: ${SRC_DIR}/app/v4l2_test_arm" "err" exit 1 fi display_alert "COMPILE-LIBISP" "Building Amlogic LibISP user-space libraries for ${chipset}" "info" display_alert "COMPILE-LIBISP" "Version: ${PKG_VERSION}, Architecture: ${PKG_ARCH}" "info" display_alert "COMPILE-LIBISP" "Cross compilation toolchain: ${CROSS_COMPILE}" "info" display_alert "COMPILE-LIBISP" "Building for kernel: ${KERNEL_VERSION}" "info" # Return values _LIBISP_CHIPSET="${chipset}" _LIBISP_PKG_NAME="${PKG_NAME}" _LIBISP_PKG_VERSION="${PKG_VERSION}" _LIBISP_ARCH="${PKG_ARCH}" _LIBISP_KERNEL_VERSION="${KERNEL_VERSION}" _LIBISP_SRC_DIR="${SRC_DIR}" _LIBISP_FILE_DIR="${FILE_DIR}" _LIBISP_CROSS_COMPILE="${CROSS_COMPILE}" } # ------------------------------------------------------------------------------ # Step 2: Build Directory Structure Setup # ------------------------------------------------------------------------------ # Create layered build directory structure # Parameters: # $1 - base name (e.g. "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}") # Sets: TMP_DIR, BASE_BUILD_DIR, SOURCE_DIR, BUILD_DIR, INSTALL_DIR, PATCH_DIR, # DEB_PACKAGE_DIR, DEBIAN_DIR function _libisp_create_build_dirs() { local base_name="$1" display_alert "COMPILE-LIBISP" "base_name ${base_name}" "info" TMP_DIR="${AMLBIAN_DIR}/.tmp" mkdir -p "${TMP_DIR}" # 基础构建目录 BASE_BUILD_DIR="${TMP_DIR}/${base_name}" rm -rf ${BASE_BUILD_DIR} # 分层目录 SOURCE_DIR="${BASE_BUILD_DIR}/source" # 源码目录 BUILD_DIR="${BASE_BUILD_DIR}/build" # 编译目录 INSTALL_DIR="${BASE_BUILD_DIR}/install" # 安装目录 PATCH_DIR="${BASE_BUILD_DIR}/patch" # 补丁目录 # 创建所有目录 mkdir -p "${SOURCE_DIR}" mkdir -p "${BUILD_DIR}" mkdir -p "${INSTALL_DIR}" mkdir -p "${PATCH_DIR}" # 在BUILD_DIR下创建deb/包名目录 DEB_PACKAGE_DIR="${BUILD_DIR}/deb/${base_name}" mkdir -p "${DEB_PACKAGE_DIR}" # 安装目录的子目录 DEBIAN_DIR="${INSTALL_DIR}/DEBIAN" mkdir -p "${DEBIAN_DIR}" # 安装目录的子目录 mkdir -p "${INSTALL_DIR}/usr/bin" mkdir -p "${INSTALL_DIR}/usr/lib" mkdir -p "${INSTALL_DIR}/usr/lib/systemd" mkdir -p "${INSTALL_DIR}/usr/include" mkdir -p "${INSTALL_DIR}/etc" # 创建编译日志文件 BUILD_LOG="${BUILD_DIR}/build.log" echo "Build log for ${base_name}" > "${BUILD_LOG}" echo "Started at: $(date)" >> "${BUILD_LOG}" echo "=========================================" >> "${BUILD_LOG}" } # Display build directory info # Parameters: # $1 - log prefix function _libisp_display_build_info() { local log_prefix="$1" display_alert "${log_prefix} Source dir: ${SOURCE_DIR}" "info" display_alert "${log_prefix} Build dir: ${BUILD_DIR}" "info" display_alert "${log_prefix} Install dir: ${INSTALL_DIR}" "info" display_alert "${log_prefix} Patch dir: ${PATCH_DIR}" "info" display_alert "${log_prefix} Deb package dir: ${DEB_PACKAGE_DIR}" "info" display_alert "${log_prefix} Build log: ${BUILD_LOG}" "info" } # ------------------------------------------------------------------------------ # Step 3: Debian Packaging Scripts Creation # ------------------------------------------------------------------------------ # Create Debian control file # Parameters: # $1 - package name # $2 - package version # $3 - package architecture # $4 - maintainer # $5 - description # $6 - dependencies (optional) # $7 - conflicts (optional) # $8 - provides (optional) # $9 - section (optional, default "multimedia") function _libisp_create_control_file() { local pkg_name="$1" local pkg_version="$2" local pkg_arch="$3" local maintainer="$4" local description="$5" local depends="${6:-}" local conflicts="${7:-}" local provides="${8:-}" local section="${9:-multimedia}" display_alert "COMPILE-LIBISP Creating control file DEBIAN/control DEBIAN_DIR $DEBIAN_DIR" "info" cat > "${DEBIAN_DIR}/control" < "${DEBIAN_DIR}/postinst" << 'EOF' #!/bin/bash set -e # Update library cache ldconfig # Enable and start isp.service if it exists if [ -f /usr/lib/systemd/system/isp.service ]; then # Reload systemd to pick up new service file systemctl daemon-reload 2>/dev/null || true # Enable the service to start on boot systemctl enable isp.service 2>/dev/null || true # Start the service now (oneshot service will run and exit) systemctl start isp.service 2>/dev/null || true echo "isp.service enabled and started" else echo "isp.service not found" fi echo "Amlogic LibISP user-space libraries installed successfully." EOF chmod 0755 "${DEBIAN_DIR}/postinst" } # Create prerm script for LibISP function _libisp_create_prerm() { display_alert "COMPILE-LIBISP Creating pre-removal script DEBIAN/prerm" "info" cat > "${DEBIAN_DIR}/prerm" << 'EOF' #!/bin/bash set -e if [ "$1" = "remove" ] || [ "$1" = "deconfigure" ]; then echo "Removing Amlogic LibISP user-space libraries..." # Note: Actual files will be removed automatically by dpkg # This script is for any custom cleanup if needed fi exit 0 EOF chmod 0755 "${DEBIAN_DIR}/prerm" } # ------------------------------------------------------------------------------ # Step 4: Source File Copying # ------------------------------------------------------------------------------ # Copy LibISP source files to source directory function _libisp_copy_source_files() { display_alert "COMPILE-LIBISP Copying source files to source directory" "info" echo "Copying source files to source directory at $(date)" >> "${BUILD_LOG}" cp -r "${_LIBISP_SRC_DIR}/"* "${SOURCE_DIR}/" 2>&1 >> "${BUILD_LOG}" # 更新SRC_DIR为SOURCE_DIR,使用复制的源码 _LIBISP_SRC_DIR="${SOURCE_DIR}" # Set up environment variables for build export ARCH="${_LIBISP_ARCH}" export CROSS_COMPILE="${_LIBISP_CROSS_COMPILE}" # Change to source directory cd "${_LIBISP_SRC_DIR}" } # ------------------------------------------------------------------------------ # Step 5: Application Building (Platform Specific) # ------------------------------------------------------------------------------ # Build common v4l2_test application function _libisp_build_v4l2_test() { local SRC_DIR="${_LIBISP_SRC_DIR}" local BUILD_DIR="${BUILD_DIR}" local INSTALL_DIR="${INSTALL_DIR}" display_alert "COMPILE-LIBISP" "Building v4l2_test application (common)" "info" cd "${SRC_DIR}/app/v4l2_test_arm" # Clean and build display_alert "COMPILE-LIBISP" "Cleaning build directory" "info" make clean 2>/dev/null || true display_alert "COMPILE-LIBISP" "Compiling v4l2_test application ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE}" "info" # export CC="${CC:-${CROSS_COMPILE}gcc}" make OUT_DIR="${BUILD_DIR}/app/v4l2_test_arm" ARM_TARGET="lib" ARCH="${ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" # Check if application was built successfully if [[ -f "${BUILD_DIR}/app/v4l2_test_arm/v4l2_test" ]]; then # 在BUILD_DIR中保存编译结果(备份) display_alert "COMPILE-LIBISP" "Saving build result to build directory" "info" # 安装到INSTALL_DIR(用于打包) install -m 0755 "${BUILD_DIR}/app/v4l2_test_arm/v4l2_test" "${INSTALL_DIR}/usr/bin/" display_alert "COMPILE-LIBISP" "v4l2_test application built successfully" "info" return 0 else display_alert "COMPILE-LIBISP" "v4l2_test application build failed" "err" return 1 fi } # Build S6 specific components function _libisp_build_s6() { local INSTALL_DIR="${INSTALL_DIR}" local FILE_DIR="${_LIBISP_FILE_DIR}" display_alert "COMPILE-LIBISP" "Installing S6 specific files" "info" # Install isp.service if [[ -f "${FILE_DIR}/isp.service" ]]; then install -D -m 0644 "${FILE_DIR}/isp.service" "${INSTALL_DIR}/usr/lib/systemd/system/isp.service" display_alert "COMPILE-LIBISP" "isp.service installed" "info" else display_alert "COMPILE-LIBISP" "isp.service not found at ${FILE_DIR}/isp.service" "warn" fi # Install S6 preparation script if [[ -f "${FILE_DIR}/s6/isp_prepare.sh" ]]; then install -m 0755 "${FILE_DIR}/s6/isp_prepare.sh" "${INSTALL_DIR}/etc/isp_prepare.sh" display_alert "COMPILE-LIBISP" "S6 preparation script installed" "info" else display_alert "COMPILE-LIBISP" "S6 preparation script not found at ${FILE_DIR}/s6/isp_prepare.sh" "warn" fi } # Build A9 specific components function _libisp_build_a9() { local SRC_DIR="${_LIBISP_SRC_DIR}" local BUILD_DIR="${BUILD_DIR}" local INSTALL_DIR="${INSTALL_DIR}" local FILE_DIR="${_LIBISP_FILE_DIR}" # Check for A9 specific source if [[ ! -d "${SRC_DIR}/aml_isp5/libaiq" ]]; then display_alert "COMPILE-LIBISP" "A9 LibISP source not found at: ${SRC_DIR}/aml_isp5/libaiq" "warn" display_alert "COMPILE-LIBISP" "Skipping A9 specific builds (source not available)" "warn" else # Build A9 specific components display_alert "COMPILE-LIBISP" "Building A9 specific components" "info" # Build isp5service if [[ -d "${SRC_DIR}/aml_isp5/libaiq/isp5service" ]]; then display_alert "COMPILE-LIBISP" "Building isp5service" "info" cd "${SRC_DIR}/aml_isp5/libaiq/isp5service" # Clean and build make clean 2>/dev/null || true make OUT_DIR="${BUILD_DIR}/aml_isp5/libaiq/isp5service" ARM_TARGET="lib64" ARCH="${ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" if [[ -f "${BUILD_DIR}/aml_isp5/libaiq/isp5service/isp5service" ]]; then install -m 0755 "${BUILD_DIR}/aml_isp5/libaiq/isp5service/isp5service" "${INSTALL_DIR}/usr/bin/" display_alert "COMPILE-LIBISP" "isp5service built successfully" "info" else display_alert "COMPILE-LIBISP" "isp5service build failed or not found" "warn" fi else display_alert "COMPILE-LIBISP" "isp5service source not found at: ${SRC_DIR}/aml_isp5/libaiq/isp5service" "warn" fi # Install libisp5aml.so library if [[ -f "${SRC_DIR}/aml_isp5/libaiq/firmware/lib64/libisp5aml.so" ]]; then install -m 0644 "${SRC_DIR}/aml_isp5/libaiq/firmware/lib64/libisp5aml.so" "${INSTALL_DIR}/usr/lib/" display_alert "COMPILE-LIBISP" "libisp5aml.so installed" "info" elif [[ -f "${SRC_DIR}/aml_isp5/libaiq/firmware/lib/libisp5aml.so" ]]; then install -m 0644 "${SRC_DIR}/aml_isp5/libaiq/firmware/lib/libisp5aml.so" "${INSTALL_DIR}/usr/lib/" display_alert "COMPILE-LIBISP" "libisp5aml.so installed" "info" else display_alert "COMPILE-LIBISP" "libisp5aml.so not found" "warn" fi fi # Install A9 specific preparation script display_alert "COMPILE-LIBISP" "Installing A9 specific files" "info" # Install isp.service if [[ -f "${FILE_DIR}/isp.service" ]]; then install -D -m 0644 "${FILE_DIR}/isp.service" "${INSTALL_DIR}/usr/lib/systemd/system/isp.service" display_alert "COMPILE-LIBISP" "isp.service installed" "info" fi # Install A9 preparation script if [[ -f "${FILE_DIR}/a9/isp_prepare_6.12.sh" ]]; then install -m 0755 "${FILE_DIR}/a9/isp_prepare_6.12.sh" "${INSTALL_DIR}/etc/isp_prepare.sh" display_alert "COMPILE-LIBISP" "A9 preparation script installed" "info" elif [[ -f "${FILE_DIR}/a9/isp_prepare.sh" ]]; then install -m 0755 "${FILE_DIR}/a9/isp_prepare.sh" "${INSTALL_DIR}/etc/isp_prepare.sh" display_alert "COMPILE-LIBISP" "A9 preparation script installed" "info" else display_alert "COMPILE-LIBISP" "A9 preparation script not found" "warn" fi } # ------------------------------------------------------------------------------ # Step 6: Debian Package Building # ------------------------------------------------------------------------------ # Build Debian package from install directory # Parameters: # $1 - log prefix (e.g. "COMPILE-LIBISP") # $2 - output deb filename (without path) # Sets: OUTPUT_DEB function _libisp_build_deb_package() { local log_prefix="$1" local output_deb_name="$2" # 创建DEBIAN目录 DEBIAN_DIR="${INSTALL_DIR}/DEBIAN" mkdir -p "${DEBIAN_DIR}" # 将install目录内容拷贝到deb目录 display_alert "Copying install directory to deb package directory ${log_prefix}" "info" echo "Copying install directory to deb package directory at $(date)" >> "${BUILD_LOG}" cp -r "${INSTALL_DIR}/"* "${DEB_PACKAGE_DIR}/" 2>&1 >> "${BUILD_LOG}" # 基于deb目录打包 display_alert "Building Debian package from deb directory ${log_prefix}" "info" echo "Building Debian package at $(date)" >> "${BUILD_LOG}" dpkg-deb --build "${DEB_PACKAGE_DIR}" 2>&1 >> "${BUILD_LOG}" if [[ $? -ne 0 ]]; then display_alert "${log_prefix} Package build failed" "error" exit 1 fi # Move to output directory OUTPUT_DEB="${SRC}/output/${output_deb_name}" mkdir -p "$(dirname "${OUTPUT_DEB}")" mv "${DEB_PACKAGE_DIR}.deb" "${OUTPUT_DEB}" display_alert "${log_prefix} Package built successfully ${output_deb_name}" "info" display_alert "${log_prefix} Build directory preserved ${BASE_BUILD_DIR}" "info" } # ============================================================================== # Main Build Functions (Entry Points - DO NOT RENAME) # ============================================================================== # ------------------------------------------------------------------------------ # LibISP User-space Build for specific chipset # Entry point: amlbian_build_libisp # ------------------------------------------------------------------------------ function amlbian_build_libisp() { local chipset="${LIBISP_CHIPSET}" # ---- Step 1: Version and Package Information ---- _libisp_init_package_info "${chipset}" # ---- Step 2: Build Directory Setup ---- _libisp_create_build_dirs "${_LIBISP_PKG_NAME}_${_LIBISP_PKG_VERSION}_${_LIBISP_ARCH}" display_alert "COMPILE-LIBISP Building LibISP DEBIAN_DIR (${DEBIAN_DIR})" "info" # Display info display_alert "COMPILE-LIBISP Building LibISP package version ${_LIBISP_PKG_VERSION} for ${_LIBISP_ARCH} (${chipset})" "info" _libisp_display_build_info "COMPILE-LIBISP" # ---- Step 3: Debian Packaging Scripts ---- _libisp_create_control_file \ "${_LIBISP_PKG_NAME}" "${_LIBISP_PKG_VERSION}" "${_LIBISP_ARCH}" "${PKG_MAINTAINER}" \ "${PKG_DESCRIPTION}" "" "" "" "multimedia" _libisp_create_postinst _libisp_create_prerm # ---- Step 4: Copy Source Files ---- _libisp_copy_source_files # ---- Step 5: Build Applications (Platform Specific) ---- # Build common v4l2_test application _libisp_build_v4l2_test # Build platform specific components if [[ "${chipset}" == "s6" ]]; then _libisp_build_s6 elif [[ "${chipset}" == "a9" ]]; then _libisp_build_a9 else display_alert "COMPILE-LIBISP" "Unsupported chipset: ${chipset}" "err" exit 1 fi # ---- Step 6: Build Debian Package ---- _libisp_build_deb_package "COMPILE-LIBISP" "${_LIBISP_PKG_NAME}_${_LIBISP_PKG_VERSION}_${_LIBISP_ARCH}.deb" display_alert "COMPILE-LIBISP Build directories preserved:" "info" display_alert "COMPILE-LIBISP Source: ${SOURCE_DIR}" "info" display_alert "COMPILE-LIBISP Build: ${BUILD_DIR}" "info" display_alert "COMPILE-LIBISP Install: ${INSTALL_DIR}" "info" display_alert "COMPILE-LIBISP LibISP user-space build for ${chipset} completed successfully" "info" return 0 }