Search code examples
pythoncmakepipscipy

Can't install Scipy from source in Ubuntu Focal (Python 3.8.10) (can't find `./scipy/_lib/highs/CMakeLists.txt`)


I'm currently trying to install SciPy from source, but I keep running into problems. I'm following the instructions on https://scipy.github.io/devdocs/building/linux.html.

What I did:

  1. Cloned the github repo.
  2. Downloaded the dependencies with sudo apt-get install gcc g++ gfortran python3-dev libopenblas-dev liblapack-dev.

What does not work:

Both python3 setup.py build and python3 setup.py install don't work, with or without sudo. Moreover, trying to install it with pip, by typing pip3 install . also does not work.

The problem seems to be related to the fact that a file called ./scipy/_lib/highs/CMakeLists.txt can't be found. Is this file something supposed to be generated automatically?

Console output of pip3 install .:

Processing /mnt/data/Code/Python scripts/scipy
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'done'
  Preparing metadata (pyproject.toml): started
  Preparing metadata (pyproject.toml): finished with status 'error'

  error: subprocess-exited-with-error
  
  × Preparing metadata (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [178 lines of output]
      scipy/linalg/_generate_pyx.py: all files up-to-date
      scipy/special/_generate_pyx.py: all files up-to-date
      Running scipy/linalg/_generate_pyx.py
      Running scipy/special/_generate_pyx.py
      Running scipy/stats/_generate_pyx.py
      scipy/cluster/_hierarchy.pyx has not changed
      scipy/cluster/_optimal_leaf_ordering.pyx has not changed
      scipy/linalg/_solve_toeplitz.pyx has not changed
      scipy/linalg/_cythonized_array_utils.pyx has not changed
      scipy/linalg/_decomp_update.pyx.in has not changed
      scipy/ndimage/src/_cytest.pyx has not changed
      scipy/ndimage/src/_ni_label.pyx has not changed
      scipy/optimize/_bglu_dense.pyx has not changed
      scipy/optimize/_group_columns.pyx has not changed
      scipy/optimize/cython_optimize/_zeros.pyx.in has not changed
      scipy/optimize/_lsq/givens_elimination.pyx has not changed
      scipy/optimize/tnc/_moduleTNC.pyx has not changed
      scipy/optimize/_highs/cython/src/_highs_constants.pyx has not changed
      scipy/optimize/_highs/cython/src/_highs_wrapper.pyx has not changed
      scipy/optimize/_trlib/_trlib.pyx has not changed
      scipy/signal/_max_len_seq_inner.pyx has not changed
      scipy/signal/_peak_finding_utils.pyx has not changed
      scipy/signal/_sosfilt.pyx has not changed
      scipy/signal/_spectral.pyx has not changed
      scipy/signal/_upfirdn_apply.pyx has not changed
      scipy/sparse/_csparsetools.pyx.in has not changed
      scipy/sparse/csgraph/_flow.pyx has not changed
      scipy/sparse/csgraph/_matching.pyx has not changed
      scipy/sparse/csgraph/_min_spanning_tree.pyx has not changed
      scipy/sparse/csgraph/_reordering.pyx has not changed
      scipy/fftpack/convolve.pyx has not changed
      scipy/sparse/csgraph/_tools.pyx has not changed
      scipy/interpolate/_bspl.pyx has not changed
      scipy/spatial/_ckdtree.pyx has not changed
      scipy/io/matlab/_mio5_utils.pyx has not changed
      scipy/spatial/_qhull.pyx has not changed
      scipy/spatial/_voronoi.pyx has not changed
      scipy/spatial/transform/_rotation.pyx has not changed
      scipy/special/cython_special.pyx has not changed
      scipy/special/_ellip_harm_2.pyx has not changed
      scipy/special/_test_round.pyx has not changed
      scipy/special/_ufuncs.pyx has not changed
      scipy/interpolate/interpnd.pyx has not changed
      scipy/sparse/csgraph/_traversal.pyx has not changed
      scipy/stats/_qmc_cy.pyx has not changed
      scipy/stats/_sobol.pyx has not changed
      scipy/stats/_stats.pyx has not changed
      scipy/io/matlab/_streams.pyx has not changed
      scipy/linalg/cython_blas.pyx has not changed
      scipy/stats/_unuran/unuran_wrapper.pyx has not changed
      scipy/stats/_boost/src/beta_ufunc.pyx has not changed
      scipy/stats/_boost/src/binom_ufunc.pyx has not changed
      scipy/stats/_boost/src/hypergeom_ufunc.pyx has not changed
      scipy/special/_ufuncs_cxx.pyx has not changed
      scipy/_lib/messagestream.pyx has not changed
      scipy/_lib/_ccallback_c.pyx has not changed
      scipy/spatial/_hausdorff.pyx has not changed
      scipy/_lib/_test_deprecation_def.pyx has not changed
      scipy/stats/_biasedurn.pyx has not changed
      scipy/stats/_levy_stable/levyst.pyx has not changed
      scipy/linalg/cython_lapack.pyx has not changed
      scipy/linalg/_matfuncs_sqrtm_triu.pyx has not changed
      scipy/cluster/_vq.pyx has not changed
      scipy/sparse/csgraph/_shortest_path.pyx has not changed
      scipy/stats/_boost/src/nbinom_ufunc.pyx has not changed
      scipy/special/_comb.pyx has not changed
      scipy/interpolate/_ppoly.pyx has not changed
      scipy/_lib/_test_deprecation_call.pyx has not changed
      scipy/io/matlab/_mio_utils.pyx has not changed
      Cythonizing sources
      lapack_opt_info:
      lapack_mkl_info:
      customize UnixCCompiler
        libraries mkl_rt not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
        NOT AVAILABLE
      
      openblas_lapack_info:
      C compiler: x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -fPIC
      
      creating /tmp/tmpxeu9x3zd/tmp
      creating /tmp/tmpxeu9x3zd/tmp/tmpxeu9x3zd
      compile options: '-c'
      x86_64-linux-gnu-gcc: /tmp/tmpxeu9x3zd/source.c
      x86_64-linux-gnu-gcc -pthread /tmp/tmpxeu9x3zd/tmp/tmpxeu9x3zd/source.o -L/usr/lib/x86_64-linux-gnu -lopenblas -o /tmp/tmpxeu9x3zd/a.out
        FOUND:
          libraries = ['openblas', 'openblas']
          library_dirs = ['/usr/lib/x86_64-linux-gnu']
          language = c
          define_macros = [('HAVE_CBLAS', None)]
      
        FOUND:
          libraries = ['openblas', 'openblas']
          library_dirs = ['/usr/lib/x86_64-linux-gnu']
          language = c
          define_macros = [('HAVE_CBLAS', None)]
      
      blas_opt_info:
      blas_mkl_info:
        libraries mkl_rt not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
        NOT AVAILABLE
      
      blis_info:
        libraries blis not found in ['/usr/local/lib', '/usr/lib', '/usr/lib/x86_64-linux-gnu']
        NOT AVAILABLE
      
      openblas_info:
      C compiler: x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -fPIC
      
      creating /tmp/tmph3qne29w/tmp
      creating /tmp/tmph3qne29w/tmp/tmph3qne29w
      compile options: '-c'
      x86_64-linux-gnu-gcc: /tmp/tmph3qne29w/source.c
      x86_64-linux-gnu-gcc -pthread /tmp/tmph3qne29w/tmp/tmph3qne29w/source.o -L/usr/lib/x86_64-linux-gnu -lopenblas -o /tmp/tmph3qne29w/a.out
        FOUND:
          libraries = ['openblas', 'openblas']
          library_dirs = ['/usr/lib/x86_64-linux-gnu']
          language = c
          define_macros = [('HAVE_CBLAS', None)]
      
        FOUND:
          libraries = ['openblas', 'openblas']
          library_dirs = ['/usr/lib/x86_64-linux-gnu']
          language = c
          define_macros = [('HAVE_CBLAS', None)]
      
      setup.py:390: UserWarning: Unrecognized setuptools command ('dist_info --egg-base /tmp/pip-modern-metadata-qr6r8y4e'), proceeding with generating Cython sources and expanding templates
        warnings.warn("Unrecognized setuptools command ('{}'), proceeding with "
      Running from SciPy source directory.
      /usr/local/lib/python3.8/dist-packages/numpy/distutils/system_info.py:933: UserWarning: Specified path /usr/local/include/python3.8 is invalid.
        return self.get_paths(self.section, key)
      Traceback (most recent call last):
        File "/usr/local/lib/python3.8/dist-packages/pip/_vendor/pep517/in_process/_in_process.py", line 363, in <module>
          main()
        File "/usr/local/lib/python3.8/dist-packages/pip/_vendor/pep517/in_process/_in_process.py", line 345, in main
          json_out['return_val'] = hook(**hook_input['kwargs'])
        File "/usr/local/lib/python3.8/dist-packages/pip/_vendor/pep517/in_process/_in_process.py", line 164, in prepare_metadata_for_build_wheel
          return hook(metadata_directory, config_settings)
        File "/usr/local/lib/python3.8/dist-packages/setuptools/build_meta.py", line 188, in prepare_metadata_for_build_wheel
          self.run_setup()
        File "/usr/local/lib/python3.8/dist-packages/setuptools/build_meta.py", line 281, in run_setup
          super(_BuildMetaLegacyBackend,
        File "/usr/local/lib/python3.8/dist-packages/setuptools/build_meta.py", line 174, in run_setup
          exec(compile(code, __file__, 'exec'), locals())
        File "setup.py", line 532, in <module>
          setup_package()
        File "setup.py", line 528, in setup_package
          setup(**metadata)
        File "/usr/local/lib/python3.8/dist-packages/numpy/distutils/core.py", line 135, in setup
          config = configuration()
        File "setup.py", line 438, in configuration
          config.add_subpackage('scipy')
        File "/usr/local/lib/python3.8/dist-packages/numpy/distutils/misc_util.py", line 1014, in add_subpackage
          config_list = self.get_subpackage(subpackage_name, subpackage_path,
        File "/usr/local/lib/python3.8/dist-packages/numpy/distutils/misc_util.py", line 980, in get_subpackage
          config = self._get_configuration_from_setup_py(
        File "/usr/local/lib/python3.8/dist-packages/numpy/distutils/misc_util.py", line 922, in _get_configuration_from_setup_py
          config = setup_module.configuration(*args)
        File "/mnt/data/Code/Python scripts/scipy/scipy/setup.py", line 18, in configuration
          config.add_subpackage('optimize')
        File "/usr/local/lib/python3.8/dist-packages/numpy/distutils/misc_util.py", line 1014, in add_subpackage
          config_list = self.get_subpackage(subpackage_name, subpackage_path,
        File "/usr/local/lib/python3.8/dist-packages/numpy/distutils/misc_util.py", line 980, in get_subpackage
          config = self._get_configuration_from_setup_py(
        File "/usr/local/lib/python3.8/dist-packages/numpy/distutils/misc_util.py", line 922, in _get_configuration_from_setup_py
          config = setup_module.configuration(*args)
        File "/mnt/data/Code/Python scripts/scipy/scipy/optimize/setup.py", line 130, in configuration
          config.add_subpackage('_highs')
        File "/usr/local/lib/python3.8/dist-packages/numpy/distutils/misc_util.py", line 1014, in add_subpackage
          config_list = self.get_subpackage(subpackage_name, subpackage_path,
        File "/usr/local/lib/python3.8/dist-packages/numpy/distutils/misc_util.py", line 980, in get_subpackage
          config = self._get_configuration_from_setup_py(
        File "/usr/local/lib/python3.8/dist-packages/numpy/distutils/misc_util.py", line 922, in _get_configuration_from_setup_py
          config = setup_module.configuration(*args)
        File "/mnt/data/Code/Python scripts/scipy/scipy/optimize/_highs/setup.py", line 63, in configuration
          _major_dot_minor = _get_version(
        File "/mnt/data/Code/Python scripts/scipy/scipy/optimize/_highs/setup.py", line 50, in _get_version
          with open(CMakeLists, 'r', encoding='utf-8') as f:
      FileNotFoundError: [Errno 2] No such file or directory: '/mnt/data/Code/Python scripts/scipy/scipy/_lib/highs/CMakeLists.txt'
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.

Solution

  • As you can see on git the folder highs is included there, but as a submodule, which you have probably not downloaded when you cloned the repo.

    Go to the repo main dir and run

    git submodule init
    git submodule update
    

    Then confirm that the specified folder exists and is populated