#!/usr/bin/env bash # SPDX-License-Identifier: (GPL-2.0-only OR MIT) # Copyright (C) 2026 Amlogic, Inc. All rights reserved ################################################################################ # Amlbian Logcat Compilation Module # # Purpose: Compile and package logcat tool for Android debugging # Provides: logcat binary for system logging ################################################################################ set -e # Get script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" AMLBIAN_DIR="$(dirname "$(dirname "$(dirname "${SCRIPT_DIR}")")")" BASE_DIR="$(dirname "$(dirname "${AMLBIAN_DIR}")")" # 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 logcat function _logcat_init_package_info() { PKG_MAINTAINER="Armbian Build " PKG_DESCRIPTION="Android logcat tool for system logging" PKG_NAME="android-tools-logcat" PKG_VERSION="1.0" PKG_ARCH="all" # Source directory for logcat LOGCAT_SRC_DIR="${BASE_DIR}/aml-comp/vendor/amlogic/aml_commonlib/logcat" FILES_DIR="${SCRIPT_DIR}/files" } # ------------------------------------------------------------------------------ # 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 _logcat_create_build_dirs() { local base_name="$1" TMP_DIR="${SRC}/.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}" } # Create standard install subdirectories for logcat function _logcat_create_install_dirs() { mkdir -p "${INSTALL_DIR}/usr/bin" } # ------------------------------------------------------------------------------ # 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 - section (optional, default "utils") function _logcat_create_control_file() { local pkg_name="$1" local pkg_version="$2" local pkg_arch="$3" local maintainer="$4" local description="$5" local section="${6:-utils}" display_alert "COMPILE-LOGCAT Creating control file DEBIAN/control" "info" cat > "${DEBIAN_DIR}/control" < "${DEBIAN_DIR}/postinst" << EOF #!/bin/sh set -e if [ "\$1" = "configure" ]; then echo "Logcat tool installed successfully" echo "Usage: logcat [options]" fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/postinst" } # Create prerm script for logcat function _logcat_create_prerm() { display_alert "COMPILE-LOGCAT Creating pre-removal script DEBIAN/prerm" "info" cat > "${DEBIAN_DIR}/prerm" << EOF #!/bin/sh set -e if [ "\$1" = "remove" ] || [ "\$1" = "deconfigure" ]; then echo "Logcat tool being removed" fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/prerm" } # ------------------------------------------------------------------------------ # Step 4: Source/Vendor File Copying and Patching # ------------------------------------------------------------------------------ # Copy logcat source files and apply patches function _logcat_copy_and_patch_files() { display_alert "COMPILE-LOGCAT Copying source files from ${LOGCAT_SRC_DIR}" "info" # Check if source directory exists if [[ ! -d "${LOGCAT_SRC_DIR}" ]]; then display_alert "COMPILE-LOGCAT Source directory not found: ${LOGCAT_SRC_DIR}" "err" display_alert "COMPILE-LOGCAT Trying to clone or find alternative source" "info" # Try to find source in other locations LOGCAT_SRC_DIR="${BASE_DIR}/aml-comp/vendor/amlogic/aml_commonlib/logcat" if [[ ! -d "${LOGCAT_SRC_DIR}" ]]; then display_alert "COMPILE-LOGCAT Source not found. Please ensure aml_commonlib is available" "err" exit 1 fi fi # Copy source files cp -r "${LOGCAT_SRC_DIR}" "${SOURCE_DIR}/logcat" display_alert "COMPILE-LOGCAT Copied logcat source files" "info" # Apply patches if available if [[ -f "${FILES_DIR}/logcat.patch" ]]; then display_alert "COMPILE-LOGCAT Applying logcat.patch" "info" cd "${SOURCE_DIR}" patch -p1 < "${FILES_DIR}/logcat.patch" || true cd - > /dev/null fi } # ------------------------------------------------------------------------------ # Step 5: Liblog Dependency Handling # ------------------------------------------------------------------------------ # Check and build liblog dependency if needed function _logcat_check_liblog_dependency() { display_alert "COMPILE-LOGCAT Checking liblog dependency" "info" # Check if liblog is already built local liblog_dir="${SRC}/.tmp/liblog-build-${ARCH:-arm64}" local liblog_install_dir="${liblog_dir}/install" if [[ ! -d "${liblog_install_dir}" ]] || [[ ! -f "${liblog_install_dir}/usr/lib/liblog.so" ]]; then display_alert "COMPILE-LOGCAT liblog not found, building liblog..." "info" # Build liblog if ! ( cd "${AMLBIAN_DIR}" source "${AMLBIAN_DIR}/scripts/build-liblog.sh" ); then display_alert "COMPILE-LOGCAT Failed to build liblog" "err" return 1 fi # Verify liblog was built if [[ ! -d "${liblog_install_dir}" ]] || [[ ! -f "${liblog_install_dir}/usr/lib/liblog.so" ]]; then display_alert "COMPILE-LOGCAT liblog still not found after build" "err" return 1 fi fi display_alert "COMPILE-LOGCAT liblog dependency satisfied" "info" return 0 } # ------------------------------------------------------------------------------ # Step 6: Compilation # ------------------------------------------------------------------------------ # Compile logcat tool function _logcat_compile() { display_alert "COMPILE-LOGCAT Compiling logcat tool" "info" # First check and build liblog dependency if ! _logcat_check_liblog_dependency; then display_alert "COMPILE-LOGCAT Cannot compile without liblog" "err" exit 1 fi # Get liblog paths local liblog_dir="${SRC}/.tmp/liblog-build-${ARCH:-arm64}" local liblog_install_dir="${liblog_dir}/install" cd "${SOURCE_DIR}/logcat" # Set up build environment with liblog paths export OUT_DIR="${BUILD_DIR}" export TARGET_DIR="${INSTALL_DIR}" export STAGING_DIR="${STAGING_DIR_TARGET:-${BASE_DIR}/staging}" export DESTDIR="${INSTALL_DIR}" # Add liblog include and library paths export CFLAGS="-I${SOURCE_DIR}/logcat/include" export LDFLAGS="-L${liblog_install_dir}/usr/lib -llog" # Create necessary directories mkdir -p "${BUILD_DIR}" mkdir -p "${STAGING_DIR}" # Create a temporary Makefile override to fix logcat_test compilation # The original Makefile doesn't include $(CFLAGS) in the logcat_test rule local makefile_override="${TMP_DIR}/logcat-override.mk" cat > "${makefile_override}" << 'EOF' # Makefile override for logcat_test compilation # Fixes the missing $(CFLAGS) in the original rule # Override the logcat_test rule to include $(CFLAGS) logcat_test: logcat_test.c $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $(OUT_DIR)/$@ EOF # Compile with liblog support, using both the original Makefile and the override # Use -f to specify multiple makefiles: original Makefile first, then override make -C "${SOURCE_DIR}/logcat" \ OUT_DIR="${BUILD_DIR}" \ TARGET_DIR="${INSTALL_DIR}" \ STAGING_DIR="${STAGING_DIR}" \ DESTDIR="${INSTALL_DIR}" \ CFLAGS="${CFLAGS} -DHAVE_IOCTL" \ LDFLAGS="${LDFLAGS}" \ -f Makefile -f "${makefile_override}" cd - > /dev/null # Check if compilation succeeded if [[ ! -f "${BUILD_DIR}/logcat" ]]; then display_alert "COMPILE-LOGCAT Compilation failed: logcat binary not found" "err" exit 1 fi display_alert "COMPILE-LOGCAT Compilation successful" "info" } # ------------------------------------------------------------------------------ # Step 7: Installation # ------------------------------------------------------------------------------ # Install logcat binaries function _logcat_install() { display_alert "COMPILE-LOGCAT Installing binaries" "info" # Create bin directory mkdir -p "${INSTALL_DIR}/usr/bin" # Install logcat binary if [[ -f "${BUILD_DIR}/logcat" ]]; then install -m 0755 "${BUILD_DIR}/logcat" "${INSTALL_DIR}/usr/bin/" display_alert "COMPILE-LOGCAT Installed logcat binary" "info" else display_alert "COMPILE-LOGCAT logcat binary not found in ${BUILD_DIR}" "err" exit 1 fi # Install logcat_test if available if [[ -f "${BUILD_DIR}/logcat_test" ]]; then install -m 0755 "${BUILD_DIR}/logcat_test" "${INSTALL_DIR}/usr/bin/" display_alert "COMPILE-LOGCAT Installed logcat_test binary" "info" fi } # ------------------------------------------------------------------------------ # Step 8: Debian Package Building # ------------------------------------------------------------------------------ # Build Debian package from install directory # Parameters: # $1 - log prefix (e.g. "COMPILE-LOGCAT") # $2 - output deb filename (without path) # Sets: OUTPUT_DEB function _logcat_build_deb_package() { local log_prefix="$1" local output_deb_name="$2" # 将install目录内容拷贝到deb目录 display_alert "Copying install directory to deb package directory ${log_prefix}" "info" cp -r "${INSTALL_DIR}/"* "${DEB_PACKAGE_DIR}/" 2>&1 # 基于deb目录打包 display_alert "Building Debian package from deb directory ${log_prefix}" "info" dpkg-deb --build "${DEB_PACKAGE_DIR}" 2>&1 # 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" } # Display build directory info # Parameters: # $1 - log prefix function _logcat_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} Logcat source dir: ${LOGCAT_SRC_DIR}" "info" } # ============================================================================== # Main Build Functions (Entry Points - DO NOT RENAME) # ============================================================================== # ------------------------------------------------------------------------------ # Logcat Tool Build # Entry point: amlbian_build_logcat # ------------------------------------------------------------------------------ function amlbian_build_logcat() { if ! is_unit_enabled "devtool" || ! is_unit_enabled "liblog"; then echo "[SKIP] >> Logcat disable in BUILD_UNITS" return fi # ---- Step 1: Version and Package Information ---- _logcat_init_package_info # ---- Step 2: Build Directory Setup ---- _logcat_create_build_dirs "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}" _logcat_create_install_dirs # Display info display_alert "COMPILE-LOGCAT Building logcat tool package version ${PKG_VERSION}" "info" _logcat_display_build_info "COMPILE-LOGCAT" # ---- Step 3: Debian Packaging Scripts ---- _logcat_create_control_file \ "${PKG_NAME}" "${PKG_VERSION}" "${PKG_ARCH}" "${PKG_MAINTAINER}" \ "${PKG_DESCRIPTION}" "utils" _logcat_create_postinst _logcat_create_prerm # ---- Step 4: Copy Source/Vendor Files and Apply Patches ---- _logcat_copy_and_patch_files # ---- Step 5: Check and Build Liblog Dependency ---- if ! _logcat_check_liblog_dependency; then display_alert "COMPILE-LOGCAT Cannot proceed without liblog" "err" return 1 fi # ---- Step 6: Compilation ---- _logcat_compile # ---- Step 7: Installation ---- _logcat_install # ---- Step 8: Build Debian Package ---- _logcat_build_deb_package "COMPILE-LOGCAT" "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}.deb" display_alert "COMPILE-LOGCAT Logcat tool build completed successfully" "info" return 0 } display_alert "AMLbian Logcat Build Script" "Scriptdir: ${SCRIPT_DIR} AmlbianDir: ${AMLBIAN_DIR}" "info" amlbian_build_logcat display_alert "AMLOGIC: logcat build completed" "${OUTPUT_DIR}" "info"