> 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.vilchans...@gmail.com <mailto:oleksii.vilchans...@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
signature.asc
Description: OpenPGP digital signature
-- 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