feat: Add Linux build script and document ARM64 support

- Add build.sh: comprehensive Linux build script equivalent to build.ps1
  * Support for --build-type (all/idsueye-only), --config (release/debug)
  * Automatic dependency checking (cmake, GStreamer dev packages)
  * ARM64 architecture detection and support
  * Conditional IDS uEye SDK detection
  * Colored output and comprehensive error handling
  * Auto-installation with sudo when needed

- Update README.md with Linux/ARM64 build instructions:
  * Add Linux build section with build.sh usage examples
  * Document manual build process for Linux
  * Add verification commands and example usage
  * Mark ARM64 (aarch64) as tested on Jetson Xavier/Orin
  * Include platform compatibility matrix

Verified working on:
- Linux ARM64 (aarch64) - Jetson Xavier with Ubuntu 20.04 LTS
- IDS uEye UI328xCP-C camera successfully tested with video recording
- All 8 plugins build and function properly on ARM64
This commit is contained in:
yair
2025-11-26 19:28:06 +00:00
parent 73afb1f671
commit 1e58284817
2 changed files with 363 additions and 0 deletions

305
build.sh Executable file
View File

@@ -0,0 +1,305 @@
#!/bin/bash
set -e
# GStreamer Vision Plugins Build Script for Linux
#
# Usage Examples:
# ./build.sh
# ./build.sh --build-type all --config release
# ./build.sh --build-type idsueye-only --config debug --no-install
# ./build.sh --help
# Default values
BUILD_TYPE="all"
CONFIG="release"
NO_INSTALL=""
BUILD_DIR=""
GSTREAMER_ROOT=""
INSTALL_PREFIX=""
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color
print_banner() {
echo -e "${CYAN}========================================"
echo "GStreamer Vision Plugins Build Script"
echo "Linux/ARM64 Compatible Version"
echo -e "========================================${NC}"
echo ""
}
print_help() {
echo "Usage: $0 [OPTIONS]"
echo ""
echo "Options:"
echo " --build-type TYPE Build type: 'all' (default) or 'idsueye-only'"
echo " --config CONFIG Build config: 'release' (default) or 'debug'"
echo " --no-install Skip installing plugins to system directories"
echo " --build-dir DIR Custom build directory (default: build)"
echo " --install-prefix DIR Custom install prefix"
echo " --help Show this help message"
echo ""
echo "Examples:"
echo " ./build.sh # Build all plugins in release mode"
echo " ./build.sh --build-type idsueye-only # Build only IDS uEye plugin"
echo " ./build.sh --config debug --no-install # Debug build without system install"
echo ""
}
# Parse command line arguments
while [[ $# -gt 0 ]]; do
case $1 in
--build-type)
BUILD_TYPE="$2"
shift 2
;;
--config)
CONFIG="$2"
shift 2
;;
--no-install)
NO_INSTALL="yes"
shift
;;
--build-dir)
BUILD_DIR="$2"
shift 2
;;
--install-prefix)
INSTALL_PREFIX="$2"
shift 2
;;
--help)
print_help
exit 0
;;
*)
echo -e "${RED}Error: Unknown option $1${NC}" >&2
print_help
exit 1
;;
esac
done
print_banner
# Validate build type
case $BUILD_TYPE in
"all"|"idsueye-only")
;;
*)
echo -e "${RED}Error: Invalid build type '$BUILD_TYPE'. Use 'all' or 'idsueye-only'${NC}" >&2
exit 1
;;
esac
# Validate config
case $CONFIG in
"release"|"debug")
;;
*)
echo -e "${RED}Error: Invalid config '$CONFIG'. Use 'release' or 'debug'${NC}" >&2
exit 1
;;
esac
# Set build directory
if [ -z "$BUILD_DIR" ]; then
if [ "$BUILD_TYPE" = "idsueye-only" ]; then
BUILD_DIR="build_idsueye"
else
BUILD_DIR="build"
fi
fi
# Detect architecture
ARCH=$(uname -m)
echo -e "${CYAN}Build Configuration:${NC}"
echo -e " Build Type: ${WHITE}$BUILD_TYPE${NC}"
echo -e " Config: ${WHITE}$(echo $CONFIG | tr '[:lower:]' '[:upper:]')${NC}"
echo -e " Architecture: ${WHITE}$ARCH${NC}"
echo -e " Build Directory: ${WHITE}$BUILD_DIR${NC}"
echo ""
# Check dependencies
echo -e "${CYAN}Checking dependencies...${NC}"
# Check if cmake is available
if ! command -v cmake >/dev/null 2>&1; then
echo -e "${RED}Error: cmake not found. Please install cmake.${NC}" >&2
echo " sudo apt-get install cmake" >&2
exit 1
fi
# Check if make is available
if ! command -v make >/dev/null 2>&1; then
echo -e "${RED}Error: make not found. Please install build-essential.${NC}" >&2
echo " sudo apt-get install build-essential" >&2
exit 1
fi
# Check GStreamer development packages
if ! pkg-config --exists gstreamer-1.0; then
echo -e "${RED}Error: GStreamer development packages not found.${NC}" >&2
echo "Please install GStreamer development files:" >&2
echo " sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev" >&2
exit 1
fi
# Check for IDS uEye SDK if building IDS components
if [ "$BUILD_TYPE" = "all" ] || [ "$BUILD_TYPE" = "idsueye-only" ]; then
if [ ! -f "/opt/ids/ueye/lib/$(uname -m)-linux-gnu/libueye_api.so" ] && [ ! -f "/usr/lib/$(uname -m)-linux-gnu/libueye_api.so" ]; then
echo -e "${YELLOW}Warning: IDS uEye SDK not found. IDS uEye plugin will be skipped.${NC}"
echo "Install IDS uEye SDK for camera support."
else
echo -e "${GREEN}✓ IDS uEye SDK found${NC}"
fi
fi
echo -e "${GREEN}✓ All required dependencies found${NC}"
echo ""
# Create build directory
if [ ! -d "$BUILD_DIR" ]; then
mkdir -p "$BUILD_DIR"
echo -e "${GREEN}Created build directory: $BUILD_DIR${NC}"
else
echo -e "${GREEN}Using existing build directory: $BUILD_DIR${NC}"
fi
echo ""
# Configure CMake
echo -e "${CYAN}Configuring CMake...${NC}"
echo ""
cd "$BUILD_DIR"
# Prepare CMake arguments
CMAKE_ARGS="../"
if [ "$CONFIG" = "debug" ]; then
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_BUILD_TYPE=Debug"
else
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release"
fi
# Add custom install prefix if specified
if [ -n "$INSTALL_PREFIX" ]; then
CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX"
fi
# Configure and build
if ! cmake $CMAKE_ARGS; then
echo ""
echo -e "${RED}========================================${NC}"
echo -e "${RED}CMake configuration failed!${NC}"
echo -e "${RED}========================================${NC}"
echo ""
echo -e "${YELLOW}Common issues:${NC}"
echo -e "${YELLOW}1. Missing GStreamer development packages${NC}"
echo -e "${YELLOW}2. IDS uEye SDK not found (install from IDS website)${NC}"
echo -e "${YELLOW}3. Missing build dependencies (cmake, build-essential)${NC}"
echo ""
echo -e "${YELLOW}Install dependencies:${NC}"
echo -e "${WHITE} sudo apt-get update${NC}"
echo -e "${WHITE} sudo apt-get install cmake build-essential${NC}"
echo -e "${WHITE} sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev${NC}"
echo ""
exit 1
fi
# Build the plugins
echo ""
echo -e "${CYAN}Building plugins...${NC}"
echo ""
CPU_CORES=$(nproc)
if ! make -j$CPU_CORES; then
echo ""
echo -e "${RED}========================================${NC}"
echo -e "${RED}Build failed!${NC}"
echo -e "${RED}========================================${NC}"
exit 1
fi
# Collect built plugin information
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}Build completed successfully!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
# Find built plugins
BUILT_PLUGINS=$(find . -name "libgst*.so" -type f)
PLUGIN_COUNT=$(echo "$BUILT_PLUGINS" | grep -c "libgst" || true)
echo -e "${CYAN}Built plugins ($PLUGIN_COUNT total):${NC}"
for plugin in $BUILT_PLUGINS; do
plugin_name=$(basename "$plugin")
echo -e " - ${WHITE}$plugin_name${NC} (${plugin})"
done
echo ""
# Install plugins if requested
if [ "$NO_INSTALL" != "yes" ]; then
echo -e "${CYAN}Installing plugins...${NC}"
# Check if we have permission to install
if [ "$EUID" -eq 0 ]; then
# Running as root
if make install; then
echo -e "${GREEN}✓ Successfully installed plugins to system directories${NC}"
else
echo -e "${RED}✗ Installation failed${NC}"
exit 1
fi
else
# Not running as root, ask for sudo
echo -e "${YELLOW}Installing plugins requires root privileges...${NC}"
if sudo make install; then
echo -e "${GREEN}✓ Successfully installed plugins to system directories${NC}"
else
echo -e "${RED}✗ Installation failed${NC}"
exit 1
fi
fi
else
echo -e "${YELLOW}Skipping installation (--no-install specified)${NC}"
echo -e "${YELLOW}Plugins remain in build directory${NC}"
fi
cd ..
echo ""
echo -e "${CYAN}========================================${NC}"
echo -e "${CYAN}Next Steps${NC}"
echo -e "${CYAN}========================================${NC}"
echo ""
echo -e "${YELLOW}Verify installation:${NC}"
echo -e "${WHITE} gst-inspect-1.0 idsueyesrc${NC}"
echo -e "${WHITE} gst-inspect-1.0 linescan${NC}"
echo -e "${WHITE} gst-inspect-1.0 intervalometer${NC}"
echo ""
echo -e "${YELLOW}Example usage:${NC}"
echo -e "${WHITE} # Record from IDS camera to MP4:${NC}"
echo -e "${WHITE} gst-launch-1.0 idsueyesrc device-id=1 num-buffers=300 ! videoconvert ! x264enc ! mp4mux ! filesink location=test.mp4${NC}"
echo ""
echo -e "${WHITE} # Stream to network:${NC}"
echo -e "${WHITE} gst-launch-1.0 idsueyesrc device-id=1 ! queue ! videoconvert ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=TARGET_HOST port=5000${NC}"
echo ""
echo -e "${WHITE} # Line scan operation:${NC}"
echo -e "${WHITE} gst-launch-1.0 idsueyesrc ! linescan direction=horizontal line-index=100 output-size=800 ! videoconvert ! autovideosink${NC}"
echo ""
if [ "$BUILD_TYPE" = "all" ]; then
echo -e "${GREEN}✓ All plugins built successfully for $ARCH!${NC}"
else
echo -e "${GREEN}✓ IDS uEye plugin built successfully for $ARCH!${NC}"
fi