181 lines
5.4 KiB
Makefile
181 lines
5.4 KiB
Makefile
NAME = wolfssl-jni-jsse
|
|
VERSION = $(shell grep 'name="implementation.version"' build.xml | sed -nre 's/.*value="([0-9A-Za-z._-]+)".*/\1/p')
|
|
DIST_FILES = build.xml COPYING examples IDE java.sh LICENSING Makefile native platform \
|
|
README.md rpm src
|
|
|
|
ifneq ($(PREFIX),)
|
|
INSTALL_DIR = $(DESTDIR)$(PREFIX)
|
|
else
|
|
INSTALL_DIR = $(DESTDIR)/usr/local
|
|
endif
|
|
|
|
ifeq ($(INSTALL),)
|
|
INSTALL=install
|
|
endif
|
|
|
|
ifeq ($(LIBDIR),)
|
|
LIBDIR=lib
|
|
endif
|
|
|
|
# Native JNI compilation variables
|
|
NATIVE_SRC_DIR = native
|
|
NATIVE_SRCS = $(wildcard $(NATIVE_SRC_DIR)/*.c)
|
|
NATIVE_OBJS = $(NATIVE_SRCS:.c=.o)
|
|
NATIVE_DEPS = $(NATIVE_SRCS:.c=.d)
|
|
|
|
CC ?= gcc
|
|
WOLFSSL_INSTALL_DIR ?= $(INSTALL_DIR)
|
|
WOLFSSL_LIBNAME ?= wolfssl
|
|
|
|
# Platform detection
|
|
OS := $(shell uname)
|
|
ARCH := $(shell uname -m)
|
|
|
|
# JAVA_HOME detection with platform-aware fallback
|
|
JAVA_HOME ?= $(shell \
|
|
if [ "$(OS)" = "Darwin" ]; then \
|
|
/usr/libexec/java_home 2>/dev/null; \
|
|
else \
|
|
java_bin=$$(readlink -f $$(which java) 2>/dev/null); \
|
|
jh=$$(dirname $$(dirname $$java_bin)); \
|
|
if [ ! -d "$$jh/include" ]; then jh=$$(dirname $$jh); fi; \
|
|
echo $$jh; \
|
|
fi)
|
|
|
|
# Platform-specific flags
|
|
ifeq ($(OS),Darwin)
|
|
JNI_INCLUDES = -I"$(JAVA_HOME)/include" \
|
|
-I"$(JAVA_HOME)/include/darwin" \
|
|
-I"$(WOLFSSL_INSTALL_DIR)/include"
|
|
JNI_LIB_FLAGS = -dynamiclib
|
|
JNI_LIB_NAME = libwolfssljni.dylib
|
|
else ifeq ($(OS),Linux)
|
|
JNI_INCLUDES = -I"$(JAVA_HOME)/include" \
|
|
-I"$(JAVA_HOME)/include/linux" \
|
|
-I"$(WOLFSSL_INSTALL_DIR)/include"
|
|
JNI_LIB_FLAGS = -shared
|
|
JNI_LIB_NAME = libwolfssljni.so
|
|
ifneq ($(filter x86_64 aarch64,$(ARCH)),)
|
|
FPIC = -fPIC
|
|
endif
|
|
else
|
|
$(error Unsupported host OS '$(OS)'; supported OSes are Linux and Darwin)
|
|
endif
|
|
|
|
# Optionally enable all patch defines in the native code for testing.
|
|
ifeq ($(ENABLE_PATCHES),1)
|
|
PATCH_CFLAGS = $(addprefix -D,$(shell ./scripts/find-wolfssl-pr-patch-defines.sh))
|
|
ifeq ($(PATCH_CFLAGS),)
|
|
$(warning no WOLFSSL_PR*_PATCH_APPLIED defines found; building without patches)
|
|
endif
|
|
endif
|
|
|
|
# Verbose mode: set V=1 to see full compiler commands
|
|
ifeq ($(V),1)
|
|
Q =
|
|
else
|
|
Q = @
|
|
endif
|
|
|
|
JNI_CFLAGS = -Wall -Wextra -Werror $(FPIC) -MMD -MP $(PATCH_CFLAGS) $(CFLAGS)
|
|
JNI_LDFLAGS = -Wall $(JNI_LIB_FLAGS) $(CFLAGS) \
|
|
-L"$(WOLFSSL_INSTALL_DIR)/lib" \
|
|
-L"$(WOLFSSL_INSTALL_DIR)/lib64"
|
|
JNI_LDLIBS = -l$(WOLFSSL_LIBNAME)
|
|
|
|
.PHONY: all build check native clean-native clean install uninstall dist rpm \
|
|
print-config check-jdk
|
|
|
|
all: build
|
|
|
|
build: build.xml
|
|
$(MAKE) native WOLFSSL_INSTALL_DIR="$(WOLFSSL_INSTALL_DIR)" WOLFSSL_LIBNAME="$(WOLFSSL_LIBNAME)"
|
|
ant
|
|
|
|
check: build
|
|
ant test
|
|
|
|
# Fail with a clear message when JAVA_HOME does not point at a JDK.
|
|
check-jdk:
|
|
@if [ ! -f "$(JAVA_HOME)/include/jni.h" ]; then \
|
|
echo "ERROR: JAVA_HOME \"$(JAVA_HOME)\" has no include/jni.h" >&2; \
|
|
exit 1; \
|
|
fi
|
|
|
|
# Pattern rule: compile any native/*.c to native/*.o
|
|
$(NATIVE_SRC_DIR)/%.o: $(NATIVE_SRC_DIR)/%.c | print-config check-jdk
|
|
@echo " CC $<"
|
|
$(Q)$(CC) $(JNI_CFLAGS) -c $< -o $@ $(JNI_INCLUDES)
|
|
|
|
# Link all .o files into the shared library
|
|
lib/$(JNI_LIB_NAME): $(NATIVE_OBJS) | lib
|
|
@echo " LD $@"
|
|
$(Q)$(CC) $(JNI_LDFLAGS) -o $@ $(NATIVE_OBJS) $(JNI_LDLIBS)
|
|
|
|
lib:
|
|
mkdir -p lib
|
|
|
|
# Print build configuration, matching the output style of upstream java.sh
|
|
print-config:
|
|
@echo "Compiling Native JNI library:"
|
|
@echo " WOLFSSL_INSTALL_DIR = $(WOLFSSL_INSTALL_DIR)"
|
|
@echo " WOLFSSL_LIBNAME = $(WOLFSSL_LIBNAME)"
|
|
@if [ -n "$(JAVA_HOME)" ]; then \
|
|
echo " JAVA_HOME = $(JAVA_HOME)"; \
|
|
else \
|
|
echo " JAVA_HOME = <not set>"; \
|
|
fi
|
|
@if [ -n "$(CFLAGS)" ]; then \
|
|
echo " CFLAGS = $(CFLAGS)"; \
|
|
else \
|
|
echo " CFLAGS = <none>"; \
|
|
fi
|
|
@echo " Host OS = $(OS) $(ARCH)"
|
|
|
|
# Convenience target for building just native JNI library
|
|
native: lib/$(JNI_LIB_NAME)
|
|
@echo " Generated ./lib/$(JNI_LIB_NAME)"
|
|
|
|
# Clean only native artifacts (.o, .d files and shared lib)
|
|
clean-native:
|
|
$(Q)rm -f $(NATIVE_SRC_DIR)/*.o $(NATIVE_SRC_DIR)/*.d
|
|
$(Q)rm -f lib/$(JNI_LIB_NAME)
|
|
|
|
# Include auto-generated dependency files (if they exist)
|
|
-include $(NATIVE_DEPS)
|
|
|
|
clean: clean-native
|
|
ant clean cleanjni
|
|
|
|
install:
|
|
$(INSTALL) -d $(INSTALL_DIR)/$(LIBDIR)
|
|
$(INSTALL) lib/$(JNI_LIB_NAME) $(INSTALL_DIR)/$(LIBDIR)
|
|
$(INSTALL) lib/wolfssl.jar $(INSTALL_DIR)/$(LIBDIR)
|
|
$(INSTALL) lib/wolfssl-jsse.jar $(INSTALL_DIR)/$(LIBDIR)
|
|
|
|
uninstall:
|
|
rm -f $(INSTALL_DIR)/$(LIBDIR)/$(JNI_LIB_NAME)
|
|
rm -f $(INSTALL_DIR)/$(LIBDIR)/wolfssl.jar
|
|
rm -f $(INSTALL_DIR)/$(LIBDIR)/wolfssl-jsse.jar
|
|
|
|
dist:
|
|
@test -n "$(VERSION)" || { \
|
|
echo "ERROR: could not extract VERSION from build.xml" >&2 ; \
|
|
exit 1 ; }
|
|
@mkdir -p "$(NAME)-$(VERSION)"
|
|
@cp -pr $(DIST_FILES) "$(NAME)-$(VERSION)"
|
|
tar -zcf "$(NAME)-$(VERSION).tar.gz" "$(NAME)-$(VERSION)"
|
|
@rm -rf "$(NAME)-$(VERSION)"
|
|
|
|
rpm: dist
|
|
@rm -f *.rpm
|
|
rpmdev-setuptree
|
|
find ~/rpmbuild/RPMS ~/rpmbuild/SRPMS -name "$(PACKAGE)-$(VERSION)*.rpm" | xargs rm -f
|
|
@cp "$(NAME)-$(VERSION).tar.gz" ~/rpmbuild/SOURCES/
|
|
@cp rpm/spec.in rpm/spec
|
|
@sed -i rpm/spec -e "s/@NAME@/$(NAME)/g"
|
|
@sed -i rpm/spec -e "s/@VERSION@/$(VERSION)/g"
|
|
rpmbuild -ba --clean rpm/spec
|
|
@cp ~/rpmbuild/RPMS/*/$(NAME)-$(VERSION)*.rpm .
|
|
@cp ~/rpmbuild/SRPMS/$(NAME)-$(VERSION)*.rpm .
|