Is there a way to delay "find_package" until link-time when the package is actually needed?

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

Is there a way to delay "find_package" until link-time when the package is actually needed?

Timothy Wrona
I have a collection of interdependent CMake projects (lots of legacy code) that I want to convert to using CMake targets for linking. The code is built in such a way that all projects run cmake generation, then all projects build, then all projects link.

I would like to export a CMake target from one of the projects and link to it in another, but the issue is the project I am exporting from runs its cmake generation AFTER the project I am linking the target in. This causes "find_package" to fail because the target has not been exported yet, but realistically the exported target is not needed until link-time.

Is there a way to delay "find_package" to not look for the package until link-time? At link-time the package will have been exported already and if "find_package" was not called until then, it would be found successfully and the target could be pulled in and linked to.

Thanks,
Tim

--

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

Re: Is there a way to delay "find_package" until link-time when the package is actually needed?

Eric Noulard


Le jeu. 14 févr. 2019 à 18:22, Timothy Wrona <[hidden email]> a écrit :
I have a collection of interdependent CMake projects (lots of legacy code) that I want to convert to using CMake targets for linking. The code is built in such a way that all projects run cmake generation, then all projects build, then all projects link.

I would like to export a CMake target from one of the projects and link to it in another, but the issue is the project I am exporting from runs its cmake generation AFTER the project I am linking the target in. This causes "find_package" to fail because the target has not been exported yet, but realistically the exported target is not needed until link-time.

This heavily depends on the target. Modern CMake target convey compile time information as well like compile flags, include directory etc...

Can't you re-order the cmake generation order of your projects? 
If you [ever] have the graph dependency of your projects you may topologically sort them in order to avoid this issue and superbuild them in appropriate order.


Is there a way to delay "find_package" to not look for the package until link-time?

I don't think so.
 
At link-time the package will have been exported already and if "find_package" was not called until then, it would be found successfully and the target could be pulled in and linked to.

But the build compile line options used to generate build system files are computed during CMake configuration/generation step.
So I don't think what you ask is possible.

--
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:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to delay "find_package" until link-time when the package is actually needed?

Timothy Wrona
The problem is it is very likely that there are some circular dependencies in the build tree -- which is why it was broken up to generation of all, then build all, then link all in the first place.

With circular dependencies there's no real way to sort these dependencies out without just running generation twice, but the first run will get a bunch of errors for missing packages.

On Thu, Feb 14, 2019 at 12:38 PM Eric Noulard <[hidden email]> wrote:


Le jeu. 14 févr. 2019 à 18:22, Timothy Wrona <[hidden email]> a écrit :
I have a collection of interdependent CMake projects (lots of legacy code) that I want to convert to using CMake targets for linking. The code is built in such a way that all projects run cmake generation, then all projects build, then all projects link.

I would like to export a CMake target from one of the projects and link to it in another, but the issue is the project I am exporting from runs its cmake generation AFTER the project I am linking the target in. This causes "find_package" to fail because the target has not been exported yet, but realistically the exported target is not needed until link-time.

This heavily depends on the target. Modern CMake target convey compile time information as well like compile flags, include directory etc...

Can't you re-order the cmake generation order of your projects? 
If you [ever] have the graph dependency of your projects you may topologically sort them in order to avoid this issue and superbuild them in appropriate order.


Is there a way to delay "find_package" to not look for the package until link-time?

I don't think so.
 
At link-time the package will have been exported already and if "find_package" was not called until then, it would be found successfully and the target could be pulled in and linked to.

But the build compile line options used to generate build system files are computed during CMake configuration/generation step.
So I don't think what you ask is possible.

--
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:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to delay "find_package" until link-time when the package is actually needed?

Eric Noulard


Le jeu. 14 févr. 2019 à 18:57, Timothy Wrona <[hidden email]> a écrit :
The problem is it is very likely that there are some circular dependencies in the build tree -- which is why it was broken up to generation of all, then build all, then link all in the first place.

Yes, wrong solution to a real design issue :-)
 

With circular dependencies there's no real way to sort these dependencies out without just running generation twice, but the first run will get a bunch of errors for missing packages.

I understand the situation, I did face that too in the past.
If there is not too much circular deps you may either break them by writing (by hand) a bunch of imported target or you can merge in the same CMake project the sub-projects belonging to the same cycle.
Feasibility depends on the amount of projects (and cycle) you have.


 

On Thu, Feb 14, 2019 at 12:38 PM Eric Noulard <[hidden email]> wrote:


Le jeu. 14 févr. 2019 à 18:22, Timothy Wrona <[hidden email]> a écrit :
I have a collection of interdependent CMake projects (lots of legacy code) that I want to convert to using CMake targets for linking. The code is built in such a way that all projects run cmake generation, then all projects build, then all projects link.

I would like to export a CMake target from one of the projects and link to it in another, but the issue is the project I am exporting from runs its cmake generation AFTER the project I am linking the target in. This causes "find_package" to fail because the target has not been exported yet, but realistically the exported target is not needed until link-time.

This heavily depends on the target. Modern CMake target convey compile time information as well like compile flags, include directory etc...

Can't you re-order the cmake generation order of your projects? 
If you [ever] have the graph dependency of your projects you may topologically sort them in order to avoid this issue and superbuild them in appropriate order.


Is there a way to delay "find_package" to not look for the package until link-time?

I don't think so.
 
At link-time the package will have been exported already and if "find_package" was not called until then, it would be found successfully and the target could be pulled in and linked to.

But the build compile line options used to generate build system files are computed during CMake configuration/generation step.
So I don't think what you ask is possible.

--
Eric


--
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:
https://cmake.org/mailman/listinfo/cmake
Reply | Threaded
Open this post in threaded view
|

Re: Is there a way to delay "find_package" until link-time when the package is actually needed?

Timothy Wrona
I guess what I would ultimately like to achieve would be a "pre-cmake-configuration" step that just initializes the package registry with the location of each project's build tree and copies the "project-config.cmake" files into each projects build-tree. This would allow it to be found during generation, but it doesn't seem like it works that way. Maybe some sort of "superbuild" pattern would be a better option.

On Thu, Feb 14, 2019 at 1:32 PM Eric Noulard <[hidden email]> wrote:


Le jeu. 14 févr. 2019 à 18:57, Timothy Wrona <[hidden email]> a écrit :
The problem is it is very likely that there are some circular dependencies in the build tree -- which is why it was broken up to generation of all, then build all, then link all in the first place.

Yes, wrong solution to a real design issue :-)
 

With circular dependencies there's no real way to sort these dependencies out without just running generation twice, but the first run will get a bunch of errors for missing packages.

I understand the situation, I did face that too in the past.
If there is not too much circular deps you may either break them by writing (by hand) a bunch of imported target or you can merge in the same CMake project the sub-projects belonging to the same cycle.
Feasibility depends on the amount of projects (and cycle) you have.


 

On Thu, Feb 14, 2019 at 12:38 PM Eric Noulard <[hidden email]> wrote:


Le jeu. 14 févr. 2019 à 18:22, Timothy Wrona <[hidden email]> a écrit :
I have a collection of interdependent CMake projects (lots of legacy code) that I want to convert to using CMake targets for linking. The code is built in such a way that all projects run cmake generation, then all projects build, then all projects link.

I would like to export a CMake target from one of the projects and link to it in another, but the issue is the project I am exporting from runs its cmake generation AFTER the project I am linking the target in. This causes "find_package" to fail because the target has not been exported yet, but realistically the exported target is not needed until link-time.

This heavily depends on the target. Modern CMake target convey compile time information as well like compile flags, include directory etc...

Can't you re-order the cmake generation order of your projects? 
If you [ever] have the graph dependency of your projects you may topologically sort them in order to avoid this issue and superbuild them in appropriate order.


Is there a way to delay "find_package" to not look for the package until link-time?

I don't think so.
 
At link-time the package will have been exported already and if "find_package" was not called until then, it would be found successfully and the target could be pulled in and linked to.

But the build compile line options used to generate build system files are computed during CMake configuration/generation step.
So I don't think what you ask is possible.

--
Eric


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