Improve configure2cmake to find_package only in certain conditions
It doesn't make much sense to look for X11 related packages on macOS and Windows by default. Usually they would not be there, and as a result the configuration step would show a long list of scary not found packages, and also eat precious configure time. Change the conversion script to allow putting conditions around generated find_package calls. These conditions can be manually set in the conversion script library mapping, using the emit_if argument, which we do for the X11 and Wayland related packages. They are also computed by checking which features use a given library, and if the feature is protected by a simple emitIf condition like config.linux, the relevant library find_package call will be protected by the same condition. If a developer still wishes to look for all packages, they can define the CACHE variable QT_FIND_ALL_PACKAGES_ALWAYS to ON. The relevant configure.cmake files are regenerated in this patch. Change-Id: I6f918a94f50257ec41d6216305dae9774933389a Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
parent
42c8c38564
commit
e4b8c488bd
@ -18,7 +18,9 @@ qt_find_package(WrapRt PROVIDED_TARGETS WrapRt)
|
|||||||
qt_find_package(LTTngUST PROVIDED_TARGETS LTTng::UST)
|
qt_find_package(LTTngUST PROVIDED_TARGETS LTTng::UST)
|
||||||
qt_find_package(PCRE2 PROVIDED_TARGETS PCRE2)
|
qt_find_package(PCRE2 PROVIDED_TARGETS PCRE2)
|
||||||
set_package_properties(PCRE2 PROPERTIES TYPE REQUIRED)
|
set_package_properties(PCRE2 PROPERTIES TYPE REQUIRED)
|
||||||
|
if((QNX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(PPS PROVIDED_TARGETS PPS::PPS)
|
qt_find_package(PPS PROVIDED_TARGETS PPS::PPS)
|
||||||
|
endif()
|
||||||
qt_find_package(Slog2 PROVIDED_TARGETS Slog2::Slog2)
|
qt_find_package(Slog2 PROVIDED_TARGETS Slog2::Slog2)
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,26 +38,66 @@ qt_find_package(OpenGL PROVIDED_TARGETS OpenGL::GL)
|
|||||||
qt_find_package(GLESv2 PROVIDED_TARGETS GLESv2::GLESv2)
|
qt_find_package(GLESv2 PROVIDED_TARGETS GLESv2::GLESv2)
|
||||||
qt_find_package(Tslib PROVIDED_TARGETS PkgConfig::Tslib)
|
qt_find_package(Tslib PROVIDED_TARGETS PkgConfig::Tslib)
|
||||||
qt_find_package(Vulkan PROVIDED_TARGETS Vulkan::Vulkan)
|
qt_find_package(Vulkan PROVIDED_TARGETS Vulkan::Vulkan)
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(Wayland PROVIDED_TARGETS Wayland::Server)
|
qt_find_package(Wayland PROVIDED_TARGETS Wayland::Server)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(X11 PROVIDED_TARGETS X11::XCB)
|
qt_find_package(X11 PROVIDED_TARGETS X11::XCB)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(X11 PROVIDED_TARGETS ${X11_SM_LIB} ${X11_ICE_LIB})
|
qt_find_package(X11 PROVIDED_TARGETS ${X11_SM_LIB} ${X11_ICE_LIB})
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB 1.9 PROVIDED_TARGETS XCB::XCB)
|
qt_find_package(XCB 1.9 PROVIDED_TARGETS XCB::XCB)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS ICCCM PROVIDED_TARGETS XCB::ICCCM)
|
qt_find_package(XCB COMPONENTS ICCCM PROVIDED_TARGETS XCB::ICCCM)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS IMAGE PROVIDED_TARGETS XCB::IMAGE)
|
qt_find_package(XCB COMPONENTS IMAGE PROVIDED_TARGETS XCB::IMAGE)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS KEYSYMS PROVIDED_TARGETS XCB::KEYSYMS)
|
qt_find_package(XCB COMPONENTS KEYSYMS PROVIDED_TARGETS XCB::KEYSYMS)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS RENDERUTIL PROVIDED_TARGETS XCB::RENDERUTIL)
|
qt_find_package(XCB COMPONENTS RENDERUTIL PROVIDED_TARGETS XCB::RENDERUTIL)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS RANDR PROVIDED_TARGETS XCB::RANDR)
|
qt_find_package(XCB COMPONENTS RANDR PROVIDED_TARGETS XCB::RANDR)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS SHAPE PROVIDED_TARGETS XCB::SHAPE)
|
qt_find_package(XCB COMPONENTS SHAPE PROVIDED_TARGETS XCB::SHAPE)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS SHM PROVIDED_TARGETS XCB::SHM)
|
qt_find_package(XCB COMPONENTS SHM PROVIDED_TARGETS XCB::SHM)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS SYNC PROVIDED_TARGETS XCB::SYNC)
|
qt_find_package(XCB COMPONENTS SYNC PROVIDED_TARGETS XCB::SYNC)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS XFIXES PROVIDED_TARGETS XCB::XFIXES)
|
qt_find_package(XCB COMPONENTS XFIXES PROVIDED_TARGETS XCB::XFIXES)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS XINERAMA PROVIDED_TARGETS XCB::XINERAMA)
|
qt_find_package(XCB COMPONENTS XINERAMA PROVIDED_TARGETS XCB::XINERAMA)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS XKB PROVIDED_TARGETS XCB::XKB)
|
qt_find_package(XCB COMPONENTS XKB PROVIDED_TARGETS XCB::XKB)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS RENDER PROVIDED_TARGETS XCB::RENDER)
|
qt_find_package(XCB COMPONENTS RENDER PROVIDED_TARGETS XCB::RENDER)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS GLX PROVIDED_TARGETS XCB::GLX)
|
qt_find_package(XCB COMPONENTS GLX PROVIDED_TARGETS XCB::GLX)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XCB COMPONENTS XINPUT PROVIDED_TARGETS XCB::XINPUT)
|
qt_find_package(XCB COMPONENTS XINPUT PROVIDED_TARGETS XCB::XINPUT)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XKB 0.4.1 PROVIDED_TARGETS XKB::XKB)
|
qt_find_package(XKB 0.4.1 PROVIDED_TARGETS XKB::XKB)
|
||||||
|
endif()
|
||||||
|
if((LINUX) OR QT_FIND_ALL_PACKAGES_ALWAYS)
|
||||||
qt_find_package(XRender PROVIDED_TARGETS PkgConfig::xrender)
|
qt_find_package(XRender PROVIDED_TARGETS PkgConfig::xrender)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
#### Tests
|
#### Tests
|
||||||
|
@ -181,9 +181,29 @@ def parseLib(ctx, lib, data, cm_fh, cmake_find_packages_set):
|
|||||||
if newlib.targetName in cmake_find_packages_set:
|
if newlib.targetName in cmake_find_packages_set:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# If certain libraries are used within a feature, but the feature
|
||||||
|
# is only emitted conditionally with a simple condition (like
|
||||||
|
# 'on Windows' or 'on Linux'), we should enclose the find_package
|
||||||
|
# call for the library into the same condition.
|
||||||
|
emit_if = newlib.emit_if
|
||||||
|
|
||||||
|
# Only look through features if a custom emit_if wasn't provided.
|
||||||
|
if not emit_if:
|
||||||
|
for feature in data['features']:
|
||||||
|
feature_data = data['features'][feature]
|
||||||
|
if 'condition' in feature_data and \
|
||||||
|
'libs.{}'.format(lib) in feature_data['condition'] and \
|
||||||
|
'emitIf' in feature_data and \
|
||||||
|
'config.' in feature_data['emitIf']:
|
||||||
|
emit_if = feature_data['emitIf']
|
||||||
|
break
|
||||||
|
|
||||||
|
if emit_if:
|
||||||
|
emit_if = map_condition(emit_if)
|
||||||
|
|
||||||
cmake_find_packages_set.add(newlib.targetName)
|
cmake_find_packages_set.add(newlib.targetName)
|
||||||
|
|
||||||
cm_fh.write(generate_find_package_info(newlib))
|
cm_fh.write(generate_find_package_info(newlib, emit_if=emit_if))
|
||||||
|
|
||||||
|
|
||||||
def lineify(label, value, quote=True):
|
def lineify(label, value, quote=True):
|
||||||
@ -890,7 +910,7 @@ def processLibraries(ctx, data, cm_fh):
|
|||||||
return
|
return
|
||||||
|
|
||||||
for lib in data['libraries']:
|
for lib in data['libraries']:
|
||||||
parseLib(ctx, lib, data['libraries'][lib], cm_fh, cmake_find_packages_set)
|
parseLib(ctx, lib, data, cm_fh, cmake_find_packages_set)
|
||||||
|
|
||||||
|
|
||||||
def processSubconfigs(dir, ctx, data):
|
def processSubconfigs(dir, ctx, data):
|
||||||
|
@ -35,7 +35,8 @@ class LibraryMapping:
|
|||||||
targetName: typing.Optional[str], *,
|
targetName: typing.Optional[str], *,
|
||||||
resultVariable: typing.Optional[str] = None,
|
resultVariable: typing.Optional[str] = None,
|
||||||
extra: typing.List[str] = [],
|
extra: typing.List[str] = [],
|
||||||
appendFoundSuffix: bool = True) -> None:
|
appendFoundSuffix: bool = True,
|
||||||
|
emit_if: str = '') -> None:
|
||||||
self.soName = soName
|
self.soName = soName
|
||||||
self.packageName = packageName
|
self.packageName = packageName
|
||||||
self.resultVariable = resultVariable
|
self.resultVariable = resultVariable
|
||||||
@ -43,6 +44,10 @@ class LibraryMapping:
|
|||||||
self.extra = extra
|
self.extra = extra
|
||||||
self.targetName = targetName
|
self.targetName = targetName
|
||||||
|
|
||||||
|
# if emit_if is non-empty, the generated find_package call
|
||||||
|
# for a library will be surrounded by this condition.
|
||||||
|
self.emit_if = emit_if
|
||||||
|
|
||||||
def is_qt(self) -> bool:
|
def is_qt(self) -> bool:
|
||||||
return self.packageName == 'Qt' \
|
return self.packageName == 'Qt' \
|
||||||
or self.packageName == 'Qt5' \
|
or self.packageName == 'Qt5' \
|
||||||
@ -172,6 +177,7 @@ _qt_library_map = [
|
|||||||
# qtzlib: No longer supported.
|
# qtzlib: No longer supported.
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Note that the library map is adjusted dynamically further down.
|
||||||
_library_map = [
|
_library_map = [
|
||||||
# 3rd party:
|
# 3rd party:
|
||||||
LibraryMapping('atspi', 'ATSPI2', 'PkgConfig::ATSPI2'),
|
LibraryMapping('atspi', 'ATSPI2', 'PkgConfig::ATSPI2'),
|
||||||
@ -247,6 +253,20 @@ _library_map = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def _adjust_library_map():
|
||||||
|
# Assign a Linux condition on all x and wayland related packages.
|
||||||
|
# We don't want to get pages of package not found messages on
|
||||||
|
# Windows and macOS, and this also improves configure time on
|
||||||
|
# those platforms.
|
||||||
|
linux_package_prefixes = ['xcb', 'x11', 'xkb', 'xrender', 'xlib', 'wayland']
|
||||||
|
for i, _ in enumerate(_library_map):
|
||||||
|
if any([_library_map[i].soName.startswith(p) for p in linux_package_prefixes]):
|
||||||
|
_library_map[i].emit_if = 'config.linux'
|
||||||
|
|
||||||
|
|
||||||
|
_adjust_library_map()
|
||||||
|
|
||||||
|
|
||||||
def find_3rd_party_library_mapping(soName: str) -> typing.Optional[LibraryMapping]:
|
def find_3rd_party_library_mapping(soName: str) -> typing.Optional[LibraryMapping]:
|
||||||
for i in _library_map:
|
for i in _library_map:
|
||||||
if i.soName == soName:
|
if i.soName == soName:
|
||||||
@ -356,8 +376,10 @@ def map_3rd_party_library(lib: str) -> str:
|
|||||||
return mapping.targetName + libpostfix
|
return mapping.targetName + libpostfix
|
||||||
|
|
||||||
|
|
||||||
def generate_find_package_info(lib: LibraryMapping, use_qt_find_package: bool=True, *,
|
def generate_find_package_info(lib: LibraryMapping,
|
||||||
indent: int = 0) -> str:
|
use_qt_find_package: bool=True, *,
|
||||||
|
indent: int = 0,
|
||||||
|
emit_if: str = '') -> str:
|
||||||
isRequired = False
|
isRequired = False
|
||||||
|
|
||||||
extra = lib.extra.copy()
|
extra = lib.extra.copy()
|
||||||
@ -377,7 +399,8 @@ def generate_find_package_info(lib: LibraryMapping, use_qt_find_package: bool=Tr
|
|||||||
extra += ['PROVIDED_TARGETS', cmake_target_name]
|
extra += ['PROVIDED_TARGETS', cmake_target_name]
|
||||||
|
|
||||||
result = ''
|
result = ''
|
||||||
ind = ' ' * indent
|
one_ind = ' '
|
||||||
|
ind = one_ind * indent
|
||||||
|
|
||||||
if use_qt_find_package:
|
if use_qt_find_package:
|
||||||
if extra:
|
if extra:
|
||||||
@ -393,4 +416,12 @@ def generate_find_package_info(lib: LibraryMapping, use_qt_find_package: bool=Tr
|
|||||||
else:
|
else:
|
||||||
result = '{}find_package({})\n'.format(ind, lib.packageName)
|
result = '{}find_package({})\n'.format(ind, lib.packageName)
|
||||||
|
|
||||||
|
# If a package should be found only in certain conditions, wrap
|
||||||
|
# the find_package call within that condition.
|
||||||
|
if emit_if:
|
||||||
|
result = "if(({emit_if}) OR QT_FIND_ALL_PACKAGES_ALWAYS)\n" \
|
||||||
|
"{ind}{result}endif()\n".format(emit_if=emit_if,
|
||||||
|
result=result,
|
||||||
|
ind=one_ind)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
Loading…
x
Reference in New Issue
Block a user