llvm/mlir/lib
Stella Stamenova 784a5bccfd [mlir] Fix python bindings build on Windows in Debug
Currently, building mlir with the python bindings enabled on Windows in Debug is broken because pybind11, python and cmake don't like to play together. This change normalizes how the three interact, so that the builds can now run and succeed.

The main issue is that python and cmake both make assumptions about which libraries are needed in a Windows build based on the flavor.
- cmake assumes that a debug (or a debug-like) flavor of the build will always require pythonX_d.lib and provides no option/hint to tell it to use a different library. cmake does find both the debug and release versions, but then uses the debug library.
- python (specifically pyconfig.h and by extension python.h) hardcodes the dependency on pythonX_d.lib or pythonX.lib depending on whether `_DEBUG` is defined. This is NOT transparent - it does not show up anywhere in the build logs until the link step fails with `pythonX_d.lib is missing` (or `pythonX.lib is missing`)
- pybind11 tries to "fix" this by implementing a workaround - unless Py_DEBUG is defined, `_DEBUG` is explicitly undefined right before including python headers. This also requires some windows headers to be included differently, so while clever, this is a non-trivial workaround.

mlir itself includes the pybind11 headers (which contain the workaround) AS WELL AS python.h, essentially always requiring both pythonX.lib and pythonX_d.lib for linking. cmake explicitly only adds one or the other, so the build fails.

This change does a couple of things:
- In the cmake files, explicitly add the release version of the python library on Windows builds regardless of flavor. Since Py_DEBUG is not defined, pybind11 will always require release and it will be satisfied
- To satisfy python as well, this change removes any explicit inclusions of Python.h on Windows instead relying on the fact that pybind11 headers will bring in what is needed

There are a few additional things that we could do but I rejected as unnecessary at this time:
- define Py_DEBUG based on the CMAKE_BUILD_TYPE - this will *mostly* work, we'd have to think through multiconfig generators like VS, but it's possible. There doesn't seem to be a need to link against debug python at the moment, so I chose not to overcomplicate the build and always default to release
- similar to above, but define Py_DEBUG based on the CMAKE_BUILD_TYPE *as well as* the presence of the debug python library (`Python3_LIBRARY_DEBUG`). Similar to above, this seems unnecessary right now. I think it's slightly better than above because most people don't actually have the debug version of python installed, so this would prevent breaks in that case.
- similar to the two above, but add a cmake variable to control the logic
- implement the pybind11 workaround directly in mlir (specifically in Interop.h) so that Python.h can still be included directly. This seems prone to error and a pain to maintain in lock step with pybind11
- reorganize how the pybind11 headers are included and place at least one of them in Interop.h directly, so that the header has all of its dependencies included as was the original intention. I decided against this because it really doesn't need pybind11 logic and it's always included after pybind11 is, so we don't necessarily need the python includes

Reviewed By: stellaraccident

Differential Revision: https://reviews.llvm.org/D125284
2022-05-09 19:46:47 -07:00
..
Analysis [MLIR][Presburger] subtraction: add support for divs defined by equalties 2022-04-30 14:45:13 +01:00
Bindings/Python [mlir] Fix python bindings build on Windows in Debug 2022-05-09 19:46:47 -07:00
CAPI [MLIR] Add function to create BFloat16 array attribute 2022-04-19 19:27:06 +00:00
Conversion [mlir][nvvm] Add attribute to nvvm.cpAsyncOp to control l1 bypass 2022-05-09 19:34:48 +00:00
Dialect [mlir][nvvm] Add attribute to nvvm.cpAsyncOp to control l1 bypass 2022-05-09 19:34:48 +00:00
ExecutionEngine Apply clang-tidy fixes for readability-identifier-naming in SparseTensorUtils.cpp (NFC) 2022-05-06 20:19:19 +00:00
Interfaces Apply clang-tidy fixes for performance-unnecessary-value-param in ControlFlowInterfaces.cpp (NFC) 2022-04-19 17:20:57 +00:00
IR [mlir] Remove special case parsing/printing of func operations 2022-05-06 13:36:15 -07:00
Parser [mlir] Remove special case parsing/printing of func operations 2022-05-06 13:36:15 -07:00
Pass Print custom assembly on pass failure by default 2022-04-19 17:29:08 +00:00
Reducer [mlir] Add asserts when changing various MLIRContext configurations 2022-04-15 21:49:03 -07:00
Rewrite [mlir:PDLInterp] Refactor the implementation of result type inferrence 2022-05-01 12:25:05 -07:00
Support [mlir] Rework the implementation of TypeID 2022-04-04 13:52:26 -07:00
TableGen [mlir] Attach InferTypeOpInterface on SameOperandsAndResultType operations when possible 2022-04-28 12:57:59 -07:00
Target [mlir][LLVMIR] Do not update instMap via assignments to entry references 2022-05-04 13:16:51 -07:00
Tools [mlir:PDLL] Fix the import of native constraints from ODS 2022-04-28 12:58:00 -07:00
Transforms [MLIR] Fix iteration counting in greedy pattern application 2022-04-21 15:17:28 -04:00
CMakeLists.txt [mlir][NFC] Move Translation.h to a Tools/mlir-translate directory 2022-03-07 01:05:38 -08:00