On 2013-04-03 22:06, Saad Khattak wrote:
Hi,

I am trying my best to understand CMake's install and export commands so
that separate projects are able to find libraries easily.

I am having a tremendously hard time understand what CMake is doing. After
'add_library()' where the library is called 'myLib' I called the following:

install(TARGETS myLib
     DESTINATION ${PROJECT_BINARY_DIR}/lib/
     EXPORT repoA-targets
     )

You're installing to your build directory. Don't do that. You should install to the install prefix, which is most easily done by not specifying a full path to DESTINATION (the prefix is automatically prepended to relative paths).

Also, you should install to 'lib${LIB_SUFFIX}', not 'lib'. This will allow you (and distros packaging your software) to set LIB_SUFFIX to separate arch-specific components of 32- and 64-bit builds. E.g. on Linux, lib_suffix is usually ''/'64' or '32'/'', and on Windows might be ''/'/amd64'.

That is only part of the problem. Now in RepoB, I want to import the
libraries. CMake documentation here:
http://www.cmake.org/Wiki/CMake/Tutorials/Exporting_and_Importing_Targets

states that I can do something like this:
include(${PATH_OF_REPO_A_BUILD}/repoA-targets.cmake)

You can, but I wouldn't recommend it. Instead, you should create a 'repoAConfig.cmake' that is installed by repoA, which does this for you. Then use repoA with 'find_package(repoA)'.

Usually I generate (with @ONLY) a FooConfig.cmake and FooConfig-install.cmake with each containing an appropriate Foo_INCLUDE_DIRS. The first, intended for using your package from the build directory, will set its include directories to locations in your source and/or build. The second usually uses @CMAKE_INSTALL_PREFIX@/include, and is installed with the RENAME option to rename it 'back' to FooConfig.cmake.

Besides setting the INCLUDE_DIRS, it should include the line:

include("${CMAKE_CURRENT_LIST_DIR}/FooTargets.cmake")

target_link_libraries(repoBExecutable myLib)

...and then you can do this.

Some things to check if it is not working:

- Open repoATargets.cmake and verify that it is declaring an imported 'myLib' target.
- if(NOT TARGET myLib)
    message(SEND_ERROR "myLib not a target?!")
  endif()

It may also be beneficial to look at an existing CMake project...

--
Matthew

--

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

Reply via email to