[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