On Wed, Apr 3, 2019 at 11:10 AM Michele Rosso <mro...@lbl.gov> wrote:

> Hello,
> according to the doc for CMake 3.14, target_sources() interprets relative
> source file paths as being relative to the current source directory, i.e.
> it should
> prepend CMAKE_CURRENT_SOURCE_DIR to the relative paths given by the user.
> However, this is not the case if the target and the sources are defined in
> the same directory.
>

The docs say that target_sources() will *interpret* relative source file
paths that way, but they do not state that it will prepend
CMAKE_CURRENT_SOURCE_DIR. The docs for target_sources() only talk about how
relative paths are interpreted. The docs for policy CMP0076 are a bit more
explicit, but even they only say that target_sources() will convert the
relative path to absolute *if the conditions also specified in those policy
docs are met*. In the case where target_sources() is called in the same
directory as where the target is defined, the target's SOURCE_DIR property
and the CMAKE_CURRENT_SOURCE_DIR variable will hold the same value, so the
relative path is not modified, as per the CMP0076 docs.



> I attached a simple example to reproduce the issue. The structure of the
> example is as follows:
>
> - cmake-bug/
>      - CMakeLists.txt
>      - main.cpp
>      - foo/
>         - CMakeLists.txt
>         - foo.H
>         - foo.cpp
>      - bar/
>         - CMakeLists.txt
>         - bar.H
>         - bar.cpp
>
> Target "main.exe" is defined in the top-level CMakeLists.txt, while its
> headers and sources are located in the the top-level directory
> and in the sub-directories 'foo' and 'bar'.
> After target_sources is used to include all the headers and sources, I
> retrieve the "SOURCES" property for  `main.exe`: all the sources and headers
> but  `main.cpp` are given the correct (absolute) path.
>
> Is this the intended behavior? If so, why should a source file located in
> the same directory where the target is defined be treated any differently?
>

Yes, this is the intended behavior. There's no need to modify the path when
target_sources() is called in the same directory as that in which the
target is defined because the behavior is unambiguous and is the same
whether CMP0076 is set to OLD or NEW. This is consistent with what you'd
get if you had listed the sources directly in the add_executable() or
add_library() call instead.


-- 
Craig Scott
Melbourne, Australia
https://crascit.com

Get the hand-book for every CMake user: Professional CMake: A Practical
Guide <https://crascit.com/professional-cmake/>
-- 

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:
https://cmake.org/mailman/listinfo/cmake

Reply via email to