From bc0e00de0ca72502cd44e09d99b6a8d2aa56ef01 Mon Sep 17 00:00:00 2001 From: Will Hedgecock Date: Tue, 18 Jan 2022 00:00:49 -0600 Subject: [PATCH] Initial commit for OpenBSD architectures --- src/main/c/Posix/Makefile | 37 +++++++++++++++++- src/main/c/Posix/PosixHelperFunctions.c | 6 +-- src/main/c/Posix/PosixHelperFunctions.h | 4 +- src/main/c/Posix/SerialPort_Posix.c | 3 +- .../resources/OpenBSD/amd64/libjSerialComm.so | Bin 0 -> 38520 bytes .../resources/OpenBSD/x86/libjSerialComm.so | Bin 0 -> 31360 bytes 6 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/OpenBSD/amd64/libjSerialComm.so create mode 100644 src/main/resources/OpenBSD/x86/libjSerialComm.so diff --git a/src/main/c/Posix/Makefile b/src/main/c/Posix/Makefile index 64bffba..515d8b1 100644 --- a/src/main/c/Posix/Makefile +++ b/src/main/c/Posix/Makefile @@ -14,10 +14,13 @@ COMPILE_ANDROID := ndk-build COMPILE_FREEBSD_X86 := clang -target i386-unknown-freebsd11.2 --sysroot=$(HOME)/x-tools/i386-unknown-freebsd11.2 COMPILE_FREEBSD_X86_64 := clang -target x86_64-unknown-freebsd11.2 --sysroot=$(HOME)/x-tools/x86_64-unknown-freebsd11.2 COMPILE_FREEBSD_ARM64 := clang -target arm64-unknown-freebsd11.2 --sysroot=$(HOME)/x-tools/arm64-unknown-freebsd11.2 +COMPILE_OPENBSD_X86 := clang -target i386-unknown-openbsd6.2 --sysroot=$(HOME)/x-tools/i386-unknown-openbsd6.2 +COMPILE_OPENBSD_X86_64 := clang -target amd64-unknown-openbsd6.2 --sysroot=$(HOME)/x-tools/amd64-unknown-openbsd6.2 CFLAGS_POSIX := -fPIC -Os -flto -static-libgcc -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -fuse-linker-plugin CFLAGS_APPLE := -fPIC -Os -flto -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 LDFLAGS_POSIX := -Os -flto -static-libgcc -shared -fuse-linker-plugin -s LDFLAGS_FREEBSD := -fuse-ld=lld -O3 -flto -shared -s -fuse-linker-plugin +LDFLAGS_OPENBSD := -fuse-ld=lld -O3 -flto -shared -s -fuse-linker-plugin LDFLAGS_APPLE := -Os -dynamiclib -flto -shared -fuse-linker-plugin JDK_HOME := $(shell if [ "`uname`" = "Darwin" ]; then echo "`/usr/libexec/java_home`"; else echo "$$JDK_HOME"; fi) INCLUDES := -I"$(JDK_HOME)/include" -I"$(JDK_HOME)/include/linux" -I"$(JDK_HOME)/include/darwin" -I"$(JDK_HOME)/include/solaris" @@ -37,6 +40,7 @@ RESOURCE_DIR_LINUX := ../../../../src/main/resources/Linux RESOURCE_DIR_SOLARIS := ../../../../src/main/resources/Solaris RESOURCE_DIR_OSX := ../../../../src/main/resources/OSX RESOURCE_DIR_FREEBSD := ../../../../src/main/resources/FreeBSD +RESOURCE_DIR_OPENBSD := ../../../../src/main/resources/OpenBSD JAVA_SOURCE_DIR := ../../../../src/main/java/com/fazecast/jSerialComm FULL_CLASS := com.fazecast.jSerialComm.SerialPort JAVA_CLASS_DIR := $(BUILD_DIR)/com/fazecast/jSerialComm @@ -63,6 +67,8 @@ OBJECTSsolarisSparc64 := $(BUILD_DIR)/solaris_sparc64/SerialPort_Posix.o $ OBJECTSfreebsd32 := $(BUILD_DIR)/freebsd_x86/SerialPort_Posix.o $(BUILD_DIR)/freebsd_x86/PosixHelperFunctions.o OBJECTSfreebsd64 := $(BUILD_DIR)/freebsd_x86_64/SerialPort_Posix.o $(BUILD_DIR)/freebsd_x86_64/PosixHelperFunctions.o OBJECTSfreebsdArm64 := $(BUILD_DIR)/freebsd_arm64/SerialPort_Posix.o $(BUILD_DIR)/freebsd_arm64/PosixHelperFunctions.o +OBJECTSopenbsd32 := $(BUILD_DIR)/openbsd_x86/SerialPort_Posix.o $(BUILD_DIR)/openbsd_x86/PosixHelperFunctions.o +OBJECTSopenbsd64 := $(BUILD_DIR)/openbsd_amd64/SerialPort_Posix.o $(BUILD_DIR)/openbsd_amd64/PosixHelperFunctions.o OBJECTSosx86 := $(BUILD_DIR)/osx_x86/SerialPort_Posix.o $(BUILD_DIR)/osx_x86/PosixHelperFunctions.o OBJECTSosx64 := $(BUILD_DIR)/osx_x86_64/SerialPort_Posix.o $(BUILD_DIR)/osx_x86_64/PosixHelperFunctions.o OBJECTSosxaarch64 := $(BUILD_DIR)/osx_aarch64/SerialPort_Posix.o $(BUILD_DIR)/osx_aarch64/PosixHelperFunctions.o @@ -83,18 +89,20 @@ FLAGSsolarisSparc64 := -mno-app-regs -mcpu=v9 -m64 FLAGSfreebsd32 := -m32 FLAGSfreebsd64 := -m64 FLAGSfreebsdArm64 := -m64 +FLAGSopenbsd32 := -m32 +FLAGSopenbsd64 := -m64 FLAGSosx86 := -arch i386 -m32 FLAGSosx64 := -arch x86_64 -m64 FLAGSosxaarch64 := -arch arm64 # Define phony and suffix rules -.PHONY: all clean linux linux32 linux64 arm armv5 armv6 armv6hf armv7 armv7hf armv8_32 armv8_64 powerpc ppc64le solaris solaris32 solaris64 solarisSparc32 solarisSparc64 osx osx32 osx64 osxaarch64 android freebsd freebsd32 freebsd64 freebsdArm64 +.PHONY: all clean linux linux32 linux64 arm armv5 armv6 armv6hf armv7 armv7hf armv8_32 armv8_64 powerpc ppc64le solaris solaris32 solaris64 solarisSparc32 solarisSparc64 osx osx32 osx64 osxaarch64 android freebsd freebsd32 freebsd64 freebsdArm64 openbsd openbsd32 openbsd64 .SUFFIXES: .SUFFIXES: .cpp .c .o .class .java .h # Default build target does nothing all : - $(PRINT) You must specify either linux, arm, powerpc, solaris, freebsd, osx, or android! + $(PRINT) You must specify either linux, arm, powerpc, solaris, freebsd, openbsd, osx, or android! clean : $(DELETE) -rf "$(BUILD_DIR)" $(DELETE) -rf ../*.h @@ -124,6 +132,11 @@ freebsd : freebsd32 freebsd64 freebsdArm64 $(DELETE) -rf "`readlink -f $(BUILD_DIR)`" $(DELETE) -rf ../*.h +# Build all OpenBSD libraries +openbsd : openbsd32 openbsd64 + $(DELETE) -rf "`readlink -f $(BUILD_DIR)`" + $(DELETE) -rf ../*.h + # Build all OSX libraries osx : osx32 osx64 osxaarch64 $(DELETE) -rf "$(BUILD_DIR)" @@ -190,6 +203,14 @@ freebsdArm64 : $(JAVA_CLASS_DIR) $(BUILD_DIR)/freebsd_arm64 $(BUILD_DIR)/freebsd $(DELETE) -rf $(BUILD_DIR)/freebsd_arm64/*.o $(COPY) $(BUILD_DIR)/freebsd_arm64/*.* $(RESOURCE_DIR_FREEBSD)/arm64/ +# Build architecture-specific OpenBSD libraries +openbsd32 : $(JAVA_CLASS_DIR) $(BUILD_DIR)/openbsd_x86 $(BUILD_DIR)/openbsd_x86/$(LIBRARY_NAME_POSIX) + $(DELETE) -rf $(BUILD_DIR)/openbsd_x86/*.o + $(COPY) $(BUILD_DIR)/openbsd_x86/*.* $(RESOURCE_DIR_OPENBSD)/x86/ +openbsd64 : $(JAVA_CLASS_DIR) $(BUILD_DIR)/openbsd_amd64 $(BUILD_DIR)/openbsd_amd64/$(LIBRARY_NAME_POSIX) + $(DELETE) -rf $(BUILD_DIR)/openbsd_amd64/*.o + $(COPY) $(BUILD_DIR)/openbsd_amd64/*.* $(RESOURCE_DIR_OPENBSD)/amd64/ + # Build architecture-specific OSX libraries osx32 : $(JAVA_CLASS_DIR) $(BUILD_DIR)/osx_x86 $(BUILD_DIR)/osx_x86/$(LIBRARY_NAME_APPLE) $(DELETE) -rf $(BUILD_DIR)/osx_x86/*.o @@ -240,6 +261,10 @@ $(BUILD_DIR)/freebsd_x86_64 : $(MKDIR) -p $@ $(BUILD_DIR)/freebsd_arm64 : $(MKDIR) -p $@ +$(BUILD_DIR)/openbsd_x86 : + $(MKDIR) -p $@ +$(BUILD_DIR)/openbsd_amd64 : + $(MKDIR) -p $@ $(BUILD_DIR)/osx_x86 : $(MKDIR) -p $@ $(BUILD_DIR)/osx_x86_64 : @@ -284,6 +309,10 @@ $(BUILD_DIR)/freebsd_x86_64/$(LIBRARY_NAME_POSIX) : $(JNI_HEADER) $(OBJECTSfreeb $(COMPILE_FREEBSD_X86_64) $(LDFLAGS_FREEBSD) $(FLAGSfreebsd64) -o $@ $(OBJECTSfreebsd64) $(LIBRARIES_POSIX) $(BUILD_DIR)/freebsd_arm64/$(LIBRARY_NAME_POSIX) : $(JNI_HEADER) $(OBJECTSfreebsdArm64) $(COMPILE_FREEBSD_ARM64) $(LDFLAGS_FREEBSD) $(FLAGSfreebsdArm64) -o $@ $(OBJECTSfreebsdArm64) $(LIBRARIES_POSIX) +$(BUILD_DIR)/openbsd_x86/$(LIBRARY_NAME_POSIX) : $(JNI_HEADER) $(OBJECTSopenbsd32) + $(COMPILE_OPENBSD_X86) $(LDFLAGS_OPENBSD) $(FLAGSopenbsd32) -o $@ $(OBJECTSopenbsd32) $(LIBRARIES_POSIX) +$(BUILD_DIR)/openbsd_amd64/$(LIBRARY_NAME_POSIX) : $(JNI_HEADER) $(OBJECTSopenbsd64) + $(COMPILE_OPENBSD_X86_64) $(LDFLAGS_OPENBSD) $(FLAGSopenbsd64) -o $@ $(OBJECTSopenbsd64) $(LIBRARIES_POSIX) $(BUILD_DIR)/osx_x86/$(LIBRARY_NAME_APPLE) : $(JNI_HEADER) $(OBJECTSosx86) $(COMPILE_OSX_X86) $(LDFLAGS_APPLE) $(FLAGSosx86) -o $@ $(OBJECTSosx86) $(LIBRARIES_APPLE) $(BUILD_DIR)/osx_x86_64/$(LIBRARY_NAME_APPLE) : $(JNI_HEADER) $(OBJECTSosx64) @@ -326,6 +355,10 @@ $(BUILD_DIR)/freebsd_x86_64/%.o : %.c $(COMPILE_FREEBSD_X86_64) $(INCLUDES) $(CFLAGS_APPLE) $(FLAGSfreebsd64) -c $< -o $@ $(BUILD_DIR)/freebsd_arm64/%.o : %.c $(COMPILE_FREEBSD_ARM64) $(INCLUDES) $(CFLAGS_APPLE) $(FLAGSfreebsdArm64) -c $< -o $@ +$(BUILD_DIR)/openbsd_x86/%.o : %.c + $(COMPILE_OPENBSD_X86) $(INCLUDES) $(CFLAGS_APPLE) $(FLAGSopenbsd32) -c $< -o $@ +$(BUILD_DIR)/openbsd_amd64/%.o : %.c + $(COMPILE_OPENBSD_X86_64) $(INCLUDES) $(CFLAGS_APPLE) $(FLAGSopenbsd64) -c $< -o $@ $(BUILD_DIR)/osx_x86/%.o : %.c $(COMPILE_OSX_X86) $(INCLUDES) $(CFLAGS_APPLE) $(FLAGSosx86) -c $< -o $@ $(BUILD_DIR)/osx_x86_64/%.o : %.c diff --git a/src/main/c/Posix/PosixHelperFunctions.c b/src/main/c/Posix/PosixHelperFunctions.c index bcc7f12..deb8b4f 100644 --- a/src/main/c/Posix/PosixHelperFunctions.c +++ b/src/main/c/Posix/PosixHelperFunctions.c @@ -2,7 +2,7 @@ * PosixHelperFunctions.c * * Created on: Mar 10, 2015 - * Last Updated on: Jan 04, 2022 + * Last Updated on: Jan 17, 2022 * Author: Will Hedgecock * * Copyright (C) 2012-2022 Fazecast, Inc. @@ -61,7 +61,7 @@ serialPort* pushBack(serialPortVector* vector, const char* key, const char* frie pthread_mutex_init(&port->eventMutex, NULL); pthread_condattr_t conditionVariableAttributes; pthread_condattr_init(&conditionVariableAttributes); -#if !defined(__APPLE__) +#if !defined(__APPLE__) && !defined(__OpenBSD__) pthread_condattr_setclock(&conditionVariableAttributes, CLOCK_MONOTONIC); #endif pthread_cond_init(&port->eventReceived, &conditionVariableAttributes); @@ -1066,7 +1066,7 @@ int setBaudRateCustom(int portFD, baud_rate baudRate) } // BSD-specific functionality -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__OpenBSD__) char getPortLocation(const char *deviceName, char* portLocation) { diff --git a/src/main/c/Posix/PosixHelperFunctions.h b/src/main/c/Posix/PosixHelperFunctions.h index 87dc10c..21cc484 100644 --- a/src/main/c/Posix/PosixHelperFunctions.h +++ b/src/main/c/Posix/PosixHelperFunctions.h @@ -2,7 +2,7 @@ * PosixHelperFunctions.h * * Created on: Mar 10, 2015 - * Last Updated on: Jan 04, 2022 + * Last Updated on: Jan 17, 2022 * Author: Will Hedgecock * * Copyright (C) 2012-2022 Fazecast, Inc. @@ -88,7 +88,7 @@ int flock(int fd, int op); void searchForComPorts(serialPortVector* comPorts); // FreeBSD-specific functionality -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__OpenBSD__) typedef int baud_rate; void searchForComPorts(serialPortVector* comPorts); diff --git a/src/main/c/Posix/SerialPort_Posix.c b/src/main/c/Posix/SerialPort_Posix.c index 7502ce0..9f65afa 100644 --- a/src/main/c/Posix/SerialPort_Posix.c +++ b/src/main/c/Posix/SerialPort_Posix.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -218,7 +219,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_fazecast_jSerialComm_SerialPort_getCommP driverBasedSearchForComPorts(&serialPorts, "/proc/tty/driver/mvebu_serial", "/dev/ttyMV"); lastDitchSearchForComPorts(&serialPorts); -#elif defined(__sun__) || defined(__APPLE__) || defined(__FreeBSD__) +#elif defined(__sun__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) searchForComPorts(&serialPorts); diff --git a/src/main/resources/OpenBSD/amd64/libjSerialComm.so b/src/main/resources/OpenBSD/amd64/libjSerialComm.so new file mode 100644 index 0000000000000000000000000000000000000000..587aa1a4b2957462807cfcf1862b8878f0467b02 GIT binary patch literal 38520 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