Skip to content

BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure #178

Description

@wshlavacek

Summary

BNGSIM_KLU_AUTOBUILD (GH #209, CMakeLists.txt:76) exists so that an install on
a box with no system SuiteSparse still gets the sparse solver instead of failing
or degrading to dense. On a bare ubuntu-latest it cannot complete: the
pinned SuiteSparse subset's own CMake calls find_package(BLAS), the runner
image has no BLAS, and the configure dies in SuiteSparse_config before KLU is
reached at all.

Combined with BNGSIM_REQUIRE_KLU = "ON" — which pyproject.toml sets for
every scikit-build-core build — the net effect is that
pip install . / pip install <sdist> is a hard configure failure ~12 s in
on a stock Linux host with no SuiteSparse. Not a dense-only fallback; a build
error.

So GH #209's self-sufficiency property holds on macOS (Accelerate supplies the
BLAS) and does not hold on Linux.

Found by #169's new whole-suite Linux job on its first run, before any test ran.

Evidence

Run 31022147818,
ubuntu-latest leg. The autobuild fires and reports itself normally:

-- BNGsim: SuiteSparse/KLU not found — building the pinned KLU subset from source
into .../build/cp312-cp312-linux_x86_64/_bngsim_klu_autobuild (one-time, ~1-2 min) …
==> Building SuiteSparse v7.8.3 (d3c4926d2c47fd6ae558e898bfc072ade210a2a1)

SuiteSparse_config then walks its whole BLAS probe list and finds nothing:

-- Looking for Intel 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
-- Looking for 32-bit Apple BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
-- Looking for ARM 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
-- Looking for IBM ESSL 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
-- Looking for 32-bit OpenBLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
-- Looking for 32-bit FLAME (BLIS) BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
-- Looking for any 32-bit BLAS
-- Looking for sgemm_ - not found
-- Configuring incomplete, errors occurred!

_bngsim_autobuild_klu handles the non-zero exit exactly as written
(CMakeLists.txt:223-226) and hands back to discovery:

-- BNGsim: SuiteSparse/KLU auto-build FAILED (exit 1); see the output above.
Falling back to system discovery result.

…at which point _bngsim_require_klu_or_die (CMakeLists.txt:154, called from
:372) turns the still-missing KLU into the fatal error:

CMake Error at CMakeLists.txt:154 (message):
SuiteSparse/KLU is required (-DBNGSIM_REQUIRE_KLU=ON) but was not found/usable:
not found on any search prefix.

Full call stack of the underlying failure:

FindPackageHandleStandardArgs.cmake:233 (message)
FindBLAS.cmake:1419 (find_package_handle_standard_args)
SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake:242 (find_package)
SuiteSparse_config/CMakeLists.txt:130 (include)

What is notable about it

KLU itself does not use a BLAS. It is a sparse LU with a
BTF/AMD/COLAMD/CAMD preordering; the dense-blocked SuiteSparse packages
(CHOLMOD, UMFPACK, SPQR) are the ones that need one. The dependency comes from
SuiteSparse_config — the shared configuration package every SuiteSparse
component includes — probing unconditionally. So the thing blocking the build is
not something the KLU subset needs at runtime.

That is what makes this look fixable at the ci/build_suitesparse.sh level
rather than by adding a BLAS dependency to bngsim: if SuiteSparse_config can be
configured without a BLAS (or pointed at a stub), the subset that bngsim actually
consumes is unaffected. I have not verified which SuiteSparse option does that,
so treat this paragraph as a direction, not a fix.

The failure is also silent to every existing CI job, which is why it survived:

jobwhy it cannot see this
wheels.yml (all three OSes)resolves a prebuilt SuiteSparse through SUITESPARSE_ROOT (dnf install suitesparse-devel on Linux, ci/build_suitesparse.sh with an explicit prefix on macOS/Windows), so the autobuild branch is never taken
mir.yml, windows-tail.yml, windows-nfsim.yml, native-tests.ymlall build -DBNGSIM_ENABLE_KLU=OFF
local developmentmacOS, where Accelerate satisfies the probe

python-tests.yml's macOS leg is now the only place the autobuild path runs at
all, and it is the platform where it works.

Impact

  • A stock Linux pip install bngsim from sdist fails to build unless the
    user has SuiteSparse (or a BLAS) already. Note the published wheels are
    unaffected — they bundle KLU — so this hits source installs: HPC modules,
    conda-less clusters, pip install --no-binary, aarch64 and musllinux (which
    cibuildwheel skips), and Python versions outside cp310-cp313.
  • The error message is at least actionable: it names apt-get install libsuitesparse-dev and the -D escape hatches. So this is a
    "self-sufficiency claim is overstated" bug, not a mystifying one.

Workaround in place

#169's Linux leg installs libsuitesparse-dev
(PR #175), the same system-package
route cibuildwheel's Linux leg already takes, so it matches the shipped wheel.
macOS deliberately installs nothing so that leg keeps exercising the autobuild.
Neither change touches the autobuild itself — this is unfixed.

Suggested acceptance

A Linux host with no SuiteSparse and no BLAS can pip install . and get
HAS_KLU True. The cheap CI proof is a leg that does not install
libsuitesparse-dev — i.e. deleting the workaround step from
python-tests.yml and staying green.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
       blocks
      (function() {
      function addCopyButtons() {
      document.querySelectorAll('pre code').forEach(function(codeBlock) {
      if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
      codeBlock.parentElement.setAttribute('data-copy-added', 'true');
      var btn = document.createElement('button');
      btn.textContent = 'Copy';
      btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
      btn.onmouseover = function() { this.style.opacity = '1'; };
      btn.onmouseout = function() { this.style.opacity = '0.7'; };
      btn.onclick = function() {
      navigator.clipboard.writeText(codeBlock.textContent).then(function() {
      btn.textContent = 'Copied!';
      setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
      });
      };
      codeBlock.parentElement.style.position = 'relative';
      codeBlock.parentElement.appendChild(btn);
      });
      }
      addCopyButtons();
      // Re-run on dynamic content
      var observer = new MutationObserver(addCopyButtons);
      observer.observe(document.body, { childList: true, subtree: true });
      })();
      }
      } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
      })();
      (function(){
      try {
      var __m = "github.com";
      var __re = new RegExp('^' + "github\\.com" + '
      BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure · Issue #178 · lanl/bngsim · GitHub
      Skip to content

      BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure #178

      Description

      @wshlavacek

      Summary

      BNGSIM_KLU_AUTOBUILD (GH #209, CMakeLists.txt:76) exists so that an install on
      a box with no system SuiteSparse still gets the sparse solver instead of failing
      or degrading to dense. On a bare ubuntu-latest it cannot complete: the
      pinned SuiteSparse subset's own CMake calls find_package(BLAS), the runner
      image has no BLAS, and the configure dies in SuiteSparse_config before KLU is
      reached at all.

      Combined with BNGSIM_REQUIRE_KLU = "ON" — which pyproject.toml sets for
      every scikit-build-core build — the net effect is that
      pip install . / pip install <sdist> is a hard configure failure ~12 s in
      on a stock Linux host with no SuiteSparse. Not a dense-only fallback; a build
      error.

      So GH #209's self-sufficiency property holds on macOS (Accelerate supplies the
      BLAS) and does not hold on Linux.

      Found by #169's new whole-suite Linux job on its first run, before any test ran.

      Evidence

      Run 31022147818,
      ubuntu-latest leg. The autobuild fires and reports itself normally:

      -- BNGsim: SuiteSparse/KLU not found — building the pinned KLU subset from source
      into .../build/cp312-cp312-linux_x86_64/_bngsim_klu_autobuild (one-time, ~1-2 min) …
      ==> Building SuiteSparse v7.8.3 (d3c4926d2c47fd6ae558e898bfc072ade210a2a1)
      

      SuiteSparse_config then walks its whole BLAS probe list and finds nothing:

      -- Looking for Intel 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
      -- Looking for 32-bit Apple BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
      -- Looking for ARM 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
      -- Looking for IBM ESSL 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
      -- Looking for 32-bit OpenBLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
      -- Looking for 32-bit FLAME (BLIS) BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
      -- Looking for any 32-bit BLAS
      -- Looking for sgemm_ - not found
      -- Configuring incomplete, errors occurred!
      

      _bngsim_autobuild_klu handles the non-zero exit exactly as written
      (CMakeLists.txt:223-226) and hands back to discovery:

      -- BNGsim: SuiteSparse/KLU auto-build FAILED (exit 1); see the output above.
      Falling back to system discovery result.
      

      …at which point _bngsim_require_klu_or_die (CMakeLists.txt:154, called from
      :372) turns the still-missing KLU into the fatal error:

      CMake Error at CMakeLists.txt:154 (message):
      SuiteSparse/KLU is required (-DBNGSIM_REQUIRE_KLU=ON) but was not found/usable:
      not found on any search prefix.
      

      Full call stack of the underlying failure:

      FindPackageHandleStandardArgs.cmake:233 (message)
      FindBLAS.cmake:1419 (find_package_handle_standard_args)
      SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake:242 (find_package)
      SuiteSparse_config/CMakeLists.txt:130 (include)
      

      What is notable about it

      KLU itself does not use a BLAS. It is a sparse LU with a
      BTF/AMD/COLAMD/CAMD preordering; the dense-blocked SuiteSparse packages
      (CHOLMOD, UMFPACK, SPQR) are the ones that need one. The dependency comes from
      SuiteSparse_config — the shared configuration package every SuiteSparse
      component includes — probing unconditionally. So the thing blocking the build is
      not something the KLU subset needs at runtime.

      That is what makes this look fixable at the ci/build_suitesparse.sh level
      rather than by adding a BLAS dependency to bngsim: if SuiteSparse_config can be
      configured without a BLAS (or pointed at a stub), the subset that bngsim actually
      consumes is unaffected. I have not verified which SuiteSparse option does that,
      so treat this paragraph as a direction, not a fix.

      The failure is also silent to every existing CI job, which is why it survived:

      jobwhy it cannot see this
      wheels.yml (all three OSes)resolves a prebuilt SuiteSparse through SUITESPARSE_ROOT (dnf install suitesparse-devel on Linux, ci/build_suitesparse.sh with an explicit prefix on macOS/Windows), so the autobuild branch is never taken
      mir.yml, windows-tail.yml, windows-nfsim.yml, native-tests.ymlall build -DBNGSIM_ENABLE_KLU=OFF
      local developmentmacOS, where Accelerate satisfies the probe

      python-tests.yml's macOS leg is now the only place the autobuild path runs at
      all, and it is the platform where it works.

      Impact

      • A stock Linux pip install bngsim from sdist fails to build unless the
        user has SuiteSparse (or a BLAS) already. Note the published wheels are
        unaffected — they bundle KLU — so this hits source installs: HPC modules,
        conda-less clusters, pip install --no-binary, aarch64 and musllinux (which
        cibuildwheel skips), and Python versions outside cp310-cp313.
      • The error message is at least actionable: it names apt-get install libsuitesparse-dev and the -D escape hatches. So this is a
        "self-sufficiency claim is overstated" bug, not a mystifying one.

      Workaround in place

      #169's Linux leg installs libsuitesparse-dev
      (PR #175), the same system-package
      route cibuildwheel's Linux leg already takes, so it matches the shipped wheel.
      macOS deliberately installs nothing so that leg keeps exercising the autobuild.
      Neither change touches the autobuild itself — this is unfixed.

      Suggested acceptance

      A Linux host with no SuiteSparse and no BLAS can pip install . and get
      HAS_KLU True. The cheap CI proof is a leg that does not install
      libsuitesparse-dev — i.e. deleting the workaround step from
      python-tests.yml and staying green.

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        bugSomething isn't working

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure · Issue #178 · lanl/bngsim · GitHub
          Skip to content

          BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure #178

          Description

          @wshlavacek

          Summary

          BNGSIM_KLU_AUTOBUILD (GH #209, CMakeLists.txt:76) exists so that an install on
          a box with no system SuiteSparse still gets the sparse solver instead of failing
          or degrading to dense. On a bare ubuntu-latest it cannot complete: the
          pinned SuiteSparse subset's own CMake calls find_package(BLAS), the runner
          image has no BLAS, and the configure dies in SuiteSparse_config before KLU is
          reached at all.

          Combined with BNGSIM_REQUIRE_KLU = "ON" — which pyproject.toml sets for
          every scikit-build-core build — the net effect is that
          pip install . / pip install <sdist> is a hard configure failure ~12 s in
          on a stock Linux host with no SuiteSparse. Not a dense-only fallback; a build
          error.

          So GH #209's self-sufficiency property holds on macOS (Accelerate supplies the
          BLAS) and does not hold on Linux.

          Found by #169's new whole-suite Linux job on its first run, before any test ran.

          Evidence

          Run 31022147818,
          ubuntu-latest leg. The autobuild fires and reports itself normally:

          -- BNGsim: SuiteSparse/KLU not found — building the pinned KLU subset from source
          into .../build/cp312-cp312-linux_x86_64/_bngsim_klu_autobuild (one-time, ~1-2 min) …
          ==> Building SuiteSparse v7.8.3 (d3c4926d2c47fd6ae558e898bfc072ade210a2a1)
          

          SuiteSparse_config then walks its whole BLAS probe list and finds nothing:

          -- Looking for Intel 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
          -- Looking for 32-bit Apple BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
          -- Looking for ARM 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
          -- Looking for IBM ESSL 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
          -- Looking for 32-bit OpenBLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
          -- Looking for 32-bit FLAME (BLIS) BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
          -- Looking for any 32-bit BLAS
          -- Looking for sgemm_ - not found
          -- Configuring incomplete, errors occurred!
          

          _bngsim_autobuild_klu handles the non-zero exit exactly as written
          (CMakeLists.txt:223-226) and hands back to discovery:

          -- BNGsim: SuiteSparse/KLU auto-build FAILED (exit 1); see the output above.
          Falling back to system discovery result.
          

          …at which point _bngsim_require_klu_or_die (CMakeLists.txt:154, called from
          :372) turns the still-missing KLU into the fatal error:

          CMake Error at CMakeLists.txt:154 (message):
          SuiteSparse/KLU is required (-DBNGSIM_REQUIRE_KLU=ON) but was not found/usable:
          not found on any search prefix.
          

          Full call stack of the underlying failure:

          FindPackageHandleStandardArgs.cmake:233 (message)
          FindBLAS.cmake:1419 (find_package_handle_standard_args)
          SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake:242 (find_package)
          SuiteSparse_config/CMakeLists.txt:130 (include)
          

          What is notable about it

          KLU itself does not use a BLAS. It is a sparse LU with a
          BTF/AMD/COLAMD/CAMD preordering; the dense-blocked SuiteSparse packages
          (CHOLMOD, UMFPACK, SPQR) are the ones that need one. The dependency comes from
          SuiteSparse_config — the shared configuration package every SuiteSparse
          component includes — probing unconditionally. So the thing blocking the build is
          not something the KLU subset needs at runtime.

          That is what makes this look fixable at the ci/build_suitesparse.sh level
          rather than by adding a BLAS dependency to bngsim: if SuiteSparse_config can be
          configured without a BLAS (or pointed at a stub), the subset that bngsim actually
          consumes is unaffected. I have not verified which SuiteSparse option does that,
          so treat this paragraph as a direction, not a fix.

          The failure is also silent to every existing CI job, which is why it survived:

          jobwhy it cannot see this
          wheels.yml (all three OSes)resolves a prebuilt SuiteSparse through SUITESPARSE_ROOT (dnf install suitesparse-devel on Linux, ci/build_suitesparse.sh with an explicit prefix on macOS/Windows), so the autobuild branch is never taken
          mir.yml, windows-tail.yml, windows-nfsim.yml, native-tests.ymlall build -DBNGSIM_ENABLE_KLU=OFF
          local developmentmacOS, where Accelerate satisfies the probe

          python-tests.yml's macOS leg is now the only place the autobuild path runs at
          all, and it is the platform where it works.

          Impact

          • A stock Linux pip install bngsim from sdist fails to build unless the
            user has SuiteSparse (or a BLAS) already. Note the published wheels are
            unaffected — they bundle KLU — so this hits source installs: HPC modules,
            conda-less clusters, pip install --no-binary, aarch64 and musllinux (which
            cibuildwheel skips), and Python versions outside cp310-cp313.
          • The error message is at least actionable: it names apt-get install libsuitesparse-dev and the -D escape hatches. So this is a
            "self-sufficiency claim is overstated" bug, not a mystifying one.

          Workaround in place

          #169's Linux leg installs libsuitesparse-dev
          (PR #175), the same system-package
          route cibuildwheel's Linux leg already takes, so it matches the shipped wheel.
          macOS deliberately installs nothing so that leg keeps exercising the autobuild.
          Neither change touches the autobuild itself — this is unfixed.

          Suggested acceptance

          A Linux host with no SuiteSparse and no BLAS can pip install . and get
          HAS_KLU True. The cheap CI proof is a leg that does not install
          libsuitesparse-dev — i.e. deleting the workaround step from
          python-tests.yml and staying green.

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            bugSomething isn't working

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure · Issue #178 · lanl/bngsim · GitHub
              Skip to content

              BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure #178

              Description

              @wshlavacek

              Summary

              BNGSIM_KLU_AUTOBUILD (GH #209, CMakeLists.txt:76) exists so that an install on
              a box with no system SuiteSparse still gets the sparse solver instead of failing
              or degrading to dense. On a bare ubuntu-latest it cannot complete: the
              pinned SuiteSparse subset's own CMake calls find_package(BLAS), the runner
              image has no BLAS, and the configure dies in SuiteSparse_config before KLU is
              reached at all.

              Combined with BNGSIM_REQUIRE_KLU = "ON" — which pyproject.toml sets for
              every scikit-build-core build — the net effect is that
              pip install . / pip install <sdist> is a hard configure failure ~12 s in
              on a stock Linux host with no SuiteSparse. Not a dense-only fallback; a build
              error.

              So GH #209's self-sufficiency property holds on macOS (Accelerate supplies the
              BLAS) and does not hold on Linux.

              Found by #169's new whole-suite Linux job on its first run, before any test ran.

              Evidence

              Run 31022147818,
              ubuntu-latest leg. The autobuild fires and reports itself normally:

              -- BNGsim: SuiteSparse/KLU not found — building the pinned KLU subset from source
              into .../build/cp312-cp312-linux_x86_64/_bngsim_klu_autobuild (one-time, ~1-2 min) …
              ==> Building SuiteSparse v7.8.3 (d3c4926d2c47fd6ae558e898bfc072ade210a2a1)
              

              SuiteSparse_config then walks its whole BLAS probe list and finds nothing:

              -- Looking for Intel 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
              -- Looking for 32-bit Apple BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
              -- Looking for ARM 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
              -- Looking for IBM ESSL 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
              -- Looking for 32-bit OpenBLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
              -- Looking for 32-bit FLAME (BLIS) BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
              -- Looking for any 32-bit BLAS
              -- Looking for sgemm_ - not found
              -- Configuring incomplete, errors occurred!
              

              _bngsim_autobuild_klu handles the non-zero exit exactly as written
              (CMakeLists.txt:223-226) and hands back to discovery:

              -- BNGsim: SuiteSparse/KLU auto-build FAILED (exit 1); see the output above.
              Falling back to system discovery result.
              

              …at which point _bngsim_require_klu_or_die (CMakeLists.txt:154, called from
              :372) turns the still-missing KLU into the fatal error:

              CMake Error at CMakeLists.txt:154 (message):
              SuiteSparse/KLU is required (-DBNGSIM_REQUIRE_KLU=ON) but was not found/usable:
              not found on any search prefix.
              

              Full call stack of the underlying failure:

              FindPackageHandleStandardArgs.cmake:233 (message)
              FindBLAS.cmake:1419 (find_package_handle_standard_args)
              SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake:242 (find_package)
              SuiteSparse_config/CMakeLists.txt:130 (include)
              

              What is notable about it

              KLU itself does not use a BLAS. It is a sparse LU with a
              BTF/AMD/COLAMD/CAMD preordering; the dense-blocked SuiteSparse packages
              (CHOLMOD, UMFPACK, SPQR) are the ones that need one. The dependency comes from
              SuiteSparse_config — the shared configuration package every SuiteSparse
              component includes — probing unconditionally. So the thing blocking the build is
              not something the KLU subset needs at runtime.

              That is what makes this look fixable at the ci/build_suitesparse.sh level
              rather than by adding a BLAS dependency to bngsim: if SuiteSparse_config can be
              configured without a BLAS (or pointed at a stub), the subset that bngsim actually
              consumes is unaffected. I have not verified which SuiteSparse option does that,
              so treat this paragraph as a direction, not a fix.

              The failure is also silent to every existing CI job, which is why it survived:

              jobwhy it cannot see this
              wheels.yml (all three OSes)resolves a prebuilt SuiteSparse through SUITESPARSE_ROOT (dnf install suitesparse-devel on Linux, ci/build_suitesparse.sh with an explicit prefix on macOS/Windows), so the autobuild branch is never taken
              mir.yml, windows-tail.yml, windows-nfsim.yml, native-tests.ymlall build -DBNGSIM_ENABLE_KLU=OFF
              local developmentmacOS, where Accelerate satisfies the probe

              python-tests.yml's macOS leg is now the only place the autobuild path runs at
              all, and it is the platform where it works.

              Impact

              • A stock Linux pip install bngsim from sdist fails to build unless the
                user has SuiteSparse (or a BLAS) already. Note the published wheels are
                unaffected — they bundle KLU — so this hits source installs: HPC modules,
                conda-less clusters, pip install --no-binary, aarch64 and musllinux (which
                cibuildwheel skips), and Python versions outside cp310-cp313.
              • The error message is at least actionable: it names apt-get install libsuitesparse-dev and the -D escape hatches. So this is a
                "self-sufficiency claim is overstated" bug, not a mystifying one.

              Workaround in place

              #169's Linux leg installs libsuitesparse-dev
              (PR #175), the same system-package
              route cibuildwheel's Linux leg already takes, so it matches the shipped wheel.
              macOS deliberately installs nothing so that leg keeps exercising the autobuild.
              Neither change touches the autobuild itself — this is unfixed.

              Suggested acceptance

              A Linux host with no SuiteSparse and no BLAS can pip install . and get
              HAS_KLU True. The cheap CI proof is a leg that does not install
              libsuitesparse-dev — i.e. deleting the workaround step from
              python-tests.yml and staying green.

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                bugSomething isn't working

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure · Issue #178 · lanl/bngsim · GitHub
                  Skip to content

                  BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure #178

                  Description

                  @wshlavacek

                  Summary

                  BNGSIM_KLU_AUTOBUILD (GH #209, CMakeLists.txt:76) exists so that an install on
                  a box with no system SuiteSparse still gets the sparse solver instead of failing
                  or degrading to dense. On a bare ubuntu-latest it cannot complete: the
                  pinned SuiteSparse subset's own CMake calls find_package(BLAS), the runner
                  image has no BLAS, and the configure dies in SuiteSparse_config before KLU is
                  reached at all.

                  Combined with BNGSIM_REQUIRE_KLU = "ON" — which pyproject.toml sets for
                  every scikit-build-core build — the net effect is that
                  pip install . / pip install <sdist> is a hard configure failure ~12 s in
                  on a stock Linux host with no SuiteSparse. Not a dense-only fallback; a build
                  error.

                  So GH #209's self-sufficiency property holds on macOS (Accelerate supplies the
                  BLAS) and does not hold on Linux.

                  Found by #169's new whole-suite Linux job on its first run, before any test ran.

                  Evidence

                  Run 31022147818,
                  ubuntu-latest leg. The autobuild fires and reports itself normally:

                  -- BNGsim: SuiteSparse/KLU not found — building the pinned KLU subset from source
                  into .../build/cp312-cp312-linux_x86_64/_bngsim_klu_autobuild (one-time, ~1-2 min) …
                  ==> Building SuiteSparse v7.8.3 (d3c4926d2c47fd6ae558e898bfc072ade210a2a1)
                  

                  SuiteSparse_config then walks its whole BLAS probe list and finds nothing:

                  -- Looking for Intel 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                  -- Looking for 32-bit Apple BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                  -- Looking for ARM 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                  -- Looking for IBM ESSL 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                  -- Looking for 32-bit OpenBLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                  -- Looking for 32-bit FLAME (BLIS) BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                  -- Looking for any 32-bit BLAS
                  -- Looking for sgemm_ - not found
                  -- Configuring incomplete, errors occurred!
                  

                  _bngsim_autobuild_klu handles the non-zero exit exactly as written
                  (CMakeLists.txt:223-226) and hands back to discovery:

                  -- BNGsim: SuiteSparse/KLU auto-build FAILED (exit 1); see the output above.
                  Falling back to system discovery result.
                  

                  …at which point _bngsim_require_klu_or_die (CMakeLists.txt:154, called from
                  :372) turns the still-missing KLU into the fatal error:

                  CMake Error at CMakeLists.txt:154 (message):
                  SuiteSparse/KLU is required (-DBNGSIM_REQUIRE_KLU=ON) but was not found/usable:
                  not found on any search prefix.
                  

                  Full call stack of the underlying failure:

                  FindPackageHandleStandardArgs.cmake:233 (message)
                  FindBLAS.cmake:1419 (find_package_handle_standard_args)
                  SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake:242 (find_package)
                  SuiteSparse_config/CMakeLists.txt:130 (include)
                  

                  What is notable about it

                  KLU itself does not use a BLAS. It is a sparse LU with a
                  BTF/AMD/COLAMD/CAMD preordering; the dense-blocked SuiteSparse packages
                  (CHOLMOD, UMFPACK, SPQR) are the ones that need one. The dependency comes from
                  SuiteSparse_config — the shared configuration package every SuiteSparse
                  component includes — probing unconditionally. So the thing blocking the build is
                  not something the KLU subset needs at runtime.

                  That is what makes this look fixable at the ci/build_suitesparse.sh level
                  rather than by adding a BLAS dependency to bngsim: if SuiteSparse_config can be
                  configured without a BLAS (or pointed at a stub), the subset that bngsim actually
                  consumes is unaffected. I have not verified which SuiteSparse option does that,
                  so treat this paragraph as a direction, not a fix.

                  The failure is also silent to every existing CI job, which is why it survived:

                  jobwhy it cannot see this
                  wheels.yml (all three OSes)resolves a prebuilt SuiteSparse through SUITESPARSE_ROOT (dnf install suitesparse-devel on Linux, ci/build_suitesparse.sh with an explicit prefix on macOS/Windows), so the autobuild branch is never taken
                  mir.yml, windows-tail.yml, windows-nfsim.yml, native-tests.ymlall build -DBNGSIM_ENABLE_KLU=OFF
                  local developmentmacOS, where Accelerate satisfies the probe

                  python-tests.yml's macOS leg is now the only place the autobuild path runs at
                  all, and it is the platform where it works.

                  Impact

                  • A stock Linux pip install bngsim from sdist fails to build unless the
                    user has SuiteSparse (or a BLAS) already. Note the published wheels are
                    unaffected — they bundle KLU — so this hits source installs: HPC modules,
                    conda-less clusters, pip install --no-binary, aarch64 and musllinux (which
                    cibuildwheel skips), and Python versions outside cp310-cp313.
                  • The error message is at least actionable: it names apt-get install libsuitesparse-dev and the -D escape hatches. So this is a
                    "self-sufficiency claim is overstated" bug, not a mystifying one.

                  Workaround in place

                  #169's Linux leg installs libsuitesparse-dev
                  (PR #175), the same system-package
                  route cibuildwheel's Linux leg already takes, so it matches the shipped wheel.
                  macOS deliberately installs nothing so that leg keeps exercising the autobuild.
                  Neither change touches the autobuild itself — this is unfixed.

                  Suggested acceptance

                  A Linux host with no SuiteSparse and no BLAS can pip install . and get
                  HAS_KLU True. The cheap CI proof is a leg that does not install
                  libsuitesparse-dev — i.e. deleting the workaround step from
                  python-tests.yml and staying green.

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    bugSomething isn't working

                    Type

                    No type

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure · Issue #178 · lanl/bngsim · GitHub
                      Skip to content

                      BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure #178

                      Description

                      @wshlavacek

                      Summary

                      BNGSIM_KLU_AUTOBUILD (GH #209, CMakeLists.txt:76) exists so that an install on
                      a box with no system SuiteSparse still gets the sparse solver instead of failing
                      or degrading to dense. On a bare ubuntu-latest it cannot complete: the
                      pinned SuiteSparse subset's own CMake calls find_package(BLAS), the runner
                      image has no BLAS, and the configure dies in SuiteSparse_config before KLU is
                      reached at all.

                      Combined with BNGSIM_REQUIRE_KLU = "ON" — which pyproject.toml sets for
                      every scikit-build-core build — the net effect is that
                      pip install . / pip install <sdist> is a hard configure failure ~12 s in
                      on a stock Linux host with no SuiteSparse. Not a dense-only fallback; a build
                      error.

                      So GH #209's self-sufficiency property holds on macOS (Accelerate supplies the
                      BLAS) and does not hold on Linux.

                      Found by #169's new whole-suite Linux job on its first run, before any test ran.

                      Evidence

                      Run 31022147818,
                      ubuntu-latest leg. The autobuild fires and reports itself normally:

                      -- BNGsim: SuiteSparse/KLU not found — building the pinned KLU subset from source
                      into .../build/cp312-cp312-linux_x86_64/_bngsim_klu_autobuild (one-time, ~1-2 min) …
                      ==> Building SuiteSparse v7.8.3 (d3c4926d2c47fd6ae558e898bfc072ade210a2a1)
                      

                      SuiteSparse_config then walks its whole BLAS probe list and finds nothing:

                      -- Looking for Intel 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                      -- Looking for 32-bit Apple BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                      -- Looking for ARM 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                      -- Looking for IBM ESSL 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                      -- Looking for 32-bit OpenBLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                      -- Looking for 32-bit FLAME (BLIS) BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                      -- Looking for any 32-bit BLAS
                      -- Looking for sgemm_ - not found
                      -- Configuring incomplete, errors occurred!
                      

                      _bngsim_autobuild_klu handles the non-zero exit exactly as written
                      (CMakeLists.txt:223-226) and hands back to discovery:

                      -- BNGsim: SuiteSparse/KLU auto-build FAILED (exit 1); see the output above.
                      Falling back to system discovery result.
                      

                      …at which point _bngsim_require_klu_or_die (CMakeLists.txt:154, called from
                      :372) turns the still-missing KLU into the fatal error:

                      CMake Error at CMakeLists.txt:154 (message):
                      SuiteSparse/KLU is required (-DBNGSIM_REQUIRE_KLU=ON) but was not found/usable:
                      not found on any search prefix.
                      

                      Full call stack of the underlying failure:

                      FindPackageHandleStandardArgs.cmake:233 (message)
                      FindBLAS.cmake:1419 (find_package_handle_standard_args)
                      SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake:242 (find_package)
                      SuiteSparse_config/CMakeLists.txt:130 (include)
                      

                      What is notable about it

                      KLU itself does not use a BLAS. It is a sparse LU with a
                      BTF/AMD/COLAMD/CAMD preordering; the dense-blocked SuiteSparse packages
                      (CHOLMOD, UMFPACK, SPQR) are the ones that need one. The dependency comes from
                      SuiteSparse_config — the shared configuration package every SuiteSparse
                      component includes — probing unconditionally. So the thing blocking the build is
                      not something the KLU subset needs at runtime.

                      That is what makes this look fixable at the ci/build_suitesparse.sh level
                      rather than by adding a BLAS dependency to bngsim: if SuiteSparse_config can be
                      configured without a BLAS (or pointed at a stub), the subset that bngsim actually
                      consumes is unaffected. I have not verified which SuiteSparse option does that,
                      so treat this paragraph as a direction, not a fix.

                      The failure is also silent to every existing CI job, which is why it survived:

                      jobwhy it cannot see this
                      wheels.yml (all three OSes)resolves a prebuilt SuiteSparse through SUITESPARSE_ROOT (dnf install suitesparse-devel on Linux, ci/build_suitesparse.sh with an explicit prefix on macOS/Windows), so the autobuild branch is never taken
                      mir.yml, windows-tail.yml, windows-nfsim.yml, native-tests.ymlall build -DBNGSIM_ENABLE_KLU=OFF
                      local developmentmacOS, where Accelerate satisfies the probe

                      python-tests.yml's macOS leg is now the only place the autobuild path runs at
                      all, and it is the platform where it works.

                      Impact

                      • A stock Linux pip install bngsim from sdist fails to build unless the
                        user has SuiteSparse (or a BLAS) already. Note the published wheels are
                        unaffected — they bundle KLU — so this hits source installs: HPC modules,
                        conda-less clusters, pip install --no-binary, aarch64 and musllinux (which
                        cibuildwheel skips), and Python versions outside cp310-cp313.
                      • The error message is at least actionable: it names apt-get install libsuitesparse-dev and the -D escape hatches. So this is a
                        "self-sufficiency claim is overstated" bug, not a mystifying one.

                      Workaround in place

                      #169's Linux leg installs libsuitesparse-dev
                      (PR #175), the same system-package
                      route cibuildwheel's Linux leg already takes, so it matches the shipped wheel.
                      macOS deliberately installs nothing so that leg keeps exercising the autobuild.
                      Neither change touches the autobuild itself — this is unfixed.

                      Suggested acceptance

                      A Linux host with no SuiteSparse and no BLAS can pip install . and get
                      HAS_KLU True. The cheap CI proof is a leg that does not install
                      libsuitesparse-dev — i.e. deleting the workaround step from
                      python-tests.yml and staying green.

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        bugSomething isn't working

                        Type

                        No type

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure · Issue #178 · lanl/bngsim · GitHub
                          Skip to content

                          BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure #178

                          Description

                          @wshlavacek

                          Summary

                          BNGSIM_KLU_AUTOBUILD (GH #209, CMakeLists.txt:76) exists so that an install on
                          a box with no system SuiteSparse still gets the sparse solver instead of failing
                          or degrading to dense. On a bare ubuntu-latest it cannot complete: the
                          pinned SuiteSparse subset's own CMake calls find_package(BLAS), the runner
                          image has no BLAS, and the configure dies in SuiteSparse_config before KLU is
                          reached at all.

                          Combined with BNGSIM_REQUIRE_KLU = "ON" — which pyproject.toml sets for
                          every scikit-build-core build — the net effect is that
                          pip install . / pip install <sdist> is a hard configure failure ~12 s in
                          on a stock Linux host with no SuiteSparse. Not a dense-only fallback; a build
                          error.

                          So GH #209's self-sufficiency property holds on macOS (Accelerate supplies the
                          BLAS) and does not hold on Linux.

                          Found by #169's new whole-suite Linux job on its first run, before any test ran.

                          Evidence

                          Run 31022147818,
                          ubuntu-latest leg. The autobuild fires and reports itself normally:

                          -- BNGsim: SuiteSparse/KLU not found — building the pinned KLU subset from source
                          into .../build/cp312-cp312-linux_x86_64/_bngsim_klu_autobuild (one-time, ~1-2 min) …
                          ==> Building SuiteSparse v7.8.3 (d3c4926d2c47fd6ae558e898bfc072ade210a2a1)
                          

                          SuiteSparse_config then walks its whole BLAS probe list and finds nothing:

                          -- Looking for Intel 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                          -- Looking for 32-bit Apple BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                          -- Looking for ARM 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                          -- Looking for IBM ESSL 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                          -- Looking for 32-bit OpenBLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                          -- Looking for 32-bit FLAME (BLIS) BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                          -- Looking for any 32-bit BLAS
                          -- Looking for sgemm_ - not found
                          -- Configuring incomplete, errors occurred!
                          

                          _bngsim_autobuild_klu handles the non-zero exit exactly as written
                          (CMakeLists.txt:223-226) and hands back to discovery:

                          -- BNGsim: SuiteSparse/KLU auto-build FAILED (exit 1); see the output above.
                          Falling back to system discovery result.
                          

                          …at which point _bngsim_require_klu_or_die (CMakeLists.txt:154, called from
                          :372) turns the still-missing KLU into the fatal error:

                          CMake Error at CMakeLists.txt:154 (message):
                          SuiteSparse/KLU is required (-DBNGSIM_REQUIRE_KLU=ON) but was not found/usable:
                          not found on any search prefix.
                          

                          Full call stack of the underlying failure:

                          FindPackageHandleStandardArgs.cmake:233 (message)
                          FindBLAS.cmake:1419 (find_package_handle_standard_args)
                          SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake:242 (find_package)
                          SuiteSparse_config/CMakeLists.txt:130 (include)
                          

                          What is notable about it

                          KLU itself does not use a BLAS. It is a sparse LU with a
                          BTF/AMD/COLAMD/CAMD preordering; the dense-blocked SuiteSparse packages
                          (CHOLMOD, UMFPACK, SPQR) are the ones that need one. The dependency comes from
                          SuiteSparse_config — the shared configuration package every SuiteSparse
                          component includes — probing unconditionally. So the thing blocking the build is
                          not something the KLU subset needs at runtime.

                          That is what makes this look fixable at the ci/build_suitesparse.sh level
                          rather than by adding a BLAS dependency to bngsim: if SuiteSparse_config can be
                          configured without a BLAS (or pointed at a stub), the subset that bngsim actually
                          consumes is unaffected. I have not verified which SuiteSparse option does that,
                          so treat this paragraph as a direction, not a fix.

                          The failure is also silent to every existing CI job, which is why it survived:

                          jobwhy it cannot see this
                          wheels.yml (all three OSes)resolves a prebuilt SuiteSparse through SUITESPARSE_ROOT (dnf install suitesparse-devel on Linux, ci/build_suitesparse.sh with an explicit prefix on macOS/Windows), so the autobuild branch is never taken
                          mir.yml, windows-tail.yml, windows-nfsim.yml, native-tests.ymlall build -DBNGSIM_ENABLE_KLU=OFF
                          local developmentmacOS, where Accelerate satisfies the probe

                          python-tests.yml's macOS leg is now the only place the autobuild path runs at
                          all, and it is the platform where it works.

                          Impact

                          • A stock Linux pip install bngsim from sdist fails to build unless the
                            user has SuiteSparse (or a BLAS) already. Note the published wheels are
                            unaffected — they bundle KLU — so this hits source installs: HPC modules,
                            conda-less clusters, pip install --no-binary, aarch64 and musllinux (which
                            cibuildwheel skips), and Python versions outside cp310-cp313.
                          • The error message is at least actionable: it names apt-get install libsuitesparse-dev and the -D escape hatches. So this is a
                            "self-sufficiency claim is overstated" bug, not a mystifying one.

                          Workaround in place

                          #169's Linux leg installs libsuitesparse-dev
                          (PR #175), the same system-package
                          route cibuildwheel's Linux leg already takes, so it matches the shipped wheel.
                          macOS deliberately installs nothing so that leg keeps exercising the autobuild.
                          Neither change touches the autobuild itself — this is unfixed.

                          Suggested acceptance

                          A Linux host with no SuiteSparse and no BLAS can pip install . and get
                          HAS_KLU True. The cheap CI proof is a leg that does not install
                          libsuitesparse-dev — i.e. deleting the workaround step from
                          python-tests.yml and staying green.

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            bugSomething isn't working

                            Type

                            No type

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure · Issue #178 · lanl/bngsim · GitHub
                              Skip to content

                              BNGSIM_KLU_AUTOBUILD cannot complete on a bare Linux host: SuiteSparse_config requires a BLAS, so REQUIRE_KLU=ON makes a source install a hard configure failure #178

                              Description

                              @wshlavacek

                              Summary

                              BNGSIM_KLU_AUTOBUILD (GH #209, CMakeLists.txt:76) exists so that an install on
                              a box with no system SuiteSparse still gets the sparse solver instead of failing
                              or degrading to dense. On a bare ubuntu-latest it cannot complete: the
                              pinned SuiteSparse subset's own CMake calls find_package(BLAS), the runner
                              image has no BLAS, and the configure dies in SuiteSparse_config before KLU is
                              reached at all.

                              Combined with BNGSIM_REQUIRE_KLU = "ON" — which pyproject.toml sets for
                              every scikit-build-core build — the net effect is that
                              pip install . / pip install <sdist> is a hard configure failure ~12 s in
                              on a stock Linux host with no SuiteSparse. Not a dense-only fallback; a build
                              error.

                              So GH #209's self-sufficiency property holds on macOS (Accelerate supplies the
                              BLAS) and does not hold on Linux.

                              Found by #169's new whole-suite Linux job on its first run, before any test ran.

                              Evidence

                              Run 31022147818,
                              ubuntu-latest leg. The autobuild fires and reports itself normally:

                              -- BNGsim: SuiteSparse/KLU not found — building the pinned KLU subset from source
                              into .../build/cp312-cp312-linux_x86_64/_bngsim_klu_autobuild (one-time, ~1-2 min) …
                              ==> Building SuiteSparse v7.8.3 (d3c4926d2c47fd6ae558e898bfc072ade210a2a1)
                              

                              SuiteSparse_config then walks its whole BLAS probe list and finds nothing:

                              -- Looking for Intel 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                              -- Looking for 32-bit Apple BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                              -- Looking for ARM 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                              -- Looking for IBM ESSL 32-bit BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                              -- Looking for 32-bit OpenBLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                              -- Looking for 32-bit FLAME (BLIS) BLAS -- Could NOT find BLAS (missing: BLAS_LIBRARIES)
                              -- Looking for any 32-bit BLAS
                              -- Looking for sgemm_ - not found
                              -- Configuring incomplete, errors occurred!
                              

                              _bngsim_autobuild_klu handles the non-zero exit exactly as written
                              (CMakeLists.txt:223-226) and hands back to discovery:

                              -- BNGsim: SuiteSparse/KLU auto-build FAILED (exit 1); see the output above.
                              Falling back to system discovery result.
                              

                              …at which point _bngsim_require_klu_or_die (CMakeLists.txt:154, called from
                              :372) turns the still-missing KLU into the fatal error:

                              CMake Error at CMakeLists.txt:154 (message):
                              SuiteSparse/KLU is required (-DBNGSIM_REQUIRE_KLU=ON) but was not found/usable:
                              not found on any search prefix.
                              

                              Full call stack of the underlying failure:

                              FindPackageHandleStandardArgs.cmake:233 (message)
                              FindBLAS.cmake:1419 (find_package_handle_standard_args)
                              SuiteSparse_config/cmake_modules/SuiteSparseBLAS.cmake:242 (find_package)
                              SuiteSparse_config/CMakeLists.txt:130 (include)
                              

                              What is notable about it

                              KLU itself does not use a BLAS. It is a sparse LU with a
                              BTF/AMD/COLAMD/CAMD preordering; the dense-blocked SuiteSparse packages
                              (CHOLMOD, UMFPACK, SPQR) are the ones that need one. The dependency comes from
                              SuiteSparse_config — the shared configuration package every SuiteSparse
                              component includes — probing unconditionally. So the thing blocking the build is
                              not something the KLU subset needs at runtime.

                              That is what makes this look fixable at the ci/build_suitesparse.sh level
                              rather than by adding a BLAS dependency to bngsim: if SuiteSparse_config can be
                              configured without a BLAS (or pointed at a stub), the subset that bngsim actually
                              consumes is unaffected. I have not verified which SuiteSparse option does that,
                              so treat this paragraph as a direction, not a fix.

                              The failure is also silent to every existing CI job, which is why it survived:

                              jobwhy it cannot see this
                              wheels.yml (all three OSes)resolves a prebuilt SuiteSparse through SUITESPARSE_ROOT (dnf install suitesparse-devel on Linux, ci/build_suitesparse.sh with an explicit prefix on macOS/Windows), so the autobuild branch is never taken
                              mir.yml, windows-tail.yml, windows-nfsim.yml, native-tests.ymlall build -DBNGSIM_ENABLE_KLU=OFF
                              local developmentmacOS, where Accelerate satisfies the probe

                              python-tests.yml's macOS leg is now the only place the autobuild path runs at
                              all, and it is the platform where it works.

                              Impact

                              • A stock Linux pip install bngsim from sdist fails to build unless the
                                user has SuiteSparse (or a BLAS) already. Note the published wheels are
                                unaffected — they bundle KLU — so this hits source installs: HPC modules,
                                conda-less clusters, pip install --no-binary, aarch64 and musllinux (which
                                cibuildwheel skips), and Python versions outside cp310-cp313.
                              • The error message is at least actionable: it names apt-get install libsuitesparse-dev and the -D escape hatches. So this is a
                                "self-sufficiency claim is overstated" bug, not a mystifying one.

                              Workaround in place

                              #169's Linux leg installs libsuitesparse-dev
                              (PR #175), the same system-package
                              route cibuildwheel's Linux leg already takes, so it matches the shipped wheel.
                              macOS deliberately installs nothing so that leg keeps exercising the autobuild.
                              Neither change touches the autobuild itself — this is unfixed.

                              Suggested acceptance

                              A Linux host with no SuiteSparse and no BLAS can pip install . and get
                              HAS_KLU True. The cheap CI proof is a leg that does not install
                              libsuitesparse-dev — i.e. deleting the workaround step from
                              python-tests.yml and staying green.

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                bugSomething isn't working

                                Type

                                No type

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions