VS: ZERO_CHECK cyclic dependency with CMake 3.27.1
When testing CMake 3.27.1 on windows, our project (C++ static library + pybind11 wrapper and python wheel generation) fails to configure.
the ZERO_CHECK
seems to generate a cyclic dependency, which was not the case up to CMake 3.26.4...
$ cd .../bazel-pybind11
$ cmake -S. -Bbuild
...
CMake Error: The inter-target dependency graph contains the following strongly connected component (cycle):
"ZERO_CHECK" of type UTILITY
depends on "foo" (strong)
depends on "foo_pybind11" (strong)
"foo" of type STATIC_LIBRARY
depends on "ZERO_CHECK" (strong)
"foo_pybind11" of type MODULE_LIBRARY
depends on "ZERO_CHECK" (strong)
depends on "foo" (weak)
depends on "ZERO_CHECK" (strong)
At least one of these targets is not a STATIC_LIBRARY. Cyclic dependencies are allowed only among static libraries.
CMake Generate step failed. Build files cannot be regenerated correctly.
So we have the graph:
flowchart BT
Z["ZERO_CHECK<br>Type: UTILITY"]
F["foo.lib<br>Type: STATIC_LIBRARY"]
FP["foo_pybind11.pyd<br>Type: MODULE_LIBRARY"]
SI["setup.py.in"]
SO["setup.py"]
W["Python wheel package"]
Z --> F & FP
F --> Z
FP --> F & Z
SI --> F & FP
SO -->|"configure_file + file(GENERATE)"| SI
W --> SO & F & FP
note: if removing the setup.py.in
configure_file()
the problem gone -> it seems it is this generation of the file which make the python package dependent of ZERO_CHECK which make the circular dependency.
# setup.py.in contains cmake variable e.g. @PYTHON_PROJECT@ and
# generator expression e.g. $<TARGET_FILE_NAME:foo_pybind11>
#configure_file(
# ${PROJECT_SOURCE_DIR}/python/setup.py.in
# ${PROJECT_BINARY_DIR}/python/setup.py.in
# @ONLY)
file(GENERATE
OUTPUT ${PROJECT_BINARY_DIR}/python/setup.py
CONTENT "")
#INPUT ${PROJECT_BINARY_DIR}/python/setup.py.in)
...
add_custom_command(
OUTPUT python/dist/timestamp
...
Work In Progress workaround
We could disable this target on windows using:
set(CMAKE_SUPPRESS_REGENERATION TRUE)
You can found the source of this minimal reproducible issue at: https://github.com/mizux/bazel-pybind11
Edited by Mizux