On Thu, Aug 6, 2009 at 2:46 PM, Mathieu Malaterre<mathieu.malate...@gmail.com> wrote: > On Thu, Aug 6, 2009 at 2:27 PM, Stephen Roderick<kiwi....@mac.com> wrote: >> On Aug 6, 2009, at 06:02 , Mathieu Malaterre wrote: >> >>> On Wed, Aug 5, 2009 at 6:55 PM, Stephen Roderick<kiwi....@mac.com> wrote: >>>> >>>> The existing UseSWIG.cmake file creates a MODULE and not a SHARED >>>> library. >>>> The module is unuseable by any program trying to load dynamic libraries >>>> (eg >>>> wrapped Java). The attached patch fixes this problem for our situations. >>>> Demonstrated on both Mac OS X Leopard and Ubuntu Jaunty. >>>> >>>> Is this a known issue? I searched what I could of the list and the 'net, >>>> and >>>> couldn't find anything on this. >>> >>> No, you are confusing the C++ library and the Java binding. Instead: >>> >>> ADD_LIBRARY(foo SHARED ${foo_SRCS}) # the actual shared lib >>> SWIG_ADD_MODULE(foojni java foo.i) >>> SWIG_LINK_LIBRARIES(foojni foo >>> ${JNI_LIBRARIES} >>> ) >>> >>> The next time you will want to create -say- a python module you'll >>> simply link to your *shared C++* library: >>> >>> SWIG_ADD_MODULE(foopython python foo.i) >>> SWIG_LINK_LIBRARIES(foopython foo >>> ${PYTHON_LIBRARIES} >>> ) >> >> Unfortunately, that is what we currently have. >> >> <code> >> ADD_LIBRARY(MyInterfaceCpp ...) >> >> Find_Package(SWIG REQUIRED) >> Find_Package(JNI REQUIRED) >> INCLUDE(UseSWIG) >> INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}) >> >> SET_SOURCE_FILES_PROPERTIES(MyInterface.i PROPERTIES CPLUSPLUS 1) >> # compile swig with package flag >> SET(CMAKE_SWIG_FLAGS -package x.y.z) >> >> SWIG_ADD_MODULE(MyInterface java MyInterface.i) >> SWIG_LINK_LIBRARIES(MyInterface >> MyInterfaceCpp ...) >> </code> >> >> The failure comes when you try to load the SWIG-output, JNI library from >> within java, using something like >> <code> >> static { >> System.loadLibrary("MyInterface"); >> } >> </code> >> >> With a module in a "MyInterface.so" file (what SWIG currently outputs), the > > No. On Linux 'lib' is always preprended, even for MODULE. I am not > sure about MacOSX. > >> above call fails on both Mac OS X and Linux. They both need a correctly >> named dynamic library, hence the patch. > > I have been using this in gdcm and it works fine on Linux: > > http://gdcm.svn.sf.net/viewvc/gdcm/trunk/Wrapping/Java/gdcm.i?r1=5779&r2=5799
My bad... I forgot that SWIG stuff always override the 'lib' setting, hence you have to revert it: http://gdcm.svn.sf.net/viewvc/gdcm/trunk/Wrapping/Java/CMakeLists.txt?view=markup See comments: ... IF(UNIX) SET_TARGET_PROPERTIES(${SWIG_MODULE_gdcmjni_REAL_NAME} PROPERTIES PREFIX "lib") ENDIF(UNIX) ... I think this comes from the SWIG module initially designed based on the python requirement where '_' would be preprended before the actual lib name. Sorry for the confusion. -- Mathieu http://mathieumalaterre.com _______________________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake