rules_python icon indicating copy to clipboard operation
rules_python copied to clipboard

Runtime error python3xy.dll not found: Missing srcs in python_repository's libpython rule for os:windows

Open axbycc-mark opened this issue 1 year ago • 4 comments

🐞 bug report

The srcs attribute for this cc_library for os:windows is ["python3.dll", "libs/python{python_version_nodot}.lib"]. It is missing the version-specific binary, eg python311.dll.

https://github.com/bazelbuild/rules_python/blob/c5c03b2477dd1ce0c06c9dc60bf816995f222bcf/python/repositories.bzl#L318-L326

This will result in a runtime error (python311.dll not found) in the following scenario.

  1. User creates a cc_binary which has #include <Python.h> and which depends on the libpython above.
  2. User never defines #Py_LIMITED_ABI
  3. User attempts to run the cc_binary

The Python.h includes the pyconfig.h, which causes msvc to attempt linking against python3xy.dll via the#pragma comment(lib, ...)mechanism. The relevant code from the cpython project is here. https://github.com/python/cpython/blob/d610d821fd210dce63a1132c274ffdf8acc510bc/PC/pyconfig.h.in#L315-L331

I have resolved this locally by globbing *.dll into the libpython cc_library.

A similar issue occurs if the user defines #Py_DEBUG, which causes msvc to attempt linking against the debug binary python3xy_d.dll. I did not see a way to request debug binaries using the python_repository rule but if that were enabled, I think globbing *.dll would fix that case too.

Affected Rule

python_repository

Is this a regression?

Unsure.

Description

See above.

🔬 Minimal Reproduction

See above.

🔥 Exception or Error

Runtime error python3xy.dll not found

🌍 Your Environment

Operating System:

  
Windows 10
  

Output of bazel version:

  
7.0.2
  

Rules_python version:

  
0.31.0
  

Anything else relevant?

axbycc-mark avatar Mar 24 '24 07:03 axbycc-mark

Possibly related test failure

https://github.com/bazelbuild/rules_python/blob/c5c03b2477dd1ce0c06c9dc60bf816995f222bcf/tests/cc/current_py_cc_libs/BUILD.bazel#L23-L25

axbycc-mark avatar Mar 24 '24 16:03 axbycc-mark

For the same reason as in this example, statically linking a Python extension on Windows fails when Py_LIMITED_API is defined because the unversioned libs/python3.lib is not in that list. That is fixed in https://github.com/bazelbuild/rules_python/pull/1820, depending on the feedback on that PR, I suppose I could easily integrate this case there as well.

nicholasjng avatar Mar 24 '24 16:03 nicholasjng

Similarly, any cc_library depending on @rules_python//python/cc:current_py_cc_headers and including <Python.h> will also break when compiled with -c dbg, since this also causes Python.h to attempt to link to the python3[xy]_d.lib, which is not available.

axbycc-mark avatar Mar 26 '24 02:03 axbycc-mark

This issue has been automatically marked as stale because it has not had any activity for 180 days. It will be closed if no further activity occurs in 30 days. Collaborators can add an assignee to keep this open indefinitely. Thanks for your contributions to rules_python!

github-actions[bot] avatar Sep 22 '24 22:09 github-actions[bot]