diff --git a/Makefile b/Makefile index 5358fdf..84f9767 100644 --- a/Makefile +++ b/Makefile @@ -58,7 +58,7 @@ else ifeq ($(VARIANT),full) BREW_PREFIX := $(shell brew --prefix) ICU_PREFIX := $(BREW_PREFIX)/opt/icu4c LLVM_PREFIX := $(BREW_PREFIX)/opt/llvm - CONFIGURE_FLAGS = --prefix=$(PREFIX) --with-openssl --with-icu --with-lz4 --with-zstd --with-libxml --with-llvm --with-uuid=e2fs --disable-nls CFLAGS="-Wno-unguarded-availability-new" --with-includes="$(BREW_PREFIX)/include:$(ICU_PREFIX)/include:$(LLVM_PREFIX)/include" --with-libraries="$(BREW_PREFIX)/lib:$(ICU_PREFIX)/lib:$(LLVM_PREFIX)/lib" + CONFIGURE_FLAGS = --prefix=$(PREFIX) --with-openssl --with-icu --with-lz4 --with-zstd --with-libxml --with-llvm --with-uuid=e2fs --disable-nls CFLAGS="-Wno-unguarded-availability-new" --with-includes="$(BREW_PREFIX)/include:$(ICU_PREFIX)/include:$(LLVM_PREFIX)/include" --with-libraries="$(BREW_PREFIX)/lib:$(ICU_PREFIX)/lib:$(LLVM_PREFIX)/lib" LLVM_CONFIG="$(LLVM_PREFIX)/bin/llvm-config" CLANG="$(LLVM_PREFIX)/bin/clang" else ifeq ($(PLATFORM),linux) CONFIGURE_FLAGS = --prefix=$(PREFIX) --with-openssl --with-icu --with-lz4 --with-zstd --with-libxml --with-llvm --with-uuid=e2fs --disable-nls else ifeq ($(PLATFORM),win32) @@ -92,7 +92,11 @@ extract: configure: @echo "âš™ī¸ Configuring PostgreSQL build..." ifeq ($(PLATFORM),darwin) - cd $(POSTGRES_SRC) && PKG_CONFIG_PATH="$(ICU_PREFIX)/lib/pkgconfig:$(BREW_PREFIX)/lib/pkgconfig" LLVM_CONFIG="$(LLVM_PREFIX)/bin/llvm-config" ./configure $(CONFIGURE_FLAGS) +ifeq ($(VARIANT),full) + cd $(POSTGRES_SRC) && PKG_CONFIG_PATH="$(ICU_PREFIX)/lib/pkgconfig:$(BREW_PREFIX)/lib/pkgconfig" LLVM_CONFIG="$(LLVM_PREFIX)/bin/llvm-config" CLANG="$(LLVM_PREFIX)/bin/clang" ./configure $(CONFIGURE_FLAGS) +else + cd $(POSTGRES_SRC) && PKG_CONFIG_PATH="$(BREW_PREFIX)/lib/pkgconfig" ./configure $(CONFIGURE_FLAGS) +endif else cd $(POSTGRES_SRC) && ./configure $(CONFIGURE_FLAGS) endif @@ -128,18 +132,62 @@ bundle-deps: @echo "đŸ“Ļ Bundling runtime dependencies..." ifeq ($(VARIANT),full) ifeq ($(PLATFORM),darwin) - @echo " 🔗 Bundling LLVM libraries for JIT support..." + @echo " 🔗 Bundling LLVM and dependencies for JIT support..." + + # Bundle LLVM library @if [ -f "$(LLVM_PREFIX)/lib/libLLVM.dylib" ]; then \ cp "$(LLVM_PREFIX)/lib/libLLVM.dylib" "$(PREFIX)/lib/"; \ echo " ✅ Bundled libLLVM.dylib"; \ else \ - echo " âš ī¸ Warning: libLLVM.dylib not found at $(LLVM_PREFIX)/lib/"; \ + echo " ❌ Error: libLLVM.dylib not found at $(LLVM_PREFIX)/lib/"; \ + exit 1; \ + fi + + # Bundle Z3 SMT solver library (LLVM dependency) + @if [ -f "$(BREW_PREFIX)/opt/z3/lib/libz3.dylib" ]; then \ + cp "$(BREW_PREFIX)/opt/z3/lib/libz3.dylib" "$(PREFIX)/lib/"; \ + echo " ✅ Bundled libz3.dylib"; \ + elif [ -f "$(BREW_PREFIX)/opt/z3/lib/libz3.4.15.dylib" ]; then \ + cp "$(BREW_PREFIX)/opt/z3/lib/libz3.4.15.dylib" "$(PREFIX)/lib/"; \ + echo " ✅ Bundled libz3.4.15.dylib"; \ + else \ + echo " ❌ Error: libz3 not found at $(BREW_PREFIX)/opt/z3/lib/"; \ + exit 1; \ + fi + + # Bundle Zstandard compression library (LLVM dependency) + @if [ -f "$(BREW_PREFIX)/opt/zstd/lib/libzstd.1.dylib" ]; then \ + cp "$(BREW_PREFIX)/opt/zstd/lib/libzstd.1.dylib" "$(PREFIX)/lib/"; \ + echo " ✅ Bundled libzstd.1.dylib"; \ + else \ + echo " ❌ Error: libzstd.1.dylib not found at $(BREW_PREFIX)/opt/zstd/lib/"; \ + exit 1; \ fi - @echo " 🔧 Fixing library paths for bundled dependencies..." + + @echo " 🔧 Fixing library paths for JIT dependencies..." + + # Fix llvmjit.dylib -> libLLVM.dylib path @if [ -f "$(PREFIX)/lib/llvmjit.dylib" ] && [ -f "$(PREFIX)/lib/libLLVM.dylib" ]; then \ install_name_tool -change "$(LLVM_PREFIX)/lib/libLLVM.dylib" "@loader_path/libLLVM.dylib" "$(PREFIX)/lib/llvmjit.dylib"; \ - echo " ✅ Fixed llvmjit.dylib library path"; \ + echo " ✅ Fixed llvmjit.dylib -> libLLVM.dylib path"; \ + fi + + # Fix libLLVM.dylib paths to its dependencies + @if [ -f "$(PREFIX)/lib/libLLVM.dylib" ]; then \ + install_name_tool -id "@loader_path/libLLVM.dylib" "$(PREFIX)/lib/libLLVM.dylib"; \ + if [ -f "$(PREFIX)/lib/libz3.dylib" ]; then \ + install_name_tool -change "$(BREW_PREFIX)/opt/z3/lib/libz3.dylib" "@loader_path/libz3.dylib" "$(PREFIX)/lib/libLLVM.dylib"; \ + elif [ -f "$(PREFIX)/lib/libz3.4.15.dylib" ]; then \ + install_name_tool -change "$(BREW_PREFIX)/opt/z3/lib/libz3.4.15.dylib" "@loader_path/libz3.4.15.dylib" "$(PREFIX)/lib/libLLVM.dylib"; \ + fi; \ + if [ -f "$(PREFIX)/lib/libzstd.1.dylib" ]; then \ + install_name_tool -change "$(BREW_PREFIX)/opt/zstd/lib/libzstd.1.dylib" "@loader_path/libzstd.1.dylib" "$(PREFIX)/lib/libLLVM.dylib"; \ + fi; \ + echo " ✅ Fixed libLLVM.dylib dependency paths"; \ fi + + @echo " đŸŽ¯ JIT dependency bundling complete" + else @echo " â„šī¸ Dependency bundling not implemented for $(PLATFORM)" endif diff --git a/test-binaries.sh b/test-binaries.sh index 5b28ccf..972fd0a 100755 --- a/test-binaries.sh +++ b/test-binaries.sh @@ -94,7 +94,59 @@ FROM test_vectors ORDER BY distance; " -# Test 7: Clean shutdown +# Test 7: JIT functionality (full variant only) +if [ "$VARIANT" = "full" ]; then + echo "đŸ”Ŧ Testing JIT compilation (full variant)..." + + # Test basic JIT availability + echo " Testing JIT availability..." + ${POSTGRES_DIR}/bin/psql -p ${TEST_PORT} -d template1 -U ${USER} -c "SHOW jit;" || { + echo "❌ ERROR: JIT parameter not available" + exit 1 + } + + # Test JIT can be enabled without errors + echo " Testing JIT enable/disable..." + ${POSTGRES_DIR}/bin/psql -p ${TEST_PORT} -d template1 -U ${USER} -c "SET jit = on;" || { + echo "❌ ERROR: Failed to enable JIT" + exit 1 + } + + # Test JIT with actual compilation (force low cost threshold) + echo " Testing JIT compilation with complex query..." + ${POSTGRES_DIR}/bin/psql -p ${TEST_PORT} -d template1 -U ${USER} -c " + SET jit = on; + SET jit_above_cost = 0; + SET jit_optimize_above_cost = 0; + SET jit_inline_above_cost = 0; + + -- Create larger dataset for JIT to kick in + CREATE TABLE jit_test AS + SELECT i as id, random() as value, 'test_' || i as name + FROM generate_series(1, 1000) i; + + -- Complex query that should trigger JIT + SELECT COUNT(*), AVG(value), MIN(value), MAX(value) + FROM jit_test + WHERE value > 0.5 AND id % 3 = 0 + GROUP BY (id / 100)::int + HAVING COUNT(*) > 5; + + DROP TABLE jit_test; + " || { + echo "❌ ERROR: JIT compilation failed" + exit 1 + } + + echo " ✅ JIT functionality working correctly" + +elif [ "$VARIANT" = "lite" ]; then + echo "â„šī¸ Skipping JIT test (lite variant - JIT not available)" +else + echo "âš ī¸ Unknown variant: $VARIANT - skipping JIT test" +fi + +# Test 8: Clean shutdown echo "🛑 Testing server shutdown..." ${POSTGRES_DIR}/bin/pg_ctl -D ${TEST_DIR}/data stop