// Minimal HTTP download test for debugging // Tests net.http.http_download_file() which appears to hang on illumos import net.http import io.file proc main() println("=== HTTP Download Test ===") println("") // Test 1: Simple HTTPS URL (zlib - small file) let url1 = "https://zlib.net/zlib-1.3.1.tar.gz" let dest1 = "/tmp/http_test_zlib.tar.gz" println("Test 1: zlib download (1.5MB)") println("URL: " + url1) println("Calling http_download_file()...") let result1 = http.http_download_file(url1, dest1) if result1 println("SUCCESS: Downloaded to " + dest1) if file.fileExists(dest1) println("File exists: true") end if else println("FAILED: http_download_file returned false") end if println("") // Test 2: GitHub URL (requires redirect handling) let url2 = "https://github.com/vim/vim/archive/refs/tags/v9.1.0.tar.gz" let dest2 = "/tmp/http_test_vim.tar.gz" println("Test 2: GitHub download with redirects (17MB)") println("URL: " + url2) println("Calling http_download_file()...") let result2 = http.http_download_file(url2, dest2) if result2 println("SUCCESS: Downloaded to " + dest2) if file.fileExists(dest2) println("File exists: true") end if else println("FAILED: http_download_file returned false") end if println("") println("=== Test Complete ===") end main #!/bin/sh # Build script for apptest # A test application that uses libtest set -e echo "Building apptest..." # Create source file mkdir -p src cat > src/apptest.c << 'EOF' #include #include int main(void) { printf("apptest v1.0.0\n"); printf("Using libtest: %s\n", libtest_version()); printf("Message: %s\n", libtest_greet()); printf("\nDependency chain validated successfully!\n"); return 0; } EOF # Compile - link against libtest echo "Compiling apptest..." gcc ${CFLAGS} -I/usr/include -o apptest src/apptest.c -L/usr/lib -ltest # Install to DESTDIR echo "Installing to ${DESTDIR}..." mkdir -p "${DESTDIR}/usr/bin" install -m 755 apptest "${DESTDIR}/usr/bin/apptest" echo "Build complete!" # apptest - Simple Test Application # Depends on libtest - for testing dependency resolution [package] name = "apptest" version = "1.0.0" release = 1 description = "A test application that depends on libtest" url = "https://github.com/leafscale/zygaena" license = "BSD-2-Clause" maintainer = "Chris Tusa " arch = "x86_64" [dependencies] # This is the key test - apptest depends on libtest runtime = ["libtest"] build = ["libtest"] [sources] # No external sources - we create inline urls = [] checksums = [] [build] parallel = true jobs = 1 #!/bin/sh # Build script for hello package # This is a test package that creates a simple hello world program set -e echo "Building hello world test package..." # Create source directory mkdir -p src # Create simple hello.c cat > src/hello.c << 'EOF' #include int main(void) { printf("Hello from Coral package manager!\n"); printf("If you see this, the build system is working.\n"); return 0; } EOF # Compile echo "Compiling hello.c..." gcc ${CFLAGS} -o hello src/hello.c # Install to DESTDIR echo "Installing to ${DESTDIR}..." mkdir -p "${DESTDIR}/usr/bin" install -m 755 hello "${DESTDIR}/usr/bin/hello" # Create a simple man page mkdir -p "${DESTDIR}/usr/share/man/man1" cat > "${DESTDIR}/usr/share/man/man1/hello.1" << 'EOF' .TH HELLO 1 "2025" "Coral" "User Commands" .SH NAME hello \- a test program for coral package manager .SH SYNOPSIS .B hello .SH DESCRIPTION A simple hello world program used to test the Coral package build system. .SH AUTHOR Chris Tusa EOF echo "Build complete!" # Hello World Package - Test Port # This is a simple test package to verify coral build works [package] name = "hello" version = "1.0.1" release = 1 description = "A simple hello world program for testing coral" url = "https://github.com/leafscale/zygaena" license = "MIT" maintainer = "Chris Tusa " arch = "x86_64" [dependencies] runtime = [] build = [] [sources] # No external sources - we include the source directly urls = [] checksums = [] [build] parallel = true jobs = 1 #!/bin/sh # Build script for tree # A directory listing utility set -e echo "Building tree..." # Enter source directory (GitHub archives extract with different name) cd tree-2.1.1 # On illumos, use GNU make MAKE=gmake if [ "$(uname -s)" != "SunOS" ]; then MAKE=make fi # Build with appropriate flags for illumos case "$(uname -s)" in SunOS|illumos) # illumos needs specific flags $MAKE CC=gcc CFLAGS="${CFLAGS} -D_XOPEN_SOURCE=600" prefix=/usr ;; *) $MAKE CC=gcc CFLAGS="${CFLAGS}" prefix=/usr ;; esac # Install to DESTDIR echo "Installing to ${DESTDIR}..." mkdir -p "${DESTDIR}/usr/bin" mkdir -p "${DESTDIR}/usr/share/man/man1" install -m 755 tree "${DESTDIR}/usr/bin/tree" install -m 644 doc/tree.1 "${DESTDIR}/usr/share/man/man1/tree.1" echo "Build complete!" # Tree Package - Directory Listing Utility # A simple C program for testing coral with real source [package] name = "tree" version = "2.1.1" release = 1 description = "List directory contents in a tree-like format" url = "http://mama.indstate.edu/users/ice/tree/" license = "GPL-2.0" maintainer = "Chris Tusa " arch = "x86_64" [dependencies] runtime = [] build = [] [sources] # Real source from upstream (single-line format for TOML parser compatibility) urls = ["https://github.com/Old-Man-Programmer/tree/archive/refs/tags/2.1.1.tar.gz"] checksums = ["SKIP"] [build] parallel = true jobs = 1 #!/bin/sh # Build script for vim # Vi IMproved text editor set -e echo "Building vim..." cd vim-9.1.0000 # On illumos, use GNU make MAKE=gmake if [ "$(uname -s)" != "SunOS" ]; then MAKE=make fi # Configure with minimal features for testing # (Full vim would have more options) ./configure \ --prefix=/usr \ --with-features=normal \ --enable-multibyte \ --disable-gui \ --without-x \ --disable-netbeans \ --enable-cscope # Build $MAKE ${MAKEFLAGS} # Install to DESTDIR echo "Installing to ${DESTDIR}..." $MAKE DESTDIR="${DESTDIR}" install # Create vi symlink cd "${DESTDIR}/usr/bin" ln -sf vim vi 2>/dev/null || true echo "Build complete!" # Vim - Vi IMproved # The classic text editor [package] name = "vim" version = "9.1.0" release = 1 description = "Vi IMproved - enhanced vi text editor" url = "https://www.vim.org/" license = "Vim" maintainer = "Chris Tusa " arch = "x86_64" # vim provides the editor and vi alternatives alternatives = ["editor", "vi"] [dependencies] # Depends on ncurses for terminal handling runtime = ["ncurses"] build = ["ncurses"] [[source]] file = "vim-9.1.0.tar.gz" urls = [ "https://github.com/vim/vim/archive/refs/tags/v9.1.0000.tar.gz", "https://ftp.nluug.nl/pub/vim/unix/vim-9.1.tar.bz2" ] checksum = "SKIP" [build] parallel = true jobs = 0 #!/bin/sh # Build script for libtest # A simple test library for validating coral dependency resolution set -e echo "Building libtest..." # Create source files mkdir -p src cat > src/libtest.h << 'EOF' #ifndef LIBTEST_H #define LIBTEST_H /* Return a greeting message */ const char* libtest_greet(void); /* Return the library version */ const char* libtest_version(void); #endif /* LIBTEST_H */ EOF cat > src/libtest.c << 'EOF' #include "libtest.h" const char* libtest_greet(void) { return "Hello from libtest!"; } const char* libtest_version(void) { return "1.0.0"; } EOF # Compile shared library echo "Compiling libtest..." gcc ${CFLAGS} -fPIC -c src/libtest.c -o libtest.o gcc -shared -o libtest.so.1.0.0 libtest.o # Create version symlinks ln -sf libtest.so.1.0.0 libtest.so.1 ln -sf libtest.so.1 libtest.so # Install to DESTDIR echo "Installing to ${DESTDIR}..." mkdir -p "${DESTDIR}/usr/lib" mkdir -p "${DESTDIR}/usr/include" # Save current directory (build dir) BUILD_DIR=$(pwd) install -m 755 libtest.so.1.0.0 "${DESTDIR}/usr/lib/" cd "${DESTDIR}/usr/lib" ln -sf libtest.so.1.0.0 libtest.so.1 ln -sf libtest.so.1 libtest.so # Install header from saved build directory install -m 644 "${BUILD_DIR}/src/libtest.h" "${DESTDIR}/usr/include/" echo "Build complete!" # libtest - Simple Test Library # For testing dependency resolution [package] name = "libtest" version = "1.0.1" release = 1 description = "A simple test library for validating coral dependencies" url = "https://github.com/leafscale/zygaena" license = "BSD-2-Clause" maintainer = "Chris Tusa " arch = "x86_64" # Provides the testlib alternative alternatives = ["testlib"] [dependencies] runtime = [] build = [] [sources] # No external sources - we create inline urls = [] checksums = [] [build] parallel = true jobs = 1 #!/bin/sh # Build script for ncurses # Terminal UI library set -e echo "Building ncurses..." cd ncurses-6.4 # On illumos, use GNU make MAKE=gmake if [ "$(uname -s)" != "SunOS" ]; then MAKE=make fi # Configure with common options ./configure \ --prefix=/usr \ --with-shared \ --with-cxx-shared \ --without-debug \ --without-normal \ --enable-widec \ --enable-pc-files \ --with-pkg-config-libdir=/usr/lib/pkgconfig # Build $MAKE ${MAKEFLAGS} # Install to DESTDIR echo "Installing to ${DESTDIR}..." $MAKE DESTDIR="${DESTDIR}" install # Create compatibility symlinks for non-wide-char programs # Many programs expect -lncurses, but we built -lncursesw cd "${DESTDIR}/usr/lib" for lib in ncurses form panel menu; do ln -sf lib${lib}w.so lib${lib}.so 2>/dev/null || true ln -sf ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc 2>/dev/null || true done # Also provide curses.h symlink cd "${DESTDIR}/usr/include" ln -sf ncursesw/curses.h curses.h 2>/dev/null || true ln -sf ncursesw/ncurses.h ncurses.h 2>/dev/null || true echo "Build complete!" # ncurses - Terminal UI Library # Foundation library for terminal applications [package] name = "ncurses" version = "6.4" release = 1 description = "Terminal UI library for Unix-like systems" url = "https://invisible-island.net/ncurses/" license = "MIT" maintainer = "Chris Tusa " arch = "x86_64" # ncurses provides the curses alternative alternatives = ["curses"] [dependencies] runtime = [] build = [] [sources] urls = [ "https://ftp.gnu.org/gnu/ncurses/ncurses-6.4.tar.gz" ] checksums = [ "SKIP" ] [build] parallel = true jobs = 0 # Base development tools package group # Install with: coral install @base-devel [group] name = "base-devel" description = "Base development tools for building packages" packages = [ "gcc", "gmake", "binutils", "autoconf", "automake", "libtool", "pkg-config", "m4", "bison", "flex" ] // Unit tests for package.build_script_cmd — asserts exact command strings. import core.package import core.str mut g_fail = 0 proc expect(label: string, got: string, want: string) if str.equals(got, want) println("PASS: " + label) else g_fail = g_fail + 1 println("FAIL: " + label) println(" got: " + got) println(" want: " + want) end if end expect proc main() println("=== build_script_cmd tests ===") // Normal install: root "/", no chroot -> CORAL_ROOT="/" prefix let normal = package.new_script_ctx("/", false) expect("normal .sh", package.build_script_cmd(normal, "/tmp/x/.SCRIPTS/post-install.sh", "post-install.sh", "\"1.0\"", true), "CORAL_ROOT=\"/\" zsh \"/tmp/x/.SCRIPTS/post-install.sh\" \"1.0\"") // Host-fallback: root "/mnt", do_chroot false -> CORAL_ROOT="/mnt" prefix, host path let host = package.new_script_ctx("/mnt", false) expect("host-fallback .sh", package.build_script_cmd(host, "/tmp/x/.SCRIPTS/post-install.sh", "post-install.sh", "\"1.0\"", true), "CORAL_ROOT=\"/mnt\" zsh \"/tmp/x/.SCRIPTS/post-install.sh\" \"1.0\"") // Bare executable (is_sh false): no zsh wrapper expect("normal bare", package.build_script_cmd(normal, "/tmp/x/.SCRIPTS/post-install", "post-install", "\"1.0\"", false), "CORAL_ROOT=\"/\" \"/tmp/x/.SCRIPTS/post-install\" \"1.0\"") // Empty args: no trailing space expect("normal no-args", package.build_script_cmd(normal, "/tmp/x/.SCRIPTS/pre-remove.sh", "pre-remove.sh", "", true), "CORAL_ROOT=\"/\" zsh \"/tmp/x/.SCRIPTS/pre-remove.sh\"") // Confined: root "/mnt", do_chroot true -> chroot prefix, in-root /.SCRIPTS path, CORAL_ROOT="/" let jail = package.new_script_ctx("/mnt", true) expect("chroot .sh", package.build_script_cmd(jail, "/tmp/x/.SCRIPTS/post-install.sh", "post-install.sh", "\"1.0\"", true), "chroot \"/mnt\" env CORAL_ROOT=\"/\" zsh \"/.SCRIPTS/post-install.sh\" \"1.0\"") expect("chroot bare", package.build_script_cmd(jail, "/tmp/x/.SCRIPTS/post-install", "post-install", "\"1.0\"", false), "chroot \"/mnt\" env CORAL_ROOT=\"/\" \"/.SCRIPTS/post-install\" \"1.0\"") println("") if g_fail == 0 println("RESULT: ALL PASS") else println("RESULT: FAIL (" + str.from_int(g_fail) + " failures)") end if end main