CmakeLists chain cannot find source added with add_custom_command

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|

CmakeLists chain cannot find source added with add_custom_command

J Decker
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/sack.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
Reply | Threaded
Open this post in threaded view
|

Re: CmakeLists chain cannot find source added with add_custom_command

J Decker
Known issue?  Or just doesn't require a response?  

On Wed, Jun 28, 2017 at 6:05 AM, J Decker <[hidden email]> 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/sack.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
Reply | Threaded
Open this post in threaded view
|

Re: CmakeLists chain cannot find source added with add_custom_command

Eric Noulard
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" <[hidden email]> a écrit :
Known issue?  Or just doesn't require a response?  

On Wed, Jun 28, 2017 at 6:05 AM, J Decker <[hidden email]> 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/sack.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
Reply | Threaded
Open this post in threaded view
|

Re: CmakeLists chain cannot find source added with add_custom_command

Eric Noulard
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" <[hidden email]> 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" <[hidden email]> a écrit :
Known issue?  Or just doesn't require a response?  

On Wed, Jun 28, 2017 at 6:05 AM, J Decker <[hidden email]> 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/sack.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
Reply | Threaded
Open this post in threaded view
|

Re: CmakeLists chain cannot find source added with add_custom_command

J Decker
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 <[hidden email]> 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" <[hidden email]> 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" <[hidden email]> a écrit :
Known issue?  Or just doesn't require a response?  

On Wed, Jun 28, 2017 at 6:05 AM, J Decker <[hidden email]> 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/sack.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
Reply | Threaded
Open this post in threaded view
|

Re: CmakeLists chain cannot find source added with add_custom_command

Eric Noulard
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 <[hidden email]>:
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 <[hidden email]> 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" <[hidden email]> 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" <[hidden email]> a écrit :
Known issue?  Or just doesn't require a response?  

On Wed, Jun 28, 2017 at 6:05 AM, J Decker <[hidden email]> 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/sack.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

GenFileReferredInSubdir.zip (2K) Download Attachment
GenFileReferredInSubdir-v2.zip (2K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: CmakeLists chain cannot find source added with add_custom_command

Nicholas Devenish
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 <[hidden email]> 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 <[hidden email]>:
>>
>> 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 <[hidden email]>
>> 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" <[hidden email]> 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" <[hidden email]> a écrit :
>>>>
>>>> Known issue?  Or just doesn't require a response?
>>>>
>>>> On Wed, Jun 28, 2017 at 6:05 AM, J Decker <[hidden email]> 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/sack.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
--

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
Reply | Threaded
Open this post in threaded view
|

Re: CmakeLists chain cannot find source added with add_custom_command

Eric Noulard
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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
>>
>> 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 <[hidden email]>
>> 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" <[hidden email]> 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" <[hidden email]> a écrit :
>>>>
>>>> Known issue?  Or just doesn't require a response?
>>>>
>>>> On Wed, Jun 28, 2017 at 6:05 AM, J Decker <[hidden email]> 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/sack.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
Reply | Threaded
Open this post in threaded view
|

Re: CmakeLists chain cannot find source added with add_custom_command

J Decker
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 <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
>>
>> 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 <[hidden email]>
>> 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" <[hidden email]> 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" <[hidden email]> a écrit :
>>>>
>>>> Known issue?  Or just doesn't require a response?
>>>>
>>>> On Wed, Jun 28, 2017 at 6:05 AM, J Decker <[hidden email]> 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/sack.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


--

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
Reply | Threaded
Open this post in threaded view
|

Re: CmakeLists chain cannot find source added with add_custom_command

J Decker


On Wed, Jul 5, 2017 at 4:05 AM, J Decker <[hidden email]> wrote:
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.

hmm that won't work, the source has the target name compiled into it, so it would really have to be recompiled anyway....  and various other definition options might be applied...




On Wed, Jul 5, 2017 at 3:34 AM, Eric Noulard <[hidden email]> 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 <[hidden email]>:
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 <[hidden email]> 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 <[hidden email]>:
>>
>> 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 <[hidden email]>
>> 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" <[hidden email]> 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" <[hidden email]> a écrit :
>>>>
>>>> Known issue?  Or just doesn't require a response?
>>>>
>>>> On Wed, Jun 28, 2017 at 6:05 AM, J Decker <[hidden email]> 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/sack.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



--

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