From d0e1a27a50538813b4a53a485f1cb1b908d13937 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 01/20] Linux ARM natives: add FP requirement to arch. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without this change, compilation on newer versions of GCC fails: cc1: error: ‘-mfloat-abi=hard’: selected architecture lacks an FPU The [GCC 8 ARM changes] note that “`-mfpu=auto` is now the default setting unless the compiler has been configured with an explicit `--with-fpu` option.” We were setting `-mfpu` to something other than `auto`, but one possible interpretation of that sentence is “the value of this option is now ignored unless you pass `--with-fpu`”. And of course, didn't, so on architectures where an FPU is optional (ARMv6 and ARMv7), we were being pushed onto a compile path that assumed the absence. A quick search uncovers a few other people dealing with this. Some distro developers discussing [how to handle the switch] refer to GCC 8, but the general consensus seems to be that the breaking change was introduced [with GCC 11] in Debian/Ubuntu. The GitHub Actions runners for Ubuntu 18.04 are now dead, but the last [installed software list] indicates that they included GCC v7.5.0, v9.4.0, and v10.3.0; presumably v7.5.0 was the default, which is why we didn't run into this before now. (The logs and artifacts from the last successful CI build are long expired.) I expect that this breaks compilation on GCC Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 02/20] macOS natives: don't need to link Java framework. The project doesn't actually use any headers from the JavaVM framework, so we don't need to link against it. --- src/main/c/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/c/Makefile b/src/main/c/Makefile index c133086..ad90255 100644 --- a/src/main/c/Makefile +++ b/src/main/c/Makefile @@ -216,7 +216,7 @@ ppc: # Requires a macOS host. osx: export CFLAGS += -I$(JAVA_HOME)/include/darwin -arch x86_64 -osx: export LDFLAGS := -arch x86_64 -dynamiclib -framework JavaVM -framework IOKit -framework CoreFoundation +osx: export LDFLAGS := -arch x86_64 -dynamiclib -framework IOKit -framework CoreFoundation osx: export objects := fuserImp.o SerialImp.o osx: export platform := osx osx: export lib_type := jnilib From e542631cb25aba182570d4cdd117ce6ea7a7dbe7 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 03/20] macOS natives: specifically target Mac OS X 10.7. ...rather than accepting whatever default we get for the x86_64 arch. I've chosen 10.7 because that's the lowest requirement I can find for a Java 8 JDK. No sense in building natives for anything older if there's no way to run them there. --- src/main/c/Makefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/c/Makefile b/src/main/c/Makefile index ad90255..5324962 100644 --- a/src/main/c/Makefile +++ b/src/main/c/Makefile @@ -215,8 +215,12 @@ ppc: $(MAKE) -f natives.mk # Requires a macOS host. -osx: export CFLAGS += -I$(JAVA_HOME)/include/darwin -arch x86_64 -osx: export LDFLAGS := -arch x86_64 -dynamiclib -framework IOKit -framework CoreFoundation +osx: export CFLAGS += -I$(JAVA_HOME)/include/darwin \ + -target x86_64-apple-macos10.7 +osx: export LDFLAGS := -target x86_64-apple-macos10.7 \ + -dynamiclib \ + -framework IOKit \ + -framework CoreFoundation osx: export objects := fuserImp.o SerialImp.o osx: export platform := osx osx: export lib_type := jnilib From 61790706e4d014199d3b4e557a54002d80420686 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 04/20] CI: use evergreen runners; update actions. GitHub will continue to merrily deprecate and remove old runner environments, as is their prerogative. However, the simplest way to produce a library with a low minimum glibc version requirement is to build in an environment having an old glibc. Not only does Ubuntu 18.04 have a fairly old glibc (v2.27), but the symbol versions our library links against require only glibc v2.7 (on x86_64; somewhat higher for some of the other architectures). Having previously fixed cross-compilation compatibility with GCC 8, we are no longer able to build with GCC 7-based compilers. Thankfully, Ubuntu did package GCC 8 on 18.04; it's just not the default. --- .github/workflows/build.yml | 64 ++++++++++++++++++++++--------------- src/main/c/Makefile | 41 ++++++++++++++---------- 2 files changed, 64 insertions(+), 41 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9de938d..4b89845 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,11 @@ on: jobs: natives-linux-windows: name: Linux (x86/ARM/PPC) and Windows native library compilation - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest + container: + image: ubuntu:18.04 + env: + GCC: gcc-8 defaults: run: @@ -14,15 +18,20 @@ jobs: steps: - name: Checkout the target branch - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup Java - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: + distribution: temurin java-version: 8 + # Don't need the dependency cache here (or in any of the other native + # library compilation steps), because we're not invoking the Java + # compiler in this step. We only need the JDK for its headers. - name: Install build prerequisites run: | - sudo apt update - sudo make crosstools + apt-get update + apt-get --assume-yes install make $GCC + make crosstools - name: Build the Linux and Windows native libraries run: | @@ -33,25 +42,25 @@ jobs: # exactly to the directories inside `src/main/c/resources/native`. That # way, the Java build job can pull down all artifacts and unpack them # into that directory to overwrite the versions in-repo. This is sadly - # necessary because the actions/download-artifact@v2 action flattens + # necessary because the actions/download-artifact@v3 action flattens # paths inside artifacts. If it retained full relative paths, we could # put Linux and Windows natives inside the same artifact, and we could be # flexible with the artifact names. But it doesn't, so we can't, and we # can't. - name: Upload Linux native libraries - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: linux path: src/main/c/resources/native/linux - name: Upload Windows native libraries - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: windows path: src/main/c/resources/native/windows natives-macos: name: macOS native library compilation - runs-on: macos-10.15 + runs-on: macos-latest defaults: run: @@ -59,10 +68,11 @@ jobs: steps: - name: Checkout the target branch - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup Java - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: + distribution: temurin java-version: 8 - name: Build the macOS native libraries @@ -71,18 +81,16 @@ jobs: make osx - name: Upload macOS native libraries - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: osx path: src/main/c/resources/native/osx/libNRJavaSerial.jnilib natives-freebsd: name: FreeBSD native library compilation - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest container: image: empterdose/freebsd-cross-build:9.3 - env: - JAVA_HOME: /usr/lib/jvm/default-jvm defaults: run: @@ -90,13 +98,17 @@ jobs: steps: - name: Checkout the target branch - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup Java + uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: 8 + - name: Fake the FreeBSD Java headers # This feels extremely dirty, but the only native header we care about # is `jni_md.h`, and it is exactly identical between Linux and FreeBSD # (at least in OpenJDK 8). run: | - apk add openjdk8 ln -s $JAVA_HOME/include/linux $JAVA_HOME/include/freebsd - name: Build the FreeBSD native libraries @@ -106,14 +118,14 @@ jobs: settarget x86_64-freebsd9 make freebsd64 - name: Upload FreeBSD native libraries - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: freebsd path: src/main/c/resources/native/freebsd java: name: Java compilation - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest needs: - natives-linux-windows @@ -126,18 +138,20 @@ jobs: # don't regress formatting when compared with the master branch, we need # to have a local copy of the master branch for comparison. - name: Checkout the master branch - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: master - name: Checkout the target branch - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup Java - uses: actions/setup-java@v1 + uses: actions/setup-java@v3 with: + distribution: temurin java-version: 8 + cache: gradle - name: Download native libraries - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: path: src/main/c/resources/native @@ -146,9 +160,9 @@ jobs: - name: Determine commit hash for artifact filename id: vars - run: echo "::set-output name=short-rev::$(git rev-parse --short HEAD)" + run: echo "short-rev=$(git rev-parse --short HEAD)" >>$GITHUB_OUTPUT - name: Upload build artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: nrjavaserial-${{steps.vars.outputs.short-rev}} path: build/libs/*.jar diff --git a/src/main/c/Makefile b/src/main/c/Makefile index 5324962..837a9d7 100644 --- a/src/main/c/Makefile +++ b/src/main/c/Makefile @@ -58,6 +58,14 @@ include JAVA_HOME.mk include platform.mk +# Most of the time, GCC is called `gcc` and is installed from a `gcc` package. +# However, sometimes a distribution packages multiple versions of GCC. In this +# case, both the binary and package names of non-default versions are suffixed +# (e.g., `gcc-8`). We can't use the standard CC variable to adapt to this, +# because each target already overrides that variable with the name of the +# appropriate cross compiler. +GCC ?= gcc + # In all cases, we want to include the system JNI headers, our own headers, # crank the optimization level, and compile position-independent code so that # it will work as a library (dlopen(3) et al. can load it into any memory). @@ -87,13 +95,13 @@ all: $(error $(NO_TARGET_PLATFORM_SPECIFIED)) crosstools: - apt install --install-recommends \ - gcc-i686-linux-gnu \ - gcc-arm-linux-gnueabi \ - gcc-arm-linux-gnueabihf \ - gcc-aarch64-linux-gnu \ + apt-get --assume-yes install \ + $(GCC)-i686-linux-gnu \ + $(GCC)-arm-linux-gnueabi \ + $(GCC)-arm-linux-gnueabihf \ + $(GCC)-aarch64-linux-gnu \ gcc-mingw-w64 \ - gcc-powerpc-linux-gnu + $(GCC)-powerpc-linux-gnu # Does not include Android, because Android toolchains are large, not commonly # available, and the resulting library is not typically desired. @@ -108,7 +116,7 @@ LINUX_CFLAGS += -U_FORTIFY_SOURCE endif # Requires gcc-i686-linux-gnu. -linux32: export CC := i686-linux-gnu-gcc +linux32: export CC := i686-linux-gnu-$(GCC) linux32: export CFLAGS += $(LINUX_CFLAGS) -m32 linux32: export LDFLAGS += -m32 linux32: export platform := linux/x86_32 @@ -116,6 +124,7 @@ linux32: $(MAKE) -f natives.mk # Requires gcc. +linux64: export CC := $(GCC) linux64: export CFLAGS += $(LINUX_CFLAGS) -m64 linux64: export platform := linux/x86_64 linux64: @@ -127,7 +136,7 @@ arm: arm32v5 \ arm32v8 arm32v8HF arm64v8 # Requires gcc-arm-linux-gnueabi. -arm32v5: export CC := arm-linux-gnueabi-gcc +arm32v5: export CC := arm-linux-gnueabi-$(GCC) arm32v5: export CFLAGS += $(LINUX_CFLAGS) -march=armv5t arm32v5: export LDFLAGS += -march=armv5t arm32v5: export platform := linux/ARM_32 @@ -136,7 +145,7 @@ arm32v5: $(MAKE) -f natives.mk # Requires gcc-arm-linux-gnueabi. -arm32v6: export CC := arm-linux-gnueabi-gcc +arm32v6: export CC := arm-linux-gnueabi-$(GCC) arm32v6: export CFLAGS += $(LINUX_CFLAGS) -march=armv6 arm32v6: export LDFLAGS += -march=armv6 arm32v6: export platform := linux/ARM_32 @@ -145,7 +154,7 @@ arm32v6: $(MAKE) -f natives.mk # Requires gcc-arm-linux-gnueabihf. -arm32v6HF: export CC := arm-linux-gnueabihf-gcc +arm32v6HF: export CC := arm-linux-gnueabihf-$(GCC) arm32v6HF: export CFLAGS += $(LINUX_CFLAGS) -march=armv6+fp -marm arm32v6HF: export LDFLAGS += -march=armv6+fp -marm arm32v6HF: export platform := linux/ARM_32 @@ -154,7 +163,7 @@ arm32v6HF: $(MAKE) -f natives.mk # Requires gcc-arm-linux-gnueabi. -arm32v7: export CC := arm-linux-gnueabi-gcc +arm32v7: export CC := arm-linux-gnueabi-$(GCC) arm32v7: export CFLAGS += $(LINUX_CFLAGS) -march=armv7-a arm32v7: export LDFLAGS += -march=armv7-a arm32v7: export platform := linux/ARM_32 @@ -163,7 +172,7 @@ arm32v7: $(MAKE) -f natives.mk # Requires gcc-arm-linux-gnueabihf. -arm32v7HF: export CC := arm-linux-gnueabihf-gcc +arm32v7HF: export CC := arm-linux-gnueabihf-$(GCC) arm32v7HF: export CFLAGS += $(LINUX_CFLAGS) -march=armv7-a+fp arm32v7HF: export LDFLAGS += -march=armv7-a+fp arm32v7HF: export platform := linux/ARM_32 @@ -172,7 +181,7 @@ arm32v7HF: $(MAKE) -f natives.mk # Requires gcc-arm-linux-gnueabi. -arm32v8: export CC := arm-linux-gnueabi-gcc +arm32v8: export CC := arm-linux-gnueabi-$(GCC) arm32v8: export CFLAGS += $(LINUX_CFLAGS) -march=armv8-a arm32v8: export LDFLAGS += -march=armv8-a arm32v8: export platform := linux/ARM_32 @@ -181,7 +190,7 @@ arm32v8: $(MAKE) -f natives.mk # Requires gcc-arm-linux-gnueabihf. -arm32v8HF: export CC := arm-linux-gnueabihf-gcc +arm32v8HF: export CC := arm-linux-gnueabihf-$(GCC) arm32v8HF: export CFLAGS += $(LINUX_CFLAGS) -march=armv8-a -mfpu=neon-fp-armv8 arm32v8HF: export LDFLAGS += -march=armv8-a -mfpu=neon-fp-armv8 arm32v8HF: export platform := linux/ARM_32 @@ -190,7 +199,7 @@ arm32v8HF: $(MAKE) -f natives.mk # Requires gcc-aarch64-linux-gnu. -arm64v8: export CC := aarch64-linux-gnu-gcc +arm64v8: export CC := aarch64-linux-gnu-$(GCC) arm64v8: export CFLAGS += $(LINUX_CFLAGS) -march=armv8-a+fp arm64v8: export LDFLAGS += -march=armv8-a+fp arm64v8: export platform := linux/ARM_64 @@ -208,7 +217,7 @@ android: $(MAKE) -f natives.mk # Requires gcc-powerpc-linux-gnu. -ppc: export CC := powerpc-linux-gnu-gcc +ppc: export CC := powerpc-linux-gnu-$(GCC) ppc: export CFLAGS += $(LINUX_CFLAGS) ppc: export platform := linux/PPC ppc: From e10feb7933b30fa8d7955a66591f6cfa18759297 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 05/20] CI: build for FreeBSD 11, including arm64. --- .github/workflows/build.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4b89845..381e0ff 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -90,7 +90,7 @@ jobs: name: FreeBSD native library compilation runs-on: ubuntu-latest container: - image: empterdose/freebsd-cross-build:9.3 + image: empterdose/freebsd-cross-build:11.4 defaults: run: @@ -114,8 +114,9 @@ jobs: - name: Build the FreeBSD native libraries run: | make clean-freebsd - settarget i386-freebsd9 make freebsd32 - settarget x86_64-freebsd9 make freebsd64 + settarget i386-freebsd11 make freebsd32 + settarget x86_64-freebsd11 make freebsd64 + settarget arm64-freebsd11 make freebsdarm64v8 - name: Upload FreeBSD native libraries uses: actions/upload-artifact@v3 From eef5733d4ca67368838823f2bf938d98dbd1492c Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 06/20] Gradle: apply all of the plugins together. No need to apply some of plugins outside of the plugins block. --- build.gradle | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index a073dac..3a2ec64 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,12 @@ plugins { id "biz.aQute.bnd.builder" version "5.0.1" id "com.diffplug.spotless" version "5.9.0" + id 'eclipse' + id 'java' + id 'maven' + id 'signing' } -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'maven' -apply plugin: 'signing' - [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' File buildDir = file("."); From 84a4365495702280d3352a1c5aaeb97c4734e7c6 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 07/20] Gradle: remove the deprecated JCenter repository. --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index 3a2ec64..a5e6ad3 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,6 @@ jar.archiveName = "nrjavaserial-${props.'app.version'}.jar" repositories { mavenCentral() - jcenter() } dependencies { From 712e4846cad7ef0783c57c8066eff4571db2fdc8 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 08/20] Gradle: remove obsolete reference to `libs/` dir. --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index a5e6ad3..a4159bf 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,6 @@ repositories { } dependencies { - compile fileTree(dir: 'libs', includes: ['*.jar']) testCompile 'junit:junit:4.12' compile 'commons-net:commons-net:3.9.0' compileOnly 'net.java.dev.jna:jna:4.4.0' From a2c9325ce08f03fa6f9df318d49691249267899a Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 09/20] Gradle: remove unnecessary JAR configuration. The archive name is automatically derived from the `archivesBaseName` and the `version`. And we don't have any duplicate archive contents, so we don't benefit from setting a strategy to cope with them. --- build.gradle | 5 ----- 1 file changed, 5 deletions(-) diff --git a/build.gradle b/build.gradle index a4159bf..6fdd893 100644 --- a/build.gradle +++ b/build.gradle @@ -31,8 +31,6 @@ sourceSets { } } -jar.archiveName = "nrjavaserial-${props.'app.version'}.jar" - repositories { mavenCentral() } @@ -45,8 +43,6 @@ dependencies { } jar { - jar.duplicatesStrategy = DuplicatesStrategy.EXCLUDE - bnd("Created-By": "Commonwealth Robotics Cooperative", "Specification-Title": props."app.name", "Specification-Version": props."app.version", @@ -57,7 +53,6 @@ jar { "Import-Package": "com.sun.jna.platform.win32;resolution:=optional,org.apache.commons.net.telnet;resolution:=optional,!gnu.io*,*", "Export-Package": "gnu.io*" ) - } task javadocJar(type: Jar) { From 4cfddf5c3a799f2405908ef2f72aa5db9b34af17 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 10/20] Gradle: update dependency configurations names. Some dependency configurations have been renamed as of Gradle 7. --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 6fdd893..891bf8f 100644 --- a/build.gradle +++ b/build.gradle @@ -36,8 +36,8 @@ repositories { } dependencies { - testCompile 'junit:junit:4.12' - compile 'commons-net:commons-net:3.9.0' + testImplementation 'junit:junit:4.12' + implementation 'commons-net:commons-net:3.9.0' compileOnly 'net.java.dev.jna:jna:4.4.0' compileOnly 'net.java.dev.jna:jna-platform:4.4.0' } From f5b383d58155f6e2602f977672edf168d2f7cca7 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 11/20] Gradle: use automatic Javadoc/source archives. By using the Java plugin's built-in functionality to create these archives, they're automatically created as part of a normal build, and included in publications. --- build.gradle | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 891bf8f..c53364d 100644 --- a/build.gradle +++ b/build.gradle @@ -42,6 +42,11 @@ dependencies { compileOnly 'net.java.dev.jna:jna-platform:4.4.0' } +java { + withJavadocJar() + withSourcesJar() +} + jar { bnd("Created-By": "Commonwealth Robotics Cooperative", "Specification-Title": props."app.name", @@ -55,17 +60,11 @@ jar { ) } -task javadocJar(type: Jar) { - classifier = 'javadoc' - from javadoc -} - -task sourcesJar(type: Jar) { - classifier = 'sources' - from (sourceSets.main.allSource) { - exclude 'native/' - } -} +// withSourcesJar() creates the sourcesJar task which, by default, packages +// sourceSets.main.allSource. Including native libraries in this source set is +// the easiest way to include them the final library archive, but we don't want +// an extra half meg of binaries to be included in the source archive. +sourcesJar.exclude('native/') spotless { enforceCheck false From 4155d5af65ca2b88bb9f2653bda187090897ae18 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 12/20] Gradle: switch to the maven-publish plugin. --- README.md | 7 ++++ build.gradle | 98 +++++++++++++++++++++++++++++++++-------------- gradle.properties | 1 - 3 files changed, 76 insertions(+), 30 deletions(-) delete mode 120000 gradle.properties diff --git a/README.md b/README.md index b7425ad..34a00e6 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,13 @@ ease of use and embeddability in other libraries. The resulting JAR will be found in the `build/libs/` directory. +Optionally, you can publish (“install”) your new build +into your local Maven repository (`~/.m2/repository`). +That way, you easily can consume your own build of the library +from other locally-built Maven/Gradle projects. + + $ ./gradlew publishToMavenLocal + # Building the native libraries The native libraries are written in C, diff --git a/build.gradle b/build.gradle index c53364d..2d2ffca 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { id "com.diffplug.spotless" version "5.9.0" id 'eclipse' id 'java' - id 'maven' + id 'maven-publish' id 'signing' } @@ -92,12 +92,6 @@ signing { sign configurations.archives } -artifacts { - archives javadocJar - archives sourcesJar - archives jar -} - //import org.gradle.plugins.signing.Sign // //gradle.taskGraph.whenReady { taskGraph -> @@ -119,49 +113,95 @@ artifacts { // console.printf "\nThanks.\n\n" // } //} +*/ +// You can provide OSSRH publication credentials in three ways. Either: +// +// 1. Pass the username and password properties on the command line: +// +// ./gradlew ... -PossrhUsername=username -PossrhPassword=password +// +// 2. Configure those properties in ~/.gradle/gradle.properties. +// 3. Set the OSSRHUSERNAME and OSSRHPASSWORD environment variables to the +// username and password, respectively. +publishing { + def ossrhUsername = findProperty('ossrhUsername') + def ossrhPassword = findProperty('ossrhPassword') + + if (System.env.OSSRHUSERNAME && System.env.OSSRHPASSWORD) { + ossrhUsername = System.env.OSSRHUSERNAME + ossrhPassword = System.env.OSSRHPASSWORD + } -uploadArchives { repositories { - mavenDeployer { - beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } - - repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { - authentication(userName: ossrhUsername, password: ossrhPassword) + // A Nexus Repository instance running on localhost. Useful for + // debugging the publishing process. Named “localhost”, not “local”, to + // avoid confusion with the publishToMavenLocal task, which publishes + // to the local Maven cache at ~/.m2/repository. + maven { + name = 'localhost' + url = 'http://localhost:8081/repository/maven-releases/' + allowInsecureProtocol = true + credentials { + username = ossrhUsername + password = ossrhPassword + } } - snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { - authentication(userName: ossrhUsername, password: ossrhPassword) + maven { + name = 'ossrh' + url = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + credentials { + username = ossrhUsername + password = ossrhPassword + } } + maven { + name = 'ossrhSnapshots' + url = 'https://oss.sonatype.org/content/repositories/snapshots/' + credentials { + username = ossrhUsername + password = ossrhPassword + } + } + } - pom.project { - name 'NRJavaSerial' - packaging 'jar' - description 'A fork of the RXTX library with a focus on ease of use and embeddability in other libraries.' - url 'http://neuronrobotics.com' + publications { + nrJavaSerial(MavenPublication) { + pom { + // By default, the artifact ID is derived from the name of the + // directory housing this file. If we don't specifically + // override that, we'll end up with an unexpected artifact ID + // if the project directory is called something other than + // “nrjavaserial”. + artifactId = props.'app.name' + name = 'NRJavaSerial' + description = 'A fork of the RXTX library with a focus on ease of use and embeddability in other libraries.' + url = 'https://nrjs.org' + + from components.java scm { - connection 'scm:git:https://github.com/NeuronRobotics/nrjavaserial.git' - developerConnection 'scm:git:git@github.com:NeuronRobotics/nrjavaserial.git' - url 'https://github.com/NeuronRobotics/nrjavaserial' + connection = 'scm:git:https://github.com/NeuronRobotics/nrjavaserial.git' + developerConnection = 'scm:git:git@github.com:NeuronRobotics/nrjavaserial.git' + url = 'https://github.com/NeuronRobotics/nrjavaserial' } licenses { license { - name 'The Apache License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + name = 'RXTX License v 2.1 - LGPL v 2.1 + Linking Over Controlled Interface' + url = 'https://raw.githubusercontent.com/NeuronRobotics/nrjavaserial/master/LICENSE' } } developers { developer { - id 'madhephaestus' - name 'Kevin Harrington' - email 'kharrington@neuronrobotics.com' + id = 'madhephaestus' + name = 'Kevin Harrington' + email = 'kharrington@neuronrobotics.com' } } } } } } -*/ diff --git a/gradle.properties b/gradle.properties deleted file mode 120000 index 4e89a6b..0000000 --- a/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -/home/hephaestus/gradle.properties \ No newline at end of file From 63993ca9536202746602b36667595d0da9d9928a Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 13/20] Gradle: optionally sign publication artifacts. Because signing now only happens when publishing the build and only when signatory configuration appears to be available, we can leave the signing block uncommented without getting in the way of people who are just trying to make local builds. --- build.gradle | 77 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 30 deletions(-) diff --git a/build.gradle b/build.gradle index 2d2ffca..30d1364 100644 --- a/build.gradle +++ b/build.gradle @@ -84,39 +84,11 @@ spotless { eclipse() } } -/* -signing { - required { - gradle.taskGraph.hasTask("uploadArchives") - } - sign configurations.archives -} -//import org.gradle.plugins.signing.Sign -// -//gradle.taskGraph.whenReady { taskGraph -> -// if (taskGraph.allTasks.any { it instanceof Sign }) { -// // Use Java 6's console to read from the console (no good for -// // a CI environment) -// Console console = System.console() -// console.printf "\n\nWe have to sign some things in this build." + -// "\n\nPlease enter your signing details.\n\n" -// -// def id = console.readLine("PGP Key Id: ") -// def file = console.readLine("PGP Secret Key Ring File (absolute path): ") -// def password = console.readPassword("PGP Private Key Password: ") -// -// allprojects { ext."signing.keyId" = id } -// allprojects { ext."signing.secretKeyRingFile" = file } -// allprojects { ext."signing.password" = password } -// -// console.printf "\nThanks.\n\n" -// } -//} -*/ // You can provide OSSRH publication credentials in three ways. Either: // -// 1. Pass the username and password properties on the command line: +// 1. Pass the username and password properties – ossrhUsername and +// ossrhPassword – on the command line: // // ./gradlew ... -PossrhUsername=username -PossrhPassword=password // @@ -205,3 +177,48 @@ publishing { } } } + +// You can provide a signatory in three ways. Either: +// +// 1. Pass the signatory properties – signing.keyId, signing.secretKeyRingFile, +// and signing.password – on the command line: +// +// ./gradlew ... \ +// -Psigning.keyId=7FD6B0A1 \ +// -Psigning.secretKeyRingFile=/path/to/.gnupg/secring.gpg \ +// -Psigning.password=secret +// +// 2. Configure those properties in ~/.gradle/gradle.properties. +// 3. Set the SIGNINGKEY and SIGNINGPASSWORD environment variables to an +// ASCII-armored PGP key and password, respectively. +// +// For more details on the behaviour of the properties and their expected +// values, see the signing plugin documentation: +// +// https://docs.gradle.org/current/userguide/signing_plugin.html#sec:signatory_credentials +// +// If a signatory has not been configured, or if the signing.skip property is +// set, artifacts will not be signed prior to publication. +// +// This signing block must appear after the publishing block in order to refer +// to the specific publication to be signed. +signing { + if (project.hasProperty('signing.skip')) { + // We've been explicitly told not to sign artifacts, even if we have a + // configured signatory. + return + } else if (System.env.SIGNINGKEY && System.env.SIGNINGPASSWORD) { + useInMemoryPgpKeys(System.env.SIGNINGKEY, System.env.SIGNINGPASSWORD) + } else if (findProperty('signing.keyId') && + findProperty('signing.secretKeyRingFile') && + findProperty('signing.password')) { + // No special configuration necessary for properties: the signing plugin + // self-configures from the signing.keyId, signing.secretKeyRingFile, and + // signing.password properties when populated. + } else { + // No signatory is configured; skip signing. + return + } + + sign publishing.publications.nrJavaSerial +} From 04072c2bb6b5dd5a0b751be05e917119f6fc6fcb Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 14/20] Gradle: update to v8.3. --- gradle/wrapper/gradle-wrapper.jar | Bin 58695 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 282 ++++++++++++++--------- gradlew.bat | 35 +-- 4 files changed, 189 insertions(+), 132 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f3d88b1c2faf2fc91d853cd5d4242b5547257070..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 44820 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�p8_=hH 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b7c8c5d..ac72c34 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7..0adc8e1 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,78 +17,111 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,87 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 9109989..6689b85 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -54,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -64,38 +65,26 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From 820005115d91699a868537382511226e5729da7a Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 15/20] Gradle: build with a Java 8 toolchain. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks to “toolchains”, introduced in Gradle v6.7, we can now easily ensure that the library is always built with a Java 8 toolchain, even if Gradle is invoked with something else. --- build.gradle | 4 ++++ settings.gradle | 3 +++ 2 files changed, 7 insertions(+) create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle index 30d1364..6b0cd4f 100644 --- a/build.gradle +++ b/build.gradle @@ -43,6 +43,10 @@ dependencies { } java { + toolchain { + languageVersion = JavaLanguageVersion.of(8) + } + withJavadocJar() withSourcesJar() } diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..208c925 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,3 @@ +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' +} From aa32d8d04567ee0dc986c9a5087cc8f7c0187b6b Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 16/20] Gradle: replace base plugin conventional props. --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6b0cd4f..4a06850 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,5 @@ plugins { + id 'base' id "biz.aQute.bnd.builder" version "5.0.1" id "com.diffplug.spotless" version "5.9.0" id 'eclipse' @@ -14,7 +15,7 @@ Properties props = new Properties() props.load(new FileInputStream(buildDir.getAbsolutePath() + "/src/main/resources/com/neuronrobotics/nrjavaserial/build.properties")) group = "com.neuronrobotics" -archivesBaseName = "nrjavaserial" +base.archivesName = props.'app.name' version = props."app.version" sourceSets { From f96d46922ab434fba6ea9f23086073e542289216 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 17/20] Gradle: update Bnd plugin to v6.4.0. Bnd v6 introduces a `bundle` extension to the the Java plugin's `jar` task, which no longer relies on conventions (which are deprecated). This mostly just clears up a deprecation warning. One warning still remains as long as the Bnd plugin is applied, and there doesn't seem to be anything we can do about it. --- build.gradle | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 4a06850..a02910d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,17 @@ plugins { id 'base' - id "biz.aQute.bnd.builder" version "5.0.1" + // The application of the Bnd plugin triggers a Gradle warning: + // + // The AbstractTask.getConvention() method has been deprecated. This is + // scheduled to be removed in Gradle 9.0. Consult the upgrading guide + // for further information: https://docs.gradle.org/8.3/userguide/ + // upgrading_version_8.html#deprecated_access_to_conventions + // + // This warning is caused by Bnd itself, and there is nothing we can do + // about it in our own configuration. This will be resolved [in Bnd v7.0]. + // + // [in Bnd v7.0]: https://github.com/bndtools/bnd/issues/5714#issuecomment-1635684935 + id 'biz.aQute.bnd.builder' version '6.4.0' id "com.diffplug.spotless" version "5.9.0" id 'eclipse' id 'java' @@ -53,16 +64,18 @@ java { } jar { - bnd("Created-By": "Commonwealth Robotics Cooperative", - "Specification-Title": props."app.name", - "Specification-Version": props."app.version", - "Specification-Vendor": "Commonwealth Robotics Cooperative", - "Implementation-Title": props."app.name", - "Implementation-Version" : props."app.version", - "Implementation-Vendor": "Commonwealth Robotics Cooperative", - "Import-Package": "com.sun.jna.platform.win32;resolution:=optional,org.apache.commons.net.telnet;resolution:=optional,!gnu.io*,*", - "Export-Package": "gnu.io*" - ) + bundle { + bnd( + 'Specification-Title': props.'app.name', + 'Specification-Version': props.'app.version', + 'Specification-Vendor': 'Commonwealth Robotics Cooperative', + 'Implementation-Title': props.'app.name', + 'Implementation-Version' : props.'app.version', + 'Implementation-Vendor': 'Commonwealth Robotics Cooperative', + 'Import-Package': 'com.sun.jna.platform.win32;resolution:=optional,org.apache.commons.net.telnet;resolution:=optional,!gnu.io*,*', + 'Export-Package': 'gnu.io*', + ) + } } // withSourcesJar() creates the sourcesJar task which, by default, packages From 485d70b573bb8145cad4abcbe13eaf0f46c240a2 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 18/20] Gradle: update Spotless plugin to v6.13.0. --- build.gradle | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a02910d..8b72d20 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,15 @@ plugins { // // [in Bnd v7.0]: https://github.com/bndtools/bnd/issues/5714#issuecomment-1635684935 id 'biz.aQute.bnd.builder' version '6.4.0' - id "com.diffplug.spotless" version "5.9.0" + // This is the [last version] of Spotless which runs on Java 8. Even though + // our toolchain configuration allows us to run Gradle on a higher Java + // version than we use to build, Java 8 is a pretty fixed target, so as + // long as we're not able to take advantage of any newer language features, + // we're probably not losing much by sticking with an older linter. + // + // [last version]: https://github.com/diffplug/spotless/issues/1337 + // [toolchain]: https://docs.gradle.org/current/userguide/toolchains.html + id 'com.diffplug.spotless' version '6.13.0' id 'eclipse' id 'java' id 'maven-publish' From 92f2f5c9253754022ba484411f7646bb4c91b833 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 19/20] Gradle: use single-quoted strings where possible. --- build.gradle | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 8b72d20..50e285a 100644 --- a/build.gradle +++ b/build.gradle @@ -29,24 +29,24 @@ plugins { [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' -File buildDir = file("."); +File buildDir = file('.'); Properties props = new Properties() -props.load(new FileInputStream(buildDir.getAbsolutePath() + "/src/main/resources/com/neuronrobotics/nrjavaserial/build.properties")) +props.load(new FileInputStream("${buildDir.getAbsolutePath()}/src/main/resources/com/neuronrobotics/nrjavaserial/build.properties")) -group = "com.neuronrobotics" +group = 'com.neuronrobotics' base.archivesName = props.'app.name' -version = props."app.version" +version = props.'app.version' sourceSets { test { java { - srcDirs = ["test/src"] + srcDirs = ['test/src'] } } main { resources { - srcDirs = ["src/main/resources", "src/main/c/resources"] - includes = ["**/*.so","**/*.dll", "**/*.jnilib","**/*.properties"] + srcDirs = ['src/main/resources', 'src/main/c/resources'] + includes = ['**/*.so','**/*.dll', '**/*.jnilib', '**/*.properties'] } } } From bcb006334db3d9ce4a71532024fe0558c3306ef2 Mon Sep 17 00:00:00 2001 From: Samuel Coleman Date: Tue, 5 Sep 2023 13:57:38 +0100 Subject: [PATCH 20/20] Gradle: add Sam to the POM's developer list. --- build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.gradle b/build.gradle index 50e285a..7994d5c 100644 --- a/build.gradle +++ b/build.gradle @@ -198,6 +198,11 @@ publishing { name = 'Kevin Harrington' email = 'kharrington@neuronrobotics.com' } + developer { + id = 'MrDOS' + name = 'Samuel Coleman' + email = 'samuel@seenet.ca' + } } } }