From a0af678f60708a5718614403889bd0285105d2a6 Mon Sep 17 00:00:00 2001 From: Chaitanya-970 Date: Thu, 15 Oct 2026 23:24:08 +0530 Subject: [PATCH 1/3] Fix declaration order in external BLAS/LAPACK interfaces --- .github/workflows/ci_BLAS.yml | 26 +++++--- CHANGELOG.md | 3 + src/blas/stdlib_linalg_blas.fypp | 88 ++++++++++++++-------------- src/lapack/stdlib_linalg_lapack.fypp | 42 +++++++------ 4 files changed, 85 insertions(+), 74 deletions(-) diff --git a/.github/workflows/ci_BLAS.yml b/.github/workflows/ci_BLAS.yml index 7195c1d61..20b4a128e 100644 --- a/.github/workflows/ci_BLAS.yml +++ b/.github/workflows/ci_BLAS.yml @@ -75,7 +75,8 @@ jobs: fail-fast: false matrix: toolchain: - - { compiler: intel, version: "2024.1" } + - { compiler: intel, version: "2024.1", build_type: Release } + - { compiler: gcc, version: 14, build_type: Debug } build: [cmake] env: BUILD_DIR: ${{ matrix.build == 'cmake' && 'build' || '.' }} @@ -102,29 +103,38 @@ jobs: version: ${{ matrix.toolchain.version }} - name: Install Intel oneAPI MKL + if: ${{ matrix.toolchain.compiler == 'intel' }} run: | sudo apt-get install ${APT_PACKAGES} source /opt/intel/oneapi/mkl/latest/env/vars.sh printenv >> $GITHUB_ENV - # Build and test with external BLAS and LAPACK (MKL on Ubuntu with Intel compilers) - - name: Configure with CMake and MKL + - name: Install OpenBLAS and LAPACK + if: ${{ matrix.toolchain.compiler == 'gcc' }} + run: | + sudo apt-get update + sudo apt-get install -y libopenblas-dev liblapack-dev + + # Build and test with external BLAS and LAPACK + - name: Configure with CMake run: >- cmake -Wdev -G Ninja - -DCMAKE_BUILD_TYPE=Release + -DCMAKE_BUILD_TYPE=${{ matrix.toolchain.build_type }} -DCMAKE_MAXIMUM_RANK:String=4 -DCMAKE_INSTALL_PREFIX=$PWD/_dist -DFIND_BLAS:STRING=TRUE + -DCMAKE_REQUIRE_FIND_PACKAGE_BLAS=ON + -DCMAKE_REQUIRE_FIND_PACKAGE_LAPACK=ON -S . -B ${{ env.BUILD_DIR }} - - name: Build and compile with MKL + - name: Build and compile run: cmake --build ${{ env.BUILD_DIR }} --parallel - - name: catch build fail with MKL + - name: catch build fail if: failure() run: cmake --build ${{ env.BUILD_DIR }} --verbose --parallel 1 - - name: test with MKL + - name: test run: >- ctest --test-dir ${{ env.BUILD_DIR }} @@ -132,5 +142,5 @@ jobs: --output-on-failure --no-tests=error - - name: Install project with MKL + - name: Install project run: cmake --install ${{ env.BUILD_DIR }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 8deb7c9db..eea778ce6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ ## Unreleased Changes to the existing modules + - Fixed declaration order in external BLAS/LAPACK interfaces for compilation + with gfortran under `-std=f2018` + [#1210](https://github.com/fortran-lang/stdlib/issues/1210) - Change in module `stdlib_system` - Added `set_environment_variable` and `delete_environment_variable` [#1187](https://github.com/fortran-lang/stdlib/issues/1187) diff --git a/src/blas/stdlib_linalg_blas.fypp b/src/blas/stdlib_linalg_blas.fypp index 61f047bd4..d9eddd39a 100644 --- a/src/blas/stdlib_linalg_blas.fypp +++ b/src/blas/stdlib_linalg_blas.fypp @@ -285,8 +285,8 @@ module stdlib_linalg_blas pure subroutine cgbmv(trans,m,n,kl,ku,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,kl,ku,lda,m,n + complex(sp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: trans complex(sp), intent(inout) :: y(*) end subroutine cgbmv @@ -297,8 +297,8 @@ module stdlib_linalg_blas pure subroutine dgbmv(trans,m,n,kl,ku,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,kl,ku,lda,m,n + real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: trans real(dp), intent(inout) :: y(*) end subroutine dgbmv @@ -309,8 +309,8 @@ module stdlib_linalg_blas pure subroutine sgbmv(trans,m,n,kl,ku,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,kl,ku,lda,m,n + real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: trans real(sp), intent(inout) :: y(*) end subroutine sgbmv @@ -321,8 +321,8 @@ module stdlib_linalg_blas pure subroutine zgbmv(trans,m,n,kl,ku,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,kl,ku,lda,m,n + complex(dp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: trans complex(dp), intent(inout) :: y(*) end subroutine zgbmv @@ -349,8 +349,8 @@ module stdlib_linalg_blas pure subroutine cgemm(transa,transb,m,n,k,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: k,lda,ldb,ldc,m,n + complex(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: transa,transb complex(sp), intent(inout) :: c(ldc,*) end subroutine cgemm @@ -361,8 +361,8 @@ module stdlib_linalg_blas pure subroutine dgemm(transa,transb,m,n,k,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: k,lda,ldb,ldc,m,n + real(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: transa,transb real(dp), intent(inout) :: c(ldc,*) end subroutine dgemm @@ -373,8 +373,8 @@ module stdlib_linalg_blas pure subroutine sgemm(transa,transb,m,n,k,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: k,lda,ldb,ldc,m,n + real(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: transa,transb real(sp), intent(inout) :: c(ldc,*) end subroutine sgemm @@ -385,8 +385,8 @@ module stdlib_linalg_blas pure subroutine zgemm(transa,transb,m,n,k,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: k,lda,ldb,ldc,m,n + complex(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: transa,transb complex(dp), intent(inout) :: c(ldc,*) end subroutine zgemm @@ -412,8 +412,8 @@ module stdlib_linalg_blas pure subroutine cgemv(trans,m,n,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,m,n + complex(sp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: trans complex(sp), intent(inout) :: y(*) end subroutine cgemv @@ -424,8 +424,8 @@ module stdlib_linalg_blas pure subroutine dgemv(trans,m,n,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,m,n + real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: trans real(dp), intent(inout) :: y(*) end subroutine dgemv @@ -436,8 +436,8 @@ module stdlib_linalg_blas pure subroutine sgemv(trans,m,n,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,m,n + real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: trans real(sp), intent(inout) :: y(*) end subroutine sgemv @@ -448,8 +448,8 @@ module stdlib_linalg_blas pure subroutine zgemv(trans,m,n,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,m,n + complex(dp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: trans complex(dp), intent(inout) :: y(*) end subroutine zgemv @@ -584,8 +584,8 @@ module stdlib_linalg_blas pure subroutine chbmv(uplo,n,k,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,k,lda,n + complex(sp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: uplo complex(sp), intent(inout) :: y(*) end subroutine chbmv @@ -596,8 +596,8 @@ module stdlib_linalg_blas pure subroutine zhbmv(uplo,n,k,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,k,lda,n + complex(dp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: uplo complex(dp), intent(inout) :: y(*) end subroutine zhbmv @@ -625,8 +625,8 @@ module stdlib_linalg_blas pure subroutine chemm(side,uplo,m,n,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: lda,ldb,ldc,m,n + complex(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: side,uplo complex(sp), intent(inout) :: c(ldc,*) end subroutine chemm @@ -637,8 +637,8 @@ module stdlib_linalg_blas pure subroutine zhemm(side,uplo,m,n,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: lda,ldb,ldc,m,n + complex(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: side,uplo complex(dp), intent(inout) :: c(ldc,*) end subroutine zhemm @@ -664,8 +664,8 @@ module stdlib_linalg_blas pure subroutine chemv(uplo,n,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,n + complex(sp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: uplo complex(sp), intent(inout) :: y(*) end subroutine chemv @@ -676,8 +676,8 @@ module stdlib_linalg_blas pure subroutine zhemv(uplo,n,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,n + complex(dp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: uplo complex(dp), intent(inout) :: y(*) end subroutine zhemv @@ -786,9 +786,9 @@ module stdlib_linalg_blas pure subroutine cher2k(uplo,trans,n,k,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none + integer(${ik}$), intent(in) :: k,lda,ldb,ldc,n complex(sp), intent(in) :: alpha,a(lda,*),b(ldb,*) real(sp), intent(in) :: beta - integer(${ik}$), intent(in) :: k,lda,ldb,ldc,n character, intent(in) :: trans,uplo complex(sp), intent(inout) :: c(ldc,*) end subroutine cher2k @@ -799,9 +799,9 @@ module stdlib_linalg_blas pure subroutine zher2k(uplo,trans,n,k,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none + integer(${ik}$), intent(in) :: k,lda,ldb,ldc,n complex(dp), intent(in) :: alpha,a(lda,*),b(ldb,*) real(dp), intent(in) :: beta - integer(${ik}$), intent(in) :: k,lda,ldb,ldc,n character, intent(in) :: trans,uplo complex(dp), intent(inout) :: c(ldc,*) end subroutine zher2k @@ -1247,8 +1247,8 @@ module stdlib_linalg_blas pure subroutine dsbmv(uplo,n,k,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,k,lda,n + real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: uplo real(dp), intent(inout) :: y(*) end subroutine dsbmv @@ -1259,8 +1259,8 @@ module stdlib_linalg_blas pure subroutine ssbmv(uplo,n,k,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,k,lda,n + real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: uplo real(sp), intent(inout) :: y(*) end subroutine ssbmv @@ -1573,8 +1573,8 @@ module stdlib_linalg_blas pure subroutine csymm(side,uplo,m,n,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: lda,ldb,ldc,m,n + complex(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: side,uplo complex(sp), intent(inout) :: c(ldc,*) end subroutine csymm @@ -1585,8 +1585,8 @@ module stdlib_linalg_blas pure subroutine dsymm(side,uplo,m,n,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: lda,ldb,ldc,m,n + real(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: side,uplo real(dp), intent(inout) :: c(ldc,*) end subroutine dsymm @@ -1597,8 +1597,8 @@ module stdlib_linalg_blas pure subroutine ssymm(side,uplo,m,n,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: lda,ldb,ldc,m,n + real(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: side,uplo real(sp), intent(inout) :: c(ldc,*) end subroutine ssymm @@ -1609,8 +1609,8 @@ module stdlib_linalg_blas pure subroutine zsymm(side,uplo,m,n,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: lda,ldb,ldc,m,n + complex(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: side,uplo complex(dp), intent(inout) :: c(ldc,*) end subroutine zsymm @@ -1635,8 +1635,8 @@ module stdlib_linalg_blas pure subroutine dsymv(uplo,n,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,n + real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: uplo real(dp), intent(inout) :: y(*) end subroutine dsymv @@ -1647,8 +1647,8 @@ module stdlib_linalg_blas pure subroutine ssymv(uplo,n,alpha,a,lda,x,incx,beta,y,incy) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,n + real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) character, intent(in) :: uplo real(sp), intent(inout) :: y(*) end subroutine ssymv @@ -1752,8 +1752,8 @@ module stdlib_linalg_blas pure subroutine csyr2k(uplo,trans,n,k,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: k,lda,ldb,ldc,n + complex(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: trans,uplo complex(sp), intent(inout) :: c(ldc,*) end subroutine csyr2k @@ -1764,8 +1764,8 @@ module stdlib_linalg_blas pure subroutine dsyr2k(uplo,trans,n,k,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: k,lda,ldb,ldc,n + real(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: trans,uplo real(dp), intent(inout) :: c(ldc,*) end subroutine dsyr2k @@ -1776,8 +1776,8 @@ module stdlib_linalg_blas pure subroutine ssyr2k(uplo,trans,n,k,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: k,lda,ldb,ldc,n + real(sp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: trans,uplo real(sp), intent(inout) :: c(ldc,*) end subroutine ssyr2k @@ -1788,8 +1788,8 @@ module stdlib_linalg_blas pure subroutine zsyr2k(uplo,trans,n,k,alpha,a,lda,b,ldb,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) integer(${ik}$), intent(in) :: k,lda,ldb,ldc,n + complex(dp), intent(in) :: alpha,beta,a(lda,*),b(ldb,*) character, intent(in) :: trans,uplo complex(dp), intent(inout) :: c(ldc,*) end subroutine zsyr2k @@ -1817,8 +1817,8 @@ module stdlib_linalg_blas pure subroutine csyrk(uplo,trans,n,k,alpha,a,lda,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,beta,a(lda,*) integer(${ik}$), intent(in) :: k,lda,ldc,n + complex(sp), intent(in) :: alpha,beta,a(lda,*) character, intent(in) :: trans,uplo complex(sp), intent(inout) :: c(ldc,*) end subroutine csyrk @@ -1829,8 +1829,8 @@ module stdlib_linalg_blas pure subroutine dsyrk(uplo,trans,n,k,alpha,a,lda,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*) integer(${ik}$), intent(in) :: k,lda,ldc,n + real(dp), intent(in) :: alpha,beta,a(lda,*) character, intent(in) :: trans,uplo real(dp), intent(inout) :: c(ldc,*) end subroutine dsyrk @@ -1841,8 +1841,8 @@ module stdlib_linalg_blas pure subroutine ssyrk(uplo,trans,n,k,alpha,a,lda,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*) integer(${ik}$), intent(in) :: k,lda,ldc,n + real(sp), intent(in) :: alpha,beta,a(lda,*) character, intent(in) :: trans,uplo real(sp), intent(inout) :: c(ldc,*) end subroutine ssyrk @@ -1853,8 +1853,8 @@ module stdlib_linalg_blas pure subroutine zsyrk(uplo,trans,n,k,alpha,a,lda,beta,c,ldc) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,beta,a(lda,*) integer(${ik}$), intent(in) :: k,lda,ldc,n + complex(dp), intent(in) :: alpha,beta,a(lda,*) character, intent(in) :: trans,uplo complex(dp), intent(inout) :: c(ldc,*) end subroutine zsyrk @@ -2133,8 +2133,8 @@ module stdlib_linalg_blas pure subroutine ctrmm(side,uplo,transa,diag,m,n,alpha,a,lda,b,ldb) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,a(lda,*) integer(${ik}$), intent(in) :: lda,ldb,m,n + complex(sp), intent(in) :: alpha,a(lda,*) character, intent(in) :: diag,side,transa,uplo complex(sp), intent(inout) :: b(ldb,*) end subroutine ctrmm @@ -2145,8 +2145,8 @@ module stdlib_linalg_blas pure subroutine dtrmm(side,uplo,transa,diag,m,n,alpha,a,lda,b,ldb) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,a(lda,*) integer(${ik}$), intent(in) :: lda,ldb,m,n + real(dp), intent(in) :: alpha,a(lda,*) character, intent(in) :: diag,side,transa,uplo real(dp), intent(inout) :: b(ldb,*) end subroutine dtrmm @@ -2157,8 +2157,8 @@ module stdlib_linalg_blas pure subroutine strmm(side,uplo,transa,diag,m,n,alpha,a,lda,b,ldb) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,a(lda,*) integer(${ik}$), intent(in) :: lda,ldb,m,n + real(sp), intent(in) :: alpha,a(lda,*) character, intent(in) :: diag,side,transa,uplo real(sp), intent(inout) :: b(ldb,*) end subroutine strmm @@ -2169,8 +2169,8 @@ module stdlib_linalg_blas pure subroutine ztrmm(side,uplo,transa,diag,m,n,alpha,a,lda,b,ldb) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,a(lda,*) integer(${ik}$), intent(in) :: lda,ldb,m,n + complex(dp), intent(in) :: alpha,a(lda,*) character, intent(in) :: diag,side,transa,uplo complex(dp), intent(inout) :: b(ldb,*) end subroutine ztrmm @@ -2259,8 +2259,8 @@ module stdlib_linalg_blas pure subroutine ctrsm(side,uplo,transa,diag,m,n,alpha,a,lda,b,ldb) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: alpha,a(lda,*) integer(${ik}$), intent(in) :: lda,ldb,m,n + complex(sp), intent(in) :: alpha,a(lda,*) character, intent(in) :: diag,side,transa,uplo complex(sp), intent(inout) :: b(ldb,*) end subroutine ctrsm @@ -2271,8 +2271,8 @@ module stdlib_linalg_blas pure subroutine dtrsm(side,uplo,transa,diag,m,n,alpha,a,lda,b,ldb) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,a(lda,*) integer(${ik}$), intent(in) :: lda,ldb,m,n + real(dp), intent(in) :: alpha,a(lda,*) character, intent(in) :: diag,side,transa,uplo real(dp), intent(inout) :: b(ldb,*) end subroutine dtrsm @@ -2283,8 +2283,8 @@ module stdlib_linalg_blas pure subroutine strsm(side,uplo,transa,diag,m,n,alpha,a,lda,b,ldb) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,a(lda,*) integer(${ik}$), intent(in) :: lda,ldb,m,n + real(sp), intent(in) :: alpha,a(lda,*) character, intent(in) :: diag,side,transa,uplo real(sp), intent(inout) :: b(ldb,*) end subroutine strsm @@ -2295,8 +2295,8 @@ module stdlib_linalg_blas pure subroutine ztrsm(side,uplo,transa,diag,m,n,alpha,a,lda,b,ldb) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: alpha,a(lda,*) integer(${ik}$), intent(in) :: lda,ldb,m,n + complex(dp), intent(in) :: alpha,a(lda,*) character, intent(in) :: diag,side,transa,uplo complex(dp), intent(inout) :: b(ldb,*) end subroutine ztrsm diff --git a/src/lapack/stdlib_linalg_lapack.fypp b/src/lapack/stdlib_linalg_lapack.fypp index 9ec8c95e9..01b899075 100644 --- a/src/lapack/stdlib_linalg_lapack.fypp +++ b/src/lapack/stdlib_linalg_lapack.fypp @@ -8352,8 +8352,8 @@ module stdlib_linalg_lapack import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,ab(ldab,*),x(*) integer(${ik}$), intent(in) :: incx,incy,ldab,m,n,kl,ku,trans + real(dp), intent(in) :: alpha,beta,ab(ldab,*),x(*) real(dp), intent(inout) :: y(*) end subroutine dla_gbamv #else @@ -8364,8 +8364,8 @@ module stdlib_linalg_lapack import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,ab(ldab,*),x(*) integer(${ik}$), intent(in) :: incx,incy,ldab,m,n,kl,ku,trans + real(sp), intent(in) :: alpha,beta,ab(ldab,*),x(*) real(sp), intent(inout) :: y(*) end subroutine sla_gbamv #else @@ -8592,8 +8592,8 @@ module stdlib_linalg_lapack subroutine dla_geamv ( trans, m, n, alpha, a, lda, x, incx, beta,y, incy ) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,m,n,trans + real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) real(dp), intent(inout) :: y(*) end subroutine dla_geamv #else @@ -8603,8 +8603,8 @@ module stdlib_linalg_lapack subroutine sla_geamv( trans, m, n, alpha, a, lda, x, incx, beta,y, incy ) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,m,n,trans + real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) real(sp), intent(inout) :: y(*) end subroutine sla_geamv #else @@ -9196,8 +9196,8 @@ module stdlib_linalg_lapack subroutine dla_syamv( uplo, n, alpha, a, lda, x, incx, beta, y,incy ) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,n,uplo + real(dp), intent(in) :: alpha,beta,a(lda,*),x(*) real(dp), intent(inout) :: y(*) end subroutine dla_syamv #else @@ -9207,8 +9207,8 @@ module stdlib_linalg_lapack subroutine sla_syamv( uplo, n, alpha, a, lda, x, incx, beta, y,incy ) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) integer(${ik}$), intent(in) :: incx,incy,lda,n,uplo + real(sp), intent(in) :: alpha,beta,a(lda,*),x(*) real(sp), intent(inout) :: y(*) end subroutine sla_syamv #else @@ -13630,8 +13630,8 @@ module stdlib_linalg_lapack pure subroutine claqr1( n, h, ldh, s1, s2, v ) import sp,dp,qp,${ik}$,lk implicit none - complex(sp), intent(in) :: s1,s2,h(ldh,*) integer(${ik}$), intent(in) :: ldh,n + complex(sp), intent(in) :: s1,s2,h(ldh,*) complex(sp), intent(out) :: v(*) end subroutine claqr1 #else @@ -13641,8 +13641,8 @@ module stdlib_linalg_lapack pure subroutine dlaqr1( n, h, ldh, sr1, si1, sr2, si2, v ) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: si1,si2,sr1,sr2,h(ldh,*) integer(${ik}$), intent(in) :: ldh,n + real(dp), intent(in) :: si1,si2,sr1,sr2,h(ldh,*) real(dp), intent(out) :: v(*) end subroutine dlaqr1 #else @@ -13652,8 +13652,8 @@ module stdlib_linalg_lapack pure subroutine slaqr1( n, h, ldh, sr1, si1, sr2, si2, v ) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: si1,si2,sr1,sr2,h(ldh,*) integer(${ik}$), intent(in) :: ldh,n + real(sp), intent(in) :: si1,si2,sr1,sr2,h(ldh,*) real(sp), intent(out) :: v(*) end subroutine slaqr1 #else @@ -13663,8 +13663,8 @@ module stdlib_linalg_lapack pure subroutine zlaqr1( n, h, ldh, s1, s2, v ) import sp,dp,qp,${ik}$,lk implicit none - complex(dp), intent(in) :: s1,s2,h(ldh,*) integer(${ik}$), intent(in) :: ldh,n + complex(dp), intent(in) :: s1,s2,h(ldh,*) complex(dp), intent(out) :: v(*) end subroutine zlaqr1 #else @@ -16484,9 +16484,8 @@ module stdlib_linalg_lapack info ) import sp,dp,qp,${ik}$,lk implicit none - integer(${ik}$), intent(out) :: givptr,info,k,givcol(ldgcol,*),iwork(*),perm(*) - integer(${ik}$), intent(in) :: icompq,ldgcol,ldgnum,nl,nr,sqre + integer(${ik}$), intent(out) :: givptr,info,k,givcol(ldgcol,*),iwork(*),perm(*) real(dp), intent(inout) :: alpha,beta,d(*),vf(*),vl(*) real(dp), intent(out) :: c,s,difl(*),difr(*),givnum(ldgnum,*),poles(ldgnum,*),& work(*),z(*) @@ -16501,9 +16500,8 @@ module stdlib_linalg_lapack info ) import sp,dp,qp,${ik}$,lk implicit none - integer(${ik}$), intent(out) :: givptr,info,k,givcol(ldgcol,*),iwork(*),perm(*) - integer(${ik}$), intent(in) :: icompq,ldgcol,ldgnum,nl,nr,sqre + integer(${ik}$), intent(out) :: givptr,info,k,givcol(ldgcol,*),iwork(*),perm(*) real(sp), intent(inout) :: alpha,beta,d(*),vf(*),vl(*) real(sp), intent(out) :: c,s,difl(*),difr(*),givnum(ldgnum,*),poles(ldgnum,*),& work(*),z(*) @@ -16536,9 +16534,9 @@ module stdlib_linalg_lapack info ) import sp,dp,qp,${ik}$,lk implicit none + integer(${ik}$), intent(in) :: icompq,ldgcol,ldgnum,nl,nr,sqre integer(${ik}$), intent(out) :: givptr,info,k,givcol(ldgcol,*),idx(*),idxp(*),& perm(*) - integer(${ik}$), intent(in) :: icompq,ldgcol,ldgnum,nl,nr,sqre real(dp), intent(in) :: alpha,beta real(dp), intent(out) :: c,s,dsigma(*),givnum(ldgnum,*),vfw(*),vlw(*),z(*),zw(& *) @@ -16554,9 +16552,9 @@ module stdlib_linalg_lapack info ) import sp,dp,qp,${ik}$,lk implicit none + integer(${ik}$), intent(in) :: icompq,ldgcol,ldgnum,nl,nr,sqre integer(${ik}$), intent(out) :: givptr,info,k,givcol(ldgcol,*),idx(*),idxp(*),& perm(*) - integer(${ik}$), intent(in) :: icompq,ldgcol,ldgnum,nl,nr,sqre real(sp), intent(in) :: alpha,beta real(sp), intent(out) :: c,s,dsigma(*),givnum(ldgnum,*),vfw(*),vlw(*),z(*),zw(& *) @@ -22011,8 +22009,8 @@ module stdlib_linalg_lapack import sp,dp,qp,${ik}$,lk implicit none real(sp), intent(in) :: tol - integer(${ik}$), intent(out) :: info,rank,piv(n) integer(${ik}$), intent(in) :: lda,n + integer(${ik}$), intent(out) :: info,rank,piv(n) character, intent(in) :: uplo complex(sp), intent(inout) :: a(lda,*) real(sp), intent(out) :: work(2*n) @@ -22025,8 +22023,8 @@ module stdlib_linalg_lapack import sp,dp,qp,${ik}$,lk implicit none real(dp), intent(in) :: tol - integer(${ik}$), intent(out) :: info,rank,piv(n) integer(${ik}$), intent(in) :: lda,n + integer(${ik}$), intent(out) :: info,rank,piv(n) character, intent(in) :: uplo real(dp), intent(inout) :: a(lda,*) real(dp), intent(out) :: work(2*n) @@ -22039,8 +22037,8 @@ module stdlib_linalg_lapack import sp,dp,qp,${ik}$,lk implicit none real(sp), intent(in) :: tol - integer(${ik}$), intent(out) :: info,rank,piv(n) integer(${ik}$), intent(in) :: lda,n + integer(${ik}$), intent(out) :: info,rank,piv(n) character, intent(in) :: uplo real(sp), intent(inout) :: a(lda,*) real(sp), intent(out) :: work(2*n) @@ -22053,8 +22051,8 @@ module stdlib_linalg_lapack import sp,dp,qp,${ik}$,lk implicit none real(dp), intent(in) :: tol - integer(${ik}$), intent(out) :: info,rank,piv(n) integer(${ik}$), intent(in) :: lda,n + integer(${ik}$), intent(out) :: info,rank,piv(n) character, intent(in) :: uplo complex(dp), intent(inout) :: a(lda,*) real(dp), intent(out) :: work(2*n) @@ -22927,8 +22925,8 @@ module stdlib_linalg_lapack pure subroutine dsfrk( transr, uplo, trans, n, k, alpha, a, lda, beta,c ) import sp,dp,qp,${ik}$,lk implicit none - real(dp), intent(in) :: alpha,beta,a(lda,*) integer(${ik}$), intent(in) :: k,lda,n + real(dp), intent(in) :: alpha,beta,a(lda,*) character, intent(in) :: trans,transr,uplo real(dp), intent(inout) :: c(*) end subroutine dsfrk @@ -22939,8 +22937,8 @@ module stdlib_linalg_lapack pure subroutine ssfrk( transr, uplo, trans, n, k, alpha, a, lda, beta,c ) import sp,dp,qp,${ik}$,lk implicit none - real(sp), intent(in) :: alpha,beta,a(lda,*) integer(${ik}$), intent(in) :: k,lda,n + real(sp), intent(in) :: alpha,beta,a(lda,*) character, intent(in) :: trans,transr,uplo real(sp), intent(inout) :: c(*) end subroutine ssfrk From 648a671f598b8ea4fa1701b3f38ea230cc7f1936 Mon Sep 17 00:00:00 2001 From: Chaitanya-970 Date: Fri, 16 Oct 2026 00:12:28 +0530 Subject: [PATCH 2/3] Check external interface conformance separately from the full build --- .github/workflows/ci_BLAS.yml | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_BLAS.yml b/.github/workflows/ci_BLAS.yml index 20b4a128e..981c43617 100644 --- a/.github/workflows/ci_BLAS.yml +++ b/.github/workflows/ci_BLAS.yml @@ -75,8 +75,8 @@ jobs: fail-fast: false matrix: toolchain: - - { compiler: intel, version: "2024.1", build_type: Release } - - { compiler: gcc, version: 14, build_type: Debug } + - { compiler: intel, version: "2024.1" } + - { compiler: gcc, version: 14 } build: [cmake] env: BUILD_DIR: ${{ matrix.build == 'cmake' && 'build' || '.' }} @@ -119,7 +119,7 @@ jobs: - name: Configure with CMake run: >- cmake -Wdev -G Ninja - -DCMAKE_BUILD_TYPE=${{ matrix.toolchain.build_type }} + -DCMAKE_BUILD_TYPE=Release -DCMAKE_MAXIMUM_RANK:String=4 -DCMAKE_INSTALL_PREFIX=$PWD/_dist -DFIND_BLAS:STRING=TRUE @@ -130,6 +130,22 @@ jobs: - name: Build and compile run: cmake --build ${{ env.BUILD_DIR }} --parallel + - name: Check external interfaces with Fortran 2018 + if: ${{ matrix.toolchain.compiler == 'gcc' }} + run: | + # Keep the strict check focused on the external interfaces until #1209 is resolved. + module_flags=() + while IFS= read -r module_dir; do + module_flags+=("-I${module_dir}") + done < <(find "${{ env.BUILD_DIR }}/src" -type d -path '*/mod_files/*') + strict_dir="${{ env.BUILD_DIR }}/strict-interfaces" + mkdir -p "$strict_dir" + "$FC" -std=f2018 -fimplicit-none -fsyntax-only \ + -DSTDLIB_EXTERNAL_BLAS -DSTDLIB_EXTERNAL_LAPACK \ + -J "$strict_dir" "${module_flags[@]}" \ + "${{ env.BUILD_DIR }}/src/blas/stdlib_linalg_blas.F90" \ + "${{ env.BUILD_DIR }}/src/lapack/stdlib_linalg_lapack.F90" + - name: catch build fail if: failure() run: cmake --build ${{ env.BUILD_DIR }} --verbose --parallel 1 From e011ebf8ae2d4b31e2883aa47ce1916326c01c95 Mon Sep 17 00:00:00 2001 From: Chaitanya-970 Date: Fri, 16 Oct 2026 00:23:39 +0530 Subject: [PATCH 3/3] Fix plain library names in pkg-config linker flags --- CHANGELOG.md | 1 + config/export_pc.cmake | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eea778ce6..05a9bc2e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ Changes to the existing modules [#1187](https://github.com/fortran-lang/stdlib/issues/1187) Changes to the existing build system + - Fixed missing `-l` prefixes for system libraries in generated pkg-config files - Fixed absolute paths in generated pkg-config file for external BLAS/LAPACK [#1109](https://github.com/fortran-lang/stdlib/issues/1109) diff --git a/config/export_pc.cmake b/config/export_pc.cmake index 321c1ee96..4929e2589 100644 --- a/config/export_pc.cmake +++ b/config/export_pc.cmake @@ -47,8 +47,10 @@ function(resolve_pc_libs out_var root_target) string(REGEX REPLACE "\\.framework$" "" _fw_name "${_fw_name}") get_filename_component(_fw_dir "${target}" DIRECTORY) list(APPEND _result "-F${_fw_dir} -framework ${_fw_name}") - else() + elseif(IS_ABSOLUTE "${target}" OR "${target}" MATCHES "^-") list(APPEND _result "${target}") + else() + list(APPEND _result "-l${target}") endif() endif()