Hi everyone,
I am currently writing a CMakeLists.txt
and am trying to export a single target from it that shall carry all its usage-requirements, even the indirectly inherited ones, without the need to also export its (built) dependencies.
Is there some elegant way to achieve that?
As examples are always easier to understand, my CMakeLists.txt
looks pretty much like this:
...
# Carries include-search path for own headers and Boost headers.
add_library( some_interface INTERFACE )
target_include_directories( some_interface INTERFACE include )
target_link_libraries( some_objects INTERFACE Boost::headers )
install( DIRECTORY include/ TYPE INCLUDE )
# Object-files for MyLib with public dependency to INTERFACE lib.
add_library( some_objects OBJECTS )
target_sources( some_objects PRIVATE a.cpp b.cpp )
target_link_libraries( some_objects PUBLIC some_interface )
# Object-files for MyLib with private dependency to some Boost lib.
add_library( some_other_objects OBJECTS )
target_sources( some_other_objects PRIVATE c.cpp dcpp )
target_link_libraries( some_other_objects PRIVATE Boost::regex )
# The shared library that shall be exported.
add_library( MyLib SHARED)
target_link_libraries( MyLib
PUBLIC
some_objects
some_other_objects
)
install( TARGETS MyLib
EXPORT MyLib-ExportSet
LIBRARY DESTINATION lib
INCLUDES DESTINATION include
)
install( EXPORT MyLib-ExportSet
DESTINATION lib/cmake
)
I hope the example is understandable.
Currently, when trying to install it fails with an error which says that some_objects
and some_other_objects
are required but not in any export-set.
What I now want is to build MyLib
and export it so that it can be used as IMPORTED
library target later and still carries the required usage-requirements, although the other targets are not exported. (You can see these other targets as implementation details that should not be of any interest to the user of my exported target.) In particular that means, MyLib
should carry the dependency to Boost::headers
and to the include search path for the installed headers but not to some_objects
, some_other_objects
or some_interface
.
So, in other words: From the (non-IMPORTED
) targets that I defined in my CMakeLists.txt I only want MyLib
exported with all its (inherited) usage-requirements.
Does anyone know some elegant way to collect these usage-requirements and to apply them to MyLib
.
Or does anyone have an idea how such a feature could look like when implemented as new feature for CMake itself?
Thanks in advance for any pointers.
Deniz