179 lines
6.8 KiB
Makefile
179 lines
6.8 KiB
Makefile
# C-Relay-PG Makefile
|
|
|
|
CC = gcc
|
|
CFLAGS = -Wall -Wextra -std=c99 -g -O2 -DDB_BACKEND_POSTGRES -DHAVE_LIBPQ
|
|
INCLUDES = -I. -Ic_utils_lib/src -Inostr_core_lib -Inostr_core_lib/nostr_core -Inostr_core_lib/cjson -Inostr_core_lib/nostr_websocket -I/usr/include/postgresql
|
|
LIBS = -lwebsockets -lz -ldl -lpthread -lm -L/usr/local/lib -lsecp256k1 -lssl -lcrypto -L/usr/local/lib -lcurl -Lc_utils_lib -lc_utils -lpq
|
|
|
|
# Build directory
|
|
BUILD_DIR = build
|
|
|
|
# Source files
|
|
MAIN_SRC = src/main.c src/config.c src/dm_admin.c src/request_validator.c src/nip009.c src/nip011.c src/nip013.c src/nip040.c src/nip042.c src/websockets.c src/subscriptions.c src/api.c src/embedded_web_content.c src/ip_ban.c src/thread_pool.c src/caching_inbox_poller.c src/caching_service_launcher.c
|
|
DB_OPS_SRC = src/db_ops.c src/db_ops_postgres.c
|
|
|
|
NOSTR_CORE_LIB = nostr_core_lib/libnostr_core_x64.a
|
|
C_UTILS_LIB = c_utils_lib/libc_utils.a
|
|
|
|
# Architecture detection
|
|
ARCH = $(shell uname -m)
|
|
ifeq ($(ARCH),x86_64)
|
|
TARGET = $(BUILD_DIR)/c_relay_pg_x86
|
|
else ifeq ($(ARCH),aarch64)
|
|
TARGET = $(BUILD_DIR)/c_relay_pg_arm64
|
|
else ifeq ($(ARCH),arm64)
|
|
TARGET = $(BUILD_DIR)/c_relay_pg_arm64
|
|
else
|
|
TARGET = $(BUILD_DIR)/c_relay_pg_$(ARCH)
|
|
endif
|
|
|
|
# Default target — refuse direct build, instruct to use build_static.sh
|
|
# The Makefile is only for submodule builds (nostr_core_lib, c_utils_lib)
|
|
# and utility targets (clean, install-deps, etc.).
|
|
# Running 'make' directly produces a dynamically-linked binary that will
|
|
# silently fall back to SQLite storage while the admin UI connects to
|
|
# PostgreSQL — causing the admin page to show stale data.
|
|
all:
|
|
@echo "============================================"
|
|
@echo " ERROR: Do not run 'make' directly!"
|
|
@echo ""
|
|
@echo " This project requires a static MUSL build"
|
|
@echo " with PostgreSQL backend. Run:"
|
|
@echo ""
|
|
@echo " ./build_static.sh"
|
|
@echo ""
|
|
@echo " Or use the full build+restart script:"
|
|
@echo ""
|
|
@echo " ./make_and_restart_relay.sh"
|
|
@echo ""
|
|
@echo " The Makefile is only for submodule builds"
|
|
@echo " (nostr_core_lib, c_utils_lib) and utility"
|
|
@echo " targets (clean, install-deps, etc.)."
|
|
@echo "============================================"
|
|
@exit 1
|
|
|
|
# Create build directory
|
|
$(BUILD_DIR):
|
|
mkdir -p $(BUILD_DIR)
|
|
|
|
# Check if nostr_core_lib is built
|
|
# Explicitly specify NIPs to ensure NIP-44 (encryption) is included
|
|
# NIPs: 1 (basic), 6 (keys), 13 (PoW), 17 (DMs), 19 (bech32), 44 (encryption), 59 (gift wrap)
|
|
$(NOSTR_CORE_LIB):
|
|
@echo "Building nostr_core_lib with required NIPs (including NIP-44 for encryption)..."
|
|
cd nostr_core_lib && ./build.sh --nips=1,6,13,17,19,44,59
|
|
|
|
# Check if c_utils_lib is built
|
|
$(C_UTILS_LIB):
|
|
@echo "Building c_utils_lib..."
|
|
cd c_utils_lib && ./build.sh lib
|
|
|
|
# Update main.h version information (requires main.h to exist)
|
|
src/main.h:
|
|
@if [ ! -f src/main.h ]; then \
|
|
echo "ERROR: src/main.h not found!"; \
|
|
echo "Please ensure src/main.h exists with relay metadata."; \
|
|
echo "Copy from a backup or create manually with proper relay configuration."; \
|
|
exit 1; \
|
|
fi; \
|
|
if [ -d .git ]; then \
|
|
echo "Updating main.h version information from git tags..."; \
|
|
RAW_VERSION=$$(git describe --tags --always 2>/dev/null || echo "unknown"); \
|
|
if echo "$$RAW_VERSION" | grep -q "^v[0-9]"; then \
|
|
CLEAN_VERSION=$$(echo "$$RAW_VERSION" | sed 's/^v//' | cut -d- -f1); \
|
|
VERSION="v$$CLEAN_VERSION"; \
|
|
MAJOR=$$(echo "$$CLEAN_VERSION" | cut -d. -f1); \
|
|
MINOR=$$(echo "$$CLEAN_VERSION" | cut -d. -f2); \
|
|
PATCH=$$(echo "$$CLEAN_VERSION" | cut -d. -f3); \
|
|
else \
|
|
VERSION="v0.0.0"; \
|
|
MAJOR=0; MINOR=0; PATCH=0; \
|
|
fi; \
|
|
echo "Updating version information in existing main.h..."; \
|
|
sed -i "s/#define VERSION \".*\"/#define VERSION \"$$VERSION\"/g" src/main.h; \
|
|
sed -i "s/#define VERSION_MAJOR [0-9]*/#define VERSION_MAJOR $$MAJOR/g" src/main.h; \
|
|
sed -i "s/#define VERSION_MINOR [0-9]*/#define VERSION_MINOR $$MINOR/g" src/main.h; \
|
|
sed -i "s/#define VERSION_PATCH [0-9]*/#define VERSION_PATCH $$PATCH/g" src/main.h; \
|
|
echo "Updated main.h version to: $$VERSION"; \
|
|
else \
|
|
echo "Git not available, preserving existing main.h version information"; \
|
|
fi
|
|
|
|
# Update main.h version information (requires existing main.h)
|
|
force-version:
|
|
@echo "Force updating main.h version information..."
|
|
@$(MAKE) src/main.h
|
|
|
|
# Build the relay — guarded to prevent accidental use.
|
|
# Use ./build_static.sh instead.
|
|
$(TARGET):
|
|
@echo "ERROR: Do not run 'make $(TARGET)' directly."
|
|
@echo "Use ./build_static.sh to build the static MUSL binary."
|
|
@exit 1
|
|
|
|
x86:
|
|
@echo "ERROR: Do not run 'make x86' directly."
|
|
@echo "Use ./build_static.sh to build the static MUSL binary."
|
|
@exit 1
|
|
|
|
arm64:
|
|
@echo "ERROR: Do not run 'make arm64' directly."
|
|
@echo "Use ./build_static.sh to build the static MUSL binary."
|
|
@exit 1
|
|
@if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then \
|
|
echo "ERROR: aarch64-linux-gnu-gcc not found."; \
|
|
echo "Install the ARM64 cross-compiler:"; \
|
|
echo " sudo apt install gcc-aarch64-linux-gnu"; \
|
|
exit 1; \
|
|
fi
|
|
@echo "Checking for ARM64 development libraries..."
|
|
@if ! dpkg -l | grep -q "libssl-dev:arm64\|libpq-dev:arm64"; then \
|
|
echo "ERROR: ARM64 libraries not found. Cross-compilation requires ARM64 versions of:"; \
|
|
echo " - libssl-dev:arm64"; \
|
|
echo " - libpq-dev:arm64"; \
|
|
echo " - libwebsockets-dev:arm64"; \
|
|
echo " - zlib1g-dev:arm64"; \
|
|
echo " - libcurl-dev:arm64"; \
|
|
echo ""; \
|
|
echo "Install them with:"; \
|
|
echo " sudo dpkg --add-architecture arm64"; \
|
|
echo " sudo apt update"; \
|
|
echo " sudo apt install gcc-aarch64-linux-gnu \\"; \
|
|
echo " libssl-dev:arm64 libpq-dev:arm64 \\"; \
|
|
echo " libwebsockets-dev:arm64 zlib1g-dev:arm64 \\"; \
|
|
echo " libcurl4-openssl-dev:arm64"; \
|
|
exit 1; \
|
|
fi; \
|
|
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig \
|
|
PKG_CONFIG_SYSROOT_DIR=/ \
|
|
aarch64-linux-gnu-gcc -Wall -Wextra -std=c99 -g -O2 \
|
|
-DDB_BACKEND_POSTGRES -DHAVE_LIBPQ \
|
|
-I. -Ic_utils_lib/src -Inostr_core_lib -Inostr_core_lib/nostr_core \
|
|
-Inostr_core_lib/cjson -Inostr_core_lib/nostr_websocket \
|
|
$(MAIN_SRC) $(DB_OPS_SRC) \
|
|
-o $(BUILD_DIR)/c_relay_pg_arm64 \
|
|
$(NOSTR_CORE_LIB) $(C_UTILS_LIB) \
|
|
-lwebsockets -lssl -lcrypto -lz -ldl -lpthread -lm \
|
|
-lsecp256k1 -lcurl -lpq
|
|
@echo "Cross-compilation complete: $(BUILD_DIR)/c_relay_pg_arm64"
|
|
|
|
# Install dependencies for ARM64 cross-compilation
|
|
install-arm64-deps:
|
|
sudo dpkg --add-architecture arm64
|
|
sudo apt update
|
|
sudo apt install -y gcc-aarch64-linux-gnu \
|
|
libssl-dev:arm64 libpq-dev:arm64 \
|
|
libwebsockets-dev:arm64 zlib1g-dev:arm64 \
|
|
libcurl4-openssl-dev:arm64
|
|
|
|
# Install dependencies for native build
|
|
install-deps:
|
|
sudo apt update
|
|
sudo apt install -y build-essential libpq-dev libssl-dev libcurl4-openssl-dev libsecp256k1-dev zlib1g-dev jq curl
|
|
|
|
# Clean build artifacts
|
|
clean:
|
|
rm -rf $(BUILD_DIR)
|
|
|
|
.PHONY: all x86 arm64 install-arm64-deps install-deps clean force-version
|