CMake: Support /nolink libraries

Add a helper function to QtBuild that generates Foo_nolink versions
of Foo library targets.

Map 'Foo/nolink' libs found in qmake to Foo_nolink.

Automatically run helper function to create _nolink targets as
part of extend_target.

Change-Id: I4c23ea68b3037d23c9a31d4ac272a6bd0565f7c0
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Tobias Hunger 2019-03-28 15:25:17 +01:00
parent be0cf9f8d7
commit 92b0d7b911
4 changed files with 79 additions and 37 deletions

View File

@ -156,6 +156,37 @@ macro(assert)
endmacro()
function(qt_create_nolink_target target)
if(NOT TARGET "${target}")
message(FATAL_ERROR "${target} does not exist when trying to build a nolink target.")
endif()
get_target_property(type "${target}" TYPE)
if(type STREQUAL EXECUTABLE)
message(FATAL_ERROR "${target} must be a library of some kind.")
endif()
if(type STREQUAL OBJECT_LIBRARY)
message(FATAL_ERROR "${target} must not be an object library.")
endif()
set(nolink_target "${target}_nolink")
if(NOT TARGET "${nolink_target}")
string(REPLACE ":" "_" base_target "__${nolink_target}")
add_library("${base_target}" INTERFACE)
target_include_directories("${base_target}" INTERFACE
$<TARGET_PROPERTY:${target},INTERFACE_INCLUDE_DIRECTORIES>)
target_include_directories("${base_target}" INTERFACE SYSTEM
$<TARGET_PROPERTY:${target},INTERFACE_SYSTEM_INCLUDE_DIRECTORIES>)
target_compile_definitions("${base_target}" INTERFACE
$<TARGET_PROPERTY:${target},INTERFACE_COMPILE_DEFINITIONS>)
target_compile_options("${base_target}" INTERFACE
$<TARGET_PROPERTY:${target},INTERFACE_COMPILE_OPTIONS>)
target_compile_features("${base_target}" INTERFACE
$<TARGET_PROPERTY:${target},INTERFACE_COMPILE_FEATURES>)
add_library("${nolink_target}" ALIAS "${base_target}")
endif()
endfunction()
function(qt_ensure_perl)
if(DEFINED HOST_PERL)
return()
@ -357,6 +388,13 @@ function(extend_target target)
list(APPEND dbus_sources "${sources}")
endforeach()
foreach(lib ${arg_PUBLIC_LIBRARIES} ${arg_LIBRARIES})
string(REGEX REPLACE "_nolink$" "" base_lib "${lib}")
if(NOT base_lib STREQUAL lib)
qt_create_nolink_target("${base_lib}")
endif()
endforeach()
target_sources("${target}" PRIVATE ${arg_SOURCES} ${dbus_sources})
if (arg_COMPILE_FLAGS)
set_source_files_properties(${arg_SOURCES} PROPERTIES COMPILE_FLAGS "${arg_COMPILE_FLAGS}")

View File

@ -1,5 +1,3 @@
# Generated from network.pro.
#####################################################################
## Network Module:
#####################################################################
@ -55,16 +53,17 @@ add_qt_module(Network
kernel
LIBRARIES
Qt::CorePrivate
ZLIB::ZLIB # special case
PUBLIC_LIBRARIES # special case
ZLIB::ZLIB # special case
PUBLIC_LIBRARIES
Qt::Core
# MODULE_PLUGIN_TYPES = "bearer"
# MODULE_WINRT_CAPABILITIES = "internetClient" "internetClientServer" "privateNetworkClientServer"
# PRECOMPILED_HEADER = "../corelib/global/qt_pch.h"
# QMAKE_LIBS = "$$QMAKE_LIBS_NETWORK"
# _LOADED = "qt_module"
)
#### Keys ignored in scope 1:.:.:network.pro:<TRUE>:
# MODULE_PLUGIN_TYPES = "bearer"
# MODULE_WINRT_CAPABILITIES = "internetClient" "internetClientServer" "privateNetworkClientServer"
# QMAKE_LIBS = "$$QMAKE_LIBS_NETWORK"
# _LOADED = "qt_module"
## Scopes:
#####################################################################
@ -72,13 +71,12 @@ extend_target(Network CONDITION MSVC AND (TEST_architecture_arch STREQUAL "i386"
LINK_OPTIONS
"/BASE:0x64000000"
)
#
#extend_target(Network CONDITION QT_FEATURE_bearermanagement
# # ANDROID_BUNDLED_JAR_DEPENDENCIES = "jar/QtAndroidBearer.jar"
# # ANDROID_LIB_DEPENDENCIES = "plugins/bearer/libqandroidbearer.so"
# # ANDROID_PERMISSIONS = "android.permission.ACCESS_NETWORK_STATE"
# # MODULE_PLUGIN_TYPES = "bearer"
#)
#### Keys ignored in scope 3:.:.:network.pro:QT_FEATURE_bearermanagement:
# ANDROID_BUNDLED_JAR_DEPENDENCIES = "jar/QtAndroidBearer.jar"
# ANDROID_LIB_DEPENDENCIES = "plugins/bearer/libqandroidbearer.so"
# ANDROID_PERMISSIONS = "android.permission.ACCESS_NETWORK_STATE"
# MODULE_PLUGIN_TYPES = "bearer"
extend_target(Network CONDITION QT_FEATURE_ftp
SOURCES
@ -101,8 +99,8 @@ extend_target(Network CONDITION APPLE_OSX
SOURCES
kernel/qnetworkproxy_mac.cpp
LIBRARIES
${FWSecurity}
${FWCoreFoundation}
${FWSecurity}
)
extend_target(Network CONDITION WASM
@ -168,6 +166,7 @@ extend_target(Network CONDITION UNIX AND NOT QT_FEATURE_linux_netlink
extend_target(Network CONDITION ANDROID AND QT_FEATURE_dnslookup
SOURCES
# kernel/qdnslookup_unix.cpp # special case: No more need to remove this
kernel/qdnslookup_android.cpp
)
@ -182,9 +181,9 @@ extend_target(Network CONDITION WIN32 AND NOT WINRT
kernel/qnetworkproxy_win.cpp
socket/qnativesocketengine_win.cpp
LIBRARIES
advapi32
dnsapi
iphlpapi
advapi32
)
extend_target(Network CONDITION QT_FEATURE_dnslookup AND WIN32 AND NOT WINRT
@ -218,8 +217,8 @@ extend_target(Network CONDITION QT_FEATURE_libproxy AND NOT APPLE_OSX AND (UNIX
SOURCES
kernel/qnetworkproxy_libproxy.cpp
LIBRARIES
LibProxy::LibProxy
${CMAKE_DL_LIBS}
LibProxy::LibProxy
)
extend_target(Network CONDITION NOT APPLE_OSX AND NOT QT_FEATURE_libproxy AND (UNIX OR WINRT)
@ -343,8 +342,8 @@ extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_opensslv11 AND
ssl/qsslcontext_openssl11.cpp
ssl/qsslsocket_openssl11.cpp
ssl/qsslsocket_openssl11_symbols_p.h
DEFINES # special case
"OPENSSL_API_COMPAT=0x10100000L"
DEFINES
OPENSSL_API_COMPAT=0x10100000L
)
extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT QT_FEATURE_opensslv11
@ -363,14 +362,16 @@ extend_target(Network CONDITION ANDROID AND QT_FEATURE_openssl AND QT_FEATURE_ss
SOURCES
ssl/qsslsocket_openssl_android.cpp
)
#
#extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_openssl_linked AND QT_FEATURE_ssl
# # QMAKE_USE_FOR_PRIVATE = "openssl"
#)
#
#extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT QT_FEATURE_openssl_linked
# # QMAKE_USE_FOR_PRIVATE = "openssl/nolink"
#)
extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_openssl_linked AND QT_FEATURE_ssl
LIBRARIES
OpenSSL::SSL
)
extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND NOT QT_FEATURE_openssl_linked
LIBRARIES
OpenSSL::SSL_nolink
)
extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND WIN32
SOURCES
@ -379,10 +380,8 @@ extend_target(Network CONDITION QT_FEATURE_openssl AND QT_FEATURE_ssl AND WIN32
crypt32
)
# Special case, from mkspecs/common/msvc-desktop.conf
extend_target(Network CONDITION WIN32
LIBRARIES
ws2_32
)
extend_target(Network CONDITION WIN32 LIBRARIES ws2_32) # special case: mkspecs/common/msvc-desktop.conf
add_qt_docs(./doc/qtnetwork.qdocconf)
add_qt_docs(
./doc/qtnetwork.qdocconf
)

View File

@ -232,6 +232,7 @@ libray_mapping = {
'libudev': 'PkgConfig::Libudev',
'mtdev': 'PkgConfig::Mtdev',
'odbc': 'ODBC::ODBC',
'openssl': 'OpenSSL::SSL',
'pcre2': 'PCRE2',
'psql': 'PostgreSQL::PostgreSQL',
'sqlite': 'SQLite::SQLite3',
@ -263,4 +264,8 @@ libray_mapping = {
def substitute_libs(lib: str) -> str:
return libray_mapping.get(lib, lib)
libpostfix = ''
if lib.endswith('/nolink'):
lib = lib[:-7]
libpostfix = '_nolink'
return libray_mapping.get(lib, lib) + libpostfix

View File

@ -1012,7 +1012,7 @@ def write_sources_section(cm_fh: typing.IO[str], scope: Scope, *,
write_library_section(cm_fh, scope,
['QMAKE_USE', 'LIBS'],
['QT_FOR_PRIVATE', 'QMAKE_USE_PRIVATE', 'LIBS_PRIVATE'],
['QT_FOR_PRIVATE', 'QMAKE_USE_PRIVATE', 'QMAKE_USE_FOR_PRIVATE', 'LIBS_PRIVATE'],
['QT',],
indent=indent, known_libraries=known_libraries)