Skip to content
Draft
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
169 changes: 79 additions & 90 deletions .github/actions/setup-jextract/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: 'Setup jextract'
description: 'Install jextract for FFM binding generation across all platforms'
inputs:
java-version:
description: 'Java version for jextract (24, 25, latest)'
description: 'Java version for jextract (25)'
required: false
default: '25'

Expand All @@ -21,47 +21,45 @@ runs:
id: setup-jextract-unix
if: runner.os != 'Windows'
shell: bash
env:
INPUT_JAVA_VERSION: ${{ inputs.java-version }}
run: |
echo "Installing jextract for $RUNNER_OS..."
echo "Installing jextract 25 for $RUNNER_OS..."

if [[ "$INPUT_JAVA_VERSION" != "25" ]]; then
echo "ERROR: Only jextract 25 is supported (requested: $INPUT_JAVA_VERSION)"
exit 1
fi

# Determine platform
if [[ "$RUNNER_OS" == "macOS" ]]; then
PLATFORM="macos-x64"
if [[ "$(uname -m)" == "arm64" ]]; then
PLATFORM="macos-aarch64"
else
PLATFORM="macos-x64"
fi
elif [[ "$(uname -m)" == "aarch64" ]]; then
PLATFORM="linux-aarch64"
else
PLATFORM="linux-x64"
fi

# Try different jextract versions (from latest to older)
# Check https://jdk.java.net/jextract/ for available builds
JEXTRACT_URLS=(
"https://download.java.net/java/early_access/jextract/22/6/openjdk-22-jextract+6-47_${PLATFORM}_bin.tar.gz"
"https://download.java.net/java/early_access/jextract/21/5/openjdk-21-jextract+5-31_${PLATFORM}_bin.tar.gz"
"https://download.java.net/java/early_access/jextract/20/1/openjdk-20-jextract+1-2_${PLATFORM}_bin.tar.gz"
)
# Use fixed jextract 25 version
JEXTRACT_URL="https://download.java.net/java/early_access/jextract/25/2/openjdk-25-jextract+2-4_${PLATFORM}_bin.tar.gz"
echo "Downloading jextract 25 from: $JEXTRACT_URL"

mkdir -p $HOME/jextract
cd $HOME/jextract

SUCCESS=false
for URL in "${JEXTRACT_URLS[@]}"; do
echo "Trying to download from: $URL"
if curl -L -f -o jextract.tar.gz "$URL" 2>/dev/null; then
echo "✓ Download successful from $URL"
tar -xzf jextract.tar.gz --strip-components=1
rm jextract.tar.gz
SUCCESS=true
break
else
echo "✗ Failed to download from $URL, trying next..."
fi
done

if [ "$SUCCESS" = false ]; then
echo "ERROR: Failed to download jextract from any known source"
echo "Please check https://jdk.java.net/jextract/ for available builds"
if ! curl -L -f -o jextract.tar.gz "$JEXTRACT_URL"; then
echo "ERROR: Failed to download jextract 25 from $JEXTRACT_URL"
echo "See https://jdk.java.net/jextract/25/ for available builds"
exit 1
fi

tar -xzf jextract.tar.gz --strip-components=1
rm jextract.tar.gz

# Set outputs
echo "jextract-home=$HOME/jextract" >> $GITHUB_OUTPUT

Expand All @@ -70,6 +68,10 @@ runs:
VERSION=$($HOME/jextract/bin/jextract --version 2>&1 | head -1 || echo "unknown")
echo "jextract-version=$VERSION" >> $GITHUB_OUTPUT
echo "✓ jextract installed successfully: $VERSION"
if [[ "$VERSION" != jextract\ 25* ]]; then
echo "ERROR: Expected jextract 25, got: $VERSION"
exit 1
fi
else
echo "jextract-version=unknown" >> $GITHUB_OUTPUT
echo "✓ jextract installed (version check not supported)"
Expand All @@ -79,84 +81,71 @@ runs:
id: setup-jextract-windows
if: runner.os == 'Windows'
shell: pwsh
env:
INPUT_JAVA_VERSION: ${{ inputs.java-version }}
run: |
Write-Host "Installing jextract for Windows..."
Write-Host "Installing jextract 25 for Windows..."

if ($env:INPUT_JAVA_VERSION -ne "25") {
Write-Host "ERROR: Only jextract 25 is supported (requested: $env:INPUT_JAVA_VERSION)"
exit 1
}

# Try multiple jextract versions (latest to older)
# Windows now uses .tar.gz format
$JextractUrls = @(
"https://download.java.net/java/early_access/jextract/22/6/openjdk-22-jextract+6-47_windows-x64_bin.tar.gz",
"https://download.java.net/java/early_access/jextract/21/5/openjdk-21-jextract+5-31_windows-x64_bin.tar.gz",
"https://download.java.net/java/early_access/jextract/20/1/openjdk-20-jextract+1-2_windows-x64_bin.tar.gz"
)
# Use fixed jextract 25 version
$JextractUrl = "https://download.java.net/java/early_access/jextract/25/2/openjdk-25-jextract+2-4_windows-x64_bin.tar.gz"
Write-Host "Downloading jextract 25 from: $JextractUrl"

$JextractHome = "$env:USERPROFILE\jextract"
New-Item -ItemType Directory -Force -Path $JextractHome | Out-Null
$TarPath = "$JextractHome\jextract.tar.gz"

$Success = $false
foreach ($Url in $JextractUrls) {
Write-Host "Trying to download from: $Url"
$TarPath = "$JextractHome\jextract.tar.gz"

try {
Invoke-WebRequest -Uri $Url -OutFile $TarPath -ErrorAction Stop
Write-Host "✓ Download successful from $Url"

# Extract using tar (available in Windows 10+)
$TempExtract = "$JextractHome\temp"
New-Item -ItemType Directory -Force -Path $TempExtract | Out-Null
tar -xzf "$TarPath" -C "$TempExtract" 2>&1 | Out-Null

# Find jextract.bat
$JextractBat = Get-ChildItem -Path $TempExtract -Filter "jextract.bat" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1

if ($JextractBat) {
Write-Host "Found jextract.bat at: $($JextractBat.FullName)"

# Move contents to JextractHome
$JextractRoot = $JextractBat.Directory.Parent.FullName
Get-ChildItem -Path $JextractRoot | ForEach-Object {
Move-Item -Path $_.FullName -Destination $JextractHome -Force
}

# Clean up
Remove-Item -Path $TempExtract -Recurse -Force
Remove-Item -Path $TarPath -Force

# Verify
if (Test-Path "$JextractHome\bin\jextract.bat") {
Write-Host "✓ jextract extracted successfully to $JextractHome"
$Success = $true
break
}
} else {
Write-Host "✗ Could not find jextract.bat in extracted files"
Remove-Item -Path $TempExtract -Recurse -Force -ErrorAction SilentlyContinue
}
}
catch {
Write-Host "✗ Failed to download or extract from $Url"
Write-Host "Error: $_"
}
try {
Invoke-WebRequest -Uri $JextractUrl -OutFile $TarPath -ErrorAction Stop
}
catch {
Write-Host "ERROR: Failed to download jextract 25 from $JextractUrl"
Write-Host "See https://jdk.java.net/jextract/25/ for available builds"
Write-Host "Error: $_"
exit 1
}

# Extract using tar (available in Windows 10+)
$TempExtract = "$JextractHome\temp"
New-Item -ItemType Directory -Force -Path $TempExtract | Out-Null
tar -xzf "$TarPath" -C "$TempExtract" 2>&1 | Out-Null

# Find jextract.bat
$JextractBat = Get-ChildItem -Path $TempExtract -Filter "jextract.bat" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1
if (-not $JextractBat) {
Write-Host "ERROR: jextract.bat not found in downloaded jextract 25 archive"
exit 1
}

$JextractRoot = $JextractBat.Directory.Parent.FullName
Get-ChildItem -Path $JextractRoot | ForEach-Object {
Move-Item -Path $_.FullName -Destination $JextractHome -Force
}

if (-not $Success) {
Write-Host "ERROR: Failed to download jextract from any known source"
Write-Host "Please check https://jdk.java.net/jextract/ for available builds"
# Clean up
Remove-Item -Path $TempExtract -Recurse -Force
Remove-Item -Path $TarPath -Force

# Verify
if (-not (Test-Path "$JextractHome\bin\jextract.bat")) {
Write-Host "ERROR: jextract 25 install incomplete (missing bin\jextract.bat)"
exit 1
}

# Set outputs
echo "jextract-home=$JextractHome" >> $env:GITHUB_OUTPUT

# Verify installation
try {
$Version = & "$JextractHome\bin\jextract.bat" --version 2>&1 | Select-Object -First 1
echo "jextract-version=$Version" >> $env:GITHUB_OUTPUT
Write-Host "✓ jextract installed successfully: $Version"
} catch {
echo "jextract-version=unknown" >> $env:GITHUB_OUTPUT
Write-Host "✓ jextract installed (version check not supported)"
$Version = & "$JextractHome\bin\jextract.bat" --version 2>&1 | Select-Object -First 1
echo "jextract-version=$Version" >> $env:GITHUB_OUTPUT
Write-Host "✓ jextract installed successfully: $Version"
if ($Version -notlike "jextract 25*") {
Write-Host "ERROR: Expected jextract 25, got: $Version"
exit 1
}

- name: Set environment variables
Expand Down
Loading