Re: [CMake] Is there a way to delay "find_package" until link-time when the package is actually needed?
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 wrote: > > > Le jeu. 14 févr. 2019 à 18:57, Timothy Wrona 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 >> wrote: >> >>> >>> >>> Le jeu. 14 févr. 2019 à 18:22, Timothy Wrona 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
Re: [CMake] Is there a way to delay "find_package" until link-time when the package is actually needed?
Le jeu. 14 févr. 2019 à 18:57, Timothy Wrona 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 > wrote: > >> >> >> Le jeu. 14 févr. 2019 à 18:22, Timothy Wrona 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
Re: [CMake] Is there a way to delay "find_package" until link-time when the package is actually needed?
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 wrote: > > > Le jeu. 14 févr. 2019 à 18:22, Timothy Wrona 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
Re: [CMake] Is there a way to delay "find_package" until link-time when the package is actually needed?
Le jeu. 14 févr. 2019 à 18:22, Timothy Wrona 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
[CMake] Is there a way to delay "find_package" until link-time when the package is actually needed?
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