Re: [CMake] set CMAKE_INSTALL_PREFIX in CMakeLists
On Nov 30, 2010, at 16:03 , David Cole wrote: If we want this unintentional behavior to continue working as is into the future, we should add a test for this behavior and make the test fail if the value of CMAKE_INSTALL_PREFIX is not as expected at the bottom of CMakeLists... I think it is a useful behavior to have. We use it within an enterprise environment to set a reasonable default, if the user hasn't specifically overridden it. As one other commentor stated though, as a project developer (not CMake) you need to make this very obvious in case the user tries to figure out why something was installed somewhere (without the user telling it anything)! S ___ 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
Re: [CMake] UseSWIG creates module instead of shared library, which can't be dynamically loaded
On Aug 6, 2009, at 06:02 , Mathieu Malaterre wrote: On Wed, Aug 5, 2009 at 6:55 PM, Stephen Roderickkiwi@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 above call fails on both Mac OS X and Linux. They both need a correctly named dynamic library, hence the patch. After searching some more I did find a previous post of this on the CMake ML, and the solution there is basically the same as mine (except the user copied the SWIG macro into their own CMakeLists.txt and then made the same changes). If that poster and myself are not doing anything wrong, then UseSWIG.cmake needs to be modified to support both naming styles. Else others will just hit this again in the future. http://www.cmake.org/pipermail/cmake/2008-October/024727.html TIA Stephen ___ 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
Re: [CMake] UseSWIG creates module instead of shared library, which can't be dynamically loaded
On Aug 6, 2009, at 10:23 , Clinton Stimpson wrote: On 08/06/2009 06:49 AM, Mathieu Malaterre wrote: On Thu, Aug 6, 2009 at 2:46 PM, Mathieu Malaterremathieu.malate...@gmail.com wrote: On Thu, Aug 6, 2009 at 2:27 PM, Stephen Roderickkiwi@mac.com wrote: On Aug 6, 2009, at 06:02 , Mathieu Malaterre wrote: On Wed, Aug 5, 2009 at 6:55 PM, Stephen Roderickkiwi@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=5779r2=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. And for python on Windows, I've had to do set_target_properties(... PROPERTIES SUFFIX .pyd) or the module doesn't work with some versions of python. We had to do both to get this right for Mac and Linux # force SWIG to generate a libXXX[.dylib] module file, not just XXX.so IF(UNIX) SET_TARGET_PROPERTIES(${SWIG_MODULE_xxx_REAL_NAME} PROPERTIES PREFIX lib) IF(APPLE) SET_TARGET_PROPERTIES(${SWIG_MODULE_xxx_REAL_NAME} PROPERTIES SUFFIX .dylib) ENDIF(APPLE) ENDIF(UNIX) It would be nice if the UseSWIG.cmake file would figure this out for itself, but it might be a little complicated as is dependant on both target language and operating system. Thanks for your help! Stephen ___ 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
[CMake] UseSWIG creates module instead of shared library, which can't be dynamically loaded
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. Stephen code -- UseSWIG.cmake-save 2009-03-19 16:04:20.0 -0400 +++ UseSWIG.cmake 2009-03-19 16:04:44.0 -0400 @@ -33,7 +33,7 @@ MESSAGE(FATAL_ERROR SWIG Error: Language \${language}\ not found) ENDIF(x${SWIG_MODULE_${name}_LANGUAGE}x MATCHES ^xUNKNOWNx$) - SET(SWIG_MODULE_${name}_REAL_NAME ${name}) + SET(SWIG_MODULE_${name}_REAL_NAME lib${name}) IF(x${SWIG_MODULE_${name}_LANGUAGE}x MATCHES ^xPYTHONx$) SET(SWIG_MODULE_${name}_REAL_NAME _${name}) ENDIF(x${SWIG_MODULE_${name}_LANGUAGE}x MATCHES ^xPYTHONx$) @@ -187,7 +187,7 @@ SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${swig_extra_clean_files};$ {swig_generated_sources}) ADD_LIBRARY(${SWIG_MODULE_${name}_REAL_NAME} -MODULE +SHARED ${swig_generated_sources} ${swig_other_sources}) SET_TARGET_PROPERTIES(${SWIG_MODULE_${name}_REAL_NAME} /code ___ 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