2012-05-09 12 views
3

誰でもSWake経由でRubyバインディングを作成するのにCMakeを使用していましたか?私は、私のCMakeファイルでSWIG経由でPythonバインディングを作成するための実例を持っていますが、Rubyバインディングを作成するために同じアプローチを使用すると、実際のRubyファイルは作成されません。作業中のPythonバインディングでは、Pythonファイルが作成されます。RubyとSWIG with CMake

ここに私の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バインディングを作成していました!

答えて

3

私たちはそれを使用します。あなたはこれらの実施例に外観を与えることができます。

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") 

libyui.soの代わりにyui.soを取得するためです。

また、.soファイルをインストールするパスがルビロードパスにあることを確認してください。

+0

ありがとう@duncan。このアプローチは私のために働いた。また、SWIGマクロでもSET_TARGET_PROPERTIESアプローチを使用してみます。 – Bryan

+0

Ruby 1.9は、これが欠けていると私に警告します。私はそれを 'ruby -r rbconfig -e 'に調整しますprint RbConfig :: CONFIG [' vendorarchdir ']" ' – Sqeaky