[cmake-developers] Generating imported library targets without the cmake executable
Stephen Kelly
steveire at gmail.com
Thu Nov 24 15:13:43 EST 2011
Hi there,
I am working on installing CMake config files from the Qt repository so that
there is less need for a FindQt.cmake.
The motivation is that between releases of Qt and CMake, the features of Qt
get out of sync with the features available through FindQt.cmake, but with
config files that is not the case. Additionally, as the Qt buildsystem knows
everything about the package it is creating, it is possible to create config
files that already 'know the answers' and locations of everything without
having to find+query.
The previous discussion on this is here:
http://thread.gmane.org/gmane.comp.programming.tools.cmake.devel/2090
the current candidate for inclusion in Qt is here (which requires an account
in the Qt jira):
http://codereview.qt-project.org/#change,8518
and here (which does not):
https://qt.gitorious.org/+kdab-developers/qt/kdab-developers-
qtbase/commit/913fd3a1acffbae2ca8f6967dd951a03ff9f76a4
There is a small sticking point to this being in a finished state:
In creating the imported targets, I attempt to create the same content as
cmake creates when using install(EXPORTS). So I generate something along
these lines:
get_filename_component(_qt5_install_prefix
${CMAKE_CURRENT_LIST_DIR}/../../../ ABSOLUTE)
set_property(TARGET Qt5Core APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
set_target_properties(Qt5Core PROPERTIES
IMPORTED_LINK_INTERFACE_LIBRARIES_DEBUG ""
IMPORTED_LOCATION_DEBUG "${_qt5_install_prefix}/lib/libQtCore.so.5.0.0"
IMPORTED_SONAME_DEBUG "libQtCore.so.5"
)
set_property(TARGET Qt5Core APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(Qt5Core PROPERTIES
IMPORTED_LINK_INTERFACE_LIBRARIES_RELEASE ""
IMPORTED_LOCATION_RELEASE
"${_qt5_install_prefix}/lib/libQtCore.so.5.0.0"
IMPORTED_SONAME_RELEASE "libQtCore.so.5"
)
That is, I generate the full file name for the IMPORTED_LOCATION including
the library prefix and suffix, which are also used for the IMPORTED_SONAME.
QMake does not provide the library prefix and suffix used in variables, as
cmake does, but I believe there is also no way to change them in qmake. As a
result I hardcode the prefixes and suffixes for windows/linux/max - .dll,
.so etc.
The Qt QMake maintainer does not like this, and requests that CMake
determines the prefix and suffix instead. Does CMake provide any way for me
to get the default prefix and suffix for libraries? If it does then I could
generate something like this instead:
IMPORTED_SONAME "${CMAKE_LIBRARY_PREFIX}QtCore.${CMAKE_LIBRARY_SUFFIX}.5"
But I still don't think it's necessarily a good idea or the right change to
make. QMake and CMake don't necessarily agree on what the prefix and suffix
for libraries will be on different platforms for one thing.
What would you consider a good idea?
Could this have any implications for cross-compiling?
Currently I generate IMPORTED_CONFIGURATIONS for debug and release
(conditionally, depending on how Qt is built). Should I also generate code
to set target properties for no configuration? Or should I only do that, and
not have debug/release versions?:
set_target_properties(Qt5Core PROPERTIES
IMPORTED_LINK_INTERFACE_LIBRARIES ""
IMPORTED_LOCATION "${_qt5_install_prefix}/lib/libQtCore.so.5.0.0"
IMPORTED_SONAME"libQtCore.so.5"
)
Thanks for any guidance,
Steve.
More information about the cmake-developers
mailing list