Pascal Fleury wrote:
How do I figure out that mylib.(a|lib) needs, e.g., the ws2_32.lib on Windows or the sockets.so on linux ? I just found the mylib_LIB_DEPENDS variable in the cache, but it is in a section that says internal, and it does not seem to be the portable way to do it.

The autotools way would be to write a test program, and use TRY_COMPILE to walk a list of libraries that might allow the program to compile. From that, you set a variable to the name of the library that provides the needed feature, and then use either LINK_LIBRARIES (not preferred) or TARGET_LINK_LIBRARIES.

In my project, I wrote this macro:

MACRO(CHECK_LIBRARY LIB_NAME LIB_DESC LIB_TEST_SOURCE)
    SET(HAVE_${LIB_NAME})
    MESSAGE(STATUS "Checking for ${LIB_DESC} library...")
    TRY_COMPILE(HAVE_${LIB_NAME} ${CMAKE_BINARY_DIR}/.cmake_temp
                ${CMAKE_SOURCE_DIR}/cmake/${LIB_TEST_SOURCE})
    IF(HAVE_${LIB_NAME})
        # Don't need one
        MESSAGE(STATUS "Checking for ${LIB_DESC} library... none needed")
    ELSE(HAVE_${LIB_NAME})
        # Try to find a suitable library
        FOREACH(lib ${ARGN})
            TRY_COMPILE(HAVE_${LIB_NAME} ${CMAKE_BINARY_DIR}/.cmake_temp
                        ${CMAKE_SOURCE_DIR}/cmake/${LIB_TEST_SOURCE}
                        CMAKE_FLAGS -DLINK_LIBRARIES:STRING=${lib})
            IF(HAVE_${LIB_NAME})
MESSAGE(STATUS "Checking for ${LIB_DESC} library... ${lib}")
                SET(HAVE_${LIB_NAME}_LIB ${lib})
            ENDIF(HAVE_${LIB_NAME})
        ENDFOREACH(lib)
    ENDIF(HAVE_${LIB_NAME})
    # Unable to find a suitable library
    IF(NOT HAVE_${LIB_NAME})
        MESSAGE(STATUS "Checking for ${LIB_DESC} library... not found")
    ENDIF(NOT HAVE_${LIB_NAME})
ENDMACRO(CHECK_LIBRARY)

...the LIB_NAME param controls the name of the variable(s) that are set if it finds the library. LIB_DESC is used for the status messages. An example usage might be:

CHECK_LIBRARY(SCK socket scktest.c socket xnet ws2_32)

(xnet is IIRC the lib used on Solaris, which illustrates why you probably shouldn't just use something based on IF(UNIX)/IF(WIN32).)


I don't know if there is a canonical better way; there is CHECK_FUNCTION_EXISTS, but I can imagine that tripping up on some platform where the function seems to exist but can't be called.

There certainly might be a module for any particular library you are interested in.

--
Matthew
PIE INCOMING!!!

_______________________________________________
CMake mailing list
[email protected]
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to