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.
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