diff --git a/.github/workflows/posix.yml b/.github/workflows/posix.yml index a6a1cf1..c2ab9f2 100644 --- a/.github/workflows/posix.yml +++ b/.github/workflows/posix.yml @@ -10,7 +10,7 @@ on: - cron: '0 0 * * 0' env: - OPENBLAS_COMMIT: "v0.3.30" + OPENBLAS_COMMIT: "585e6d06802a0" MACOSX_DEPLOYMENT_TARGET: 10.9 jobs: @@ -28,8 +28,8 @@ jobs: - { os: ubuntu-latest, PLAT: x86_64, INTERFACE64: '0', MB_ML_VER: '2014', MB_ML_LIBC: manylinux} - { os: ubuntu-latest, PLAT: x86_64, INTERFACE64: '1', MB_ML_VER: '2014', MB_ML_LIBC: manylinux} - - { os: macos-latest, PLAT: x86_64, INTERFACE64: '0', MB_ML_LIBC: macosx} - - { os: macos-latest, PLAT: x86_64, INTERFACE64: '1', MB_ML_LIBC: macosx} + - { os: macos-15-intel, PLAT: x86_64, INTERFACE64: '0', MB_ML_LIBC: macosx} + - { os: macos-15-intel, PLAT: x86_64, INTERFACE64: '1', MB_ML_LIBC: macosx} - { os: macos-latest, PLAT: arm64, INTERFACE64: '0', MB_ML_LIBC: macosx} - { os: macos-latest, PLAT: arm64, INTERFACE64: '1', MB_ML_LIBC: macosx} diff --git a/.github/workflows/windows-arm.yml b/.github/workflows/windows-arm.yml index e0e5181..24d5b46 100644 --- a/.github/workflows/windows-arm.yml +++ b/.github/workflows/windows-arm.yml @@ -7,7 +7,7 @@ on: branches: [ main ] env: - OPENBLAS_COMMIT: "v0.3.30" + OPENBLAS_COMMIT: "585e6d06802a0" OPENBLAS_ROOT: "c:\\opt" # Preserve working directory for calls into bash # Without this, invoking bash will cd to the home directory diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 69f70ae..6f51c7c 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: null env: - OPENBLAS_COMMIT: "v0.3.30" + OPENBLAS_COMMIT: "585e6d06802a0" OPENBLAS_ROOT: "c:\\opt" # Preserve working directory for calls into bash # Without this, invoking bash will cd to the home directory diff --git a/.gitmodules b/.gitmodules index 546361d..7b8f5ca 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "OpenBLAS"] path = OpenBLAS url = https://github.com/xianyi/OpenBLAS.git +[submodule "gfortran-install"] + path = gfortran-install + url = https://github.com/MacPython/gfortran-install.git diff --git a/.travis.yml b/.travis.yml index 327d9eb..7a26f1f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ env: global: # The archive that gets built has name from ``git describe`` on this # commit. - - OPENBLAS_COMMIT: "v0.3.30" + - OPENBLAS_COMMIT: "585e6d06802a0" dist: jammy services: docker diff --git a/gfortran-install b/gfortran-install new file mode 160000 index 0000000..3dd38d9 --- /dev/null +++ b/gfortran-install @@ -0,0 +1 @@ +Subproject commit 3dd38d9ce78b3890598cb0eff18a7bec50c06f5e diff --git a/patches/0001-backout-PR-4741.patch b/patches/0001-backout-PR-4741.patch deleted file mode 100644 index fa08d49..0000000 --- a/patches/0001-backout-PR-4741.patch +++ /dev/null @@ -1,61 +0,0 @@ -From fe2f02876134dcfdd75860c622226b6913eef93e Mon Sep 17 00:00:00 2001 -From: mattip -Date: Wed, 22 Oct 2025 14:40:01 +0300 -Subject: [PATCH] backout PR 4741 - ---- - driver/level3/level3_thread.c | 24 ++++++++++++------------ - 1 file changed, 12 insertions(+), 12 deletions(-) - -diff --git a/driver/level3/level3_thread.c b/driver/level3/level3_thread.c -index 22f27975b..0832db58b 100644 ---- a/driver/level3/level3_thread.c -+++ b/driver/level3/level3_thread.c -@@ -588,8 +588,8 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG - InitializeCriticalSection((PCRITICAL_SECTION)&level3_lock); - #else - static pthread_mutex_t level3_lock = PTHREAD_MUTEX_INITIALIZER; -- static pthread_cond_t level3_wakeup = PTHREAD_COND_INITIALIZER; -- volatile static BLASLONG CPU_AVAILABLE = MAX_CPU_NUMBER; -+ // static pthread_cond_t level3_wakeup = PTHREAD_COND_INITIALIZER; -+ // volatile static BLASLONG CPU_AVAILABLE = MAX_CPU_NUMBER; - #endif - - blas_arg_t newarg; -@@ -659,12 +659,12 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG - EnterCriticalSection((PCRITICAL_SECTION)&level3_lock); - #else - pthread_mutex_lock(&level3_lock); -- while(CPU_AVAILABLE < nthreads) { -- pthread_cond_wait(&level3_wakeup, &level3_lock); -- } -- CPU_AVAILABLE -= nthreads; -- WMB; -- pthread_mutex_unlock(&level3_lock); -+ // while(CPU_AVAILABLE < nthreads) { -+ // pthread_cond_wait(&level3_wakeup, &level3_lock); -+ // } -+ // CPU_AVAILABLE -= nthreads; -+ // WMB; -+ // pthread_mutex_unlock(&level3_lock); - #endif - - #ifdef USE_ALLOC_HEAP -@@ -816,10 +816,10 @@ static int gemm_driver(blas_arg_t *args, BLASLONG *range_m, BLASLONG - #elif defined(OS_WINDOWS) - LeaveCriticalSection((PCRITICAL_SECTION)&level3_lock); - #else -- pthread_mutex_lock(&level3_lock); -- CPU_AVAILABLE += nthreads; -- WMB; -- pthread_cond_signal(&level3_wakeup); -+ // pthread_mutex_lock(&level3_lock); -+ // CPU_AVAILABLE += nthreads; -+ // WMB; -+ // pthread_cond_signal(&level3_wakeup); - pthread_mutex_unlock(&level3_lock); - #endif - --- -2.43.0 - diff --git a/pyproject.toml b/pyproject.toml index a2a3b4d..32903d1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta" [project] name = "scipy-openblas64" # v0.3.30 -version = "0.3.30.0.5" +version = "0.3.30.317.0" requires-python = ">=3.7" description = "Provides OpenBLAS for python packaging" readme = "README.md" diff --git a/tools/build_objconv.sh b/tools/build_objconv.sh index 5f42508..47c98e9 100644 --- a/tools/build_objconv.sh +++ b/tools/build_objconv.sh @@ -1,4 +1,4 @@ echo "Building objconv..." set -e -x unzip source.zip -g++ -O1 -o objconv *.cpp +g++ -O1 -Wno-deprecated-declarations -o objconv *.cpp diff --git a/tools/build_steps.sh b/tools/build_steps.sh index b651c82..73c0a5b 100644 --- a/tools/build_steps.sh +++ b/tools/build_steps.sh @@ -39,7 +39,17 @@ function before_build { # get_macpython_environment ${MB_PYTHON_VERSION} venv python3.9 -m venv venv source venv/bin/activate - alias gfortran=gfortran-15 + # Since install_fortran uses `uname -a` to determine arch, + # force the architecture + arch -${PLAT} bash -s << EOF +source ${ROOT_DIR}/gfortran-install/gfortran_utils.sh +install_gfortran +EOF + + echo GFORTRAN + which gfortran + gfortran --version + echo -------- # Deployment target set by gfortran_utils echo "Deployment target $MACOSX_DEPLOYMENT_TARGET" @@ -50,18 +60,16 @@ function before_build { function clean_code { set -ex - # Copied from common_utils.sh, with added debugging local build_commit=$1 [ -z "$build_commit" ] && echo "build_commit not defined" && exit 1 + git submodule update --init --recursive pushd OpenBLAS git fetch origin --tags echo after git fetch origin git checkout $build_commit echo after git checkout $build_commit - git clean -fxd + git clean -fxd echo after git clean - git submodule update --init --recursive - echo after git submodule update popd } @@ -152,7 +160,7 @@ function do_build_lib { local target="CORE2" # Pick up the gfortran runtime libraries export DYLD_LIBRARY_PATH=/usr/local/lib:$DYLD_LIBRARY_PATH - CFLAGS="$CFLAGS -arch x86_64" + export CFLAGS="$CFLAGS -arch x86_64 -Wno-shift-op-parentheses -Wno-logical-op-parentheses -Wno-deprecated-declarations" export SDKROOT=${SDKROOT:-$(xcrun --show-sdk-path)} ;; *-i686) diff --git a/tools/gfortran_utils.sh b/tools/gfortran_utils.sh deleted file mode 100644 index b7127f5..0000000 --- a/tools/gfortran_utils.sh +++ /dev/null @@ -1,183 +0,0 @@ -# this file come from https://github.com/MacPython/gfortran-install -# Follow the license below - - -# gfortran-install license -# Copyright 2016-2021 Matthew Brett, Isuru Fernando, Matti Picus - -# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -# Bash utilities for use with gfortran - -ARCHIVE_SDIR="${ARCHIVE_SDIR:-archives}" - -GF_UTIL_DIR=$(dirname "${BASH_SOURCE[0]}") - -function get_distutils_platform { - # Report platform as in form of distutils get_platform. - # This is like the platform tag that pip will use. - # Modify fat architecture tags on macOS to reflect compiled architecture - - # Deprecate this function once get_distutils_platform_ex is used in all - # downstream projects - local plat=$1 - case $plat in - i686|x86_64|arm64|universal2|intel|aarch64|s390x|ppc64le) ;; - *) echo Did not recognize plat $plat; return 1 ;; - esac - local uname=${2:-$(uname)} - if [ "$uname" != "Darwin" ]; then - if [ "$plat" == "intel" ]; then - echo plat=intel not allowed for Manylinux - return 1 - fi - echo "manylinux1_$plat" - return - fi - # macOS 32-bit arch is i386 - [ "$plat" == "i686" ] && plat="i386" - local target=$(echo $MACOSX_DEPLOYMENT_TARGET | tr .- _) - echo "macosx_${target}_${plat}" -} - -function get_distutils_platform_ex { - # Report platform as in form of distutils get_platform. - # This is like the platform tag that pip will use. - # Modify fat architecture tags on macOS to reflect compiled architecture - # For non-darwin, report manylinux version - local plat=$1 - local mb_ml_ver=${MB_ML_VER:-1} - case $plat in - i686|x86_64|arm64|universal2|intel|aarch64|s390x|ppc64le) ;; - *) echo Did not recognize plat $plat; return 1 ;; - esac - local uname=${2:-$(uname)} - if [ "$uname" != "Darwin" ]; then - if [ "$plat" == "intel" ]; then - echo plat=intel not allowed for Manylinux - return 1 - fi - echo "manylinux${mb_ml_ver}_${plat}" - return - fi - # macOS 32-bit arch is i386 - [ "$plat" == "i686" ] && plat="i386" - local target=$(echo $MACOSX_DEPLOYMENT_TARGET | tr .- _) - echo "macosx_${target}_${plat}" -} - -function get_macosx_target { - # Report MACOSX_DEPLOYMENT_TARGET as given by distutils get_platform. - python3 -c "import sysconfig as s; print(s.get_config_vars()['MACOSX_DEPLOYMENT_TARGET'])" -} - -function check_gfortran { - # Check that gfortran exists on the path - if [ -z "$(which gfortran)" ]; then - echo Missing gfortran - exit 1 - fi -} - -function get_gf_lib_for_suf { - local suffix=$1 - local prefix=$2 - local plat=${3:-$PLAT} - local uname=${4:-$(uname)} - if [ -z "$prefix" ]; then echo Prefix not defined; exit 1; fi - local plat_tag=$(get_distutils_platform_ex $plat $uname) - if [ -n "$suffix" ]; then suffix="-$suffix"; fi - local fname="$prefix-${plat_tag}${suffix}.tar.gz" - local out_fname="${ARCHIVE_SDIR}/$fname" - [ -s $out_fname ] || (echo "$out_fname is empty"; exit 24) - echo "$out_fname" -} - -if [ "$(uname)" == "Darwin" ]; then - mac_target=${MACOSX_DEPLOYMENT_TARGET:-$(get_macosx_target)} - export MACOSX_DEPLOYMENT_TARGET=$mac_target - # Keep this for now as some builds might depend on this being - # available before install_gfortran is called - export GFORTRAN_SHA=c469a420d2d003112749dcdcbe3c684eef42127e - # Set SDKROOT env variable if not set - export SDKROOT=${SDKROOT:-$(xcrun --show-sdk-path)} - - function download_and_unpack_gfortran { - local arch=$1 - local type=$2 - curl -L -O https://github.com/isuruf/gcc/releases/download/gcc-11.3.0-2/gfortran-darwin-${arch}-${type}.tar.gz - case ${arch}-${type} in - arm64-native) - export GFORTRAN_SHA=0d5c118e5966d0fb9e7ddb49321f63cac1397ce8 - ;; - arm64-cross) - export GFORTRAN_SHA=527232845abc5af21f21ceacc46fb19c190fe804 - ;; - x86_64-native) - export GFORTRAN_SHA=c469a420d2d003112749dcdcbe3c684eef42127e - ;; - x86_64-cross) - export GFORTRAN_SHA=107604e57db97a0ae3e7ca7f5dd722959752f0b3 - ;; - esac - if [[ "$(shasum gfortran-darwin-${arch}-${type}.tar.gz)" != "${GFORTRAN_SHA} gfortran-darwin-${arch}-${type}.tar.gz" ]]; then - echo "shasum mismatch for gfortran-darwin-${arch}-${type}" - exit 1 - fi - sudo mkdir -p /opt/ - sudo cp "gfortran-darwin-${arch}-${type}.tar.gz" /opt/gfortran-darwin-${arch}-${type}.tar.gz - pushd /opt - sudo tar -xvf gfortran-darwin-${arch}-${type}.tar.gz - sudo rm gfortran-darwin-${arch}-${type}.tar.gz - popd - if [[ "${type}" == "native" ]]; then - # Link these into /usr/local so that there's no need to add rpath or -L - for f in libgfortran.dylib libgfortran.5.dylib libgcc_s.1.dylib libgcc_s.1.1.dylib libquadmath.dylib libquadmath.0.dylib; do - ln -sf /opt/gfortran-darwin-${arch}-${type}/lib/$f /usr/local/lib/$f - done - # Add it to PATH - ln -sf /opt/gfortran-darwin-${arch}-${type}/bin/gfortran /usr/local/bin/gfortran - fi - } - - function install_arm64_cross_gfortran { - download_and_unpack_gfortran arm64 cross - export FC_ARM64="$(find /opt/gfortran-darwin-arm64-cross/bin -name "*-gfortran")" - local libgfortran="$(find /opt/gfortran-darwin-arm64-cross/lib -name libgfortran.dylib)" - local libdir=$(dirname $libgfortran) - - export FC_ARM64_LDFLAGS="-L$libdir -Wl,-rpath,$libdir" - if [[ "${PLAT:-}" == "arm64" ]]; then - export FC=$FC_ARM64 - fi - } - function install_gfortran { - download_and_unpack_gfortran $(uname -m) native - check_gfortran - if [[ "${PLAT:-}" == "universal2" || "${PLAT:-}" == "arm64" ]]; then - install_arm64_cross_gfortran - fi - } - - function get_gf_lib { - # Get lib with gfortran suffix - get_gf_lib_for_suf "gf_${GFORTRAN_SHA:0:7}" $@ - } -else - function install_gfortran { - # No-op - already installed on manylinux image - check_gfortran - } - - function get_gf_lib { - # Get library with no suffix - get_gf_lib_for_suf "" $@ - } -fi