[CMake] INTERFACE library and path to source.

Oleksii Vilchanskyi oleksii.vilchanskyi at gmail.com
Mon Dec 11 09:12:54 EST 2017


> I'm not that sure that this is the "expected" behavior

Yes, now it looks like a bug to me, too. Being written as it was in the
last message,
> target_sources(lib INTERFACE lib.h)
can be treated as the equivalent of
> target_sources(main PRIVATE lib.h)
(and therefore generating an error).

However,
> target_include_directories(lib INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}")
on the command line resolves to
> -I/home/l2y/<...>/lib
and
> target_include_directories(lib INTERFACE ".")
resolves to
> -I/home/l2y/<...>/lib/.

Also, looking at `<build_dir>/main/CMakeFiles/main.dir/depend.internal`:

> main/CMakeFiles/main.dir/main.c.o
>  ../lib/lib.h
>  /home/l2y/<...>/main/main.c
So, all elements in `target_include_directories()` resolve to full
paths, as well as `target_sources()`, while `target_sources(INTERFACE)`
stay relative, which causes trouble.

On 11.12.2017 09:20, Eric Noulard wrote:
> 
> 
> 2017-12-09 1:37 GMT+01:00 Oleksii Vilchanskyi
> <oleksii.vilchanskyi at gmail.com <mailto:oleksii.vilchanskyi at gmail.com>>:
> 
>     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:
> 
> 
> Hi Oleksii,
> 
> Thanks you for the minimal reproducible example.
> I'm bot that sure that this is the "expected" behavior
>  
> 
>     Listfile under `lib`:
> 
>     > add_library(lib INTERFACE)
>     > target_include_directories(lib INTERFACE
>     "${CMAKE_CURRENT_SOURCE_DIR}")
>     > target_sources(lib INTERFACE "lib.h")
> 
> 
> With the previous one would expect that any target linking to this
> interface target
> will be provided with the include directories provided in its interface.
> In your case (and in mine too) this is given with **full path**
>  
> 
> 
>     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.
> 
> 
> Yes precisely. This seems to work OK for imported targets but not for
> header-only in-project lib.
>  
> 
> 
>     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.
> 
> 
> We (you and me) already provide 
>  target_include_directories
> with full path.
> 
> I cannot provide the file themselves with relative path since they may
> be used
> from different place.
> 
> I guess I will open an issue unless someone explain me the rational
> behind that behavior.
> 
> 
> -- 
> Eric

-- 
Regards,
Oleksii Vilchanskyi
PGP:0x8D3A0E046BDE941F2A53867CE3FD952D48C0B338

-------------- 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/20171211/40be0201/attachment.sig>


More information about the CMake mailing list