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