[CMake] add_library ALIAS

Craig Scott craig.scott at crascit.com
Mon Nov 19 15:51:39 EST 2018


On Tue, Nov 20, 2018 at 1:20 AM rmawatson rmawatson <rmawatson at hotmail.com>
wrote:

> I am trying to figure out exactly what this line is for in the cmake file
> of the github json project here ->
> https://github.com/nlohmann/json/blob/develop/CMakeLists.txt#L48
>
> add_library(${PROJECT_NAME}::${NLOHMANN_JSON_TARGET_NAME} ALIAS
> ${NLOHMANN_JSON_TARGET_NAME})
>
> Specifically with this example, what does this allow in this cmake file
> that otherwise would not be possible?
>
It is to make incorporating the project into a larger project via
add_subdirectory() rather than via find_package() more
convenient/consistent. The latter relies on an installed package, which
will have been exported with the nlohmann_json:: namespace, so it will
provide imported targets with names like nlohmann_json::nlohmann_json. When
incorporating the project via add_subdirectory() instead, nothing is
exported, so targets like nlohmann_json::nlohmann_json won't exist unless
they are explicitly added as an ALIAS like in the example above.

In other words, ALIAS targets like this allow consuming projects to use the
same target name (nlohmann_json::nlohmann_json) regardless of how they
bring the json project in as a dependency.



> The commit message where this line was added says,
>
> "Enable target namespaces and build dir project config
>
> CMake convention is to use a project namespace, i.e. Foo::, for imported
> targets.  When multiple targets are imported from a project, this looks
> like Foo::Bar1 Foo::Bar2, etc.  This adds the nlohmann_json:: namespace to
> the exported target names.
>
> This also allows the generated project config files to be used from the
> build directory instead of just the install directory."
> Removing this line appears to make no difference to any off the generated
> cmake files. I can still use find_package with the build directory in
> CMAKE_PREFIX-PATH with our without this line. Has something changed in
> cmake since this was added?
>

The ALIAS won't change the exported files (because it isn't itself
installed/exported), it is only for use directly by a parent project
consuming it via add_subdirectory(). This is not a new feature, but it has
perhaps been discussed more openly in the past year or two. When the
FetchContent <https://cmake.org/cmake/help/latest/module/FetchContent.html>
module was added in CMake 3.11, it also became much easier to incorporate a
dependency via add_subdirectory().


-- 
Craig Scott
Melbourne, Australia
https://crascit.com

New book released: Professional CMake: A Practical Guide
<https://crascit.com/professional-cmake/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20181120/4c974bae/attachment.html>


More information about the CMake mailing list