| # |
| # W A R N I N G |
| # ------------- |
| # |
| # This file is not part of the Qt API. It exists purely as an |
| # implementation detail. It may change from version to version |
| # without notice, or even be removed. |
| # |
| # We mean it. |
| # |
| |
| isEmpty(MODULE):MODULE = $$section($$list($$basename(_PRO_FILE_)), ., 0, 0) |
| isEmpty(VERSION): VERSION = $$MODULE_VERSION |
| isEmpty(VERSION): error("Module does not define version.") |
| |
| isEmpty(MODULE_CFG_FILE): MODULE_CFG_FILE = qt$${MODULE}-config |
| exists($$OUT_PWD/$${MODULE_CFG_FILE}.pri) { |
| include($$OUT_PWD/$${MODULE_CFG_FILE}.pri) |
| CONFIG += generated_privates |
| } |
| |
| skip = $$eval(QT.$${MODULE}.skip) |
| isEmpty(skip): skip = false |
| requires(!$$skip) |
| |
| # Compile as shared/DLL or static according to the option given to configure |
| # unless overridden. Host builds are always static |
| host_build|staticlib: CONFIG += static |
| |
| host_build { |
| QT -= gui # no host module will ever use gui |
| force_bootstrap { |
| !build_pass:qtConfig(release_tools): CONFIG += release |
| contains(QT, core(-private)?|xml) { |
| QT -= core core-private xml |
| QT += bootstrap-private |
| } |
| } else { |
| !build_pass:qtConfig(debug_and_release): CONFIG += release |
| } |
| } |
| |
| qtConfig(framework) { |
| minimal_syncqt: \ |
| CONFIG += module_frameworks |
| else: CONFIG(shared, static|shared): \ |
| CONFIG += module_frameworks lib_bundle |
| } |
| |
| CONFIG += relative_qt_rpath # Qt libraries should be relocatable |
| |
| # Qt libraries should only use Application Extension safe APIs |
| darwin:!no_app_extension_api_only: CONFIG += app_extension_api_only |
| |
| ucmodule = $$upper($$MODULE) |
| |
| isEmpty(MODULE_INCNAME): MODULE_INCNAME = $$TARGET |
| |
| internal_module: \ |
| MODULE_DEPENDS = $$replace(QT, -private$, _private) |
| else: \ |
| MODULE_DEPENDS = $$replace(QT, -private$, ) |
| MODULE_DEPENDS = $$unique(MODULE_DEPENDS) |
| contains(MODULE_DEPENDS, $$MODULE): \ |
| error("$$TARGET depends on itself.") |
| |
| contains(TARGET, QtAddOn.*): \ |
| MODULE_DEFINE = QT_ADDON_$${ucmodule}_LIB |
| else: \ |
| MODULE_DEFINE = QT_$${ucmodule}_LIB |
| MODULE_DEFINES = $$MODULE_DEFINE $$MODULE_DEFINES |
| |
| # Make sure that the supporting runtime is linked into the application when |
| # the module is built with exceptions enabled. |
| integrity:CONFIG(exceptions, exceptions|exceptions_off): \ |
| MODULE_CONFIG += exceptions |
| |
| load(qt_build_paths) |
| |
| header_module { |
| TEMPLATE = aux |
| CONFIG += \ |
| force_qt \ # Needed for the headers_clean tests. |
| qt_no_install_library |
| |
| # Allow creation of .prl, .la and .pc files. |
| target.path = $$[QT_INSTALL_LIBS] |
| target.CONFIG += dummy_install |
| INSTALLS += target |
| } else { |
| TEMPLATE = lib |
| } |
| DESTDIR = $$MODULE_BASE_OUTDIR/lib |
| DLLDESTDIR = $$MODULE_BASE_OUTDIR/bin |
| |
| CONFIG += target_qt |
| |
| QMAKE_DOCS_TARGETDIR = qt$${MODULE} |
| |
| load(qt_common) |
| !no_module_headers: load(qt_module_headers) |
| load(qt_module_pris) |
| |
| INCLUDEPATH *= $$eval(QT.$${MODULE}.includes) $$eval(QT.$${MODULE}_private.includes) |
| |
| # If Qt was configured with -debug-and-release then build the module the same way |
| # - unless this is a host library |
| !host_build:if(win32|mac):!macx-xcode { |
| qtConfig(debug_and_release): CONFIG += debug_and_release |
| qtConfig(build_all): CONFIG += build_all |
| } |
| |
| QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF |
| |
| QT_PRIVATE += $$QT_FOR_PRIVATE |
| unset(QT_FOR_PRIVATE) |
| QMAKE_USE_PRIVATE += $$QMAKE_USE_FOR_PRIVATE |
| unset(QMAKE_USE_FOR_PRIVATE) |
| |
| CONFIG += create_cmake |
| |
| contains(TARGET, QtAddOn.*): \ |
| DEFINES += QT_BUILD_ADDON_$${ucmodule}_LIB |
| else: \ |
| DEFINES += QT_BUILD_$${ucmodule}_LIB |
| |
| # OS X and iOS frameworks |
| lib_bundle { |
| # Set the CFBundleIdentifier prefix for Qt frameworks |
| QMAKE_TARGET_BUNDLE_PREFIX = org.qt-project |
| #QMAKE_FRAMEWORK_VERSION = 4.0 |
| CONFIG += sliced_bundle |
| header_module { |
| CONFIG += bundle |
| QMAKE_BUNDLE_NAME = $$TARGET |
| QMAKE_BUNDLE_EXTENSION = .framework |
| QMAKE_INFO_PLIST = $$QMAKESPEC/Info.plist.lib |
| } |
| !build_all| \ |
| if(if(!debug_and_release|CONFIG(release, debug|release))) { |
| FRAMEWORK_HEADERS.version = Versions |
| FRAMEWORK_HEADERS.files = \ |
| $$SYNCQT.HEADER_FILES $$SYNCQT.GENERATED_HEADER_FILES $$SYNCQT.INJECTED_HEADER_FILES |
| FRAMEWORK_HEADERS.path = Headers |
| FRAMEWORK_PRIVATE_HEADERS.version = Versions |
| FRAMEWORK_PRIVATE_HEADERS.files = \ |
| $$SYNCQT.PRIVATE_HEADER_FILES $$SYNCQT.INJECTED_PRIVATE_HEADER_FILES |
| FRAMEWORK_PRIVATE_HEADERS.path = Headers/$$VERSION/$$MODULE_INCNAME/private |
| FRAMEWORK_QPA_HEADERS.version = Versions |
| FRAMEWORK_QPA_HEADERS.files = $$SYNCQT.QPA_HEADER_FILES |
| FRAMEWORK_QPA_HEADERS.path = Headers/$$VERSION/$$MODULE_INCNAME/qpa |
| QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS FRAMEWORK_PRIVATE_HEADERS FRAMEWORK_QPA_HEADERS |
| } |
| } |
| |
| mac { |
| macx-g++ { |
| QMAKE_CFLAGS += -fconstant-cfstrings |
| QMAKE_CXXFLAGS += -fconstant-cfstrings |
| } |
| |
| qtConfig(rpath): \ |
| QMAKE_SONAME_PREFIX = @rpath |
| else: \ |
| CONFIG += absolute_library_soname |
| } |
| |
| DEFINES += QT_BUILDING_QT |
| win32 { |
| INCLUDEPATH += tmp |
| CONFIG += skip_target_version_ext |
| # If the code is really "unsafe" then it is unsafe on |
| # other platforms as well; so fixing these warnings just |
| # for MSVC builds, would clutter the code and wouldn't help |
| # in fixing issues that might exist on other platforms. |
| # Using the same functions across all supported platforms |
| # keeps the code clean and helps in writing code that is |
| # safe across all platforms. |
| DEFINES *= _CRT_SECURE_NO_WARNINGS |
| |
| DEFINES += _USE_MATH_DEFINES |
| } |
| |
| aix-g++* { |
| QMAKE_CFLAGS += -mminimal-toc |
| QMAKE_CXXFLAGS += -mminimal-toc |
| } |
| |
| sse2:!contains(QT_CPU_FEATURES.$$QT_ARCH, sse2):!host_build:!if(static:qtConfig(shared)) { |
| # If the compiler supports SSE2, enable it unconditionally in all of Qt shared libraries |
| # (and only the libraries). This is not expected to be a problem because: |
| # - on Windows, sharing of libraries is uncommon |
| # - on Mac OS X, all x86 CPUs already have SSE2 support (we won't even reach here) |
| # - on Linux, the dynamic loader can find the libraries on LIBDIR/sse2/ |
| # The last guarantee does not apply to executables and plugins, so we can't enable for them. |
| QT_CPU_FEATURES.$$QT_ARCH += sse sse2 |
| QMAKE_CFLAGS += $$QMAKE_CFLAGS_SSE2 |
| QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_SSE2 |
| } |
| |
| clang { |
| apple_clang_ver = $${QT_APPLE_CLANG_MAJOR_VERSION}.$${QT_APPLE_CLANG_MINOR_VERSION} |
| reg_clang_ver = $${QT_CLANG_MAJOR_VERSION}.$${QT_CLANG_MINOR_VERSION} |
| versionAtLeast(apple_clang_ver, 5.1)|versionAtLeast(reg_clang_ver, 3.4): \ |
| CONFIG += compiler_supports_fpmath |
| } else: gcc { |
| CONFIG += compiler_supports_fpmath |
| } |
| |
| equals(QT_ARCH, i386):contains(QT_CPU_FEATURES.$$QT_ARCH, sse2):compiler_supports_fpmath { |
| # Turn on SSE-based floating-point math |
| QMAKE_CFLAGS += -mfpmath=sse |
| QMAKE_CXXFLAGS += -mfpmath=sse |
| } |
| |
| android: CONFIG += qt_android_deps no_linker_version_script |
| |
| !header_module:unix:!isEmpty(QMAKE_LFLAGS_VERSION_SCRIPT):!no_linker_version_script:!static { |
| verscript = $${TARGET}.version |
| QMAKE_LFLAGS += $${QMAKE_LFLAGS_VERSION_SCRIPT}$$verscript |
| |
| internal_module { |
| verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API { *; };" |
| } else { |
| verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API {" \ |
| " qt_private_api_tag*;" |
| |
| private_api_headers = $$SYNCQT.PRIVATE_HEADER_FILES $$SYNCQT.QPA_HEADER_FILES |
| |
| for(header, private_api_headers): \ |
| verscript_content += " @FILE:$$header@" |
| verscript_content += "};" |
| |
| current = Qt_$$QT_MAJOR_VERSION |
| verscript_content += "$$current { *; };" |
| isEmpty(QT_NAMESPACE): tag_symbol = qt_version_tag |
| else: tag_symbol = qt_version_tag_$$QT_NAMESPACE |
| |
| for(i, 0..$$QT_MINOR_VERSION) { |
| previous = $$current |
| current = Qt_$${QT_MAJOR_VERSION}.$$i |
| equals(i, $$QT_MINOR_VERSION): verscript_content += "$$current { $$tag_symbol; } $$previous;" |
| else: verscript_content += "$$current {} $$previous;" |
| } |
| |
| # Add a post-processing step to replace the @FILE:filename@ |
| verscript_in = $${verscript}.in |
| verscriptprocess.name = linker version script ${QMAKE_FILE_BASE} |
| verscriptprocess.input = verscript_in |
| verscriptprocess.CONFIG += no_link target_predeps |
| verscriptprocess.depends = $$private_api_headers |
| verscriptprocess.output = $$verscript |
| verscriptprocess.commands = perl $${PWD}/data/unix/findclasslist.pl < ${QMAKE_FILE_IN} > $@ |
| silent:verscriptprocess.commands = @echo creating linker version script ${QMAKE_FILE_BASE} && $$verscriptprocess.commands |
| QMAKE_EXTRA_COMPILERS += verscriptprocess |
| |
| verscript = $$verscript_in |
| } |
| write_file($$OUT_PWD/$$verscript, verscript_content)|error() |
| unset(current) |
| unset(previous) |
| unset(verscript) |
| unset(verscript_content) |
| } |
| |
| #install directives |
| load(qt_installs) |
| |
| load(qt_targets) |
| |
| # this builds on top of qt_common |
| !internal_module:if(unix|mingw):!if(darwin:debug_and_release:CONFIG(debug, debug|release)) { |
| CONFIG += create_pc |
| QMAKE_PKGCONFIG_DESTDIR = pkgconfig |
| host_build: \ |
| QMAKE_PKGCONFIG_LIBDIR = $$[QT_HOST_LIBS] |
| else: \ |
| QMAKE_PKGCONFIG_LIBDIR = $$[QT_INSTALL_LIBS/raw] |
| lib_bundle { |
| QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_LIBS/raw]/$${MODULE_INCNAME}.framework/Headers |
| QMAKE_PKGCONFIG_CFLAGS = -D$$MODULE_DEFINE |
| } else { |
| QMAKE_PKGCONFIG_INCDIR = $$[QT_INSTALL_HEADERS/raw] |
| QMAKE_PKGCONFIG_CFLAGS = -D$$MODULE_DEFINE -I${includedir}/$$MODULE_INCNAME |
| for(inc, MODULE_AUX_INCLUDES): \ |
| QMAKE_PKGCONFIG_CFLAGS += -I${includedir}/$$section(inc, /, 1, 1) |
| } |
| QMAKE_PKGCONFIG_NAME = $$replace(TARGET, ^Qt, "Qt$$QT_MAJOR_VERSION ") |
| QMAKE_PKGCONFIG_FILE = $$replace(TARGET, ^Qt, Qt$$QT_MAJOR_VERSION)$$qtPlatformTargetSuffix() |
| for(i, MODULE_DEPENDS): \ |
| QMAKE_PKGCONFIG_REQUIRES += $$replace(QT.$${i}.name, ^Qt, Qt$$section(QT.$${i}.VERSION, ., 0, 0))$$qtPlatformTargetSuffix() |
| isEmpty(QMAKE_PKGCONFIG_DESCRIPTION): \ |
| QMAKE_PKGCONFIG_DESCRIPTION = $$replace(TARGET, ^Qt, "Qt ") module |
| !isEmpty(lib_replace0.match) { |
| pclib_replace0.match = $$lib_replace0.match |
| pclib_replace0.replace = $$QMAKE_PKGCONFIG_LIBDIR/ |
| pclib_replace0.CONFIG = path |
| QMAKE_PKGCONFIG_INSTALL_REPLACE += pclib_replace0 |
| } |
| pclib_replace.match = $$lib_replace.match |
| !isEmpty(lib_replace.replace): \ |
| pclib_replace.replace = $$QMAKE_PKGCONFIG_LIBDIR |
| pclib_replace.CONFIG = path |
| QMAKE_PKGCONFIG_INSTALL_REPLACE += pclib_replace |
| } |
| !lib_bundle:unix { |
| CONFIG += create_libtool |
| host_build: \ |
| QMAKE_LIBTOOL_LIBDIR = $$[QT_HOST_LIBS] |
| else: \ |
| QMAKE_LIBTOOL_LIBDIR = "=$$[QT_INSTALL_LIBS/raw]" |
| !isEmpty(lib_replace0.match) { |
| ltlib_replace0.match = $$lib_replace0.match |
| ltlib_replace0.replace = $$QMAKE_LIBTOOL_LIBDIR/ |
| ltlib_replace0.CONFIG = path |
| QMAKE_LIBTOOL_INSTALL_REPLACE += ltlib_replace0 |
| } |
| ltlib_replace.match = $$lib_replace.match |
| !isEmpty(lib_replace.replace): \ |
| ltlib_replace.replace = $$QMAKE_LIBTOOL_LIBDIR |
| ltlib_replace.CONFIG = path |
| QMAKE_LIBTOOL_INSTALL_REPLACE += ltlib_replace |
| } |
| |
| contains(QT_PRODUCT, OpenSource.*):DEFINES *= QT_OPENSOURCE |
| DEFINES *= QT_NO_CAST_TO_ASCII QT_ASCII_CAST_WARNINGS |
| DEFINES *= QT_MOC_COMPAT #we don't need warnings from calling moc code in our generated code |
| DEFINES *= QT_USE_QSTRINGBUILDER |
| DEFINES *= QT_DEPRECATED_WARNINGS |
| |
| win32 { |
| # On Windows, due to the way DLLs work, we need to export all functions, |
| # including the inlines |
| DEFINES *= QT_DISABLE_DEPRECATED_BEFORE=0x040800 |
| } else { |
| # On other platforms, Qt's own compilation goes needs to compile the Qt 5.0 API |
| DEFINES *= QT_DISABLE_DEPRECATED_BEFORE=0x050000 |
| } |
| DEFINES *= QT_DEPRECATED_WARNINGS_SINCE=0x060000 |
| |
| TARGET = $$qt5LibraryTarget($$TARGET$$QT_LIBINFIX) # Do this towards the end |