Fully statically linked for both x64 and arm64. Updated build.sh to always compile both versions
This commit is contained in:
109
Makefile
109
Makefile
@@ -17,10 +17,18 @@ endif
|
||||
INCLUDES = -I. -Inostr_core -Icjson -Isecp256k1/include -Inostr_websocket -Imbedtls/include -Imbedtls/tf-psa-crypto/include -Imbedtls/tf-psa-crypto/drivers/builtin/include
|
||||
|
||||
# Library source files
|
||||
LIB_SOURCES = nostr_core/core.c nostr_core/core_relays.c nostr_core/nostr_crypto.c nostr_core/nostr_secp256k1.c nostr_core/nostr_aes.c nostr_core/nostr_chacha20.c nostr_websocket/nostr_websocket_mbedtls.c cjson/cJSON.c
|
||||
LIB_SOURCES = nostr_core/core.c nostr_core/core_relays.c nostr_core/nostr_crypto.c nostr_core/nostr_secp256k1.c nostr_core/nostr_aes.c nostr_core/nostr_chacha20.c nostr_core/version.c nostr_websocket/nostr_websocket_mbedtls.c cjson/cJSON.c
|
||||
LIB_OBJECTS = $(LIB_SOURCES:.c=.o)
|
||||
ARM64_LIB_OBJECTS = $(LIB_SOURCES:.c=.arm64.o)
|
||||
|
||||
# secp256k1 library paths
|
||||
SECP256K1_LIB = ./secp256k1/.libs/libsecp256k1.a
|
||||
SECP256K1_PRECOMPUTED_LIB = ./secp256k1/.libs/libsecp256k1_precomputed.a
|
||||
|
||||
# ARM64 secp256k1 library paths
|
||||
SECP256K1_ARM64_LIB = ./secp256k1/.libs/libsecp256k1_arm64.a
|
||||
SECP256K1_ARM64_PRECOMPUTED_LIB = ./secp256k1/.libs/libsecp256k1_precomputed_arm64.a
|
||||
|
||||
# Library outputs (static only)
|
||||
STATIC_LIB = libnostr_core.a
|
||||
ARM64_STATIC_LIB = libnostr_core_arm64.a
|
||||
@@ -29,27 +37,72 @@ ARM64_STATIC_LIB = libnostr_core_arm64.a
|
||||
EXAMPLE_SOURCES = $(wildcard examples/*.c)
|
||||
EXAMPLE_TARGETS = $(EXAMPLE_SOURCES:.c=)
|
||||
|
||||
# Default target - build static library
|
||||
default: $(STATIC_LIB)
|
||||
# Default target - build both x64 and ARM64 static libraries
|
||||
default: $(STATIC_LIB) $(ARM64_STATIC_LIB)
|
||||
|
||||
# Build all targets (static only)
|
||||
all: $(STATIC_LIB) examples
|
||||
all: $(STATIC_LIB) $(ARM64_STATIC_LIB) examples
|
||||
|
||||
# Static library
|
||||
$(STATIC_LIB): $(LIB_OBJECTS)
|
||||
@echo "Creating static library: $@"
|
||||
$(AR) rcs $@ $^
|
||||
# Static library - includes secp256k1 objects for self-contained library
|
||||
$(STATIC_LIB): $(LIB_OBJECTS) $(SECP256K1_LIB)
|
||||
@echo "Creating self-contained static library: $@"
|
||||
@echo "Extracting secp256k1 objects..."
|
||||
@mkdir -p .tmp_secp256k1
|
||||
@cd .tmp_secp256k1 && $(AR) x ../$(SECP256K1_LIB)
|
||||
@if [ -f $(SECP256K1_PRECOMPUTED_LIB) ]; then \
|
||||
echo "Extracting secp256k1_precomputed objects..."; \
|
||||
cd .tmp_secp256k1 && $(AR) x ../$(SECP256K1_PRECOMPUTED_LIB); \
|
||||
fi
|
||||
@echo "Combining all objects into $@..."
|
||||
$(AR) rcs $@ $(LIB_OBJECTS) .tmp_secp256k1/*.o
|
||||
@rm -rf .tmp_secp256k1
|
||||
@echo "Self-contained static library created: $@"
|
||||
|
||||
# ARM64 cross-compilation settings
|
||||
ARM64_CC = aarch64-linux-gnu-gcc
|
||||
ARM64_AR = aarch64-linux-gnu-ar
|
||||
ARM64_INCLUDES = -I. -Inostr_core -Icjson
|
||||
ARM64_INCLUDES = -I. -Inostr_core -Icjson -Isecp256k1/include -Inostr_websocket -Imbedtls/include -Imbedtls/tf-psa-crypto/include -Imbedtls/tf-psa-crypto/drivers/builtin/include
|
||||
|
||||
# ARM64 static library
|
||||
$(ARM64_STATIC_LIB): $(ARM64_LIB_OBJECTS)
|
||||
@echo "Creating ARM64 static library: $@"
|
||||
$(ARM64_AR) rcs $@ $^
|
||||
# ARM64 static library - includes secp256k1 objects for self-contained library
|
||||
$(ARM64_STATIC_LIB): $(ARM64_LIB_OBJECTS) $(SECP256K1_ARM64_LIB)
|
||||
@echo "Creating self-contained ARM64 static library: $@"
|
||||
@echo "Extracting ARM64 secp256k1 objects..."
|
||||
@mkdir -p .tmp_secp256k1_arm64
|
||||
@cd .tmp_secp256k1_arm64 && $(ARM64_AR) x ../$(SECP256K1_ARM64_LIB)
|
||||
@if [ -f $(SECP256K1_ARM64_PRECOMPUTED_LIB) ]; then \
|
||||
echo "Extracting ARM64 secp256k1_precomputed objects..."; \
|
||||
cd .tmp_secp256k1_arm64 && $(ARM64_AR) x ../$(SECP256K1_ARM64_PRECOMPUTED_LIB); \
|
||||
fi
|
||||
@echo "Combining all ARM64 objects into $@..."
|
||||
$(ARM64_AR) rcs $@ $(ARM64_LIB_OBJECTS) .tmp_secp256k1_arm64/*.o
|
||||
@rm -rf .tmp_secp256k1_arm64
|
||||
@echo "Self-contained ARM64 static library created: $@"
|
||||
|
||||
# Build secp256k1 for ARM64
|
||||
$(SECP256K1_ARM64_LIB): secp256k1/configure
|
||||
@echo "Building secp256k1 for ARM64..."
|
||||
@echo "Cleaning secp256k1 source directory first..."
|
||||
@cd secp256k1 && make distclean 2>/dev/null || true
|
||||
@mkdir -p secp256k1/build_arm64
|
||||
@cd secp256k1/build_arm64 && \
|
||||
CC=$(ARM64_CC) AR=$(ARM64_AR) \
|
||||
../configure --host=aarch64-linux-gnu \
|
||||
--enable-module-schnorrsig \
|
||||
--enable-module-ecdh \
|
||||
--enable-experimental \
|
||||
--disable-shared \
|
||||
--enable-static \
|
||||
--with-pic \
|
||||
--prefix=$(PWD)/secp256k1/install_arm64 && \
|
||||
make -j$(shell nproc 2>/dev/null || echo 4)
|
||||
@mkdir -p secp256k1/.libs
|
||||
@cp secp256k1/build_arm64/.libs/libsecp256k1.a $(SECP256K1_ARM64_LIB)
|
||||
@if [ -f secp256k1/build_arm64/.libs/libsecp256k1_precomputed.a ]; then \
|
||||
cp secp256k1/build_arm64/.libs/libsecp256k1_precomputed.a $(SECP256K1_ARM64_PRECOMPUTED_LIB); \
|
||||
fi
|
||||
@echo "ARM64 secp256k1 libraries built successfully"
|
||||
@echo "Restoring x64 secp256k1 build..."
|
||||
@cd secp256k1 && ./configure --enable-module-schnorrsig --enable-module-ecdh --enable-experimental --disable-shared --enable-static --with-pic >/dev/null 2>&1 && make -j$(shell nproc 2>/dev/null || echo 4) >/dev/null 2>&1 || true
|
||||
|
||||
# Object files (x86_64)
|
||||
%.o: %.c
|
||||
@@ -66,11 +119,16 @@ examples: $(EXAMPLE_TARGETS)
|
||||
|
||||
examples/%: examples/%.c $(STATIC_LIB)
|
||||
@echo "Building example: $@"
|
||||
$(CC) $(STATIC_CFLAGS) $(LOGGING_FLAGS) $(INCLUDES) $< -o $@ ./libnostr_core.a ./secp256k1/.libs/libsecp256k1.a -lm
|
||||
$(CC) $(STATIC_CFLAGS) $(LOGGING_FLAGS) $(INCLUDES) $< -o $@ ./libnostr_core.a -lm
|
||||
|
||||
# Architecture-specific targets
|
||||
x64: $(STATIC_LIB)
|
||||
x64-only: $(STATIC_LIB)
|
||||
|
||||
# ARM64 targets
|
||||
arm64: $(ARM64_STATIC_LIB)
|
||||
arm64-all: $(ARM64_STATIC_LIB)
|
||||
arm64-only: $(ARM64_STATIC_LIB)
|
||||
|
||||
# Debug build
|
||||
debug: CFLAGS = $(DEBUG_CFLAGS)
|
||||
@@ -105,7 +163,10 @@ clean:
|
||||
@echo "Cleaning build artifacts..."
|
||||
rm -f $(LIB_OBJECTS) $(ARM64_LIB_OBJECTS)
|
||||
rm -f $(STATIC_LIB) $(ARM64_STATIC_LIB)
|
||||
rm -f $(SECP256K1_ARM64_LIB) $(SECP256K1_ARM64_PRECOMPUTED_LIB)
|
||||
rm -f $(EXAMPLE_TARGETS)
|
||||
rm -rf .tmp_secp256k1 .tmp_secp256k1_arm64
|
||||
rm -rf secp256k1/build_arm64 secp256k1/install_arm64
|
||||
|
||||
# Create distribution package
|
||||
dist: clean
|
||||
@@ -121,11 +182,14 @@ help:
|
||||
@echo "==============================="
|
||||
@echo ""
|
||||
@echo "Available targets:"
|
||||
@echo " default - Build static library (recommended)"
|
||||
@echo " all - Build static library and examples"
|
||||
@echo " arm64 - Build ARM64 static library"
|
||||
@echo " arm64-all - Build ARM64 static library"
|
||||
@echo " debug - Build with debug symbols"
|
||||
@echo " default - Build both x64 and ARM64 static libraries (recommended)"
|
||||
@echo " all - Build both architectures and examples"
|
||||
@echo " x64 - Build x64 static library only"
|
||||
@echo " x64-only - Build x64 static library only"
|
||||
@echo " arm64 - Build ARM64 static library only"
|
||||
@echo " arm64-only - Build ARM64 static library only"
|
||||
@echo " arm64-all - Build ARM64 static library only"
|
||||
@echo " debug - Build with debug symbols (both architectures)"
|
||||
@echo " examples - Build example programs"
|
||||
@echo " test - Run simple test"
|
||||
@echo " test-crypto - Run comprehensive crypto test suite"
|
||||
@@ -135,8 +199,11 @@ help:
|
||||
@echo " dist - Create distribution package"
|
||||
@echo " help - Show this help"
|
||||
@echo ""
|
||||
@echo "Library outputs (static only):"
|
||||
@echo "Library outputs (static only, self-contained with secp256k1):"
|
||||
@echo " $(STATIC_LIB) - x86_64 static library"
|
||||
@echo " $(ARM64_STATIC_LIB) - ARM64 static library"
|
||||
@echo ""
|
||||
@echo "Both libraries are self-contained and include secp256k1 objects."
|
||||
@echo "Users only need to link with the library + -lm (no secp256k1 dependency)."
|
||||
|
||||
.PHONY: default all arm64 arm64-all debug examples test test-crypto install uninstall clean dist help
|
||||
.PHONY: default all x64 x64-only arm64 arm64-all arm64-only debug examples test test-crypto install uninstall clean dist help
|
||||
|
||||
Reference in New Issue
Block a user