如何将 SWIG 与库打包

问题描述 投票:0回答:1

我使用 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)

c++ cmake swig swig-template cmake-custom-command
1个回答
0
投票

您必须使用模块

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

© www.soinside.com 2019 - 2024. All rights reserved.