gpt4 book ai didi

python - Cython、CMake 和 setup.py、python 在子目录中编译两次

转载 作者:行者123 更新时间:2023-12-04 13:44:05 24 4
gpt4 key购买 nike

我正在尝试按照 https://bloerg.net/2012/11/10/cmake-and-distutils.html 的结构与 Cython 绑定(bind)一起构建 C++ 库。 .

问题是在make install期间,扩展将被编译两次。当只有一个主 CMakeLists.txt 时,不会发生这种双重编译。在主文件夹中(已调整路径)。以下是详细信息:

我的项目结构是

.
├── CMakeLists.txt
├── python
│   ├── CMakeLists.txt
│   ├── a_py.pxd
│   ├── a_py.pyx
│   └── setup.py.in
└── src
├── A.cpp
└── A.h

顶级 CMakeLists.txt仅包含 add_subdirectory(python) .
python/CMakeLists.txt
IF(NOT ${PYTHON})
find_program(PYTHON "python")
ENDIF()

set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in")
set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py")

set(PY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/build/pytimestamp")

configure_file(
${SETUP_PY_IN}
${SETUP_PY}
)

add_custom_command(OUTPUT "${PY_OUTPUT}"
COMMAND ${PYTHON} ${SETUP_PY} build_ext
COMMAND ${CMAKE_COMMAND} -E touch ${PY_OUTPUT}
)

add_custom_target(a_py ALL DEPENDS ${PY_OUTPUT})

install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY} install)")
setup.py是:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
ext_modules = [
Extension(
name="a",
sources=["${CMAKE_CURRENT_SOURCE_DIR}/a_py.pyx", "${CMAKE_CURRENT_SOURCE_DIR}/../src/A.cpp"],
include_dirs = ['${CMAKE_CURRENT_SOURCE_DIR}/../src'],
language="c++",
),
]
setup(
name = 'a',
version='${PROJECT_VERSION}',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules,
package_dir={ 'a': '${CMAKE_CURRENT_SOURCE_DIR}' },
)

在这两种情况下( CMakeFile.txt 在根目录或在 python 子文件夹中),首先是 build_ext步骤运行:

Scanning dependencies of target a_py
[100%] Generating build/pytimestamp
running build_ext


并编译生成的 a_py.cppA.cpp并链接图书馆。
在安装步骤中,只有在 CMakeFile.txt 时才会再次运行编译。在 python子文件夹。

这是安装过程中发生的情况:

running build_ext
skipping '/Users/xxx/tmp/ctest/t08/python/a_py.cpp' Cython extension (up-to-date)
building 'a' extension
creating build


请注意 a_py.pyx不会再次被 cythonized,但会重新创建构建目录(在构建和安装步骤之间是相同的)并编译文件(使用完全相同的编译器和链接器调用)。

一个完整的例子可以在这里找到: https://github.com/zeeMonkeez/cmakeCythonTest

最佳答案

我有同样的问题。显然,就我而言,在安装阶段 setup.py在构建阶段找不到放置已编译扩展的目录时遇到问题,因此即使使用 --skip-build 也重新编译它们。转变。

我通过在构建和安装阶段指定相同的目录路径来解决 --build-lib--build-dir分别切换:

    add_custom_command(OUTPUT ${PY_OUTPUT}
COMMAND ${PYTHON} ${SETUP_PY} build_ext --build-lib ${CMAKE_CURRENT_BINARY_DIR}/mysoext
COMMAND ${CMAKE_COMMAND} -E touch ${PY_OUTPUT}
DEPENDS ${DEPS}
)
...
set(MYINSTCMD "\
EXECUTE_PROCESS(COMMAND ${PYTHON} ${SETUP_PY} install_lib \
--skip-build \
--install-dir /my/install/dir \
--build-dir ${CMAKE_CURRENT_BINARY_DIR}/mysoext)")
install(CODE "${MYINSTCMD}")

关于python - Cython、CMake 和 setup.py、python 在子目录中编译两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52211699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com