Filed new bug https://gitlab.kitware.com/cmake/cmake/issues/19475

Le jeu. 13 juin 2019 à 11:06, Marc Herbert <marc.herb...@gmail.com> a
écrit :

> Ping?
>
> I'd like to file a bug but I don't know what is the intended behavior:
> 1. Should binary_dir work even when no target?
> 2. Should CMake warn/error that binary_dir is not supported unless targets
> are used?
>
> Marc
>
> Le mar. 4 juin 2019 à 12:05, Marc Herbert <marc.herb...@gmail.com> a
> écrit :
>
>> tl;dr: should there be at least one target per CMakeLists.txt?
>>
>> https://cmake.org/cmake/help/v3.14/command/add_subdirectory.html
>> > add_subdirectory(source_dir [binary_dir] )
>> > "The binary_dir specifies the directory in which to place the output
>> files. [...] If binary_dir is not specified, the value of source_dir,
>> before expanding any relative path, will be used (the typical usage)."
>>
>> I found this part of the documentation to be correct ONLY when the
>> subdirectory defines and uses its own "sub-"target(s). If the subdirectory
>> refers to higher main targets instead then binary_dir/ is just a decoy: the
>> subdirectory build happens elsewhere. binary_dir is a decoy whether it's
>> explicit or default. It exists but there are only totally generic and
>> unused files there.
>>
>> Example:
>>
>> mainsrc/
>> ├── CMakeLists.txt
>> ├── inmodule
>> │   ├── CMakeLists.txt
>> │   ├── infile.c
>> └── mainfile.c
>>
>>
>> # mainsrc/CMakeLists.txt
>> add_executable(mainexe mainfile.c)
>> add_subdirectory(inmodule [ decoy_binary_dir ] )
>>
>> # mainsrc/inmodule/CMakeLists.txt
>> target_sources(mainexe PRIVATE infile.c) # <= direct reference, no
>> sub-target
>>
>>
>> cmake -GNinja -B build -S mainsrc && ninja -C build
>>
>> build
>> ├── CMakeFiles
>> │   ├──
>> │   ├── mainexe.dir
>> │   │   ├──
>> │   │   ├──
>> │   │   ├── inmodule       <= ACTUAL binary_dir!
>> │   │   │   └── infile.c.o
>> │   │   ├── mainfile.c.o
>> │   │   ├──
>> │   │   :
>> │   ├──
>> │   :
>> ├── inmodule       <= decoy with unused, boilerplate files and no
>> reference to any code
>> │   ├── CMakeFiles/
>> │   ├── cmake_install.cmake
>>
>>
>> The midly irritating part is that cmake complains about the lack of a
>> binary_dir argument if the module is an _out-of-tree_ subdirectory:
>>
>> CMake Error at CMakeLists.txt:5 (add_subdirectory):
>>   add_subdirectory not given a binary directory but the given source
>>   directory "~/cmake-test/outmodule" is not a subdirectory of
>>   "~/cmake-test/maindir".  When specifying an out-of-tree source
>>   a binary directory must be explicitly specified.
>>
>> That request makes sense of course except... when given that binary_dir
>> argument it requested, it's still becomes a decoy as described above.
>> This is the actual (and funny) binary_dir /in this out-of-tree case:
>> build
>> ├── CMakeFiles
>> │   ├── mainexe.dir
>> │   │   └── home
>> │   │       └── joe
>> │   │           └── cmake-test
>> │   │               └── outmodule
>> │   │                   └── outfile.c.o
>>
>>
>>
>> Reproduced with cmake version 3.14.4. No difference between make and
>> ninja.
>>
>> Researching the interwebs most people, tutorials and other documents seem
>> to assume (at least) one target per CMakeLists.txt. Should such a
>> recommendation be made more official to avoid the sort of confusion above?
>> Could this recommendation avoid other, unrelated problems I haven't
>> experienced? Yet?
>>
>> Marc
>>
>
-- 

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