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:
305
build.sh
Executable file
305
build.sh
Executable 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
|
||||
Reference in New Issue
Block a user