[Development] Improving CMake support for static builds
Kyle Edwards
kyle.edwards at kitware.com
Fri Oct 12 21:11:43 CEST 2018
Hello everyone,
New Qt developer here. I'm trying to improve Qt's support for static
builds using CMake - specifically, encoding transitive dependencies in
the *Config.cmake files. I see that these files already have inter-
module dependencies encoded in the exported targets'
INTERFACE_LINK_LIBRARIES property, but there is no information for the
flags needed to link against system libraries (freetype, harfbuzz,
etc.)
With dynamic builds, this isn't an issue, because the Qt modules
themselves link against these libraries. However, static builds need
this information to generate a fully linked binary. I've started a
patch to add this support, but I'm not very familiar with Qt's
buildsystem, and I was hoping someone could help me figure out how to
get the information that I need. The start of my patch is below:
-------------------------------------------------------------
diff --git a/mkspecs/features/create_cmake.prf
b/mkspecs/features/create_cmake.prf
index 2ed708e..2d5ab55 100644
--- a/mkspecs/features/create_cmake.prf
+++ b/mkspecs/features/create_cmake.prf
@@ -180,6 +180,7 @@ CMAKE_MKSPEC = $$[QMAKE_XSPEC]
sorted_deps = $$sort_depends(QT.$${MODULE}.depends, QT.)
mod_deps =
lib_deps =
+mod_link_flags =
aux_mod_deps =
aux_lib_deps =
# Until CMake 3.0 is the minimum requirement of Qt 5, we need to
filter
@@ -197,6 +198,7 @@ for (dep, sorted_deps) {
}
CMAKE_MODULE_DEPS = $$join(mod_deps, ";")
CMAKE_QT5_MODULE_DEPS = $$join(lib_deps, ";")
+CMAKE_MODULE_LINK_FLAGS = $$join(mod_link_flags, ";")
CMAKE_INTERFACE_MODULE_DEPS = $$join(aux_mod_deps, ";")
CMAKE_INTERFACE_QT5_MODULE_DEPS = $$join(aux_lib_deps, ";")
diff --git a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in
b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in
index 3ed6dd5..a320902 100644
--- a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in
+++ b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in
@@ -64,6 +64,11 @@
macro(_populate_$${CMAKE_MODULE_NAME}_target_properties Configuration
LIB_LOCATI
!!IF !isEmpty(CMAKE_LIB_SONAME)
\"IMPORTED_SONAME_${Configuration}\" \"$${CMAKE_LIB_SONAME}\"
!!ENDIF
+!!IF !isEmpty(CMAKE_STATIC_TYPE)
+!!IF !isEmpty(CMAKE_MODULE_LINK_FLAGS)
+ \"INTERFACE_LINK_OPTIONS\"
\"${_Qt5$${CMAKE_MODULE_NAME}_LIB_LINK_FLAGS}\"
+!!ENDIF
+!!ENDIF
# For backward compatibility with CMake < 2.8.12
\"IMPORTED_LINK_INTERFACE_LIBRARIES_${Configuration}\"
\"${_Qt5$${CMAKE_MODULE_NAME}_LIB_DEPENDENCIES}\"
)
@@ -215,6 +220,10 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME})
!!ENDIF
!!IF !isEmpty(CMAKE_STATIC_TYPE)
+!!IF !isEmpty(CMAKE_MODULE_LINK_FLAGS)
+ set(_Qt5$${CMAKE_MODULE_NAME}_LIB_LINK_FLAGS
\"$${CMAKE_MODULE_LINK_FLAGS}\")
+
+!!ENDIF
add_library(Qt5::$${CMAKE_MODULE_NAME} STATIC IMPORTED)
set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} PROPERTY
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX")
!!ELSE
-------------------------------------------------------------
I've figured out how to pass information into Qt5BasicConfig.cmake.in
from create_cmake.prf, but I'm not sure where to get the link flags
that need to be passed in. Any advice would be appreciated.
Kyle
More information about the Development
mailing list