Skip to content

f2py bug on OpenBSD "'threads.h': file not found " #19437

@dimpase

Description

@dimpase

Reproducing:

Build NumPy 1.20.3 on OpenBSD using its usual compiler, clang 10.0.1, and (e)gfortran.
The resulting NumPy's f2py is buggy. It fails the test in #18179, and also builds of SciPy using it are
broken, see scipy/scipy#14364

Error message:

here is Python3 and numpy used/built:

$ python3
Python 3.8.8 (default, Apr 19 2021, 10:23:47) 
[Clang 10.0.1 ] on openbsd6
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys, numpy; print(numpy.__version__, sys.version)
1.20.3 3.8.8 (default, Apr 19 2021, 10:23:47) 
[Clang 10.0.1 ]

which, while running

pytest -sv numpy/f2py/tests/test_callback.py -k 'test_all[t]' -r s -x

give

E                                  /tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/_test_ext_module_5403module.c:83:10: fatal error: 'threads.h' file not found
E                                  #include <threads.h>
E                                           ^~~~~~~~~~~
E                                  1 warning and 1 error generated.

full log:

$ pytest -sv numpy/f2py/tests/test_callback.py -k 'test_all[t]' -r s -x
================================================================================================================================== test session starts ===================================================================================================================================
platform openbsd6 -- Python 3.8.8, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- /home/dima/sagetrac-mirror/local/bin/python3
cachedir: .pytest_cache
hypothesis profile 'np.test() profile' -> database=None, deadline=None, print_blob=True, derandomize=True, suppress_health_check=[HealthCheck.data_too_large, HealthCheck.filter_too_much, HealthCheck.too_slow, HealthCheck.return_value, HealthCheck.large_base_example, HealthCheck.not_a_test_method, HealthCheck.function_scoped_fixture]
rootdir: /home/dima/sagetrac-mirror/local/lib/python3.8/site-packages/numpy/f2py
plugins: hypothesis-6.14.1
collected 16 items / 14 deselected / 2 selected                                                                                                                                                                                                                                          

numpy/f2py/tests/test_callback.py::TestF77Callback::test_all[t] ERROR

========================================================================================================================================= ERRORS =========================================================================================================================================
_____________________________________________________________________________________________________________________ ERROR at setup of TestF77Callback.test_all[t] ______________________________________________________________________________________________________________________

self = <numpy.f2py.tests.test_callback.TestF77Callback object at 0x7245f658340>

    def setup(self):
        if sys.platform == 'win32':
            pytest.skip('Fails with MinGW64 Gfortran (Issue #9673)')
    
        if self.module is not None:
            return
    
        # Check compiler availability first
        if not has_c_compiler():
            pytest.skip("No C compiler available")
    
        codes = []
        if self.sources:
            codes.extend(self.sources)
        if self.code is not None:
            codes.append(self.suffix)
    
        needs_f77 = False
        needs_f90 = False
        for fn in codes:
            if fn.endswith('.f'):
                needs_f77 = True
            elif fn.endswith('.f90'):
                needs_f90 = True
        if needs_f77 and not has_f77_compiler():
            pytest.skip("No Fortran 77 compiler available")
        if needs_f90 and not has_f90_compiler():
            pytest.skip("No Fortran 90 compiler available")
    
        # Build the module
        if self.code is not None:
>           self.module = build_code(self.code, options=self.options,
                                     skip=self.skip, only=self.only,
                                     suffix=self.suffix,
                                     module_name=self.module_name)

numpy/f2py/tests/util.py:351: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
numpy/f2py/tests/util.py:73: in wrapper
    memo[key] = func(*a, **kw)
numpy/f2py/tests/util.py:158: in build_code
    return build_module([path], options=options, skip=skip, only=only,
numpy/f2py/tests/util.py:73: in wrapper
    memo[key] = func(*a, **kw)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

source_files = ['/tmp/tmp1lfeb71d.f'], options = [], skip = [], only = [], module_name = '_test_ext_module_5403'

    @_memoize
    def build_module(source_files, options=[], skip=[], only=[], module_name=None):
        """
        Compile and import a f2py module, built from the given files.
    
        """
    
        code = ("import sys; sys.path = %s; import numpy.f2py as f2py2e; "
                "f2py2e.main()" % repr(sys.path))
    
        d = get_module_dir()
    
        # Copy files
        dst_sources = []
        f2py_sources = []
        for fn in source_files:
            if not os.path.isfile(fn):
                raise RuntimeError("%s is not a file" % fn)
            dst = os.path.join(d, os.path.basename(fn))
            shutil.copyfile(fn, dst)
            dst_sources.append(dst)
    
            base, ext = os.path.splitext(dst)
            if ext in ('.f90', '.f', '.c', '.pyf'):
                f2py_sources.append(dst)
    
        # Prepare options
        if module_name is None:
            module_name = get_temp_module_name()
        f2py_opts = ['-c', '-m', module_name] + options + f2py_sources
        if skip:
            f2py_opts += ['skip:'] + skip
        if only:
            f2py_opts += ['only:'] + only
    
        # Build
        cwd = os.getcwd()
        try:
            os.chdir(d)
            cmd = [sys.executable, '-c', code] + f2py_opts
            p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                                 stderr=subprocess.STDOUT)
            out, err = p.communicate()
            if p.returncode != 0:
>               raise RuntimeError("Running f2py failed: %s\n%s"
                                   % (cmd[4:], asstr(out)))
E                                  RuntimeError: Running f2py failed: ['-m', '_test_ext_module_5403', '/tmp/tmp0yy230c6/tmp1lfeb71d.f']
E                                  running build
E                                  running config_cc
E                                  unifing config_cc, config, build_clib, build_ext, build commands --compiler options
E                                  running config_fc
E                                  unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options
E                                  running build_src
E                                  build_src
E                                  building extension "_test_ext_module_5403" sources
E                                  f2py options: []
E                                  f2py:> /tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/_test_ext_module_5403module.c
E                                  creating /tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8
E                                  Reading fortran codes...
E                                  	Reading file '/tmp/tmp0yy230c6/tmp1lfeb71d.f' (format:fix,strict)
E                                  Line #22 in /tmp/tmp0yy230c6/tmp1lfeb71d.f:"       intent(callback) fun"
E                                  	analyzeline: missing __user__ module (could be nothing)
E                                  Line #22 in /tmp/tmp0yy230c6/tmp1lfeb71d.f:"       intent(callback) fun"
E                                  	analyzeline: appending intent(callback) fun to t2 arguments
E                                  Line #52 in /tmp/tmp0yy230c6/tmp1lfeb71d.f:"       intent(callback, hide) global_f"
E                                  	analyzeline: missing __user__ module (could be nothing)
E                                  Line #52 in /tmp/tmp0yy230c6/tmp1lfeb71d.f:"       intent(callback, hide) global_f"
E                                  	analyzeline: appending intent(callback) global_f to hidden_callback arguments
E                                  Post-processing...
E                                  	Block: _test_ext_module_5403
E                                  			Block: t
E                                  					Block: fun
E                                  			Block: func
E                                  			Block: func0
E                                  			Block: t2
E                                  					Block: fun
E                                  			Block: string_callback
E                                  					Block: callback
E                                  			Block: string_callback_array
E                                  					Block: callback
E                                  			Block: hidden_callback
E                                  					Block: global_f
E                                  			Block: hidden_callback2
E                                  Post-processing (stage 2)...
E                                  Building modules...
E                                  	Constructing call-back function "cb_fun_in_t__user__routines"
E                                  	  def fun(): return a
E                                  	Constructing call-back function "cb_fun_in_t2__user__routines"
E                                  	  def fun(): return a
E                                  	Constructing call-back function "cb_callback_in_string_callback__user__routines"
E                                  	  def callback(r): return a
E                                  	Constructing call-back function "cb_callback_in_string_callback_array__user__routines"
E                                  	  def callback(cu,[lencu]): return a
E                                  	Constructing call-back function "cb_global_f_in_hidden_callback__user__routines"
E                                  	  def global_f(a): return r
E                                  	Building module "_test_ext_module_5403"...
E                                  		Constructing wrapper function "t"...
E                                  		  a = t(fun,[fun_extra_args])
E                                  		Constructing wrapper function "func"...
E                                  		  a = func(a)
E                                  		Constructing wrapper function "func0"...
E                                  		  a = func0()
E                                  		Constructing wrapper function "t2"...
E                                  		  a = t2(fun,[fun_extra_args])
E                                  		Constructing wrapper function "string_callback"...
E                                  		  a = string_callback(callback,[callback_extra_args])
E                                  		Constructing wrapper function "string_callback_array"...
E                                  		  a = string_callback_array(callback,cu,[lencu,callback_extra_args])
E                                  		Constructing wrapper function "hidden_callback"...
E                                  		  r = hidden_callback(a)
E                                  		Constructing wrapper function "hidden_callback2"...
E                                  		  r = hidden_callback2(a)
E                                  	Wrote C/API module "_test_ext_module_5403" to file "/tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/_test_ext_module_5403module.c"
E                                    adding '/tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/fortranobject.c' to sources.
E                                    adding '/tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8' to include_dirs.
E                                  copying /home/dima/sagetrac-mirror/local/lib/python3.8/site-packages/numpy/f2py/src/fortranobject.c -> /tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8
E                                  copying /home/dima/sagetrac-mirror/local/lib/python3.8/site-packages/numpy/f2py/src/fortranobject.h -> /tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8
E                                  build_src: building npy-pkg config files
E                                  running build_ext
E                                  customize UnixCCompiler
E                                  customize UnixCCompiler using build_ext
E                                  get_default_fcompiler: matching types: '['gnu', 'gnu95']'
E                                  customize GnuFCompiler
E                                  Found executable /usr/local/bin/egfortran
E                                  gnu: no Fortran 90 compiler found
E                                  Found executable /usr/bin/ld
E                                  Found executable /usr/bin/ar
E                                  Found executable /usr/bin/ranlib
E                                  gnu: no Fortran 90 compiler found
E                                  customize Gnu95FCompiler
E                                  customize Gnu95FCompiler
E                                  customize Gnu95FCompiler using build_ext
E                                  building '_test_ext_module_5403' extension
E                                  compiling C sources
E                                  C compiler: clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g -I/usr/local/include -I/usr/local/include -fPIC
E                                  
E                                  creating /tmp/tmpvdb1a4dd/tmp
E                                  creating /tmp/tmpvdb1a4dd/tmp/tmpvdb1a4dd
E                                  creating /tmp/tmpvdb1a4dd/tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8
E                                  compile options: '-DNPY_DISABLE_OPTIMIZATION=1 -I/tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8 -I/home/dima/sagetrac-mirror/local/lib/python3.8/site-packages/numpy/core/include -I/home/dima/sagetrac-mirror/local/include -I/usr/local/include/python3.8 -c'
E                                  clang: /tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/_test_ext_module_5403module.c
E                                  In file included from /tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/_test_ext_module_5403module.c:16:
E                                  In file included from /tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/fortranobject.h:13:
E                                  In file included from /home/dima/sagetrac-mirror/local/lib/python3.8/site-packages/numpy/core/include/numpy/arrayobject.h:4:
E                                  In file included from /home/dima/sagetrac-mirror/local/lib/python3.8/site-packages/numpy/core/include/numpy/ndarrayobject.h:12:
E                                  In file included from /home/dima/sagetrac-mirror/local/lib/python3.8/site-packages/numpy/core/include/numpy/ndarraytypes.h:1944:
E                                  /home/dima/sagetrac-mirror/local/lib/python3.8/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: "Using deprecated NumPy API, disable it with "          "#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-W#warnings]
E                                  #warning "Using deprecated NumPy API, disable it with " \
E                                   ^
E                                  /tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/_test_ext_module_5403module.c:83:10: fatal error: 'threads.h' file not found
E                                  #include <threads.h>
E                                           ^~~~~~~~~~~
E                                  1 warning and 1 error generated.
E                                  appenddecl: "intent" not implemented.
E                                  analyzevars: character array "character*8 cu(lencu)" is considered as "character cu(lencu,8)"; "intent(c)" is forced.
E                                  analyzevars: character array "character*8 cu(lencu)" is considered as "character cu(lencu,8)"; "intent(c)" is forced.
E                                  appenddecl: "intent" not implemented.
E                                  appenddecl: "intent" not implemented.
E                                  append_needs: unknown need 'int'
E                                  append_needs: unknown need 'int'
E                                  append_needs: unknown need 'int'
E                                  append_needs: unknown need 'int'
E                                  error: Command "clang -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -O2 -pipe -g -fPIC -O2 -pipe -g -O2 -pipe -g -I/usr/local/include -I/usr/local/include -fPIC -DNPY_DISABLE_OPTIMIZATION=1 -I/tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8 -I/home/dima/sagetrac-mirror/local/lib/python3.8/site-packages/numpy/core/include -I/home/dima/sagetrac-mirror/local/include -I/usr/local/include/python3.8 -c /tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/_test_ext_module_5403module.c -o /tmp/tmpvdb1a4dd/tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/_test_ext_module_5403module.o -MMD -MF /tmp/tmpvdb1a4dd/tmp/tmpvdb1a4dd/src.openbsd-6.9-amd64-3.8/_test_ext_module_5403module.o.d" failed with exit status 1

numpy/f2py/tests/util.py:133: RuntimeError
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! stopping after 1 failures !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
============================================================================================================================ 14 deselected, 1 error in 6.35s =============================================================================================================================

C compiler info:

__STDC_NO_THREADS__ is undefined and there is no header:

$ cc -v                                                                                                                                                                                                                              
OpenBSD clang version 10.0.1 
Target: amd64-unknown-openbsd6.9
Thread model: posix
InstalledDir: /usr/bin
$ cat t.c
#ifndef __STDC_NO_THREADS__
#include <threads.h>
#endif
int main() {return 1;}
$ cc -c t.c
t.c:2:10: fatal error: 'threads.h' file not found
#include <threads.h>
         ^~~~~~~~~~~
1 error generated.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions