Files
BPI-CM9-Linux/amlbian/scripts/isp/build-libisp.sh
T
2026-08-24 10:03:24 +08:00

492 lines
19 KiB
Bash
Executable File

#!/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 <[email protected]>"
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" <<EOF
Package: ${pkg_name}
Version: ${pkg_version}
Architecture: ${pkg_arch}
Maintainer: ${maintainer}
Depends: ${depends}
Conflicts: ${conflicts}
Provides: ${provides}
Section: ${section}
Priority: optional
Description: ${description}
This package provides user-space libraries and applications
for Amlogic ISP camera support on ${_LIBISP_CHIPSET} platform.
EOF
}
# Create postinst script for LibISP
function _libisp_create_postinst() {
display_alert "COMPILE-LIBISP Creating post-installation script DEBIAN/postinst" "info"
cat > "${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
}