[CMake] Unreliable Find*.conf

Damian Philipp damian.philipp at gmx.net
Wed Mar 18 02:23:12 EDT 2015


Hello cmake-experts,

I am working on a project that uses a third-party library delivered in
binary form (TeamSpeak 3 SDK). My project is supposed to build on Win,
Linux, and OSX, so I decided to use cmake as a build tool. I have
started work on a Findts3sdk.cmake (find_package() in module mode) to
let cmake detect the library in the CMAKE_PREFIX_PATH on any of my
machines - file attached at the end of this mail.

My (current) problem is that a call to find_path() in my
Findts3sdk.cmake will not pick up the bin directory containing the
libraries, while another call did work to find the include directory.

WORKS (ts3sdk_INCLUDE_DIR == /path/to/ts3_sdk_3.0.3/include):
> find_path(ts3sdk_INCLUDE_DIR NAMES clientlib.h HINTS ${CMAKE_PREFIX_PATH}/include)

BROKEN (ts3sdk_LIBRARY_DIR == ts3sdk_LIBRARY_DIR-NOTFOUND):
> find_path(ts3sdk_LIBRARY_DIR NAMES libts3client_mac.dylib HINTS ${CMAKE_PREFIX_PATH}/bin)

I deduce from this that CMAKE_PREFIX_PATH is set correctly. I have tried
the broken command with other names of the library file as well
(ts3client_mac, libts3client_mac, libts3client_mac.dylib,
ts3client_mac.dylib).

What do I have to fix to make find_path() pick up the library file?

I am currently on a Mac, using cmake 3.1.3 installed from MacPorts.
cmake is called with -DCMAKE_PREFIX_PATH="/path/to/ts3_sdk_3.0.3".
The layout of the library delivery is as follows:

> ts3_sdk_3.0.3
> ├── bin
> │   ├── libts3client_linux_amd64.so
> │   ├── libts3client_linux_x86.so
> │   ├── libts3client_mac.dylib
> │   ├── libts3server_freebsd_amd64.so
> │   ├── libts3server_freebsd_x86.so
> │   ├── libts3server_linux_amd64.so
> │   ├── libts3server_linux_x86.so
> │   ├── libts3server_mac.dylib
> │   ├── soundbackends
> │   ├── ts3client_win32.dll
> │   ├── ts3client_win64.dll
> │   ├── ts3server_win32.dll
> │   └── ts3server_win64.dll
> ├── include
> │   ├── clientlib.h
> │   ├── clientlib_publicdefinitions.h
> │   ├── public_definitions.h
> │   ├── public_errors.h
> │   ├── serverlib.h
> │   └── serverlib_publicdefinitions.h
> └── lib
>     ├── ts3client_win32.lib
>     ├── ts3client_win64.lib
>     ├── ts3server_win32.lib
>     └── ts3server_win64.lib

My current Findts3sdk.conf looks as follows:

> # Find the INCLULDE and LIBRARY path
> find_path(ts3sdk_INCLUDE_DIR NAMES clientlib.h HINTS ${CMAKE_PREFIX_PATH}/include)
> 
> if (WIN32)
> 	set(ts3sdk_client_LIBRARIES ts3client_win32 ts3client_amd64)
> 	set(ts3sdk_server_LIBRARIES ts3server_win32 ts3server_amd64)
> elseif (APPLE)
> 	set(ts3sdk_client_LIBRARIES ts3client_mac)
> 	set(ts3sdk_server_LIBRARIES ts3server_mac)
> elseif (UNIX)
> 	set(ts3sdk_client_LIBRARIES ts3client_linux_x86 ts3client_linux_amd64)
> 	set(ts3sdk_server_LIBRARIES ts3server_linux_x86 ts3server_linux_amd64)
> endif()
> 
> #find_path(ts3sdk_LIBRARY_DIR NAMES ${ts3sdk_client_LIBRARIES} HINTS ${CMAKE_PREFIX_PATH}/bin)
> find_path(ts3sdk_LIBRARY_DIR NAMES ts3client_mac.dylib HINTS ${CMAKE_PREFIX_PATH}/bin)
> #find_path(ts3sdk_LIBRARY_DIR NAMES ${ts3sdk_client_LIBRARIES} ${ts3sdk_server_LIBRARIES} HINTS ${CMAKE_PREFIX_PATH}/bin)
>
> # Combine into output information
> set(ts3sdk_INCLUDE_DIRS ${ts3sdk_INCLUDE_DIR})
> set(ts3sdk_LIBRARY_DIRS ${ts3sdk_LIBRARY_DIR})
> 
> message(STATUS "ts3sdk headers found in " ${ts3sdk_INCLUDE_DIRS})
> message(STATUS "ts3sdk libraries used: " ${ts3sdk_client_LIBRARIES})
> message(STATUS "ts3sdk libraries found in " ${ts3sdk_LIBRARY_DIR})

Regards,
Damian Philipp


More information about the CMake mailing list