2016-02-11 12:30:53 +00:00
|
|
|
|
2011-11-24 07:01:08 +00:00
|
|
|
defineReplace(qtPlatformTargetSuffix) {
|
2016-02-11 12:30:53 +00:00
|
|
|
ios:CONFIG(simulator, simulator|device): \
|
|
|
|
suffix = _$${simulator.sdk}
|
2013-10-25 15:20:05 +00:00
|
|
|
else: \
|
|
|
|
suffix =
|
|
|
|
|
2011-11-24 07:01:08 +00:00
|
|
|
CONFIG(debug, debug|release) {
|
|
|
|
!debug_and_release|build_pass {
|
2013-10-25 15:20:05 +00:00
|
|
|
mac: return($${suffix}_debug)
|
|
|
|
win32: return($${suffix}d)
|
2011-11-24 07:01:08 +00:00
|
|
|
}
|
|
|
|
}
|
2013-10-25 15:20:05 +00:00
|
|
|
return($$suffix)
|
2011-11-24 07:01:08 +00:00
|
|
|
}
|
|
|
|
|
2011-04-27 10:05:43 +00:00
|
|
|
defineReplace(qtLibraryTarget) {
|
|
|
|
LIBRARY_NAME = $$1
|
2015-11-19 15:53:50 +00:00
|
|
|
CONFIG(shared, static|shared):contains(QT_CONFIG, qt_framework) {
|
2011-04-27 10:05:43 +00:00
|
|
|
QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME
|
|
|
|
export(QMAKE_FRAMEWORK_BUNDLE_NAME)
|
|
|
|
}
|
2013-02-18 12:53:46 +00:00
|
|
|
return($$LIBRARY_NAME$$qtPlatformTargetSuffix())
|
2011-04-27 10:05:43 +00:00
|
|
|
}
|
|
|
|
|
2015-02-25 15:00:58 +00:00
|
|
|
defineReplace(qt5LibraryTarget) {
|
|
|
|
LIBRARY_NAME = $$qtLibraryTarget($$1)
|
|
|
|
isEmpty(QMAKE_FRAMEWORK_BUNDLE_NAME) {
|
|
|
|
# Insert the major version of Qt in the library name
|
|
|
|
# unless it's a framework build.
|
|
|
|
LIBRARY_NAME ~= s,^Qt,Qt$$QT_MAJOR_VERSION,
|
|
|
|
}
|
|
|
|
return($$LIBRARY_NAME)
|
|
|
|
}
|
|
|
|
|
2016-03-09 16:42:29 +00:00
|
|
|
defineReplace(qtRelativeRPathBase) {
|
|
|
|
darwin {
|
|
|
|
if(equals(TEMPLATE, app):app_bundle)|\
|
|
|
|
if(equals(TEMPLATE, lib):plugin:plugin_bundle) {
|
|
|
|
ios: return($$target.path/$${TARGET}.app)
|
|
|
|
return($$target.path/$${TARGET}.app/Contents/MacOS)
|
|
|
|
}
|
|
|
|
equals(TEMPLATE, lib):!plugin:lib_bundle: \
|
|
|
|
return($$target.path/$${TARGET}.framework/Versions/Current)
|
|
|
|
}
|
|
|
|
return($$target.path)
|
|
|
|
}
|
|
|
|
|
2011-04-27 10:05:43 +00:00
|
|
|
defineTest(qtAddLibrary) {
|
2013-10-21 14:43:43 +00:00
|
|
|
warning("qtAddLibrary() is deprecated. Use QT+= instead.")
|
2011-04-27 10:05:43 +00:00
|
|
|
|
2012-03-01 17:49:29 +00:00
|
|
|
# Reverse-engineer the module name from the library name.
|
2013-06-17 10:18:36 +00:00
|
|
|
for(var, QT_MODULES) {
|
|
|
|
isEqual(QT.$${var}.name, $$1) {
|
2015-06-04 18:47:40 +00:00
|
|
|
QT += $$var
|
|
|
|
export(QT)
|
2013-10-21 14:45:15 +00:00
|
|
|
return(true)
|
2012-03-01 17:49:29 +00:00
|
|
|
}
|
2011-04-27 10:05:43 +00:00
|
|
|
}
|
2012-03-01 17:49:29 +00:00
|
|
|
error("No module matching library '$$1' found.")
|
2011-04-27 10:05:43 +00:00
|
|
|
}
|
|
|
|
|
2012-12-21 11:09:56 +00:00
|
|
|
# qt module
|
|
|
|
defineTest(qtHaveModule) {
|
2013-10-25 10:24:20 +00:00
|
|
|
!isEmpty(QT.$$replace(1, -, _).name): \
|
2012-12-21 11:09:56 +00:00
|
|
|
return(true)
|
|
|
|
return(false)
|
|
|
|
}
|
|
|
|
|
2014-09-15 15:30:42 +00:00
|
|
|
# variable, default, [suffix for variable for system() use], [prepare primary variable for system() use]
|
2011-04-27 10:05:43 +00:00
|
|
|
defineTest(qtPrepareTool) {
|
2014-05-21 13:14:45 +00:00
|
|
|
cmd = $$eval(QT_TOOL.$${2}.binary)
|
|
|
|
isEmpty(cmd) {
|
|
|
|
cmd = $$[QT_HOST_BINS]/$$2
|
|
|
|
exists($${cmd}.pl) {
|
|
|
|
cmd = perl -w $$system_path($${cmd}.pl)
|
2013-05-10 16:54:41 +00:00
|
|
|
} else: contains(QMAKE_HOST.os, Windows) {
|
2014-05-21 13:14:45 +00:00
|
|
|
cmd = $$system_path($${cmd}.exe)
|
2012-07-03 17:26:36 +00:00
|
|
|
} else:contains(QMAKE_HOST.os, Darwin) {
|
2014-05-21 13:14:45 +00:00
|
|
|
BUNDLENAME = $${cmd}.app/Contents/MacOS/$$2
|
2012-07-03 17:26:36 +00:00
|
|
|
exists($$BUNDLENAME) {
|
2014-05-21 13:14:45 +00:00
|
|
|
cmd = $$BUNDLENAME
|
2012-07-03 17:26:36 +00:00
|
|
|
}
|
|
|
|
}
|
2011-04-27 10:05:43 +00:00
|
|
|
}
|
2013-08-26 14:13:54 +00:00
|
|
|
QT_TOOL_ENV += $$eval(QT_TOOL.$${2}.envvars)
|
2015-11-23 13:14:46 +00:00
|
|
|
QT_TOOL_NAME = $$2
|
2014-09-15 15:30:42 +00:00
|
|
|
!isEmpty(3)|!isEmpty(4) {
|
2014-05-21 13:14:45 +00:00
|
|
|
$$1$$3 =
|
|
|
|
for (arg, cmd): \
|
|
|
|
$$1$$3 += $$system_quote($$arg)
|
2013-06-13 16:12:07 +00:00
|
|
|
qtAddTargetEnv($$1$$3, QT_TOOL.$${2}.depends, system)
|
|
|
|
}
|
2014-09-15 15:30:42 +00:00
|
|
|
isEmpty(4) {
|
|
|
|
$$1 =
|
|
|
|
for (arg, cmd): \
|
|
|
|
$$1 += $$shell_quote($$arg)
|
|
|
|
qtAddTargetEnv($$1, QT_TOOL.$${2}.depends, )
|
|
|
|
}
|
2012-09-13 16:13:13 +00:00
|
|
|
}
|
|
|
|
|
2013-06-13 16:12:07 +00:00
|
|
|
# target variable, list of env var names, [non-empty: prepare for system(), not make]
|
2012-09-13 16:13:13 +00:00
|
|
|
defineTest(qtAddToolEnv) {
|
2013-06-13 16:12:07 +00:00
|
|
|
isEmpty(3): \
|
|
|
|
ds = $$QMAKE_DIR_SEP
|
|
|
|
else: \
|
|
|
|
ds = $$DIR_SEPARATOR
|
2015-11-23 13:14:46 +00:00
|
|
|
batch_sets =
|
2012-09-13 16:13:13 +00:00
|
|
|
for(env, 2) {
|
|
|
|
value = $$eval($${env}.value)
|
|
|
|
!isEmpty(value) {
|
|
|
|
name = $$eval($${env}.name)
|
2015-12-11 13:14:13 +00:00
|
|
|
config = $$eval($${env}.CONFIG)
|
2013-06-13 16:12:07 +00:00
|
|
|
equals(ds, /) {
|
2015-12-11 13:14:13 +00:00
|
|
|
contains(config, prepend): infix = \${$$name:+:\$$$name}
|
|
|
|
else: contains(config, always_prepend): infix = :\$$$name
|
2012-09-13 16:13:13 +00:00
|
|
|
else: infix =
|
2015-11-23 13:14:46 +00:00
|
|
|
# Under msys, this path is taken only in the non-system()
|
|
|
|
# case, so using shell_quote() always works.
|
|
|
|
batch_sets += \
|
|
|
|
"$$name=$$shell_quote($$join(value, :))$$infix" \
|
|
|
|
"export $$name"
|
2012-09-13 16:13:13 +00:00
|
|
|
} else {
|
2015-11-23 13:14:46 +00:00
|
|
|
value ~= s,\\^,^^^^,g
|
|
|
|
value ~= s,!,^^!,g
|
2014-11-19 13:55:13 +00:00
|
|
|
value ~= s,\\),^),g
|
2015-12-11 13:14:13 +00:00
|
|
|
contains(config, prepend) {
|
2015-11-23 13:14:46 +00:00
|
|
|
batch_sets += \
|
|
|
|
"if defined $$name (" \
|
|
|
|
" set $$name=$$join(value, ;);!$$name!" \
|
|
|
|
") else (" \
|
|
|
|
" set $$name=$$join(value, ;)" \
|
|
|
|
")"
|
2015-12-11 13:14:13 +00:00
|
|
|
} else: contains(config, always_prepend) {
|
|
|
|
batch_sets += "(set $$name=$$join(value, ;);!$$name!)"
|
2015-11-23 13:14:46 +00:00
|
|
|
} else {
|
|
|
|
batch_sets += "(set $$name=$$join(value, ;))"
|
|
|
|
}
|
2013-06-13 15:37:53 +00:00
|
|
|
}
|
2012-09-13 16:13:13 +00:00
|
|
|
}
|
|
|
|
}
|
2015-11-23 13:14:46 +00:00
|
|
|
!isEmpty(batch_sets) {
|
|
|
|
batch_name = wrapper
|
|
|
|
!isEmpty(QT_TOOL_NAME): batch_name = $${QT_TOOL_NAME}_wrapper
|
|
|
|
cmd = $$eval($$1)
|
|
|
|
!isEmpty(cmd): cmd = "$$cmd "
|
|
|
|
equals(ds, /) {
|
|
|
|
batch_name = $${batch_name}.sh
|
|
|
|
batch_cont = \
|
|
|
|
"$$LITERAL_HASH!/bin/sh" \
|
|
|
|
$$batch_sets \
|
|
|
|
"exec $$cmd\"$@\""
|
|
|
|
# It would be nicer to use the '.' command (without 'exec' above),
|
|
|
|
# but that doesn't set the positional arguments under (d)ash.
|
|
|
|
$$1 =
|
|
|
|
} else {
|
|
|
|
batch_name = $${batch_name}.bat
|
|
|
|
batch_cont = \
|
|
|
|
"@echo off" \
|
|
|
|
"SetLocal EnableDelayedExpansion" \
|
|
|
|
$$batch_sets \
|
|
|
|
"$$cmd%*" \
|
|
|
|
"EndLocal"
|
|
|
|
$$1 = call
|
|
|
|
}
|
|
|
|
!build_pass:!write_file($$OUT_PWD/$$batch_name, batch_cont, exe): error("Aborting.")
|
|
|
|
isEmpty(3): \
|
|
|
|
$$1 += $$shell_quote($$shell_path($$OUT_PWD/$$batch_name))
|
|
|
|
else: \
|
|
|
|
$$1 += $$system_quote($$system_path($$OUT_PWD/$$batch_name))
|
|
|
|
QMAKE_DISTCLEAN += $$OUT_PWD/$$batch_name
|
|
|
|
}
|
2012-09-13 16:13:13 +00:00
|
|
|
export($$1)
|
2015-11-23 13:14:46 +00:00
|
|
|
export(QMAKE_DISTCLEAN)
|
2011-04-27 10:05:43 +00:00
|
|
|
}
|
|
|
|
|
2013-06-13 16:12:07 +00:00
|
|
|
# target variable, dependency var name, [non-empty: prepare for system(), not make]
|
2012-09-14 13:38:56 +00:00
|
|
|
defineTest(qtAddTargetEnv) {
|
2013-10-21 19:05:35 +00:00
|
|
|
deps = $$replace($$2, -private$, _private)
|
2015-05-21 10:06:23 +00:00
|
|
|
deps = $$resolve_depends(deps, "QT.", ".depends" ".run_depends")
|
2012-09-14 13:38:56 +00:00
|
|
|
!isEmpty(deps) {
|
2015-12-11 13:14:13 +00:00
|
|
|
deppath.CONFIG = prepend
|
2012-10-29 10:18:06 +00:00
|
|
|
equals(QMAKE_HOST.os, Windows) {
|
2015-12-11 13:14:13 +00:00
|
|
|
deppath.CONFIG = always_prepend
|
2012-09-14 13:38:56 +00:00
|
|
|
deppath.name = PATH
|
2013-05-10 18:06:57 +00:00
|
|
|
} else:contains(QMAKE_HOST.os, Linux|FreeBSD|OpenBSD|NetBSD|DragonFly|SunOS|HP-UX|QNX|GNU) {
|
2012-09-14 13:38:56 +00:00
|
|
|
deppath.name = LD_LIBRARY_PATH
|
2014-12-16 08:15:26 +00:00
|
|
|
} else:contains(QMAKE_HOST.os, Haiku) {
|
|
|
|
deppath.name = LIBRARY_PATH
|
2012-10-29 10:18:06 +00:00
|
|
|
} else:equals(QMAKE_HOST.os, Darwin) {
|
|
|
|
contains(QT_CONFIG, qt_framework): \
|
|
|
|
deppath.name = DYLD_FRAMEWORK_PATH
|
|
|
|
else: \
|
|
|
|
deppath.name = DYLD_LIBRARY_PATH
|
2013-05-10 18:06:57 +00:00
|
|
|
} else:equals(QMAKE_HOST.os, AIX) {
|
|
|
|
deppath.name = LIBPATH
|
2012-10-29 10:18:06 +00:00
|
|
|
} else {
|
2012-09-14 13:38:56 +00:00
|
|
|
error("Operating system not supported.")
|
2012-10-29 10:18:06 +00:00
|
|
|
}
|
2015-11-20 18:04:11 +00:00
|
|
|
ptypes =
|
|
|
|
for(dep, deps) {
|
|
|
|
isEmpty(3): \
|
2015-12-11 13:53:18 +00:00
|
|
|
deppath += $$shell_path($$eval(QT.$${dep}.libs))
|
2015-11-20 18:04:11 +00:00
|
|
|
else: \
|
2015-12-11 13:53:18 +00:00
|
|
|
deppath += $$system_path($$eval(QT.$${dep}.libs))
|
2015-11-20 18:04:11 +00:00
|
|
|
ptypes += $$eval(QT.$${dep}.plugin_types)
|
|
|
|
}
|
2012-09-14 13:38:56 +00:00
|
|
|
deppath.value = $$unique(deppath)
|
2012-09-20 10:53:33 +00:00
|
|
|
|
2012-09-14 13:38:56 +00:00
|
|
|
pluginpath.value =
|
2014-05-12 13:30:47 +00:00
|
|
|
ppaths = $$[QT_INSTALL_PLUGINS/get]
|
|
|
|
for(qplug, QT_PLUGINS): \
|
2016-01-02 15:29:15 +00:00
|
|
|
contains(ptypes, $$eval(QT_PLUGIN.$${qplug}.TYPE)): \
|
2014-05-12 13:30:47 +00:00
|
|
|
ppaths += $$eval(QT_PLUGIN.$${qplug}.PATH)
|
|
|
|
ppaths = $$unique(ppaths)
|
|
|
|
for(qplug, ppaths) {
|
|
|
|
isEmpty(3): \
|
|
|
|
pluginpath.value += $$shell_path($$qplug)
|
|
|
|
else: \
|
|
|
|
pluginpath.value += $$system_path($$qplug)
|
2012-09-20 10:53:33 +00:00
|
|
|
}
|
|
|
|
pluginpath.name = QT_PLUGIN_PATH
|
2015-10-27 00:50:45 +00:00
|
|
|
pluginpath.CONFIG = prepend
|
2012-09-20 10:53:33 +00:00
|
|
|
|
2012-09-14 13:38:56 +00:00
|
|
|
QT_TOOL_ENV += deppath pluginpath
|
|
|
|
}
|
2013-06-13 16:12:07 +00:00
|
|
|
qtAddToolEnv($$1, $$QT_TOOL_ENV, $$3)
|
2012-09-14 13:38:56 +00:00
|
|
|
}
|
|
|
|
|
2011-10-19 13:36:33 +00:00
|
|
|
defineReplace(pkgConfigExecutable) {
|
|
|
|
isEmpty(PKG_CONFIG) {
|
2016-01-19 15:48:40 +00:00
|
|
|
!isEmpty(QMAKE_PKG_CONFIG): \
|
|
|
|
PKG_CONFIG = $$QMAKE_PKG_CONFIG
|
|
|
|
else: \
|
|
|
|
PKG_CONFIG = pkg-config
|
2011-10-19 13:36:33 +00:00
|
|
|
|
2015-02-06 16:19:04 +00:00
|
|
|
sysroot.name = PKG_CONFIG_SYSROOT_DIR
|
|
|
|
sysroot.value = $$PKG_CONFIG_SYSROOT_DIR
|
|
|
|
libdir.name = PKG_CONFIG_LIBDIR
|
|
|
|
libdir.value = $$PKG_CONFIG_LIBDIR
|
2016-01-19 17:14:19 +00:00
|
|
|
QT_TOOL_NAME = pkg-config
|
2015-02-06 16:19:04 +00:00
|
|
|
qtAddToolEnv(PKG_CONFIG, sysroot libdir, SYS)
|
2011-10-19 13:36:33 +00:00
|
|
|
}
|
|
|
|
|
2013-08-07 14:21:30 +00:00
|
|
|
equals(QMAKE_HOST.os, Windows): \
|
|
|
|
PKG_CONFIG += 2> NUL
|
|
|
|
else: \
|
|
|
|
PKG_CONFIG += 2> /dev/null
|
|
|
|
|
2011-10-19 13:36:33 +00:00
|
|
|
return($$PKG_CONFIG)
|
|
|
|
}
|
|
|
|
|
2011-04-27 10:05:43 +00:00
|
|
|
defineTest(packagesExist) {
|
2012-11-19 14:53:57 +00:00
|
|
|
contains(QT_CONFIG, no-pkg-config):return(false)
|
|
|
|
|
2011-04-27 10:05:43 +00:00
|
|
|
# this can't be done in global scope here because qt_functions is loaded
|
|
|
|
# before the .pro is parsed, so if the .pro set PKG_CONFIG, we wouldn't know it
|
|
|
|
# yet. oops.
|
2011-10-19 13:36:33 +00:00
|
|
|
pkg_config = $$pkgConfigExecutable()
|
2011-04-27 10:05:43 +00:00
|
|
|
|
|
|
|
for(package, ARGS) {
|
2011-10-19 13:36:33 +00:00
|
|
|
!system($$pkg_config --exists $$package):return(false)
|
2011-04-27 10:05:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return(true)
|
|
|
|
}
|
|
|
|
|
2012-10-17 12:13:19 +00:00
|
|
|
# Prepares target that will iterate through all subdirs (except those
|
|
|
|
# with no_default_target or no_{name_of_target}_target. The prepared
|
|
|
|
# target must still be manually added to QMAKE_EXTRA_TARGETS.
|
|
|
|
defineTest(prepareRecursiveTarget) {
|
|
|
|
target = $$1
|
|
|
|
no_$${target}_target: return()
|
|
|
|
|
|
|
|
for(subdir, SUBDIRS) {
|
|
|
|
subdir_config = $$eval($${subdir}.CONFIG)
|
|
|
|
contains(subdir_config, no_default_target): next()
|
|
|
|
contains(subdir_config, no_$${target}_target): next()
|
|
|
|
|
|
|
|
$${target}.recurse += $$subdir
|
|
|
|
}
|
|
|
|
|
|
|
|
# Set up the recurse target only when there
|
|
|
|
# is something to recurse into.
|
|
|
|
isEmpty($${target}.recurse): return()
|
|
|
|
|
|
|
|
$${target}.CONFIG = recursive
|
|
|
|
$${target}.recurse_target = $${target}
|
|
|
|
|
|
|
|
export($${target}.recurse)
|
|
|
|
export($${target}.CONFIG)
|
|
|
|
export($${target}.recurse_target)
|
|
|
|
}
|