添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

https://github.com/mizux/bazel-pybind11

Edited by Mizux