Ruby 和 SWIG 与 CMake

Posted

技术标签:

【中文标题】Ruby 和 SWIG 与 CMake【英文标题】:Ruby and SWIG with CMake 【发布时间】:2012-05-09 19:14:20 【问题描述】:

有没有人幸运地使用 CMake 通过 SWIG 创建 Ruby 绑定?我在我的 CMake 文件中有一个通过 SWIG 创建 Python 绑定的工作示例,但是当我使用相同的方法创建 Ruby 绑定时,不会创建实际的 Ruby 文件。使用有效的 Python 绑定,会创建一个 Python 文件。

这是我的 CMakeLists.txt 文件的相关部分:

if ($SWIG_FOUND)
  find_package( Ruby REQUIRED )

  include_directories(
    $RUBY_INCLUDE_DIRS
    )

  include ($SWIG_USE_FILE)

  set (CMAKE_SWIG_FLAGS "") # set the global SWIG flags to empty
  set_source_files_properties (TESTSWIG.i PROPERTIES CPLUSPLUS ON) # TESTSWIG.i is c++

  SWIG_ADD_MODULE (test-ruby ruby TESTSWIG.i src/Test.cpp)
  SWIG_LINK_LIBRARIES (test-ruby test $RUBY_LIBRARY)

  set(swig_SOURCES
    $CMAKE_CURRENT_BINARY_DIR/libtest-ruby.so
    )

  install(FILES $swig_SOURCES
    DESTINATION lib/ruby
    )
endif($SWIG_FOUND)

任何人都幸运地使用 CMake 通过 SWIG 创建了 Ruby 绑定?!

【问题讨论】:

【参考方案1】:

我们使用它。你可以看看这些例子:

http://svn.opensuse.org/svn/yast/trunk/libyui-bindings/

但是,我们不使用 SWIG 宏(除了查找 SWIG 本身),而是使用 ADD_CUSTOM_COMMAND:

SET(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -fno-strict-aliasing")

EXECUTE_PROCESS(COMMAND $RUBY_EXECUTABLE -r rbconfig -e "print Config::CONFIG['vendorarchdir']" OUTPUT_VARIABLE RUBY_VENDOR_ARCH_DIR)

MESSAGE(STATUS "Ruby executable: $RUBY_EXECUTABLE")
MESSAGE(STATUS "Ruby vendor arch dir: $RUBY_VENDOR_ARCH_DIR")
MESSAGE(STATUS "Ruby include path: $RUBY_INCLUDE_PATH")

SET( SWIG_OUTPUT "$CMAKE_CURRENT_BINARY_DIR/yui_ruby.cxx" )

ADD_CUSTOM_COMMAND (
   OUTPUT  $SWIG_OUTPUT
   COMMAND $CMAKE_COMMAND -E echo_append "Creating wrapper code for ruby..."
   COMMAND $SWIG_EXECUTABLE -c++ -ruby -autorename -o $SWIG_OUTPUT -I$LIBYUI_INCLUDE_DIR $SWIG_INPUT
   COMMAND $CMAKE_COMMAND -E echo "Done."
   WORKING_DIRECTORY $CMAKE_CURRENT_BINARY_DIR
   DEPENDS $CMAKE_CURRENT_SOURCE_DIR/../*.i
)

ADD_LIBRARY( yui_ruby SHARED $SWIG_OUTPUT )
INCLUDE_DIRECTORIES( $RUBY_INCLUDE_PATH $LIBYUI_INCLUDE_DIR )

SET_TARGET_PROPERTIES( yui_ruby PROPERTIES PREFIX "" OUTPUT_NAME "yui")

TARGET_LINK_LIBRARIES( yui_ruby $LIBYUI_LIBRARY )
TARGET_LINK_LIBRARIES( yui_ruby $RUBY_LIBRARY )

INSTALL(TARGETS yui_ruby LIBRARY DESTINATION $RUBY_VENDOR_ARCH_DIR)

我假设您的版本不工作,因为 .so 文件中的“lib”前缀。这正是我们这样做的原因

SET_TARGET_PROPERTIES( yui_ruby PROPERTIES PREFIX "" OUTPUT_NAME "yui")

为了得到 yui.so 而不是 libyui.so。

还要确保安装 .so 文件的路径位于 ruby​​ 加载路径中。

【讨论】:

谢谢@duncan。这种方法对我有用。我还将尝试将 SET_TARGET_PROPERTIES 方法与 SWIG 宏一起使用。 Ruby 1.9 警告我这已被弃用。我将其调整为ruby -r rbconfig -e "print RbConfig::CONFIG['vendorarchdir']"

以上是关于Ruby 和 SWIG 与 CMake的主要内容,如果未能解决你的问题,请参考以下文章

Typedef、Ruby 和 SWIG

使用 SWIG 跨 C++ 和 Ruby 的多态性

通过 SWIG 从 Ruby 调用 Boost?

swig 对基类“std::string”一无所知,被忽略

将 SWIG 与 C++ 模板函数一起使用

如何实现 C/C++ 与 Python 的通信