diff --git a/.crow/build.yaml b/.crow/build.yaml index 804828a..6ea1145 100644 --- a/.crow/build.yaml +++ b/.crow/build.yaml @@ -82,7 +82,7 @@ matrix: steps: # Ensures that we're always using the latest available upstream build chain # - name: Pull upstream - # image: reg.devxy.io/proxy_cache/library/alpine:3.20 + # image: alpine:3.20 # commands: # - apk add -q --no-cache git # - git remote add upstream https://github.com/cynkra/r-builds.git @@ -94,11 +94,11 @@ steps: #. - name: Get latest R version - image: reg.devxy.io/proxy_cache/library/alpine:3.22 + image: alpine:3.22 commands: - apk add -q --no-cache curl - curl -s https://raw.githubusercontent.com/Homebrew/homebrew-core/master/Formula/r/r.rb | grep -o 'R-[0-9]*\.[0-9]*\.[0-9]*' | tr -d 'R-' | tr -d '"' | head -n 1 > r-version-to-build.txt - # - echo "4.1.3" > r-version-to-build.txt + - echo "4.1.3" > r-version-to-build.txt - cat r-version-to-build.txt backend_options: kubernetes: @@ -125,7 +125,7 @@ steps: AWS_SECRET_ACCESS_KEY: from_secret: HETZNER_S3_SECRET_KEY_K3S AWS_ENDPOINT_URL: https://fsn1.your-objectstorage.com - image: reg.devxy.io/proxy_cache/library/alpine:3.22 + image: alpine:3.22 commands: - apk add -q --no-cache aws-cli - | @@ -147,7 +147,7 @@ steps: # ref: https://github.com/woodpecker-ci/woodpecker/discussions/2721 - name: Build - image: reg.devxy.io/proxy_cache/library/alpine:3.22 + image: alpine:3.22 privileged: true environment: DOCKER_HOST: tcp://docker:2375 @@ -177,7 +177,7 @@ steps: effect: "NoSchedule" - name: Upload to Hetzner S3 - image: reg.devxy.io/proxy_cache/woodpeckerci/plugin-s3:1.5.2 + image: woodpeckerci/plugin-s3:1.3.0 pull: true settings: bucket: devxy-r-builds @@ -217,7 +217,7 @@ services: docker: environment: DOCKER_TLS_CERTDIR: "" - image: reg.devxy.io/proxy_cache/library/docker:28-dind + image: docker:28-dind commands: - mkdir -p /tmp/${PLATFORM}/${ARCH} - dockerd --tls=false --mtu 1420 --host=tcp://0.0.0.0:2375 diff --git a/builder/Dockerfile.rhel-10 b/builder/Dockerfile.rhel-10 index a44bf56..53da514 100644 --- a/builder/Dockerfile.rhel-10 +++ b/builder/Dockerfile.rhel-10 @@ -1,4 +1,4 @@ -FROM rockylinux/rockylinux:10 +FROM almalinux:10 ENV OS_IDENTIFIER rhel-10 @@ -59,9 +59,7 @@ RUN curl -LO "https://github.com/goreleaser/nfpm/releases/download/v2.18.1/nfpm_ RUN chmod 0777 /opt -# Configure flags for RHEL 10 that don't use the defaults in build.sh -# Since RHEL 9 with the R 4.3.0 release, RHEL/Fedora now uses FlexiBLAS as the -# default BLAS/LAPACK, which provides a native BLAS switching mechanism and matches EPEL. +# Configure flags for RHEL 9 that don't use the defaults in build.sh ENV CONFIGURE_OPTIONS="\ --enable-R-shlib \ --with-tcltk \ @@ -70,25 +68,26 @@ ENV CONFIGURE_OPTIONS="\ --with-system-valgrind-headers \ --with-tcl-config=/usr/lib64/tclConfig.sh \ --with-tk-config=/usr/lib64/tkConfig.sh \ - --enable-prebuilt-html \ - --with-blas=flexiblas \ - --with-lapack=flexiblas" + --enable-prebuilt-html" -# RHEL 10 doesn't have the inconsolata font, so override the defaults. +# RHEL 9 doesn't have the inconsolata font, so override the defaults. # This may be removed if RHEL ever adds the texlive-inconsolata package from Fedora. # Or check `dnf provides '*/inconsolata.sty'` for a package that provides it. # https://cran.r-project.org/doc/manuals/r-release/R-admin.html#Making-the-manuals ENV R_RD4PDF="times,hyper" # Make sure that patching Java does not break R. -# R's default JAVA_HOME path includes the exact Java version on RHEL, which +# R's default JAVA_HOME path includes the exact Java version on CentOS/RHEL, which # requires users to run `R CMD javareconf` even on minor/patch upgrades. Use the # major version symlink to avoid this. # https://cran.r-project.org/doc/manuals/r-release/R-admin.html#Java-support # https://solutions.posit.co/envs-pkgs/using-rjava/ -ENV JAVA_HOME=/usr/lib/jvm/jre-21-openjdk +ENV JAVA_HOME=/usr/lib/jvm/jre-11-openjdk -COPY package.rhel-10 /package.sh +# R 3.x requires PCRE2 for Pango support on RHEL 9 +ENV INCLUDE_PCRE2_IN_R_3 yes + +COPY package.rhel-9 /package.sh COPY build.sh . COPY patches /patches ENTRYPOINT ./build.sh diff --git a/builder/package.rhel-10 b/builder/package.rhel-10 index 6c03c69..1c3d03b 100644 --- a/builder/package.rhel-10 +++ b/builder/package.rhel-10 @@ -4,22 +4,67 @@ if [[ ! -d /tmp/output/${OS_IDENTIFIER} ]]; then mkdir -p "/tmp/output/${OS_IDENTIFIER}" fi -# R 4.5.0 and later require libzstd (with headers to link against libR) -zstd_libs='# - libzstd-devel' -if grep -q '^LIBS *=.*[-]lzstd' ${R_INSTALL_PATH}/lib/R/etc/Makeconf; then - zstd_libs='- libzstd-devel' +# R 3.x requires PCRE1. On RHEL 9, R 3.x also requires PCRE2 for Pango support. +pcre_libs='- pcre2-devel' +if [[ "${R_VERSION}" =~ ^3 ]]; then + pcre_libs='- pcre2-devel +- pcre-devel' fi -# Create postremove script to remove empty directories, as nFPM doesn't include them in the RPM files. -cat <> /after-remove.sh -if [ -d ${R_INSTALL_PATH} ]; then - rm -r ${R_INSTALL_PATH} -fi +# On RHEL and SUSE, we link R against the internal shared BLAS to make the +# R binaries more portable and allow users to switch BLAS implementations without +# having to recompile R. We default to OpenBLAS, but users may prefer other implementations. +# +# Binary packages built against the shared BLAS are also more portable and may be used +# with the default R distributed by RHEL/SUSE, or other R installations using +# shared BLAS and configured with a different BLAS (such as Microsoft R Open with MKL). +# This is especially important for Posit Package Manager's binary packages. +# +# However, EPEL 9's R now links externally against FlexiBLAS, which provides a +# native BLAS switching mechanism for Fedora/RHEL. Starting with R 4.3.0, we also +# link to external FlexiBLAS for compatibility. +# https://fedoraproject.org/wiki/Changes/FlexiBLAS_as_BLAS/LAPACK_manager +# +# On Ubuntu/Debian, we link R against the external BLAS instead (--with-blas/--with-lapack), +# as those distributions use the alternatives system to swap BLAS libraries at runtime. +# The default R distributions on Ubuntu/Debian use the external BLAS, so we do as well +# for portability. +# +# https://cran.r-project.org/doc/manuals/r-release/R-admin.html#Shared-BLAS +if [[ "$("${R_INSTALL_PATH}/bin/R" CMD config BLAS_LIBS)" == "-lflexiblas" ]]; then + blas_lib='flexiblas-devel' + + # Create postremove script to remove empty directories, as nFPM doesn't include them in the RPM files. + cat <> /after-remove.sh + if [ -d ${R_INSTALL_PATH} ]; then + rm -r ${R_INSTALL_PATH} + fi EOF -scripts="scripts: + scripts="scripts: postremove: /after-remove.sh " +else + blas_lib='openblas-devel' + + # Create post-install script required for OpenBLAS. + cat <> /post-install.sh + mv ${R_INSTALL_PATH}/lib/R/lib/libRblas.so ${R_INSTALL_PATH}/lib/R/lib/libRblas.so.keep + ln -s /usr/lib64/libopenblasp.so ${R_INSTALL_PATH}/lib/R/lib/libRblas.so +EOF + + # Create after-remove script to remove internal BLAS, which won't be cleaned up automatically. + cat <> /after-remove.sh + if [ -d ${R_INSTALL_PATH} ]; then + rm -r ${R_INSTALL_PATH} + fi +EOF + + scripts="scripts: + postinstall: /post-install.sh + postremove: /after-remove.sh +" +fi if [ "$(arch)" == "aarch64" ]; then echo arm64; else echo amd64; fi > /tmp/arch @@ -46,11 +91,10 @@ depends: - libtiff - libXmu - libXt -${zstd_libs} - make -- flexiblas-devel +- ${blas_lib} - pango -- pcre2-devel +${pcre_libs} - tcl - tk - unzip diff --git a/renovate.json b/renovate.json deleted file mode 100644 index 818223b..0000000 --- a/renovate.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["local>devxy/renovate-config"], - "automergeType": "branch", - "enabledManagers": ["woodpecker", "custom.regex"], - "customManagers": [ - { - "customType": "regex", - "managerFilePatterns": ["/^\\.crow(?:/[^/]+)?\\.ya?ml$/"], - "matchStrings": [ - "(?\\w+):\\s*(?\\S+)\\s*#\\s*renovate:\\s*datasource=(?\\S+)\\s*depName=(?\\S+)" - ], - "datasourceTemplate": "{{{datasource}}}", - "depNameTemplate": "{{{depName2}}}", - "versioningTemplate": "semver" - } - ] -}