#!/bin/bash # Test script for C header generation in different build modes # This script tests the header generation functionality with various buildmode options set -e # Exit on any error # Get script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Function to print colored output print_status() { echo -e "${GREEN}[INFO]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARN]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Function to check if file exists and is not empty check_file() { local file="$1" local description="$2" if [[ -f "$file" ]]; then if [[ -s "$file" ]]; then print_status "$description exists and is not empty" return 0 else print_error "$description exists but is empty" return 1 fi else print_error "$description does not exist" return 1 fi } # Function to compare header with expected content compare_header() { local header_file="$1" local expected_file="$2" local test_name="$3" if [[ -f "$expected_file" ]]; then if diff -q "$header_file" "$expected_file" >/dev/null 2>&1; then print_status "$test_name: Header content matches expected" return 0 else print_warning "$test_name: Header content differs from expected" print_warning "Run 'diff $header_file $expected_file' to see differences" return 1 fi else print_warning "$test_name: No expected file found at $expected_file" print_status "Generated header content:" echo "--- START OF HEADER ---" cat "$header_file" echo "--- END OF HEADER ---" return 0 fi } # Function to cleanup generated files cleanup() { local files=("$@") for file in "${files[@]}"; do if [[ -f "$file" ]]; then rm -f "$file" print_status "Cleaned up $file" fi done } # Check if llgo.sh exists LLGO_SCRIPT="../../../llgo.sh" if [[ ! -f "$LLGO_SCRIPT" ]]; then print_error "llgo.sh not found at $LLGO_SCRIPT" exit 1 fi print_status "Starting C header generation tests..." print_status "Working directory: $SCRIPT_DIR" echo "" # Test 1: c-shared mode print_status "=== Test 2: Building with -buildmode c-shared ===" if $LLGO_SCRIPT build -buildmode c-shared -o export .; then print_status "Build succeeded" # Check generated files (different extensions on different platforms) if [[ "$OSTYPE" == "darwin"* ]]; then # macOS check_file "libexport.dylib" "Dynamic library (libexport.dylib)" SHARED_LIB="libexport.dylib" else # Linux and others check_file "libexport.so" "Dynamic library (libexport.so)" SHARED_LIB="libexport.so" fi check_file "libexport.h" "C header (libexport.h)" # Compare with expected header if it exists if [[ -f "libexport.h" ]]; then compare_header "libexport.h" "libexport.h.want" "c-shared" fi # Test C demo with shared library print_status "=== Testing C demo with shared library ===" if cd use; then if LINK_TYPE=shared make clean && LINK_TYPE=shared make; then print_status "C demo build succeeded with shared library" if LINK_TYPE=shared make run; then print_status "C demo execution succeeded with shared library" else print_warning "C demo execution failed with shared library" fi else print_warning "C demo build failed with shared library" fi cd .. else print_error "Failed to enter use directory" fi # Cleanup cleanup "$SHARED_LIB" "libexport.h" else print_error "Build failed for c-shared mode" fi # Test 2: c-archive mode print_status "=== Test 1: Building with -buildmode c-archive ===" if $LLGO_SCRIPT build -buildmode c-archive -o export .; then print_status "Build succeeded" # Check generated files check_file "libexport.a" "Static library (libexport.a)" check_file "libexport.h" "C header (libexport.h)" # Compare with expected header if it exists if [[ -f "libexport.h" ]]; then compare_header "libexport.h" "libexport.h.want" "c-archive" fi # Test C demo with static library print_status "=== Testing C demo with static library ===" if cd use; then if make clean && make; then print_status "C demo build succeeded with static library" if make run; then print_status "C demo execution succeeded with static library" else print_warning "C demo execution failed with static library" fi else print_warning "C demo build failed with static library" fi cd .. else print_error "Failed to enter use directory" fi # # Cleanup # cleanup "libexport.a" "libexport.h" else print_error "Build failed for c-archive mode" fi echo "" # TODO(lijie): Uncomment if https://github.com/goplus/llgo/pull/1268 merged # # Test 3: ESP32 target with c-archive mode # print_status "=== Test 3: Building with -target esp32 -buildmode c-archive ===" # if $LLGO_SCRIPT build -target esp32 -buildmode c-archive -o export .; then # print_status "Build succeeded" # # Check generated files # check_file "libexport.a" "Static library for ESP32 (libexport.a)" # check_file "libexport.h" "C header for ESP32 (libexport.h)" # # Compare with expected header if it exists # if [[ -f "libexport.h" ]]; then # compare_header "libexport.h" "libexport.h.want" "esp32-c-archive" # fi # # Don't cleanup ESP32 files - keep them for inspection # print_status "ESP32 build files kept for inspection" # else # print_error "Build failed for ESP32 target" # fi # echo "" # Final summary print_status "=== Test Summary ===" if [[ -f "libexport.a" ]] && [[ -f "libexport.h" ]]; then print_status "All tests completed successfully:" print_status " ✅ C header generation (c-archive and c-shared modes)" print_status " ✅ C demo compilation and execution" print_status " ✅ Cross-platform symbol renaming" print_status " ✅ Init function export and calling" print_status "" print_status "Final files available:" print_status " - libexport.a (static library)" print_status " - libexport.h (C header file)" print_status " - use/main.out (C demo executable)" echo "" echo "===================" else print_error "Some tests may have failed. Check the output above." fi # Show file sizes for reference if [[ -f "libexport.a" ]]; then SIZE=$(wc -c < libexport.a) print_status "Static library size: $SIZE bytes" fi if [[ -f "libexport.h" ]]; then LINES=$(wc -l < libexport.h) print_status "Header file lines: $LINES" fi print_status "C header generation and demo tests completed!"