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
3 changes: 3 additions & 0 deletions .Rbuildignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,6 @@
^src/SyntaxInterface\.provenance$
^src/syntaxbridge_interface\.h$
^src/json$
^tests/figs/\.gitkeep$
^tests/testthat/\.gitkeep$
^tests/testthat/fixtures/minimalModule/inst/icons/\.gitkeep$
12 changes: 11 additions & 1 deletion .github/workflows/build-syntaxinterface.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,14 @@ jobs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- id: set-matrix
# when updating windows-2022 to windows-latest (2026 as if writing) make sure to change "2022" in the steps below
run: |
ALL='{"include":[
{"os":"ubuntu-latest", "arch":"x86_64","artifact":"libSyntaxInterface-linux-x86_64.so", "lib_file":"libSyntaxInterface.so"},
{"os":"ubuntu-24.04-arm", "arch":"arm64", "artifact":"libSyntaxInterface-linux-arm64.so", "lib_file":"libSyntaxInterface.so"},
{"os":"macos-15-intel", "arch":"x86_64","artifact":"libSyntaxInterface-darwin-x86_64.dylib", "lib_file":"libSyntaxInterface.dylib"},
{"os":"macos-15", "arch":"arm64", "artifact":"libSyntaxInterface-darwin-arm64.dylib", "lib_file":"libSyntaxInterface.dylib"},
{"os":"windows-latest", "arch":"x86_64","artifact":"SyntaxInterface-windows-x86_64.dll", "lib_file":"SyntaxInterface.dll"}
{"os":"windows-2022", "arch":"x86_64","artifact":"SyntaxInterface-windows-x86_64.dll", "lib_file":"SyntaxInterface.dll"}
]}'
FILTER='${{ github.event.inputs.os_filter }}'
if [ -z "$FILTER" ]; then
Expand Down Expand Up @@ -150,6 +151,15 @@ jobs:
copy C:\rtools45\ucrt64\bin\make.exe C:\rtools45\ucrt64\bin\mingw32-make.exe
)
)
echo C:\rtools45\ucrt64\bin>>"%GITHUB_PATH%"

- name: Test Rtools45 ucrt64 compiler (Windows)
if: runner.os == 'Windows'
shell: cmd
run: |
echo int main(void) { return 0; } > "%RUNNER_TEMP%\test.c"
gcc "%RUNNER_TEMP%\test.c" -o "%RUNNER_TEMP%\test.exe"
"%RUNNER_TEMP%\test.exe"

# ---- Install Qt from source and build static ----

Expand Down
50 changes: 50 additions & 0 deletions .github/workflows/rcmdcheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
on:
push:
paths: ['**.R', '**.svg', '**.Rd', 'DESCRIPTION', 'NAMESPACE', '.github/workflows/rcmdcheck.yml']
branches:
- master
pull_request:
paths: ['**.R', '**.svg', '**.Rd', 'DESCRIPTION', 'NAMESPACE', '.github/workflows/rcmdcheck.yml']
branches:
- master

permissions:
contents: read

jobs:
R-CMD-check:
runs-on: ${{ matrix.config.os }}

name: ${{ matrix.config.os }} (${{ matrix.config.r }})

strategy:
fail-fast: false
matrix:
config: # current jasp version, latest r-release, and development
- {os: windows-latest, r: '4.5.2'}
- {os: macOS-latest, r: '4.5.2'}
- {os: ubuntu-latest, r: '4.5.2'}
- {os: ubuntu-latest, r: 'release'}

env:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
R_KEEP_PKG_SOURCE: yes

steps:
- uses: actions/checkout@v2

# adapted from https://github.com/r-lib/actions/blob/v2/examples/check-standard.yaml
- uses: r-lib/actions/setup-pandoc@v2

- uses: r-lib/actions/setup-r@v2
with:
r-version: ${{ matrix.config.r }}
http-user-agent: ${{ matrix.config.http-user-agent }}
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v2
with:
extra-packages: any::rcmdcheck
needs: check

- uses: r-lib/actions/check-r-package@v2
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
4 changes: 2 additions & 2 deletions DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ Author: JASP Team
Website: jasp-stats.org
Maintainer: JASP Team <info@jasp-stats.org>
Description: Exposes the native JASP SyntaxInterface bridge to R so package code can parse module descriptions, replay QML option binding, load datasets, and read saved .jasp files using the same runtime preparation path as JASP Desktop.
License: GPL (>= 2)
License: GPL-3 + file LICENSE
Encoding: UTF-8
URL: https://github.com/jasp-stats/jaspSyntax
BugReports: https://github.com/jasp-stats/jaspSyntax/issues
SystemRequirements: libcurl or wget (for downloading the SyntaxInterface library during installation)
SystemRequirements: libcurl or wget (for downloading the SyntaxInterface library during installation), OpenGL (libglvnd; provides libOpenGL.so.0)
Imports:
callr,
jsonlite,
Expand Down
100 changes: 48 additions & 52 deletions configure
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/sh
# To manually specify a location for JASP_BUILD_DIR or JASP_SOURCE_DIR do
#
# options(configure.vars = c(jaspSyntax = "JASP_SOURCE_DIR='<path>'"))
Expand All @@ -9,7 +9,7 @@ set -e
# ---------- GitHub Release configuration ----------
# Pre-built binaries are hosted as GitHub Release assets.
# The build-syntaxinterface.yml workflow produces these.
GITHUB_RELEASE_TAG="${JASPSYNTAX_RELEASE_TAG:-v0.97.0}"
GITHUB_RELEASE_TAG="${JASPSYNTAX_RELEASE_TAG:-v0.97.1}"
GITHUB_RELEASE_REPO="${JASPSYNTAX_RELEASE_REPO:-jasp-stats/jaspSyntax}"
GITHUB_RELEASE_URL="https://github.com/${GITHUB_RELEASE_REPO}/releases/download/${GITHUB_RELEASE_TAG}"
SOURCE_BUNDLE_ASSET="SyntaxInterface-sources.tar.gz"
Expand All @@ -19,45 +19,45 @@ SOURCE_BUNDLE_JASP_DESKTOP_SHA=""
SOURCE_BUNDLE_JASP_SYNTAX_SHA=""
SOURCE_BUNDLE_QT_VERSION=""

function sourceBundleProvenanceValue() {
local FILE_PATH="$1"
local KEY="$2"
sourceBundleProvenanceValue() {
_sbpv_path="$1"
_sbpv_key="$2"

if [ -f "${FILE_PATH}" ]; then
grep -E "^${KEY}=" "${FILE_PATH}" | head -n 1 | sed -E 's/^[^=]+=//'
if [ -f "${_sbpv_path}" ]; then
grep -E "^${_sbpv_key}=" "${_sbpv_path}" | head -n 1 | sed 's/^[^=][^=]*=//'
fi
}


function downloadFile() {
downloadFile() {
# downloadFile <url> <output_path>
# Downloads a file using curl or wget. Exits on failure.
local URL="$1"
local OUTPUT="$2"
local DOWNLOAD_SUCCESS=1
_dl_url="$1"
_dl_output="$2"
_dl_success=1

if command -v curl >/dev/null 2>&1; then
echo "Downloading ${URL}"
curl --fail --silent --location --output "${OUTPUT}" "${URL}"
DOWNLOAD_SUCCESS=$?
echo "Downloading ${_dl_url}"
curl --fail --silent --location --output "${_dl_output}" "${_dl_url}"
_dl_success=$?
fi

if [ "${DOWNLOAD_SUCCESS}" -ne "0" ]; then
if [ "${_dl_success}" -ne "0" ]; then
if command -v wget >/dev/null 2>&1; then
echo "Trying wget for ${URL}"
wget --quiet -O "${OUTPUT}" "${URL}"
DOWNLOAD_SUCCESS=$?
echo "Trying wget for ${_dl_url}"
wget --quiet -O "${_dl_output}" "${_dl_url}"
_dl_success=$?
fi
fi

if [ "${DOWNLOAD_SUCCESS}" -ne "0" ]; then
echo "Failed to download: ${URL}"
if [ "${_dl_success}" -ne "0" ]; then
echo "Failed to download: ${_dl_url}"
return 1
fi
return 0
}

function loadFile() {
loadFile() {
# loadFile <base_url> <filename>
# Downloads <base_url>/<filename> into src/<filename>.
if ! downloadFile "$1/$2" "src/$2"; then
Expand All @@ -68,40 +68,40 @@ Either download from \"https://github.com/jasp-stats/jasp-desktop/\" manually an
fi
}

function loadReleaseSourceBundle() {
local ARCHIVE_PATH="src/${SOURCE_BUNDLE_ASSET}"
local EXTRACT_DIR="src/.SyntaxInterface-sources"
local FILE_NAME
loadReleaseSourceBundle() {
_lrsb_archive="src/${SOURCE_BUNDLE_ASSET}"
_lrsb_extract="src/.SyntaxInterface-sources"
_lrsb_fname=""

if ! downloadFile "${GITHUB_RELEASE_URL}/${SOURCE_BUNDLE_ASSET}" "${ARCHIVE_PATH}"; then
if ! downloadFile "${GITHUB_RELEASE_URL}/${SOURCE_BUNDLE_ASSET}" "${_lrsb_archive}"; then
printf "Installing jaspSyntax failed because the SyntaxInterface source bundle is missing from release %s.\n\
Set JASP_SOURCE_DIR to a matching jasp-desktop checkout, or publish %s together with the SyntaxInterface binaries.\n" "${GITHUB_RELEASE_TAG}" "${SOURCE_BUNDLE_ASSET}"
exit 1
fi

rm -rf "${EXTRACT_DIR}"
mkdir -p "${EXTRACT_DIR}" "src/json"
tar -xzf "${ARCHIVE_PATH}" -C "${EXTRACT_DIR}"
rm -rf "${_lrsb_extract}"
mkdir -p "${_lrsb_extract}" "src/json"
tar -xzf "${_lrsb_archive}" -C "${_lrsb_extract}"

if [ ! -f "${EXTRACT_DIR}/SyntaxInterface/syntaxbridge_interface.h" ]; then
if [ ! -f "${_lrsb_extract}/SyntaxInterface/syntaxbridge_interface.h" ]; then
echo "Installing jaspSyntax failed because ${SOURCE_BUNDLE_ASSET} does not contain SyntaxInterface/syntaxbridge_interface.h"
exit 1
fi

cp "${EXTRACT_DIR}/SyntaxInterface/syntaxbridge_interface.h" "${SYNTAXINTERFACE_HEADER_PATH}"
for FILE_NAME in ${JSON_FILES}; do
cp "${EXTRACT_DIR}/Common/json/${FILE_NAME}" "src/json/${FILE_NAME}"
cp "${_lrsb_extract}/SyntaxInterface/syntaxbridge_interface.h" "${SYNTAXINTERFACE_HEADER_PATH}"
for _lrsb_fname in ${JSON_FILES}; do
cp "${_lrsb_extract}/Common/json/${_lrsb_fname}" "src/json/${_lrsb_fname}"
done

if [ -f "${EXTRACT_DIR}/BUILD_PROVENANCE" ]; then
if [ -f "${_lrsb_extract}/BUILD_PROVENANCE" ]; then
SOURCE_BUNDLE_PROVENANCE_ORIGIN="${GITHUB_RELEASE_URL}/${SOURCE_BUNDLE_ASSET}:BUILD_PROVENANCE"
SOURCE_BUNDLE_JASP_DESKTOP_REF=$(sourceBundleProvenanceValue "${EXTRACT_DIR}/BUILD_PROVENANCE" "jasp_desktop_ref")
SOURCE_BUNDLE_JASP_DESKTOP_SHA=$(sourceBundleProvenanceValue "${EXTRACT_DIR}/BUILD_PROVENANCE" "jasp_desktop_sha")
SOURCE_BUNDLE_JASP_SYNTAX_SHA=$(sourceBundleProvenanceValue "${EXTRACT_DIR}/BUILD_PROVENANCE" "jasp_syntax_sha")
SOURCE_BUNDLE_QT_VERSION=$(sourceBundleProvenanceValue "${EXTRACT_DIR}/BUILD_PROVENANCE" "qt_version")
SOURCE_BUNDLE_JASP_DESKTOP_REF=$(sourceBundleProvenanceValue "${_lrsb_extract}/BUILD_PROVENANCE" "jasp_desktop_ref")
SOURCE_BUNDLE_JASP_DESKTOP_SHA=$(sourceBundleProvenanceValue "${_lrsb_extract}/BUILD_PROVENANCE" "jasp_desktop_sha")
SOURCE_BUNDLE_JASP_SYNTAX_SHA=$(sourceBundleProvenanceValue "${_lrsb_extract}/BUILD_PROVENANCE" "jasp_syntax_sha")
SOURCE_BUNDLE_QT_VERSION=$(sourceBundleProvenanceValue "${_lrsb_extract}/BUILD_PROVENANCE" "qt_version")
fi

rm -rf "${EXTRACT_DIR}" "${ARCHIVE_PATH}"
rm -rf "${_lrsb_extract}" "${_lrsb_archive}"
SYNTAXINTERFACE_HEADER_ORIGIN="${GITHUB_RELEASE_URL}/${SOURCE_BUNDLE_ASSET}:SyntaxInterface/syntaxbridge_interface.h"
}

Expand Down Expand Up @@ -154,21 +154,21 @@ SYNTAXINTERFACE_HEADER_ORIGIN=""
SYNTAXINTERFACE_BINARY_PATH="src/${DLL_NAME}"
SYNTAXINTERFACE_BINARY_ORIGIN=""

function fileSha256() {
local FILE_PATH="$1"
fileSha256() {
_fs_path="$1"

if [ ! -f "${FILE_PATH}" ]; then
if [ ! -f "${_fs_path}" ]; then
echo "unavailable"
elif command -v sha256sum >/dev/null 2>&1; then
sha256sum "${FILE_PATH}" | awk '{print $1}'
sha256sum "${_fs_path}" | awk '{print $1}'
elif command -v shasum >/dev/null 2>&1; then
shasum -a 256 "${FILE_PATH}" | awk '{print $1}'
shasum -a 256 "${_fs_path}" | awk '{print $1}'
else
echo "unavailable"
fi
}

function writeSyntaxInterfaceProvenance() {
writeSyntaxInterfaceProvenance() {
if [ -z "${SYNTAXINTERFACE_HEADER_ORIGIN}" ]; then
SYNTAXINTERFACE_HEADER_ORIGIN="local:${SYNTAXINTERFACE_HEADER_PATH}"
fi
Expand Down Expand Up @@ -205,7 +205,7 @@ EOF

JSON_FILES="allocator.h assertions.h config.h forwards.h json.h json_features.h json_reader.cpp json_tool.h json_value.cpp json_valueiterator.inl json_writer.cpp reader.h value.h version.h writer.h"

if [[ "${JASP_SOURCE_DIR}" ]]; then
if [ -n "${JASP_SOURCE_DIR}" ]; then
echo "JASP_SOURCE_DIR: ${JASP_SOURCE_DIR}"
PKG_CXXFLAGS="-I\"${JASP_SOURCE_DIR}/SyntaxInterface\" -I\"${JASP_SOURCE_DIR}/Common\""
mkdir -p 'src/json'
Expand All @@ -230,11 +230,11 @@ fi

# ---------- Download pre-built library if needed ----------

if [[ "${JASPSYNTAX_LIB_PATH}" ]]; then
if [ -n "${JASPSYNTAX_LIB_PATH}" ]; then
echo "Using JASPSYNTAX_LIB_PATH: ${JASPSYNTAX_LIB_PATH}"
SYNTAXINTERFACE_BINARY_ORIGIN="${JASPSYNTAX_LIB_PATH}"
cp "${JASPSYNTAX_LIB_PATH}" "src/${DLL_NAME}"
elif [[ "${JASP_BUILD_DIR}" ]]; then
elif [ -n "${JASP_BUILD_DIR}" ]; then
echo "JASP_BUILD_DIR: ${JASP_BUILD_DIR}"
SYNTAXINTERFACE_BINARY_ORIGIN="${JASP_BUILD_DIR}/SyntaxInterface/${DLL_NAME}"
cp "${SYNTAXINTERFACE_BINARY_ORIGIN}" "src/${DLL_NAME}"
Expand Down Expand Up @@ -294,10 +294,6 @@ SYNTAXINTERFACE_HEADER_ORIGIN="${SYNTAXINTERFACE_HEADER_ORIGIN}" \
SYNTAXINTERFACE_BINARY_ORIGIN="${SYNTAXINTERFACE_BINARY_ORIGIN}" \
"${BASH:-bash}" tools/check-syntaxinterface-symbols.sh "${SYNTAXINTERFACE_HEADER_PATH}" "${SYNTAXINTERFACE_BINARY_PATH}" "src/syntaxfunctions.cpp"

mkdir -p inst/libs
cp "src/${DLL_NAME}" "inst/libs/${DLL_NAME}"
cp "src/SyntaxInterface.provenance" "inst/libs/SyntaxInterface.provenance"

PKG_LIBS=-lSyntaxInterface

# Set platform-specific RPATH so jaspSyntax.so can find libSyntaxInterface at runtime
Expand Down
Loading
Loading