我使用 SWIG 为我的代码生成包装器,这使得 SWIG 成为直接依赖项。我想将其打包为库代码的一部分,并在编译源代码之前构建它。如果我可以这样做的话,我该如何使用 cmake 文件来做到这一点。
我尝试将其作为外部依赖项以及 CMAKE 文件中的子目录包含在内,但它给了我错误,例如未找到 SWIG 或无法包含 SWIG。我希望得到一些关于这是否是打包和安装 SWIG 的正确方法的建议,因为我不想将其变成客户端依赖项。我真的很感激一些帮助。
这是代码片段:
ExternalProject_Add(
SWIG_Project
SOURCE_DIR ${CMAKE_SOURCE_DIR}/headers/swig-4.1.1
BUILD_COMMAND make
INSTALL_COMMAND ""
BUILD_IN_SOURCE 1
)
完成此操作后,我应该如何像这样使用 SWIG
find_package(SWIG)
有效,因为我想使用这个命令
SWIG_ADD_LIBRARY(abc LANGUAGE python SOURCES abc.i)
您必须使用模块
UseSwig
,因此在 find_package(SWIG)
之后您必须使用:
include(UseSWIG)
if(${SWIG_VERSION} VERSION_GREATER_EQUAL 4)
list(APPEND CMAKE_SWIG_FLAGS "-doxygen")
endif()
if(UNIX AND NOT APPLE)
if (CMAKE_SIZEOF_VOID_P EQUAL 8)
list(APPEND CMAKE_SWIG_FLAGS "-DSWIGWORDSIZE64")
else()
list(APPEND CMAKE_SWIG_FLAGS "-DSWIGWORDSIZE32")
endif()
endif()
# Find Python 3
find_package(Python3 REQUIRED COMPONENTS Interpreter Development.Module)
list(APPEND CMAKE_SWIG_FLAGS "-py3" "-DPY3")
然后你可以使用将
foo.i
包装为模块 pyFoo:
set_property(SOURCE foo.i PROPERTY CPLUSPLUS ON)
set_property(SOURCE foo.i PROPERTY SWIG_MODULE_NAME pyFoo)
swig_add_library(pyFoo
TYPE MODULE
LANGUAGE python
OUTPUT_DIR ${CMAKE_BINARY_DIR}/.../foo
SOURCES foo.i)
add_library(${PROJECT_NAMESPACE}::pyFoo ALIAS pyFoo)
target_include_directories(pyFoo
PRIVATE
...
${Python3_INCLUDE_DIRS}
)
set_property(TARGET pyFoo PROPERTY SWIG_USE_TARGET_INCLUDE_DIRECTORIES ON)
# note: macOS is APPLE and also UNIX !
if(APPLE)
set_target_properties(pyFoo PROPERTIES
SUFFIX ".so"
INSTALL_RPATH "@loader_path;@loader_path/.../.libs"
)
set_property(TARGET pyFoo APPEND PROPERTY
LINK_FLAGS "-flat_namespace -undefined suppress"
)
elseif(UNIX)
set_target_properties(pyFoo PROPERTIES
INSTALL_RPATH "$ORIGIN:$ORIGIN/../../${PYTHON_PROJECT}/.libs"
)
endif()
target_link_libraries(pyFoo PRIVATE ${PROJECT_NAMESPACE}::Foo)
# Variable PYTHON_LIBRARIES can contains keyword `optimized`
# which won't be interpreted inside a generator expression.
# i.e. we can't use: $<$<PLATFORM_ID:Windows>:${PYTHON_LIBRARIES}>
# see: https://cmake.org/cmake/help/git-stage/command/target_link_libraries.html#command:target_link_libraries
if(MSVC)
target_link_libraries(pyFoo PRIVATE ${Python3_LIBRARIES})
endif()
参考:https://cmake.org/cmake/help/latest/module/UseSWIG.html
注意:您还可以查看此模板存储库:https://github.com/Mizux/python-native