[CMake] CmakeLists chain cannot find source added with add_custom_command

J Decker d3ck0r at gmail.com
Wed Jul 5 07:05:34 EDT 2017


Was more of a style thing... I had (from another project) a cmakelists
includable script that builds an amalgamation of sources (makes the
compilation much faster overall because it doesn't have to read megs of
headers for windows.h et al. for 50 sources but then only 1.) so I was
updating to use this script, I already had a folder 'portable' which did
more of a source based build instead of pulling various DLLs.... so it was
like
.../loader (the main project, that links to dlls)  included common
amalgamation maker here
.../loader/portable  (the static builds of the same sources) that really
only contains a single CMakeLists.txt, so rather than use the sources,
updated to use the amalgamation instead, and it blew up.

I ended up just moving the portable/CMakeLists.txt to
CMakeLists.portable.txt and including that instead.

Just caught me off guard that it would keep custom targets private to a
directory instead of making it globally available.  Which would complicate
implementing this more in lots of other 'portable' (single exe, no DLL
builds)  But I guess I could create a target that's that amalgamation
compiled to a static library that could then be referenced by other
projects.



On Wed, Jul 5, 2017 at 3:34 AM, Eric Noulard <eric.noulard at gmail.com> wrote:

> OK right.
> I missed the proper FAQ entry, thanks Nicholas for pointing it out.
>
> Eric
>
> 2017-07-05 12:10 GMT+02:00 Nicholas Devenish <ndevenish at gmail.com>:
>
>> Hi,
>>
>> It looks like this is the issue covered in
>> https://cmake.org/Wiki/CMake_FAQ#How_can_I_add_a_dependency_
>> to_a_source_file_which_is_generated_in_a_subdirectory.3F
>> and bug https://gitlab.kitware.com/cmake/cmake/issues/14633 ? I
>> suppose if you are writing your own systems from scratch it's easy not
>> to run into this, but a lot easier when converting existing
>> complicated build systems.
>>
>> I kind of agree that it's easy to miss this constraint reading the
>> documentation, but there doesn't seem to be a better suggested
>> solution yet.
>>
>> Nick
>>
>>
>> On Sun, Jul 2, 2017 at 11:57 AM, Eric Noulard <eric.noulard at gmail.com>
>> wrote:
>> > Ok,
>> >
>> > I reproduced your issue and I can then confirm it.
>> > I tried several thing including:
>> >    - generating the file is the buildtree
>> >    - refering to the same file with another target in the same dir
>> >    - using absolute path in the sub2/add_executable
>> >
>> > nothing works.
>> > it looks like a generated file cannot be referred outside the directory
>> > where the custom command generates it ???
>> >
>> > Here comes an archive with an example similar to the one descrived by J.
>> > Decker.
>> > If you build it without option it wokrs (because I used an intermediate
>> > object lib)
>> > If you (try to) build it with
>> >
>> > cmake -DBROKEN=1
>> >
>> > then it'll fails with "Cannot find source file..."
>> >
>> > This is definitely weird and I never encountered this after +10 years of
>> > CMake usage!!
>> > So I guess I have always used generated file locally to build exe or
>> lib and
>> > then refer to the lib.
>> > If this is the intended behaviour then it should be documented more
>> > explicitely.
>> >
>> > Now re-reading the doc of add_custom_command:
>> >
>> > "This defines a command to generate specified ``OUTPUT`` file(s).
>> > A target created in the same directory (``CMakeLists.txt`` file)
>> > that specifies any output of the custom command as a source file
>> > is given a rule to generate the file using the command at build time."
>> >
>> > So the "same directory" should be underlined!! Or may be another
>> sentence
>> > saying that in fact you CANNOT refer to outputed files outside the
>> > directory...
>> >
>> > In fact it is possible to have cross-directory reference to generated
>> file
>> > but this is
>> > more like a workaround. You'll have to:
>> >
>> > define your custom_command and an associated custom target in dir1
>> > define your exe/lib in dir2 and explicitely:
>> >    - flag the referred cross-dir generated source as GENERATED
>> >    - make your exe/lib depend on the cross-dir custom target in order to
>> > trigger the file generation.
>> >
>> >
>> > The second zip implement that workaround. This is nasty, I wouldn't do
>> that.
>> > Shall we open a bug for this misleading behavior or shall we open a bug
>> for
>> > doc update?
>> >
>> >
>> >
>> > 2017-07-02 10:20 GMT+02:00 J Decker <d3ck0r at gmail.com>:
>> >>
>> >> It is not generated; because it is generated during a the build phase
>> not
>> >> the generate phase.  So only the logical idea of the file exists.
>> >>
>> >> On Sun, Jul 2, 2017 at 12:12 AM, Eric Noulard <eric.noulard at gmail.com>
>> >> wrote:
>> >>>
>> >>> Needless to say that your example should work but somehow CMake does
>> not
>> >>> see that the referred file is GENERATED.
>> >>>
>> >>> Le 2 juil. 2017 09:11, "Eric Noulard" <eric.noulard at gmail.com> a
>> écrit :
>> >>>>
>> >>>> Is the referred file created?
>> >>>> Does your actual command creating the file doing it in the source
>> tree
>> >>>> and not in the build tree?
>> >>>> Are you building in-source or out of source?
>> >>>>
>> >>>> Could you give us us a toy example which shows the issue?
>> >>>>
>> >>>> Le 2 juil. 2017 04:32, "J Decker" <d3ck0r at gmail.com> a écrit :
>> >>>>
>> >>>> Known issue?  Or just doesn't require a response?
>> >>>>
>> >>>> On Wed, Jun 28, 2017 at 6:05 AM, J Decker <d3ck0r at gmail.com> wrote:
>> >>>>>
>> >>>>> I have this chain of makefiles.  It adds a custom rule to build a
>> >>>>> source file, and then a subdirectory cannot reference that file.
>> >>>>>
>> >>>>> The first is added custom rule for M:/tmp/cmake-chain/sub/src/sac
>> k.c
>> >>>>> and then later cannot find M:/tmp/cmake-chain/sub/src/sack.c
>> >>>>> though it's really referencing it as
>> >>>>> M:/tmp/cmake-chain/sub/sub2/../src/sack.c
>> >>>>>
>> >>>>> tested with 3.6.0-rc4 and 3.9.0-rc5
>> >>>>>
>> >>>>> if the add_custom_rule and add_executable are in the same makefile
>> even
>> >>>>> if there's a added path to make it not exactly the same source as
>> the
>> >>>>> 'referencing source' message logs; it works.
>> >>>>>
>> >>>>>
>> >>>>> --- CMakeLists.txt ---
>> >>>>> cmake_minimum_required(VERSION 2.8)
>> >>>>>
>> >>>>> message( "Adding custom rule for
>> >>>>> ${CMAKE_CURRENT_SOURCE_DIR}/src/sack.c" )
>> >>>>>   add_custom_command( OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/src/sack.c
>> >>>>>   COMMAND cmake -E echo do something to make src/sack.c
>> >>>>>   )
>> >>>>> add_subdirectory( sub2 )
>> >>>>> -------------------------------------
>> >>>>>
>> >>>>> --- sub2/CmakeLists.txt ---
>> >>>>> message( "referencing source ${CMAKE_CURRENT_SOURCE_DIR}/..
>> /src/sack.c"
>> >>>>> )
>> >>>>> add_executable( something ${CMAKE_CURRENT_SOURCE_DIR}/../src/sack.c
>> )
>> >>>>>
>> >>>>> -------------------------------------
>> >>>>>
>> >>>>> --- Truncated output log ------
>> >>>>> Adding custom rule for M:/tmp/cmake-chain/sub/src/sack.c
>> >>>>> referencing source M:/tmp/cmake-chain/sub/sub2/../src/sack.c
>> >>>>> -- Configuring done
>> >>>>> CMake Error at sub2/CMakeLists.txt:3 (add_executable):
>> >>>>>   Cannot find source file:
>> >>>>>
>> >>>>>     M:/tmp/cmake-chain/sub/src/sack.c
>> >>>>>
>> >>>>>   Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++
>> .hm
>> >>>>> .hpp
>> >>>>>   .hxx .in .txx
>> >>>>> --------------------------------------
>> >>>>>
>> >>>>>
>> >>>>> ------ Flat CmakeLists.txt which works ---------------
>> >>>>> cmake_minimum_required(VERSION 2.8)
>> >>>>>
>> >>>>> message( "Adding custom rule for
>> >>>>> ${CMAKE_CURRENT_SOURCE_DIR}/src/sack.c" )
>> >>>>>   add_custom_command( OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/src/sack.c
>> >>>>> COMMAND cmake -e echo make file.
>> >>>>>   )
>> >>>>>
>> >>>>> message( "referencing source ${CMAKE_CURRENT_SOURCE_DIR}/src/sack.c"
>> )
>> >>>>> add_executable( something
>> >>>>> ${CMAKE_CURRENT_SOURCE_DIR}/sub2/../src/sack.c )
>> >>>>> --------------------------------------
>> >>>>>
>> >>>>> ----- flat cmakelists output.... -----------
>> >>>>> Adding custom rule for M:/tmp/cmake-chain-flat/src/sack.c
>> >>>>> referencing source M:/tmp/cmake-chain-flat/sub2/../src/sack.c
>> >>>>> -- Configuring done
>> >>>>> --------------------------------------
>> >>>>>
>> >>>>
>> >>>>
>> >>>> --
>> >>>>
>> >>>> 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
>> >>>>
>> >>>>
>> >>
>> >>
>> >> --
>> >>
>> >> 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
>> >
>> >
>> >
>> >
>> > --
>> > Eric
>> >
>> > --
>> >
>> > 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
>>
>
>
>
> --
> Eric
>
> --
>
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20170705/c8b5b5f3/attachment-0001.html>


More information about the CMake mailing list