[CMake] INTERFACE library and path to source.

Oleksii Vilchanskyi oleksii.vilchanskyi at gmail.com
Fri Dec 8 19:37:40 EST 2017


Hello Eric,

> Why should I do that?
> Is this the expected behavior / way to create header only library?

Yes, this is the expected behaviour. CMake interprets a relative path to
the file according to the target's add_library() or add_executable()
call directory. I will provide a minimal, reproducible example:

> .
> ├── CMakeLists.txt
> ├── lib
> │   ├── CMakeLists.txt
> │   └── lib.h
> └── main
>     ├── CMakeLists.txt
>     └── main.c

First listfile:

> cmake_minimum_required(VERSION 3.10)
> project(main LANGUAGES C)
> add_subdirectory(lib)
> add_subdirectory(main)

Listfile under `lib`:

> add_library(lib INTERFACE)
> target_include_directories(lib INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}")
> target_sources(lib INTERFACE "lib.h")

Listfile under `main`:

> add_executable(main "main.c")
> target_link_libraries(main PRIVATE lib)

Now, let's look at the diagnostics:

> CMake Error at main/CMakeLists.txt:1 (add_executable):
>   Cannot find source file:
> 
>     lib.h

So, the problem occurs when CMake cannot find `lib.h` relatively to
`add_executable(main "main.c")` call. Whether it's the expected
behaviour is debatable (I personally would prefer CMake to search
relatively to `add_library(lib INTERFACE)`), and the documentation is
silent on this caveat either, so there's that.

One way to solve this is to provide a path to `lib.h` relatively to
`main` directory, another way is to provide a full path.
On 12/8/17 4:42 PM, Eric Noulard wrote:
> Hi there,
> 
> I encounter a weird issue with header-only library.
> 
> Somewhere in my source tree I have an header library which consist in a
> bunch of headers:
> 
> The concerned CMakeLists.txt looks like this:
> 
> add_library(MyHeaderLIB INTERFACE)
> 
> target_include_directories(MyHeaderLIB INTERFACE
>     ${CMAKE_CURRENT_SOURCE_DIR})
> 
> target_sources(MyHeaderLIB INTERFACE
>   whatever.h)
> 
> 
> Somewhere else (in another directory) I have another CMakeLists.txt:
> 
> add_executable(myexe myexe.cpp)
> target_link_libraries(myexe MyHeaderLIB)
> 
> and CMake complains when processing it that he cannot find "whatever.h"...
> 
> The problem disappear if I use full path in target_source, i.e.:
> 
> target_sources(MyHeaderLIB INTERFACE
>  ${CMAKE_CURRENT_SOURCE_DIR}/whatever.h)
> 
> 
> Why should I do that?
> I this the expected behavior / way to create header only library?
> 
> 
> -- 
> Eric
> 
> 

-- 
Regards,
Oleksii Vilchanskyi
PGP:0x8D3A0E046BDE941F2A53867CE3FD952D48C0B338

***
All the world's a pipeline,
And all the men and women merely instructions.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://public.kitware.com/pipermail/cmake/attachments/20171209/7350ff83/attachment.sig>


More information about the CMake mailing list