Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
313 changes: 288 additions & 25 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,37 +1,300 @@
name: Build & Publish

on:
- push
push:
release:
types: [published]
workflow_dispatch:

permissions:
contents: read

env:
JAVA_VERSION: '20'

jobs:
build:
strategy:
matrix:
os: [{name: ubuntu, version: ubuntu-20.04}, {name: macos, version: macos-latest}, {name: windows, version: windows-latest}]
#arch: [arm32, arm64, x86, x64]
fail-fast: false
# ============================================
# Build native libraries for each platform
# ============================================

build-linux-x64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'temurin'
- name: Build native library
run: |
mkdir -p build/natives/linux-x64
gcc -Wall -O2 -DNDEBUG -fPIC -shared \
-I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" \
-o build/natives/linux-x64/libjthreadmagic.so \
jthreadmagic.c
- name: Run tests
run: |
mkdir -p build/classes
javac -d build/classes \
src/main/java/rip/mem/jthreadmagic/JThreadMagic.java \
src/test/java/rip/mem/jthreadmagic/JThreadMagicTest.java
java -Djava.library.path=build/natives/linux-x64 \
-cp build/classes rip.mem.jthreadmagic.JThreadMagicTest
- uses: actions/upload-artifact@v4
with:
name: native-linux-x64
path: build/natives/

build-linux-x86:
# Note: Tests skipped - would require 32-bit JVM which is not readily available
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup JDK 8
uses: actions/setup-java@v4
- uses: actions/checkout@v4
- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'temurin'
- name: Install 32-bit toolchain
run: |
sudo apt-get update
sudo apt-get install -y gcc-multilib
- name: Build native library
run: |
mkdir -p build/natives/linux-x86
gcc -m32 -Wall -O2 -DNDEBUG -fPIC -shared \
-I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" \
-o build/natives/linux-x86/libjthreadmagic.so \
jthreadmagic.c
- uses: actions/upload-artifact@v4
with:
name: native-linux-x86
path: build/natives/

build-linux-arm64:
runs-on: ubuntu-24.04-arm
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'temurin'
- name: Build native library
run: |
mkdir -p build/natives/linux-arm64
gcc -Wall -O2 -DNDEBUG -fPIC -shared \
-I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" \
-o build/natives/linux-arm64/libjthreadmagic.so \
jthreadmagic.c
- name: Run tests
run: |
mkdir -p build/classes
javac -d build/classes \
src/main/java/rip/mem/jthreadmagic/JThreadMagic.java \
src/test/java/rip/mem/jthreadmagic/JThreadMagicTest.java
java -Djava.library.path=build/natives/linux-arm64 \
-cp build/classes rip.mem.jthreadmagic.JThreadMagicTest
- uses: actions/upload-artifact@v4
with:
name: native-linux-arm64
path: build/natives/

build-windows-x64:
runs-on: windows-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'temurin'
- uses: ilammy/msvc-dev-cmd@v1
with:
arch: x64
- name: Build native library
shell: cmd
run: |
mkdir build\natives\windows-x64
cl /nologo /O2 /W3 /GL /LD /DNDEBUG ^
/I "%JAVA_HOME%\include" /I "%JAVA_HOME%\include\win32" ^
/Fe"build\natives\windows-x64\jthreadmagic.dll" ^
jthreadmagic.c
del build\natives\windows-x64\*.exp build\natives\windows-x64\*.lib
- name: Run tests
shell: cmd
run: |
mkdir build\classes
javac -d build\classes ^
src\main\java\rip\mem\jthreadmagic\JThreadMagic.java ^
src\test\java\rip\mem\jthreadmagic\JThreadMagicTest.java
java -Djava.library.path=build\natives\windows-x64 ^
-cp build\classes rip.mem.jthreadmagic.JThreadMagicTest
- uses: actions/upload-artifact@v4
with:
name: native-windows-x64
path: build/natives/

build-windows-x86:
# Note: Tests skipped - would require 32-bit JVM which is not readily available
runs-on: windows-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
java-version: '8'
java-version: ${{ env.JAVA_VERSION }}
distribution: 'temurin'
java-package: 'jdk'
# TODO: use old distributions
# TODO: build ubuntu arm, build windows
- name: Build (temp ubuntu)
if: ${{ matrix.os.name == 'ubuntu' }}
- uses: ilammy/msvc-dev-cmd@v1
with:
arch: x86
- name: Build native library
shell: cmd
run: |
mkdir build\natives\windows-x86
cl /nologo /O2 /W3 /GL /LD /DNDEBUG ^
/I "%JAVA_HOME%\include" /I "%JAVA_HOME%\include\win32" ^
/Fe"build\natives\windows-x86\jthreadmagic.dll" ^
jthreadmagic.c
del build\natives\windows-x86\*.exp build\natives\windows-x86\*.lib
- uses: actions/upload-artifact@v4
with:
name: native-windows-x86
path: build/natives/

build-windows-arm64:
runs-on: windows-11-arm
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'zulu'
- uses: ilammy/msvc-dev-cmd@v1
with:
arch: arm64
- name: Build native library
shell: cmd
run: |
make MYCFLAGS="-m32" TARGET="libjthreadmagic_x86.so"
make MYCFLAGS="-m64" TARGET="libjthreadmagic_x64.so"
#- name: Build (temp windows)
# if: ${{ matrix.os.name == 'windows' }}
- name: Build (temp macos)
if: ${{ matrix.os.name == 'macos' }}
run: make MYCFLAGS="-arch arm64 -arch x86_64" TARGET="libjthreadmagic.dylib"
mkdir build\natives\windows-arm64
cl /nologo /O2 /W3 /GL /LD /DNDEBUG ^
/I "%JAVA_HOME%\include" /I "%JAVA_HOME%\include\win32" ^
/Fe"build\natives\windows-arm64\jthreadmagic.dll" ^
jthreadmagic.c
del build\natives\windows-arm64\*.exp build\natives\windows-arm64\*.lib
- name: Run tests
shell: cmd
run: |
mkdir build\classes
javac -d build\classes ^
src\main\java\rip\mem\jthreadmagic\JThreadMagic.java ^
src\test\java\rip\mem\jthreadmagic\JThreadMagicTest.java
java -Djava.library.path=build\natives\windows-arm64 ^
-cp build\classes rip.mem.jthreadmagic.JThreadMagicTest
- uses: actions/upload-artifact@v4
with:
name: native-windows-arm64
path: build/natives/

# build java, build native, test, release
build-macos:
runs-on: macos-14
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'temurin'
- name: Build universal native library
run: |
mkdir -p build/natives/macos
clang -arch x86_64 -arch arm64 -Wall -O2 -DNDEBUG -fPIC -dynamiclib \
-I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" \
-o build/natives/macos/libjthreadmagic.dylib \
jthreadmagic.c
- name: Run tests
run: |
mkdir -p build/classes
javac -d build/classes \
src/main/java/rip/mem/jthreadmagic/JThreadMagic.java \
src/test/java/rip/mem/jthreadmagic/JThreadMagicTest.java
java -Djava.library.path=build/natives/macos \
-cp build/classes rip.mem.jthreadmagic.JThreadMagicTest
- uses: actions/upload-artifact@v4
with:
name: native-macos
path: build/natives/

# ============================================
# Package everything into JAR and publish
# ============================================

package:
needs:
- build-linux-x64
- build-linux-x86
- build-linux-arm64
- build-windows-x64
- build-windows-x86
- build-windows-arm64
- build-macos
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'temurin'

- name: Download all native artifacts
uses: actions/download-artifact@v4
with:
path: build/natives
pattern: native-*
merge-multiple: true

- name: Show downloaded natives
run: find build/natives -type f

- name: Build with Maven
run: mvn -B package -DskipTests

- name: Upload JAR artifact
uses: actions/upload-artifact@v4
with:
name: jthreadmagic-jar
path: target/jthreadmagic-*.jar

publish:
if: github.event_name == 'release'
needs: package
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- name: Set up Java for publishing
uses: actions/setup-java@v5
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'temurin'
server-id: central
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
gpg-passphrase: ${{ secrets.GPG_PASSPHRASE }}

- name: Download all native artifacts
uses: actions/download-artifact@v4
with:
path: build/natives
pattern: native-*
merge-multiple: true

- name: Publish to Maven Central
run: |
# Set version from tag (assuming tag is v1.2.3)
VERSION=${GITHUB_REF#refs/tags/}
# Remove 'v' prefix if present
VERSION=${VERSION#v}
mvn -B versions:set -DnewVersion=$VERSION
mvn -B deploy -P release -Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }}
env:
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.OSSRH_TOKEN }}
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
21 changes: 20 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,23 @@ dkms.conf

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
replay_pid*

###
### Build
###

build/
target/
out/

###
### IDE
###

.idea/
*.iml
.vscode/
.settings/
.project
.classpath
Loading