Using FetchContent fails when two subprojects have a target with the same name

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

Using FetchContent fails when two subprojects have a target with the same name

Timothy Wrona
I am having an issue with using FetchContent to grab two subprojects that both contain a "doxygen" target to build the documentation.

Both of these subprojects need to be able to be built independently and when built on their own they compile fine (along with their documentation), but when I pull them into one project using "FetchContent" I get an error saying I can't define the "doxygen" target more than once.

I imagine this kind of issue would come up all of the time when using a "superbuild" pattern. Is there a typical way of handling this?

--

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: Using FetchContent fails when two subprojects have a target with the same name

Timothy Wrona
(Included cmake-developers list as well in case this may have just been something that should work that was overlooked with the FetchContent module)

On Tue, Feb 19, 2019 at 11:32 PM Timothy Wrona <[hidden email]> wrote:
I am having an issue with using FetchContent to grab two subprojects that both contain a "doxygen" target to build the documentation.

Both of these subprojects need to be able to be built independently and when built on their own they compile fine (along with their documentation), but when I pull them into one project using "FetchContent" I get an error saying I can't define the "doxygen" target more than once.

I imagine this kind of issue would come up all of the time when using a "superbuild" pattern. Is there a typical way of handling this?

--

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: [cmake-developers] Using FetchContent fails when two subprojects have a target with the same name

Craig Scott-3


On Wed, Feb 20, 2019 at 3:36 PM Timothy Wrona <[hidden email]> wrote:
(Included cmake-developers list as well in case this may have just been something that should work that was overlooked with the FetchContent module)

On Tue, Feb 19, 2019 at 11:32 PM Timothy Wrona <[hidden email]> wrote:
I am having an issue with using FetchContent to grab two subprojects that both contain a "doxygen" target to build the documentation.

Both of these subprojects need to be able to be built independently and when built on their own they compile fine (along with their documentation), but when I pull them into one project using "FetchContent" I get an error saying I can't define the "doxygen" target more than once.

I imagine this kind of issue would come up all of the time when using a "superbuild" pattern. Is there a typical way of handling this?

I thought this limitation was already mentioned in the FetchContent docs, but it seems it isn't. If two different dependencies define the same global target name, then they cannot be combined into the same build via add_subdirectory(). CMake doesn't allow a target to be redefined (although it does allow additional commands to be added to an existing custom target). I'll try to add some docs to FetchContent to mention this limitation, but they will not make it into the 3.14 release - the limitation has always been there right from when FetchContent was first introduced in 3.11.

A traditional superbuild that uses ExternalProject won't have a problem with this because a subproject's own targets are not combined with targets of other subprojects into a single build. Instead, the top level project only sees the targets that ExternalProject itself creates. This is most likely the best workaround if you are not able to modify the target names used in the subprojects you want to combine.

--
Craig Scott
Melbourne, Australia

Get the hand-book for every CMake user: Professional CMake: A Practical Guide

--

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: [cmake-developers] Using FetchContent fails when two subprojects have a target with the same name

Timothy Wrona
Okay that makes sense. I will give ExternalProject_Add a try. I think it would be very useful if FetchContent were able to support targets with the same name and that would be a great feature to add (although it is understandable if it is a language limitation).

I much prefer the simplicity of FetchContent :)

Thanks,
Tim

On Wed, Feb 20, 2019 at 8:22 AM Craig Scott <[hidden email]> wrote:


On Wed, Feb 20, 2019 at 3:36 PM Timothy Wrona <[hidden email]> wrote:
(Included cmake-developers list as well in case this may have just been something that should work that was overlooked with the FetchContent module)

On Tue, Feb 19, 2019 at 11:32 PM Timothy Wrona <[hidden email]> wrote:
I am having an issue with using FetchContent to grab two subprojects that both contain a "doxygen" target to build the documentation.

Both of these subprojects need to be able to be built independently and when built on their own they compile fine (along with their documentation), but when I pull them into one project using "FetchContent" I get an error saying I can't define the "doxygen" target more than once.

I imagine this kind of issue would come up all of the time when using a "superbuild" pattern. Is there a typical way of handling this?

I thought this limitation was already mentioned in the FetchContent docs, but it seems it isn't. If two different dependencies define the same global target name, then they cannot be combined into the same build via add_subdirectory(). CMake doesn't allow a target to be redefined (although it does allow additional commands to be added to an existing custom target). I'll try to add some docs to FetchContent to mention this limitation, but they will not make it into the 3.14 release - the limitation has always been there right from when FetchContent was first introduced in 3.11.

A traditional superbuild that uses ExternalProject won't have a problem with this because a subproject's own targets are not combined with targets of other subprojects into a single build. Instead, the top level project only sees the targets that ExternalProject itself creates. This is most likely the best workaround if you are not able to modify the target names used in the subprojects you want to combine.

--
Craig Scott
Melbourne, Australia

Get the hand-book for every CMake user: Professional CMake: A Practical Guide

--

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