diff options
Diffstat (limited to 'mkspecs/features')
34 files changed, 628 insertions, 106 deletions
diff --git a/mkspecs/features/android.prf b/mkspecs/features/android.prf new file mode 100644 index 0000000000..2a3086d4ad --- /dev/null +++ b/mkspecs/features/android.prf @@ -0,0 +1,14 @@ +contains(TEMPLATE, ".*app") { + !android_app { + !contains(TARGET, ".so"): TARGET = lib$${TARGET}.so + QMAKE_LFLAGS += -Wl,-soname,$$TARGET + } +} +!QTDIR_build:android_install { + isEmpty(QT_BUILD_TREE) { + target.path=/libs/$$ANDROID_TARGET_ARCH/ + } else { + target.path = / + } + INSTALLS *= target +} diff --git a/mkspecs/features/c++11.prf b/mkspecs/features/c++11.prf index 4b56fa9fd2..32eaca4a9b 100644 --- a/mkspecs/features/c++11.prf +++ b/mkspecs/features/c++11.prf @@ -1,3 +1,10 @@ QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_CXX11 QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CXXFLAGS_CXX11 QMAKE_LFLAGS += $$QMAKE_LFLAGS_CXX11 + +contains(QMAKE_LFLAGS, -stdlib=libc++) { + equals(QMAKE_MACOSX_DEPLOYMENT_TARGET, 10.6): \ + QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7 + contains(QMAKE_IOS_DEPLOYMENT_TARGET, ^4.*): \ + QMAKE_IOS_DEPLOYMENT_TARGET = 5.0 +} diff --git a/mkspecs/features/cmake_functions.prf b/mkspecs/features/cmake_functions.prf new file mode 100644 index 0000000000..62634d9b88 --- /dev/null +++ b/mkspecs/features/cmake_functions.prf @@ -0,0 +1,26 @@ +# +# 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. +# + +defineReplace(cmakeModuleName) { + _module = $$1 + _name = $$eval(QT.$${_module}.name) + cmake_module_name = $$replace(_name, ^Qt, ) + return ($$cmake_module_name) +} + +defineReplace(cmakeModuleList) { + variable = $$1 + out = + for(v, variable) { + out += $$cmakeModuleName($$v) + } + return ($$join(out, ";")) +} diff --git a/mkspecs/features/configure.prf b/mkspecs/features/configure.prf index 39144e7216..b4569df6d5 100644 --- a/mkspecs/features/configure.prf +++ b/mkspecs/features/configure.prf @@ -7,6 +7,9 @@ equals(MAKEFILE_GENERATOR, UNIX) { QMAKE_MAKE = mingw32-make } else:if(equals(MAKEFILE_GENERATOR, MSVC.NET)|equals(MAKEFILE_GENERATOR, MSBUILD)) { QMAKE_MAKE = nmake +} else:ios { + # iOS unsets MAKEFILE_GENERATOR in its default_pre.prf + QMAKE_MAKE = make } else { error("Configure tests are not supported with the $$MAKEFILE_GENERATOR Makefile generator.") } diff --git a/mkspecs/features/create_cmake.prf b/mkspecs/features/create_cmake.prf index 43dca4cd70..cf0acaf4b7 100644 --- a/mkspecs/features/create_cmake.prf +++ b/mkspecs/features/create_cmake.prf @@ -9,21 +9,7 @@ # We mean it. # -defineReplace(cmakeModuleName) { - _module = $$1 - _name = $$eval(QT.$${_module}.name) - cmake_module_name = $$replace(_name, ^Qt, ) - return ($$cmake_module_name) -} - -defineReplace(cmakeModuleList) { - variable = $$1 - out = - for(v, variable) { - out += $$cmakeModuleName($$v) - } - return ($$join(out, ";")) -} +load(cmake_functions) defineReplace(cmakeRelativePath) { path = $$relative_path($$1, $$2) @@ -69,10 +55,10 @@ CMAKE_BIN_DIR = $$cmakeRelativePath($$[QT_HOST_BINS], $$[QT_INSTALL_PREFIX]) CMAKE_BIN_DIR_IS_ABSOLUTE = True } -CMAKE_ARCHDATA_DIR = $$cmakeRelativePath($$[QT_INSTALL_ARCHDATA], $$[QT_INSTALL_PREFIX]) -!isEmpty(CMAKE_FORCE_ABSOLUTE_PATHS)|contains(CMAKE_ARCHDATA_DIR, "^\\.\\./.*") { # For the mkspecs - CMAKE_ARCHDATA_DIR = $$[QT_INSTALL_ARCHDATA]/ - CMAKE_ARCHDATA_DIR_IS_ABSOLUTE = True +CMAKE_HOST_DATA_DIR = $$cmakeRelativePath($$[QT_HOST_DATA], $$[QT_INSTALL_PREFIX]) +!isEmpty(CMAKE_FORCE_ABSOLUTE_PATHS)|contains(CMAKE_HOST_DATA_DIR, "^\\.\\./.*") { + CMAKE_HOST_DATA_DIR = $$[QT_HOST_DATA]/ + CMAKE_HOST_DATA_DIR_IS_ABSOLUTE = True } static|staticlib:CMAKE_STATIC_TYPE = true @@ -83,7 +69,7 @@ CMAKE_MKSPEC = $$[QMAKE_XSPEC] CMAKE_QT_STEM = Qt$$eval(QT.$${MODULE}.MAJOR_VERSION)$${CMAKE_MODULE_NAME}$${QT_LIBINFIX} -macx { +mac { !isEmpty(CMAKE_STATIC_TYPE) { CMAKE_LIB_FILE_LOCATION_DEBUG = lib$${CMAKE_QT_STEM}_debug.a CMAKE_LIB_FILE_LOCATION_RELEASE = lib$${CMAKE_QT_STEM}.a diff --git a/mkspecs/features/ctest_testcase.prf b/mkspecs/features/ctest_testcase.prf index 7f86ca0052..7faf738d6e 100644 --- a/mkspecs/features/ctest_testcase.prf +++ b/mkspecs/features/ctest_testcase.prf @@ -18,6 +18,8 @@ isEmpty(CMAKE_VERSION) { CMAKE_VERSION_MAJOR = $$section(CMAKE_VERSION, ., 0, 0) CMAKE_VERSION_MINOR = $$section(CMAKE_VERSION, ., 1, 1) CMAKE_VERSION_PATCH = $$section(CMAKE_VERSION, ., 2, 2) + # CMake can report versions like 2.8.11-rc1, so strip off the rc part. + CMAKE_VERSION_PATCH ~= s,-.*,, VERSION_OK = greaterThan(CMAKE_VERSION_MAJOR, 2) { @@ -31,6 +33,8 @@ isEmpty(CMAKE_VERSION) { isEmpty(VERSION_OK) { message("cmake $$CMAKE_VERSION is too old for this test.") } else { + load(cmake_functions) + CMAKE_BUILD_TYPE = Debug CONFIG(release, debug|release):CMAKE_BUILD_TYPE = Release win32-g++*:CMAKE_GENERATOR = -G \"MinGW Makefiles\" @@ -40,10 +44,39 @@ isEmpty(CMAKE_VERSION) { for(d, $$list($$split($$list($$[QMAKE_MKSPECS]), $$DIRLIST_SEPARATOR))) { CMAKE_PREFIX_PATH *= $$dirname(d) } + CMAKE_PREFIX_PATH=\"$$join(CMAKE_PREFIX_PATH, ;)\" + + !qtHaveModule(widgets): CMAKE_MODULE_DEFINES += -DNO_WIDGETS=True + !qtHaveModule(dbus): CMAKE_MODULE_DEFINES += -DNO_DBUS=True + + dependentmodules = $$resolve_depends(CMAKE_QT_MODULES_UNDER_TEST, "QT.") + dependentmodules -= $$CMAKE_QT_MODULES_UNDER_TEST + dependentmodules = $$cmakeModuleList($$dependentmodules) + + SET = set + equals(QMAKE_DIR_SEP, "/"):SET = export + + CMAKE_MODULE_VERSIONS = + CMAKE_MODULES_UNDER_TEST = + for (MODULE_UNDER_TEST, CMAKE_QT_MODULES_UNDER_TEST) { + CMAKE_NAME = $$cmakeModuleName($$MODULE_UNDER_TEST) + CMAKE_MODULE_VERSIONS += \ + -DCMAKE_$${CMAKE_NAME}_MODULE_MAJOR_VERSION=$$eval(QT.$${MODULE_UNDER_TEST}.MAJOR_VERSION) \ + -DCMAKE_$${CMAKE_NAME}_MODULE_MINOR_VERSION=$$eval(QT.$${MODULE_UNDER_TEST}.MINOR_VERSION) \ + -DCMAKE_$${CMAKE_NAME}_MODULE_PATCH_VERSION=$$eval(QT.$${MODULE_UNDER_TEST}.PATCH_VERSION) + CMAKE_MODULES_UNDER_TEST += $$CMAKE_NAME + } + CMAKE_MODULES_UNDER_TEST = $$join(CMAKE_MODULES_UNDER_TEST, ;) check.commands = \ - $(MKDIR) $$BUILD_DIR && cd $$BUILD_DIR && \ - cmake $$_PRO_FILE_PWD_ $$CMAKE_GENERATOR -DCMAKE_BUILD_TYPE=$${CMAKE_BUILD_TYPE} -DCMAKE_PREFIX_PATH=\"$$join(CMAKE_PREFIX_PATH, ;)\" && \ + $(MKDIR) $$BUILD_DIR && cd $$BUILD_DIR && $$SET VERBOSE=1 && \ + cmake $$_PRO_FILE_PWD_ $$CMAKE_GENERATOR \ + $$CMAKE_MODULE_DEFINES \ + -DCMAKE_BUILD_TYPE=$${CMAKE_BUILD_TYPE} \ + -DCMAKE_PREFIX_PATH=$$CMAKE_PREFIX_PATH \ + -DQt5_MODULE_TEST_DEPENDS=\"$${dependentmodules}\" \ + $${CMAKE_MODULE_VERSIONS} \ + -DCMAKE_MODULES_UNDER_TEST=\"$$CMAKE_MODULES_UNDER_TEST\" && \ $(TESTRUNNER) ctest --output-on-failure } @@ -54,6 +87,4 @@ insignificant_test:!isEmpty(check.commands) { check.commands = -$${check.commands} } -!qtHaveModule(widgets): CONFIG += insignificant_test # QTBUG-28540 - QMAKE_EXTRA_TARGETS *= check diff --git a/mkspecs/features/data/android/dx.bat b/mkspecs/features/data/android/dx.bat new file mode 100644 index 0000000000..af143c52b5 --- /dev/null +++ b/mkspecs/features/data/android/dx.bat @@ -0,0 +1,102 @@ +@echo off +REM Copyright (C) 2007 The Android Open Source Project +REM +REM Licensed under the Apache License, Version 2.0 (the "License"); +REM you may not use this file except in compliance with the License. +REM You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. + +REM If/when Google merge: +REM https://android-review.googlesource.com/#/c/52680/ +REM this file will become redundant. + +REM don't modify the caller's environment +setlocal + +REM Locate dx.jar in the directory where dx.bat was found and start it. + +REM Set up prog to be the path of this script, including following symlinks, +REM and set up progdir to be the fully-qualified pathname of its directory. +set prog=%~f0 + +if [%1]==[] goto badArgs +set "androidsdk=%1" +shift /1 + +if [%1]==[] goto badArgs + +rem Check we have a valid Java.exe in the path. +set java_exe= +call "%androidsdk%\tools\lib\find_java.bat" +if not defined java_exe goto :EOF + +set jarfile=dx.jar +set "frameworkdir=%androidsdk%\platform-tools" + +if exist "%frameworkdir%\%jarfile%" goto JarFileOk + set "frameworkdir=%frameworkdir%\lib" + +if exist "%frameworkdir%\%jarfile%" goto JarFileOk + set "frameworkdir=%androidsdk%\framework" + +:JarFileOk + +set jarpath=%frameworkdir%\%jarfile% + +set javaOpts= +set args= + +REM By default, give dx a max heap size of 1 gig and a stack size of 1meg. +rem This can be overridden by using "-JXmx..." and "-JXss..." options below. +set defaultXmx=-Xmx1024M +set defaultXss=-Xss1m + +REM Capture all arguments that are not -J options. +REM Note that when reading the input arguments with %1, the cmd.exe +REM automagically converts --name=value arguments into 2 arguments "--name" +REM followed by "value". Dx has been changed to know how to deal with that. +set params= + +:firstArg +if [%1]==[] goto endArgs +set a=%~1 + + if [%defaultXmx%]==[] goto notXmx + if %a:~0,5% NEQ -JXmx goto notXmx + set defaultXmx= + :notXmx + + if [%defaultXss%]==[] goto notXss + if %a:~0,5% NEQ -JXss goto notXss + set defaultXss= + :notXss + + if %a:~0,2% NEQ -J goto notJ + set javaOpts=%javaOpts% -%a:~2% + shift /1 + goto firstArg + + :notJ + set params=%params% %1 + shift /1 + goto firstArg + +:endArgs + +set javaOpts=%javaOpts% %defaultXmx% %defaultXss% + +call "%java_exe%" %javaOpts% -Djava.ext.dirs="%frameworkdir%" -jar "%jarpath%" %params% + +goto :EOF + +:badArgs +echo Usage: dx (for Qt) <android_sdk_path> <dx_arguments> +echo Example: dx (for Qt) C:\android-sdk --dex --output=target.jar .classes + diff --git a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in index d70dbedbf4..65ba03d44c 100644 --- a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in +++ b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in @@ -9,9 +9,7 @@ get_filename_component(_qt5$${CMAKE_MODULE_NAME}_install_prefix \"${CMAKE_CURREN set(_qt5$${CMAKE_MODULE_NAME}_install_prefix \"$$[QT_INSTALL_PREFIX]\") !!ENDIF -set(Qt5$${CMAKE_MODULE_NAME}_VERSION_MAJOR "$$eval(QT.$${MODULE}.MAJOR_VERSION)") -set(Qt5$${CMAKE_MODULE_NAME}_VERSION_MINOR "$$eval(QT.$${MODULE}.MINOR_VERSION)") -set(Qt5$${CMAKE_MODULE_NAME}_VERSION_PATCH "$$eval(QT.$${MODULE}.PATCH_VERSION)") +# For backwards compatibility only. Use Qt5$${CMAKE_MODULE_NAME}_VERSION instead. set(Qt5$${CMAKE_MODULE_NAME}_VERSION_STRING "$$eval(QT.$${MODULE}.MAJOR_VERSION).$$eval(QT.$${MODULE}.MINOR_VERSION).$$eval(QT.$${MODULE}.PATCH_VERSION)") set(Qt5$${CMAKE_MODULE_NAME}_LIBRARIES Qt5::$${CMAKE_MODULE_NAME}) @@ -47,13 +45,13 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME}) !!IF !no_module_headers !!IF isEmpty(CMAKE_INCLUDE_DIR_IS_ABSOLUTE) - set(Qt5$${CMAKE_MODULE_NAME}_INCLUDE_DIRS \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$${CMAKE_INCLUDE_DIR}$${MODULE_INCNAME}\") + set(Qt5$${CMAKE_MODULE_NAME}_INCLUDE_DIRS \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$$CMAKE_INCLUDE_DIR\" \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$${CMAKE_INCLUDE_DIR}$${MODULE_INCNAME}\") set(Qt5$${CMAKE_MODULE_NAME}_PRIVATE_INCLUDE_DIRS \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$${CMAKE_INCLUDE_DIR}$${MODULE_INCNAME}/${Qt5$${CMAKE_MODULE_NAME}_VERSION_STRING}\" \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$${CMAKE_INCLUDE_DIR}$${MODULE_INCNAME}/${Qt5$${CMAKE_MODULE_NAME}_VERSION_STRING}/$${MODULE_INCNAME}\" ) !!ELSE - set(Qt5$${CMAKE_MODULE_NAME}_INCLUDE_DIRS \"$${CMAKE_INCLUDE_DIR}Qt$${CMAKE_MODULE_NAME}\") + set(Qt5$${CMAKE_MODULE_NAME}_INCLUDE_DIRS \"$$CMAKE_INCLUDE_DIR\" \"$${CMAKE_INCLUDE_DIR}Qt$${CMAKE_MODULE_NAME}\") set(Qt5$${CMAKE_MODULE_NAME}_PRIVATE_INCLUDE_DIRS \"$${CMAKE_INCLUDE_DIR}$${MODULE_INCNAME}/${Qt5$${CMAKE_MODULE_NAME}_VERSION_STRING}\" \"$${CMAKE_INCLUDE_DIR}$${MODULE_INCNAME}/${Qt5$${CMAKE_MODULE_NAME}_VERSION_STRING}/$${MODULE_INCNAME}\" @@ -77,13 +75,18 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME}) if (Qt5$${CMAKE_MODULE_NAME}_FIND_QUIETLY) set(_Qt5$${CMAKE_MODULE_NAME}_DEPENDENCIES_FIND_QUIET QUIET) endif() + set(_Qt5$${CMAKE_MODULE_NAME}_FIND_VERSION_EXACT) + if (Qt5$${CMAKE_MODULE_NAME}_FIND_VERSION_EXACT) + set(_Qt5$${CMAKE_MODULE_NAME}_FIND_VERSION_EXACT EXACT) + endif() foreach(_module_dep ${_Qt5$${CMAKE_MODULE_NAME}_MODULE_DEPENDENCIES}) if (NOT Qt5${_module_dep}_FOUND) find_package(Qt5${_module_dep} + ${Qt5$${CMAKE_MODULE_NAME}_VERSION_STRING} ${_Qt5$${CMAKE_MODULE_NAME}_FIND_VERSION_EXACT} ${_Qt5$${CMAKE_MODULE_NAME}_DEPENDENCIES_FIND_QUIET} ${_Qt5$${CMAKE_MODULE_NAME}_FIND_DEPENDENCIES_REQUIRED} - PATHS \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}\" NO_DEFAULT_PATH + PATHS \"${CMAKE_CURRENT_LIST_DIR}/..\" NO_DEFAULT_PATH ) endif() @@ -103,7 +106,7 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME}) list(REMOVE_DUPLICATES Qt5$${CMAKE_MODULE_NAME}_DEFINITIONS) list(REMOVE_DUPLICATES Qt5$${CMAKE_MODULE_NAME}_COMPILE_DEFINITIONS) if (Qt5$${CMAKE_MODULE_NAME}_EXECUTABLE_COMPILE_FLAGS) - list(REMOVE_DUPLICATES Qt5$${CMAKE_MODULE_NAME}_EXECUTABLE_COMPILE_FLAGS) + list(REMOVE_DUPLICATES Qt5$${CMAKE_MODULE_NAME}_EXECUTABLE_COMPILE_FLAGS) endif() set(_Qt5$${CMAKE_MODULE_NAME}_LIB_DEPENDENCIES \"$${CMAKE_QT5_MODULE_DEPS}\") @@ -118,6 +121,11 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME}) set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} PROPERTY FRAMEWORK 1) !!ENDIF + set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${Qt5$${CMAKE_MODULE_NAME}_INCLUDE_DIRS}) + set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} PROPERTY + INTERFACE_COMPILE_DEFINITIONS $${MODULE_DEFINE}) + !!IF !isEmpty(CMAKE_RELEASE_TYPE) !!IF !isEmpty(CMAKE_STATIC_WINDOWS_BUILD) _populate_$${CMAKE_MODULE_NAME}_target_properties(RELEASE \"$${CMAKE_IMPLIB_FILE_LOCATION_RELEASE}\" \"\" ) diff --git a/mkspecs/features/default_post.prf b/mkspecs/features/default_post.prf index cdd200e80b..c756455dd2 100644 --- a/mkspecs/features/default_post.prf +++ b/mkspecs/features/default_post.prf @@ -47,6 +47,14 @@ incredibuild_xge { CONFIG = incredibuild_xge $$CONFIG } +silent { + # Ensure that we process silent.prf last, as it will mangle QMAKE_CXX + # and friends in a way that some of the other features (sdk.prf and + # simd.prf eg) do not handle. + CONFIG -= silent + CONFIG = silent $$CONFIG +} + force_debug_info:win32 { load(resolve_target) QMAKE_CLEAN += $$replace(QMAKE_RESOLVED_TARGET, ...$, pdb) # for the debug case it is hardcoded in qmake diff --git a/mkspecs/features/exclusive_builds.prf b/mkspecs/features/exclusive_builds.prf index 0e0da05c70..c45ff22c06 100644 --- a/mkspecs/features/exclusive_builds.prf +++ b/mkspecs/features/exclusive_builds.prf @@ -6,7 +6,7 @@ defineTest(fixExclusiveOutputDirs) { count(ARGS, 2, greaterThan):isEqual($$list($$lower($$3)), false):appendFirstBuild = false else:appendFirstBuild = true - isEmpty(QMAKE_DIR_REPLACE):QMAKE_DIR_REPLACE += OBJECTS_DIR MOC_DIR RCC_DIR + isEmpty(QMAKE_DIR_REPLACE):QMAKE_DIR_REPLACE += OBJECTS_DIR MOC_DIR RCC_DIR PRECOMPILED_DIR lessThan(firstBuild, $$secondBuild):eval($${firstBuild}_and_$${secondBuild}_target:QMAKE_DIR_REPLACE += DESTDIR) else:eval($${secondBuild}_and_$${firstBuild}_target:QMAKE_DIR_REPLACE += DESTDIR) for(fix, QMAKE_DIR_REPLACE) { @@ -33,15 +33,15 @@ defineTest(addExclusiveBuilds) { contains(TEMPLATE, subdirs) { eval(sub_$${firstBuildName}.target = $$firstBuild) - export(sub_$${firstBuildName}.target) + export(sub_$${firstBuildName}.target) eval(sub_$${firstBuildName}.CONFIG = recursive) - export(sub_$${firstBuildName}.CONFIG) + export(sub_$${firstBuildName}.CONFIG) eval(sub_$${secondBuildName}.target = $$secondBuild) - export(sub_$${secondBuildName}.target) + export(sub_$${secondBuildName}.target) eval(sub_$${secondBuildName}.CONFIG = recursive) - export(sub_$${secondBuildName}.CONFIG) - QMAKE_EXTRA_TARGETS += sub_$${firstBuildName} sub_$${secondBuildName} - export(QMAKE_EXTRA_TARGETS) + export(sub_$${secondBuildName}.CONFIG) + QMAKE_EXTRA_TARGETS += sub_$${firstBuildName} sub_$${secondBuildName} + export(QMAKE_EXTRA_TARGETS) } else:!build_pass { first_BUILDS = second_BUILDS = @@ -56,32 +56,32 @@ defineTest(addExclusiveBuilds) { else: permutationName = -$$permutation # Makefile target rule eval($${firstBuildName}$${permutation}.target = $${firstBuild}$$lower($${permutationName})) - export($${firstBuildName}$${permutation}.target) + export($${firstBuildName}$${permutation}.target) # IDE name eval($${firstBuildName}$${permutation}.name = $${firstBuildName}$${permutationName}) - export($${firstBuildName}$${permutation}.name) - # prl import CONFIG option + export($${firstBuildName}$${permutation}.name) + # prl import CONFIG option eval($${firstBuildName}$${permutation}.PRL_CONFIG = $${firstBuild}$${permutation}) export($${firstBuildName}$${permutation}.PRL_CONFIG) # Individual CONFIG option eval($${firstBuildName}$${permutation}.CONFIG = $${firstBuild} $${firstBuildName}Build $$eval($${permutation}.CONFIG)) - export($${firstBuildName}$${permutation}.CONFIG) + export($${firstBuildName}$${permutation}.CONFIG) eval($${secondBuildName}$${permutation}.target = $${secondBuild}$$lower($${permutationName})) - export($${secondBuildName}$${permutation}.target) + export($${secondBuildName}$${permutation}.target) eval($${secondBuildName}$${permutation}.name = $${secondBuildName}$${permutationName}) - export($${secondBuildName}$${permutation}.name) - eval($${secondBuildName}$${permutation}.PRL_CONFIG = $${secondBuild}$${permutation}) - export($${secondBuildName}$${permutation}.PRL_CONFIG) + export($${secondBuildName}$${permutation}.name) + eval($${secondBuildName}$${permutation}.PRL_CONFIG = $${secondBuild}$${permutation}) + export($${secondBuildName}$${permutation}.PRL_CONFIG) eval($${secondBuildName}$${permutation}.CONFIG = $${secondBuild} $${secondBuildName}Build $$eval($${permutation}.CONFIG)) - export($${secondBuildName}$${permutation}.CONFIG) - + export($${secondBuildName}$${permutation}.CONFIG) + first_BUILDS += $${firstBuildName}$${permutation} second_BUILDS += $${secondBuildName}$${permutation} } - + # A mutual exclusive block. - CONFIG($${firstBuild}, $${firstBuild}|$${secondBuild}): BUILDS = $$first_BUILDS $$second_BUILDS + CONFIG($${firstBuild}, $${firstBuild}|$${secondBuild}): BUILDS = $$first_BUILDS $$second_BUILDS else: BUILDS = $$second_BUILDS $$first_BUILDS export(BUILDS) } else { diff --git a/mkspecs/features/ios/default_post.prf b/mkspecs/features/ios/default_post.prf new file mode 100644 index 0000000000..e9d2149351 --- /dev/null +++ b/mkspecs/features/ios/default_post.prf @@ -0,0 +1,69 @@ + +CONFIG(qt):contains(QT, gui):equals(TEMPLATE, app): CONFIG += gui_app + +isEmpty(MAKEFILE_GENERATOR) { + gui_app:app_bundle: \ + # For applications we want Xcode project files + MAKEFILE_GENERATOR = XCODE + else: \ + # For libs, etc we still want regular Makefiles + MAKEFILE_GENERATOR = UNIX +} + +gui_app { + # We have to do the link and dependency resolution for the platform plugin + # manually, since QTPLUGIN and the prl lookup logic does not support + # the -force_load link style. The -force_load option ensures that all + # symbols from the static library are included, not just the ones the + # linker have seen a use for so far. We need this because we load the platform + # plugin from the platform plugin itself, using Q_IMPORT_PLUGIN. + lib_path_and_base = $$[QT_INSTALL_PLUGINS/get]/platforms/libqios$$qtPlatformTargetSuffix() + LIBS += "-force_load $${lib_path_and_base}.$${QMAKE_EXTENSION_STATICLIB}" + LIBS += $$fromfile($${lib_path_and_base}.prl, QMAKE_PRL_LIBS) + + # Which means we don't want the auto-generated import for the platform plugin + CONFIG -= import_qpa_plugin + + !no_main_wrapper { + # We link the iosmain library manually as well, since it's not really a plugin + lib_name = qiosmain + lib_path_and_base = $$[QT_INSTALL_PLUGINS/get]/platforms/lib$${lib_name}$$qtPlatformTargetSuffix() + LIBS += -L$$[QT_INSTALL_PLUGINS/get]/platforms -l$${lib_name}$$qtPlatformTargetSuffix() + LIBS += $$fromfile($${lib_path_and_base}.prl, QMAKE_PRL_LIBS) + DEFINES += main=qt_main + } +} + +contains(MAKEFILE_GENERATOR, XCODE) { + ios_device_family.name = TARGETED_DEVICE_FAMILY + ios_device_family.value = $$QMAKE_IOS_TARGETED_DEVICE_FAMILY + QMAKE_MAC_XCODE_SETTINGS += ios_device_family +} + +isEmpty(QT_ARCH) { + # The iPhoneOS and iPhoneSimulator targets share the same toolchain, + # so when configure runs the arch tests it passes the correct sysroot, + # but we fail to pick up the architecture since we're not passing -arch + # yet. Xcode does not seem to have a way to run the shared toolchain + # in a way that will automatically do this (for example xcrun -sdk). + contains(QMAKE_MAC_SDK, iphoneos.*): QT_ARCH = armv7 + else: QT_ARCH = i386 # Simulator +} else { + # Fix up the QT_ARCH to be more specific + equals(QT_ARCH, arm) { + # Samsung S5PC100, Apple A4, A5, A5X + QT_ARCH = armv7 + + # FIXME: How do we support armv7s when Qt can't do universal builds? + } +} + +!equals(MAKEFILE_GENERATOR, XCODE) { + arch_flag = -arch $$QT_ARCH + QMAKE_CFLAGS += $$arch_flag + QMAKE_CXXFLAGS += $$arch_flag + QMAKE_OBJECTIVE_CFLAGS += $$arch_flag + QMAKE_LFLAGS += $$arch_flag +} + +load(default_post) diff --git a/mkspecs/features/ios/default_pre.prf b/mkspecs/features/ios/default_pre.prf new file mode 100644 index 0000000000..e2956bd77d --- /dev/null +++ b/mkspecs/features/ios/default_pre.prf @@ -0,0 +1,4 @@ +# Unset makefile generator, so we can auto-detect value in default_post +unset(MAKEFILE_GENERATOR) + +load(default_pre) diff --git a/mkspecs/features/java.prf b/mkspecs/features/java.prf new file mode 100644 index 0000000000..6cbd690c37 --- /dev/null +++ b/mkspecs/features/java.prf @@ -0,0 +1,65 @@ +TEMPLATE = lib +android { + isEmpty(SDK_ROOT): SDK_ROOT = $$(ANDROID_SDK_ROOT) + isEmpty(SDK_ROOT): SDK_ROOT = $$DEFAULT_ANDROID_SDK_ROOT + isEmpty(API_VERSION) { + API_VERSION = $$(ANDROID_API_VERSION) + isEmpty(API_VERSION): API_VERSION = android-10 + } + + !exists($$SDK_ROOT/platforms/$$API_VERSION/android.jar) { + error("The Path $$SDK_ROOT/platforms/$$API_VERSION/android.jar does not exist. Make sure the ANDROID_SDK_ROOT and ANDROID_API_VERSION environment variables are correctly set.") + } + JAVACLASSPATH += $$SDK_ROOT/platforms/$$API_VERSION/android.jar + + # FIXME: This is a hack to work around some hardcoded values in the android.prf. The + # android.prf should be fixed and this should be removed. + CONFIG += android_app +} + +isEmpty(CLASS_DIR): CLASS_DIR = .classes + +CONFIG -= qt + +# Without these, qmake adds a name prefix and versioning postfixes (as well as file +# links) to the target. This is hardcoded in the qmake code, so for now we use +# the plugin configs to get what we want. +CONFIG += plugin no_plugin_name_prefix + +javac.input = JAVASOURCES +javac.output = $$CLASS_DIR +javac.CONFIG += combine +javac.commands = javac -source 6 -target 6 -cp $$shell_quote($$shell_path($$join(JAVACLASSPATH, $$QMAKE_DIRLIST_SEP))) -d $$shell_quote($$CLASS_DIR) ${QMAKE_FILE_IN} +# Force rebuild every time, because we don't know the paths of the destination files +# as they depend on the code. +javac.depends = FORCE +QMAKE_EXTRA_COMPILERS += javac + +mkpath($$absolute_path($$CLASS_DIR, $$OUT_PWD)) | error("Aborting.") + +# Disable all linker flags since we are overriding the regular linker +QMAKE_LFLAGS = +QMAKE_CFLAGS = +QMAKE_LFLAGS_RPATH = +QMAKE_LFLAGS_PLUGIN = +QMAKE_LIBS = +QMAKE_LIBS_OPENGL_ES2 = +QMAKE_LIBDIR = +QMAKE_EXTENSION_SHLIB = jar + +# Override linker with dex (for Android) or jar (for other java builds) +android { + QMAKE_LINK_O_FLAG = --output= + contains(QMAKE_HOST.os, Windows) { + QMAKE_LINK = $$PWD/data/android/dx $$SDK_ROOT --dex + } else { + QMAKE_LINK = $$SDK_ROOT/platform-tools/dx --dex + } +} else { + QMAKE_LINK_O_FLAG = "cf " + QMAKE_LINK = jar +} + +# Force link step to always happen, since we are always updating the +# .class files +PRE_TARGETDEPS += FORCE diff --git a/mkspecs/features/mac/default_post.prf b/mkspecs/features/mac/default_post.prf index 273094d4cd..437e3d93e4 100644 --- a/mkspecs/features/mac/default_post.prf +++ b/mkspecs/features/mac/default_post.prf @@ -4,7 +4,7 @@ load(default_post) # Pick a suitable default architecture for qmake-based applications. # If the Qt package contains one of x86 and x86_64, pick that one. If it # contains both then use the compiler default. Make a similiar decision for -# PowerPC-based systems. Note that this logic assumes that Qt has been +# PowerPC-based systems. Note that this logic assumes that Qt has been # configured with an architecture that is usable on the system. qt:!isEmpty(QT_CONFIG) { contains(QMAKE_HOST.arch, ppc)|contains(QMAKE_HOST.arch, "Power Macintosh") { @@ -15,3 +15,7 @@ qt:!isEmpty(QT_CONFIG) { contains(QT_CONFIG, x86_64):!contains(QT_CONFIG, x86):CONFIG += x86_64 } } + +# Ensure that we process sdk.prf first, as it will update QMAKE_CXX +# and friends that other features/extra compilers may depend on. +sdk: load(sdk) diff --git a/mkspecs/features/mac/sdk.prf b/mkspecs/features/mac/sdk.prf index 5eab94896b..ece0e27536 100644 --- a/mkspecs/features/mac/sdk.prf +++ b/mkspecs/features/mac/sdk.prf @@ -1,8 +1,58 @@ -!isEmpty(QMAKE_MAC_SDK) { - !macx-xcode:!macx-pbuilder { - QMAKE_CFLAGS += -isysroot $$QMAKE_MAC_SDK - QMAKE_OBJECTIVE_CFLAGS += -isysroot $$QMAKE_MAC_SDK - QMAKE_CXXFLAGS += -isysroot $$QMAKE_MAC_SDK - QMAKE_LFLAGS += -Wl,-syslibroot,$$QMAKE_MAC_SDK - } + +isEmpty(QMAKE_MAC_SDK): \ + error("QMAKE_MAC_SDK must be set when using CONFIG += sdk.") + +contains(QMAKE_MAC_SDK, .*/.*): \ + error("QMAKE_MAC_SDK can only contain short-form SDK names (eg. macosx, iphoneos)") + +QMAKE_MAC_SDK_PATH = $$system("/usr/bin/xcodebuild -sdk $$QMAKE_MAC_SDK -version Path 2>/dev/null") +isEmpty(QMAKE_MAC_SDK_PATH): error("Could not resolve SDK path for \'$$QMAKE_MAC_SDK\'") + +!equals(MAKEFILE_GENERATOR, XCODE) { + QMAKE_CFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH + QMAKE_CXXFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH + QMAKE_OBJECTIVE_CFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH + QMAKE_LFLAGS += -Wl,-syslibroot,$$QMAKE_MAC_SDK_PATH +} + +sysrootified = +for(val, QMAKE_INCDIR_OPENGL): sysrootified += $${QMAKE_MAC_SDK_PATH}$$val +QMAKE_INCDIR_OPENGL = $$sysrootified + +# Resolve SDK version of various tools +for(tool, $$list(QMAKE_CC QMAKE_CXX QMAKE_FIX_RPATH QMAKE_AR QMAKE_RANLIB QMAKE_LINK QMAKE_LINK_SHLIB)) { + value = $$eval($$tool) + isEmpty(value): next() + + sysrooted = $$system("/usr/bin/xcrun -sdk $$QMAKE_MAC_SDK -find $$first(value) 2>/dev/null") + isEmpty(sysrooted): next() + + $$tool = $$sysrooted $$member(value, 1, -1) +} + +# We use xml as the output format instead of json since plutil on 10.6 does not have that option +QMAKE_MAC_PLATFORM_NAME = $$system("plutil -convert xml1 \"$$QMAKE_MAC_SDK_PATH/SDKSettings.plist\" -o - | " \ + "sed '/^<!DOCTYPE/d' | " \ # Don't look up http://www.apple.com/DTDs/PropertyList-1.0.dtd + "PERL5LIB= xpath 'string(//key[.=\"PLATFORM_NAME\"]/following-sibling::*[1])' 2>&1 | " \ + "sed 's/.*Value: \\(.*\\)/\\1/'") + +isEmpty(QMAKE_MAC_PLATFORM_NAME): error("Could not resolve platform name for SDK '$$QMAKE_MAC_SDK'") + +!equals(MAKEFILE_GENERATOR, XCODE) { + # FIXME: Get the version_min_flag out of the platform's 'Native Build System.xcspec' + version_identifier = $$replace(QMAKE_MAC_PLATFORM_NAME, iphonesimulator, ios-simulator) + + # C++11 support may affect the deployment target + c++11: load(c++11) + + ios:!host_build: \ + deployment_target = $$QMAKE_IOS_DEPLOYMENT_TARGET + else: \ + deployment_target = $$QMAKE_MACOSX_DEPLOYMENT_TARGET + + version_min_flag = -m$${version_identifier}-version-min=$$deployment_target + QMAKE_CFLAGS += $$version_min_flag + QMAKE_CXXFLAGS += $$version_min_flag + QMAKE_OBJECTIVE_CFLAGS += $$version_min_flag + QMAKE_LFLAGS += $$version_min_flag } diff --git a/mkspecs/features/moc.prf b/mkspecs/features/moc.prf index 8bd512844d..59ac9db05b 100644 --- a/mkspecs/features/moc.prf +++ b/mkspecs/features/moc.prf @@ -9,7 +9,7 @@ isEmpty(QMAKE_EXT_CPP_MOC):QMAKE_EXT_CPP_MOC = .moc # has too many includes. We do this to overcome a command-line limit on Win < XP INCLUDETEMP= WIN_INCLUDETEMP= -win32:count($$list($$INCLUDEPATH), 40, >) { +win32:count(INCLUDEPATH, 40, >) { INCLUDETEMP = $$MOC_DIR/mocinclude.tmp WIN_INCLUDETEMP=$$INCLUDETEMP @@ -23,7 +23,7 @@ win32:count($$list($$INCLUDEPATH), 40, >) { unset(INCFILELIST) RET = - for(incfile, $$list($$INCLUDEPATH)) { + for(incfile, INCLUDEPATH) { INCFILELIST = -I$$incfile isEmpty(RET): RET += @echo $$INCFILELIST> $$WIN_INCLUDETEMP $$EOC else: RET += @echo $$INCFILELIST>> $$WIN_INCLUDETEMP $$EOC @@ -38,15 +38,17 @@ win32:count($$list($$INCLUDEPATH), 40, >) { } defineReplace(mocCmdBase) { + RET = !isEmpty(WIN_INCLUDETEMP) { - RET = contains(TEMPLATE, "vc.*") { RET += $$mocinclude.commands } - RET += $$QMAKE_MOC $(DEFINES) @$$WIN_INCLUDETEMP $$join(QMAKE_COMPILER_DEFINES, " -D", -D) $$QMAKE_MOC_OPTIONS - return($$RET) + incvar = @$$WIN_INCLUDETEMP + } else { + incvar = $(INCPATH) } - return($$QMAKE_MOC $(DEFINES) $(INCPATH) $$join(QMAKE_COMPILER_DEFINES, " -D", -D) $$QMAKE_MOC_OPTIONS) + RET += $$QMAKE_MOC $(DEFINES) $$join(QMAKE_COMPILER_DEFINES, " -D", -D) $$incvar $$join(QMAKE_DEFAULT_INCDIRS, " -I", -I) $$QMAKE_MOC_OPTIONS + return($$RET) } #moc headers @@ -58,7 +60,7 @@ moc_header.input = HEADERS moc_header.variable_out = SOURCES moc_header.name = MOC ${QMAKE_FILE_IN} !contains(TEMPLATE, "vc.*") { - !isEmpty(INCLUDETEMP):moc_header.depends += $$INCLUDETEMP + !isEmpty(INCLUDETEMP):moc_header.depends += $$INCLUDETEMP } silent:moc_header.commands = @echo moc ${QMAKE_FILE_IN} && $$moc_header.commands QMAKE_EXTRA_COMPILERS += moc_header @@ -72,7 +74,7 @@ moc_source.output = $$MOC_DIR/$${QMAKE_CPP_MOD_MOC}${QMAKE_FILE_BASE}$${QMAKE_EX moc_source.input = SOURCES OBJECTIVE_SOURCES moc_source.name = MOC ${QMAKE_FILE_IN} !contains(TEMPLATE, "vc.*") { - !isEmpty(INCLUDETEMP):moc_source.depends += $$INCLUDETEMP + !isEmpty(INCLUDETEMP):moc_source.depends += $$INCLUDETEMP } silent:moc_source.commands = @echo moc ${QMAKE_FILE_IN} && $$moc_source.commands QMAKE_EXTRA_COMPILERS += moc_source diff --git a/mkspecs/features/qml_plugin.prf b/mkspecs/features/qml_plugin.prf index f9beabdc18..70c3bd6b66 100644 --- a/mkspecs/features/qml_plugin.prf +++ b/mkspecs/features/qml_plugin.prf @@ -18,12 +18,8 @@ if(win32|mac):!macx-xcode { contains(QT_CONFIG, debug_and_release):CONFIG += debug_and_release contains(QT_CONFIG, build_all):CONFIG += build_all } -contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols -contains(QT_CONFIG, separate_debug_info):CONFIG += separate_debug_info -contains(QT_CONFIG, separate_debug_info_nocopy):CONFIG += separate_debug_info_nocopy -contains(QT_CONFIG, c++11):CONFIG += c++11 -isEmpty(CXX_MODULE) { +!no_cxx_module:isEmpty(CXX_MODULE) { CXX_MODULE = $$TARGET TARGET = declarative_$${TARGET} } @@ -34,11 +30,13 @@ exists($$QMLTYPEFILE): QML_FILES += $$QMLTYPEFILE # Install rules +load(qt_build_paths) + qml1_target { - DESTDIR = $$eval(QT.$${CXX_MODULE}.imports)/$$TARGETPATH + DESTDIR = $$MODULE_BASE_OUTDIR/imports/$$TARGETPATH instbase = $$[QT_INSTALL_IMPORTS] } else { - DESTDIR = $$eval(QT.$${CXX_MODULE}.qml)/$$TARGETPATH + DESTDIR = $$MODULE_BASE_OUTDIR/qml/$$TARGETPATH instbase = $$[QT_INSTALL_QML] } @@ -50,6 +48,7 @@ INSTALLS += target TARGET = $$qtLibraryTarget($$TARGET) load(qt_targets) +load(qt_common) # plugins.qmltypes is used by Qt Creator for syntax highlighting and the QML code model. It needs # to be regenerated whenever the QML elements exported by the plugin change. This cannot be done @@ -61,7 +60,14 @@ load(qt_targets) # !cross_compile { build_pass|!debug_and_release { - isEmpty(IMPORT_VERSION): IMPORT_VERSION = $$eval(QT.$${CXX_MODULE}.MAJOR_VERSION).$$eval(QT.$${CXX_MODULE}.MINOR_VERSION) + isEmpty(IMPORT_VERSION) { + no_cxx_module { + IMPORT_VERSION = $$replace(MODULE_VERSION, ^(\\d+\\.\\d+).*, \\1) + isEmpty(IMPORT_VERSION): error("Must set IMPORT_VERSION") + } else { + IMPORT_VERSION = $$eval(QT.$${CXX_MODULE}.MAJOR_VERSION).$$eval(QT.$${CXX_MODULE}.MINOR_VERSION) + } + } load(resolve_target) qml1_target: \ @@ -94,7 +100,7 @@ unix|win32-g++* { !isEmpty(_QMAKE_SUPER_CACHE_): \ lib_replace.match = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]*/lib else: \ - lib_replace.match = $$eval(QT.$${CXX_MODULE}.libs) + lib_replace.match = $$MODULE_BASE_OUTDIR lib_replace.replace = $$[QT_INSTALL_LIBS/raw] QMAKE_PRL_INSTALL_REPLACE += lib_replace } diff --git a/mkspecs/features/qmltestcase.prf b/mkspecs/features/qmltestcase.prf index 71e70e06a4..335ba90009 100644 --- a/mkspecs/features/qmltestcase.prf +++ b/mkspecs/features/qmltestcase.prf @@ -2,7 +2,7 @@ CONFIG += testcase QT += qml qmltest -macx: CONFIG -= app_bundle +mac: CONFIG -= app_bundle # If the .pro file specified an IMPORTPATH, then add that to # the command-line when the test is run. diff --git a/mkspecs/features/qpa/basicunixfontdatabase.prf b/mkspecs/features/qpa/basicunixfontdatabase.prf index 65490e03a8..261eadb5d0 100644 --- a/mkspecs/features/qpa/basicunixfontdatabase.prf +++ b/mkspecs/features/qpa/basicunixfontdatabase.prf @@ -1,5 +1,3 @@ -DEFINES += QT_COMPILES_IN_HARFBUZZ - contains(QT_CONFIG, system-freetype) { LIBS += -lfreetype } diff --git a/mkspecs/features/qpa/genericunixfontdatabase.prf b/mkspecs/features/qpa/genericunixfontdatabase.prf index 36a358271c..fc11bea470 100644 --- a/mkspecs/features/qpa/genericunixfontdatabase.prf +++ b/mkspecs/features/qpa/genericunixfontdatabase.prf @@ -2,7 +2,7 @@ CONFIG += qpa/basicunixfontdatabase contains(QT_CONFIG, fontconfig) { DEFINES += Q_FONTCONFIGDATABASE LIBS += -lfontconfig -} else { +} else:!android { fonts.path = $$[QT_INSTALL_LIBS]/fonts fonts.files = $$QT_SOURCE_TREE/lib/fonts/* INSTALLS += fonts diff --git a/mkspecs/features/qt_android_deps.prf b/mkspecs/features/qt_android_deps.prf new file mode 100644 index 0000000000..27814a90a5 --- /dev/null +++ b/mkspecs/features/qt_android_deps.prf @@ -0,0 +1,53 @@ + +# 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. +# + +# Generates an xml file to match the library in lib/ listing the dependencies +# of the module on JNI-based libraries etc. Used for deployment of an Android +# app. + +ANDROID_DEPENDS_DIR = $$MODULE_QMAKE_OUTDIR/lib/ +DEPENDENCY_FILE = $$ANDROID_DEPENDS_DIR$$TARGET-android-dependencies.xml + +!build_pass { + !isEmpty(ANDROID_JAR_DEPENDENCIES) { + for(JAR_FILE, ANDROID_JAR_DEPENDENCIES) { + INIT_CLASS = $$section(JAR_FILE, ":", 1, 1) + !isEmpty(INIT_CLASS): INIT_CLASS = "initClass=\"$$INIT_CLASS\"" + JAR_FILE = $$section(JAR_FILE, ":", 0, 0) + FILE_CONTENT += "<jar file=\"$$JAR_FILE\" $$INIT_CLASS />" + } + } + + !isEmpty(ANDROID_LIB_DEPENDENCIES) { + for(LIB_FILE, ANDROID_LIB_DEPENDENCIES) { + FILE_CONTENT += "<lib file=\"$$LIB_FILE\" />" + } + } + + !isEmpty(ANDROID_LIB_DEPENDENCY_REPLACEMENTS) { + for(REPLACEMENT, ANDROID_LIB_DEPENDENCY_REPLACEMENTS) { + REPLACEMENT_FILE = $$section(REPLACEMENT, ":", 0, 0) + LIB_FILE = $$section(REPLACEMENT, ":", 1, 1) + FILE_CONTENT += "<lib file=\"$$LIB_FILE\" replaces=\"$$REPLACEMENT_FILE\" />" + } + } + + !isEmpty(FILE_CONTENT) { + FILE_CONTENT = "<rules><dependencies><lib name=\"$$TARGET\"><depends>" $$FILE_CONTENT "</depends></lib></dependencies></rules>" + write_file($$DEPENDENCY_FILE, FILE_CONTENT) | error("Aborting.") + } +} + +!isEmpty(ANDROID_JAR_DEPENDENCIES)|!isEmpty(ANDROID_LIB_DEPENDENCIES)|!isEmpty(ANDROID_LIB_DEPENDENCY_REPLACEMENTS) { + install_dependencies_file.files = $$DEPENDENCY_FILE + install_dependencies_file.path = $$[QT_INSTALL_LIBS] + INSTALLS += install_dependencies_file +} diff --git a/mkspecs/features/qt_build_config.prf b/mkspecs/features/qt_build_config.prf index 88c1f3f3f2..4cbd08910c 100644 --- a/mkspecs/features/qt_build_config.prf +++ b/mkspecs/features/qt_build_config.prf @@ -40,6 +40,9 @@ mac { } } +cross_compile: \ + CONFIG += force_bootstrap + CONFIG += \ create_prl link_prl \ prepare_docs qt_docs_targets \ diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf new file mode 100644 index 0000000000..10b7736749 --- /dev/null +++ b/mkspecs/features/qt_common.prf @@ -0,0 +1,54 @@ +# +# 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. +# + +contains(QT_CONFIG, c++11): CONFIG += c++11 +contains(TEMPLATE, .*lib) { + # module and plugins + contains(QT_CONFIG, reduce_exports): CONFIG += hide_symbols + unix:contains(QT_CONFIG, reduce_relocations): CONFIG += bsymbolic_functions + contains(QT_CONFIG, largefile): CONFIG += largefile + contains(QT_CONFIG, separate_debug_info): CONFIG += separate_debug_info + contains(QT_CONFIG, separate_debug_info_nocopy): CONFIG += separate_debug_info_nocopy +} + +warnings_are_errors:warning_clean { + # If the module declares that it has does its clean-up of warnings, enable -Werror. + # This setting is compiler-dependent anyway because it depends on the version of the + # compiler. + clang { + # Apple clang 4.0+ or clang 3.1+ + greaterThan(QT_CLANG_MAJOR_VERSION, 3) | \ + if(equals(QT_CLANG_MAJOR_VERSION, 3):greaterThan(QT_CLANG_MINOR_VERSION, 1)) | \ + greaterThan(QT_APPLE_CLANG_MAJOR_VERSION, 3) { + QMAKE_CXXFLAGS += -Werror -Wno-error=\\$${LITERAL_HASH}warnings $$WERROR + } + } else:intel_icc { + # Intel CC 13.0+ (a.k.a. Intel Composer XE 2013) + greaterThan(QT_ICC_MAJOR_VERSION, 12) { + # 177: function "entity" was declared but never referenced + # (too aggressive; ICC reports even for functions created due to template instantiation) + # 1224: #warning directive + # 1881: argument must be a constant null pointer value + # (NULL in C++ is usually a literal 0) + QMAKE_CXXFLAGS += -Werror -ww177,1224,1881 $$WERROR + } + } else:gcc { + # GCC 4.6+ + # note: there was no GCC 3.6 and this assumes no one is crazy enough to compile Qt with GCC 2.7 + greaterThan(QT_GCC_MAJOR_VERSION, 4)|greaterThan(QT_GCC_MINOR_VERSION, 5) { + QMAKE_CXXFLAGS += -Werror -Wno-error=cpp $$WERROR + + # GCC prints this bogus warning, after it has inlined a lot of code + # error: assuming signed overflow does not occur when assuming that (X + c) < X is always false + QMAKE_CXXFLAGS += -Wno-error=strict-overflow + } + } +} diff --git a/mkspecs/features/qt_docs.prf b/mkspecs/features/qt_docs.prf index c80efb03e0..5b42cfcac8 100644 --- a/mkspecs/features/qt_docs.prf +++ b/mkspecs/features/qt_docs.prf @@ -32,7 +32,9 @@ qtmver.name = QT_VER qtmver.value = $$replace(qtver.value, ^(\\d+\\.\\d+).*$, \\1) qtvertag.name = QT_VERSION_TAG qtvertag.value = $$replace(qtver.value, \.,) -qtAddToolEnv(QDOC, qtver qtmver qtvertag) +qtdocs.name = QT_INSTALL_DOCS +qtdocs.value = $$[QT_INSTALL_DOCS/get] +qtAddToolEnv(QDOC, qtver qtmver qtvertag qtdocs) doc_command = $$QDOC $$QMAKE_DOCS prepare_docs { prepare_docs.commands += $$doc_command -prepare -no-link-errors diff --git a/mkspecs/features/qt_module.prf b/mkspecs/features/qt_module.prf index 1132943d97..3531d28b42 100644 --- a/mkspecs/features/qt_module.prf +++ b/mkspecs/features/qt_module.prf @@ -27,6 +27,19 @@ isEmpty(VERSION): error("Module does not define version.") # 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: CONFIG += release + contains(QT, core(-private)?|xml) { + QT -= core core-private xml + QT += bootstrap-private + } + } else { + !build_pass:contains(QT_CONFIG, build_all): CONFIG += release + } +} + ucmodule = $$upper($$MODULE) isEmpty(MODULE_INCNAME): MODULE_INCNAME = $$TARGET @@ -74,13 +87,6 @@ contains(TARGET, QtAddOn.*): \ else: \ DEFINES += QT_BUILD_$${ucmodule}_LIB -contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols -unix:contains(QT_CONFIG, reduce_relocations):CONFIG += bsymbolic_functions -contains(QT_CONFIG, largefile):CONFIG += largefile -contains(QT_CONFIG, separate_debug_info):CONFIG += separate_debug_info -contains(QT_CONFIG, separate_debug_info_nocopy):CONFIG += separate_debug_info_nocopy -contains(QT_CONFIG, c++11):CONFIG += c++11 - #mac frameworks mac:CONFIG(shared, static|shared):contains(QT_CONFIG, qt_framework) { #QMAKE_FRAMEWORK_VERSION = 4.0 @@ -115,6 +121,8 @@ aix-g++* { QMAKE_CXXFLAGS += -mminimal-toc } +android: CONFIG += qt_android_deps + #install directives load(qt_installs) @@ -169,6 +177,7 @@ win32 { TARGET = $$qtLibraryTarget($$TARGET$$QT_LIBINFIX) #do this towards the end load(qt_targets) +load(qt_common) win32:DEFINES+=_USE_MATH_DEFINES diff --git a/mkspecs/features/qt_module_headers.prf b/mkspecs/features/qt_module_headers.prf index 40d6bb0d40..298ca102bc 100644 --- a/mkspecs/features/qt_module_headers.prf +++ b/mkspecs/features/qt_module_headers.prf @@ -13,13 +13,21 @@ load(qt_build_paths) !build_pass { qtPrepareTool(QMAKE_SYNCQT, syncqt) - contains(QT_CONFIG, private_tests): \ # -developer-build - QMAKE_SYNCQT += -check-includes - QMAKE_SYNCQT += -module $$MODULE_INCNAME -version $$VERSION -outdir $$MODULE_BASE_OUTDIR $$MODULE_BASE_DIR + minimal_syncqt { + QMAKE_SYNCQT += -minimal $$QMAKE_SYNCQT_OPTIONS + } else { + contains(QT_CONFIG, private_tests): \ # -developer-build + QMAKE_SYNCQT += -check-includes + QMAKE_SYNCQT += -module $$MODULE_INCNAME -version $$VERSION + } + QMAKE_SYNCQT += \ + -outdir $$MODULE_BASE_OUTDIR $$MODULE_BASE_DIR !silent: message($$QMAKE_SYNCQT) system($$QMAKE_SYNCQT)|error("Failed to run: $$QMAKE_SYNCQT") } +minimal_syncqt: return() + #load up the headers info include($$MODULE_BASE_OUTDIR/include/$$MODULE_INCNAME/headers.pri, "", true) diff --git a/mkspecs/features/qt_module_pris.prf b/mkspecs/features/qt_module_pris.prf index 03863e0648..bedcfd4c47 100644 --- a/mkspecs/features/qt_module_pris.prf +++ b/mkspecs/features/qt_module_pris.prf @@ -43,7 +43,7 @@ else: \ module_config = "QT.$${MODULE}.CONFIG = $$MODULE_CONFIG" else: \ module_config = - !no_module_headers { + !no_module_headers:!minimal_syncqt { MODULE_INCLUDES = "\$\$QT_MODULE_INCLUDE_BASE \$\$QT_MODULE_INCLUDE_BASE/$$MODULE_INCNAME" MODULE_PRIVATE_INCLUDES = "\$\$QT_MODULE_INCLUDE_BASE/$$MODULE_INCNAME/$$VERSION \ \$\$QT_MODULE_INCLUDE_BASE/$$MODULE_INCNAME/$$VERSION/$$MODULE_INCNAME" diff --git a/mkspecs/features/qt_plugin.prf b/mkspecs/features/qt_plugin.prf index 158de39753..9f4882c5db 100644 --- a/mkspecs/features/qt_plugin.prf +++ b/mkspecs/features/qt_plugin.prf @@ -23,10 +23,6 @@ tool_plugin { contains(QT_CONFIG, debug_and_release):CONFIG += debug_and_release contains(QT_CONFIG, build_all):CONFIG += build_all } -contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols -contains(QT_CONFIG, separate_debug_info):CONFIG += separate_debug_info -contains(QT_CONFIG, separate_debug_info_nocopy):CONFIG += separate_debug_info_nocopy -contains(QT_CONFIG, c++11):CONFIG += c++11 CONFIG(static, static|shared) { isEmpty(MODULE): MODULE = $$basename(TARGET) @@ -52,6 +48,7 @@ INSTALLS += target TARGET = $$qtLibraryTarget($$TARGET) load(qt_targets) +load(qt_common) wince*:LIBS += $$QMAKE_LIBS_GUI QMAKE_LFLAGS += $$QMAKE_LFLAGS_NOUNDEF diff --git a/mkspecs/features/qt_tool.prf b/mkspecs/features/qt_tool.prf index 9d50856900..46d031fb32 100644 --- a/mkspecs/features/qt_tool.prf +++ b/mkspecs/features/qt_tool.prf @@ -17,9 +17,13 @@ DESTDIR = $$MODULE_BASE_OUTDIR/bin CONFIG += console isEmpty(QMAKE_INFO_PLIST): CONFIG -= app_bundle -host_build { +host_build: QT -= gui # no host tool will ever use gui +host_build:force_bootstrap { !build_pass: CONFIG += release - QT = bootstrap-private + contains(QT, core(-private)?|xml) { + QT -= core core-private xml + QT += bootstrap-private + } target.path = $$[QT_HOST_BINS] } else { !build_pass:contains(QT_CONFIG, build_all): CONFIG += release @@ -28,11 +32,12 @@ host_build { INSTALLS += target load(qt_targets) +load(qt_common) # If we are doing a prefix build, create a "module" pri which enables # qtPrepareTool() to work with the non-installed build. -!build_pass:force_independent { - +# Non-bootstrapped tools always need this because of the environment setup. +!build_pass:if(!host_build|!force_bootstrap|force_independent) { isEmpty(MODULE):MODULE = $$TARGET MODULE_DEPENDS = $$replace(QT, -private$, ) @@ -41,7 +46,7 @@ load(qt_targets) load(resolve_target) cmd = $$shell_path($$QMAKE_RESOLVED_TARGET) - !host_build: qtAddTargetEnv(cmd) + !host_build|!force_bootstrap: qtAddTargetEnv(cmd) TOOL_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules/qt_tool_$${MODULE}.pri diff --git a/mkspecs/features/resolve_target.prf b/mkspecs/features/resolve_target.prf index 8cd12b2a00..22d7722ce3 100644 --- a/mkspecs/features/resolve_target.prf +++ b/mkspecs/features/resolve_target.prf @@ -28,7 +28,7 @@ win32 { } else { contains(TEMPLATE, .*lib):LIBPREFIX = lib - macx { + mac { equals(TEMPLATE, lib) { lib_bundle { QMAKE_RESOLVED_TARGET = $${QMAKE_RESOLVED_TARGET}$${TARGET}.framework/$${TARGET} diff --git a/mkspecs/features/testcase.prf b/mkspecs/features/testcase.prf index faf4eeb124..15febe2dd5 100644 --- a/mkspecs/features/testcase.prf +++ b/mkspecs/features/testcase.prf @@ -32,7 +32,7 @@ contains(MUNGED_TARGET,.*/.*):check.commands = cd $(DESTDIR) && # Allow for a custom test runner script check.commands += $(TESTRUNNER) -macx { +mac { app_bundle: check.commands += ./$(QMAKE_TARGET).app/Contents/MacOS/$(QMAKE_TARGET) else: check.commands += ./$(QMAKE_TARGET) } diff --git a/mkspecs/features/unix/opengl.prf b/mkspecs/features/unix/opengl.prf index 74a514915d..8dd47d089d 100644 --- a/mkspecs/features/unix/opengl.prf +++ b/mkspecs/features/unix/opengl.prf @@ -11,7 +11,7 @@ contains(QT_CONFIG, opengles1) { } else { INCLUDEPATH += $$QMAKE_INCDIR_OPENGL !isEmpty(QMAKE_LIBDIR_OPENGL):QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL - target_qt:LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL_QT + target_qt:LIBS_PRIVATE += $$QMAKE_LIBS_OPENGL else:LIBS += $$QMAKE_LIBS_OPENGL } diff --git a/mkspecs/features/unix/separate_debug_info.prf b/mkspecs/features/unix/separate_debug_info.prf index cea1731888..c5ff6dcba3 100644 --- a/mkspecs/features/unix/separate_debug_info.prf +++ b/mkspecs/features/unix/separate_debug_info.prf @@ -1,8 +1,15 @@ !separate_debug_info_nocopy:have_target:!static:!isEmpty(QMAKE_OBJCOPY) { - qnx:debug_info_suffix=sym - else:debug_info_suffix=debug - QMAKE_SEPARATE_DEBUG_INFO = test -z \"$(DESTDIR)\" || cd \"$(DESTDIR)\" ; targ=`basename $(TARGET)`; $$QMAKE_OBJCOPY --only-keep-debug \"\$\$targ\" \"\$\$targ.$$debug_info_suffix\" && $$QMAKE_OBJCOPY --strip-debug \"\$\$targ\" && $$QMAKE_OBJCOPY --add-gnu-debuglink=\"\$\$targ.$$debug_info_suffix\" \"\$\$targ\" && chmod -x \"\$\$targ.$$debug_info_suffix\" + qnx { + debug_info_suffix = sym + debug_info_keep = --keep-file-symbols + debug_info_strip = --strip-debug -R.ident + } else { + debug_info_suffix = debug + debug_info_keep = --only-keep-debug + debug_info_strip = --strip-debug + } + QMAKE_SEPARATE_DEBUG_INFO = test -z \"$(DESTDIR)\" || cd \"$(DESTDIR)\" ; targ=`basename $(TARGET)`; $$QMAKE_OBJCOPY $$debug_info_keep \"\$\$targ\" \"\$\$targ.$$debug_info_suffix\" && $$QMAKE_OBJCOPY $$debug_info_strip \"\$\$targ\" && $$QMAKE_OBJCOPY --add-gnu-debuglink=\"\$\$targ.$$debug_info_suffix\" \"\$\$targ\" && chmod -x \"\$\$targ.$$debug_info_suffix\" QMAKE_INSTALL_SEPARATE_DEBUG_INFO = test -z \"$(DESTDIR)\" || cd \"$(DESTDIR)\" ; $(INSTALL_FILE) `basename $(TARGET)`.$$debug_info_suffix $(INSTALL_ROOT)/\$\$target_path/ !isEmpty(QMAKE_POST_LINK):QMAKE_POST_LINK = $$escape_expand(\\n\\t)$$QMAKE_POST_LINK diff --git a/mkspecs/features/win32/opengl.prf b/mkspecs/features/win32/opengl.prf index 898dee77f9..0f33f31e59 100644 --- a/mkspecs/features/win32/opengl.prf +++ b/mkspecs/features/win32/opengl.prf @@ -21,6 +21,7 @@ wince* { QMAKE_LIBDIR += $$QMAKE_LIBDIR_OPENGL_ES2_RELEASE } DEFINES += QT_OPENGL_ES_2 QT_OPENGL_ES_2_ANGLE + contains(QT_CONFIG, static): DEFINES += QT_OPENGL_ES_2_ANGLE_STATIC QT_CONFIG -= opengl } else { QMAKE_LIBS += $$QMAKE_LIBS_OPENGL |