Currently, libraries such as beman::task and beman::net use FetchContent in their CMakeLists.txt files to automatically download their dependencies (beman::execution in the first case, beman::execution and beman::task in the second), even when the library is a subproject itself.
I don’t think this is a good practice. I’ve empirically found that it’s most ergonomic when subprojects don’t try to do anything “clever” about their dependencies, leaving it to the root project to guarantee their acquisition. That is, including beman::net should just link to beman::task and beman::execution, without doing anything else. The top level project would then be responsible for issuing the appropriate FetchContent calls for each library.
(Neither should the CMakeLists.txt files issue find_package. find_package should also be issued by the root project, and the config file for the library would then call find_dependency as appropriate. CMakeLists.txt files should not.)