[CMake] Package found - passing _INCLUDE_DIRS to include_directories() and _LIBRARIES to target_link_libraries()

Michael Darling darlingm at gmail.com
Sat Jul 19 22:21:09 EDT 2014


I definitely want the automatic include directory adding, and also
automatic target_link_library adding.

I'm totally confused when I'd want to use an import target, and when I'd
want to use an interface target, and what a good definition is for each.  I
see interface libraries state: "A primary use-case for interface libraries
is header-only libraries", and "an interface target has no location and is
mutable, but is otherwise similar to an imported target."  My libraries
have separate implementation and are not header-only libraries.  But, it
says "primary use-case" not "only for header-only libraries".

And, what's a clear definition for the difference between an import or
interface target, vs a standard statically linked library?

If it isn't too much trouble or many changes, would anyone be willing to
change the attached example to the appropriate new type of target, so the
include directories and target_link_libraries automatically propegate?  I'm
just looking to get to the point where they compile in place - not worried
about the install parts.  I think I'm getting lost without being able to
find a reduced case whole example of both the library and the applications
using it.

On Fri, Jul 18, 2014 at 11:19 PM, Walter Gray <chrysalisx at gmail.com> wrote:

>  Unless I'm mistaken, it says that the *CONVENTION* is to call
> include_directories(${<PACKAGE-NAME>_INCLUDE_DIRS}) manually, not that it
> is done automatically.  To get that kind of automatic include directory
> adding you need to have an import or interface target with
> INTERFACE_INCLUDE_DIRECTORIES defined by the find module, then link with
> that.  Take a look at topics related to Interface Libraries [1] and writing
> modern find modules [2]
>
> [1]
> http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#interface-libraries
> [2]
> http://www.cmake.org/cmake/help/v3.0/manual/cmake-developer.7.html#find-modules
>
>
> On 7/18/2014 7:31 PM, Michael Darling wrote:
>
>
> http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries#How_package_finding_works
>
>  seems to indicate if <PACKAGE-NAME>_FOUND is found, the
> <PACKAGE-NAME>_INCLUDE_DIRS is passed to the include_directories() command,
> and <PACKAGE-NAME>_LIBRARIES is passed to target_link_libraries()
>
>  Why is the reduced-case code below calling g++ without including
> "-I~/codeTestPackages/lib", causing a "app/app.cpp:1:17: fatal error:
> lib.h: No such file or directory" ?
>
>  I'm on CMake v3.0.0.  Also tried CMake v3.0.20140718-g36a81 (git source.)
>
>  All the source is below, and attached as a .tar.gz.
>
>
>  *### CMakeLists.txt ###*
>
>  cmake_minimum_required(VERSION 3.0)
> project(codeTestPackages)
> set(CMAKE_VERBOSE_MAKEFILE on)
>  set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
> ~/codeTestPackages/findModules)
>  add_subdirectory(lib)
>  add_subdirectory(app)
>
>  *### findModules/Findlib.cmake ###*
>
>  IF(NOT lib_FOUND)
>    set(lib_FOUND "yes")
>    message("lib_FOUND is ${lib_FOUND}")
>    set(lib_INCLUDE_DIRS ~/codeTestPackages/lib)
>    set(lib_LIBRARIES lib)
> ENDIF(NOT lib_FOUND)
>
>  *### lib/CMakeListst.txt ###*
>
>  include_directories(~/codeTestPackages/lib)
> add_library(lib lib.cpp)
>
>  *### lib/lib.h ###*
>
>  #ifndef __LIB__
> #define __LIB__
> namespace LIB {
>  unsigned long libFunc(unsigned long inValue);
>  }
>  #endif
>
>  *### lib/lib.cpp ###*
>
>  #include <lib.h>
> namespace LIB {
>  unsigned long libFunc(unsigned long inValue) {
>     return inValue+1;
> }
> }
>
>  *### app/CMakeLists.txt ###*
>
>  find_package(lib REQUIRED)
> add_executable(app app.cpp)
>
>  *### app/app.cpp ###*
>
>  #include <lib.h>
> using namespace LIB;
>
>  int main() {
>    unsigned long x = 1;
>    unsigned long y = libFunc(x);
> }
>
>
>
>
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20140719/4c8db306/attachment.html>


More information about the CMake mailing list