Merge remote-tracking branch 'origin/dev' into wip/qt6
Change-Id: I54741635460bb2d8f3fd0be535ee1968d6c442bb
This commit is contained in:
commit
f255b1e8e2
@ -2,7 +2,6 @@ load(qt_build_config)
|
|||||||
CONFIG += warning_clean
|
CONFIG += warning_clean
|
||||||
|
|
||||||
DEFINES += QT_NO_JAVA_STYLE_ITERATORS
|
DEFINES += QT_NO_JAVA_STYLE_ITERATORS
|
||||||
DEFINES += QT_NO_LINKED_LIST
|
|
||||||
|
|
||||||
QT_SOURCE_TREE = $$PWD
|
QT_SOURCE_TREE = $$PWD
|
||||||
QT_BUILD_TREE = $$shadowed($$PWD)
|
QT_BUILD_TREE = $$shadowed($$PWD)
|
||||||
|
@ -79,9 +79,6 @@ normalizePath(\$out_basedir);
|
|||||||
our $build_basedir;
|
our $build_basedir;
|
||||||
our $basedir;
|
our $basedir;
|
||||||
|
|
||||||
# Make sure we use Windows line endings for chomp and friends on Windows.
|
|
||||||
$INPUT_RECORD_SEPARATOR = "\r\n" if ($^O eq "msys");
|
|
||||||
|
|
||||||
# will be defined based on the modules sync.profile
|
# will be defined based on the modules sync.profile
|
||||||
our (%modules, %moduleheaders, @allmoduleheadersprivate, %classnames, %deprecatedheaders);
|
our (%modules, %moduleheaders, @allmoduleheadersprivate, %classnames, %deprecatedheaders);
|
||||||
our (@qpa_headers, @private_headers);
|
our (@qpa_headers, @private_headers);
|
||||||
@ -182,10 +179,10 @@ sub shouldMasterInclude {
|
|||||||
my ($iheader) = @_;
|
my ($iheader) = @_;
|
||||||
return 0 if (basename($iheader) =~ /_/);
|
return 0 if (basename($iheader) =~ /_/);
|
||||||
return 0 if (basename($iheader) =~ /qconfig/);
|
return 0 if (basename($iheader) =~ /qconfig/);
|
||||||
|
local $/ = "\x0a";
|
||||||
if (open(F, "<$iheader")) {
|
if (open(F, "<$iheader")) {
|
||||||
while (<F>) {
|
while (<F>) {
|
||||||
chomp;
|
s/\x0d?\x0a//;
|
||||||
chop if /\r$/;
|
|
||||||
return 0 if (/^\#pragma qt_no_master_include$/);
|
return 0 if (/^\#pragma qt_no_master_include$/);
|
||||||
}
|
}
|
||||||
close(F);
|
close(F);
|
||||||
@ -215,11 +212,11 @@ sub classNames {
|
|||||||
my $ihdrbase = basename($iheader);
|
my $ihdrbase = basename($iheader);
|
||||||
|
|
||||||
my $parsable = "";
|
my $parsable = "";
|
||||||
|
local $/ = "\x0a";
|
||||||
if(open(F, "<$iheader")) {
|
if(open(F, "<$iheader")) {
|
||||||
while(<F>) {
|
while(<F>) {
|
||||||
|
s/\x0d?\x0a//;
|
||||||
my $line = $_;
|
my $line = $_;
|
||||||
chomp $line;
|
|
||||||
chop $line if ($line =~ /\r$/);
|
|
||||||
if($line =~ /^\#/) {
|
if($line =~ /^\#/) {
|
||||||
$$clean = 0 if ($line =~ m/^#pragma qt_sync_skip_header_check/);
|
$$clean = 0 if ($line =~ m/^#pragma qt_sync_skip_header_check/);
|
||||||
return @ret if($line =~ m/^#pragma qt_sync_stop_processing/);
|
return @ret if($line =~ m/^#pragma qt_sync_stop_processing/);
|
||||||
@ -231,6 +228,7 @@ sub classNames {
|
|||||||
$line .= ";" if($line =~ m/^Q_[A-Z_0-9]*\(.*\)[\r\n]*$/); #qt macro
|
$line .= ";" if($line =~ m/^Q_[A-Z_0-9]*\(.*\)[\r\n]*$/); #qt macro
|
||||||
$line .= ";" if($line =~ m/^QT_(BEGIN|END)_HEADER[\r\n]*$/); #qt macro
|
$line .= ";" if($line =~ m/^QT_(BEGIN|END)_HEADER[\r\n]*$/); #qt macro
|
||||||
$line .= ";" if($line =~ m/^QT_(BEGIN|END)_NAMESPACE(_[A-Z]+)*[\r\n]*$/); #qt macro
|
$line .= ";" if($line =~ m/^QT_(BEGIN|END)_NAMESPACE(_[A-Z]+)*[\r\n]*$/); #qt macro
|
||||||
|
$line .= ";" if($line =~ m/^QT_DEPRECATED_X\(.*\)[\r\n]*$/); #qt macro
|
||||||
$line .= ";" if($line =~ m/^QT_MODULE\(.*\)[\r\n]*$/); # QT_MODULE macro
|
$line .= ";" if($line =~ m/^QT_MODULE\(.*\)[\r\n]*$/); # QT_MODULE macro
|
||||||
$line .= ";" if($line =~ m/^QT_WARNING_(PUSH|POP|DISABLE_\w+\(.*\))[\r\n]*$/); # qt macros
|
$line .= ";" if($line =~ m/^QT_WARNING_(PUSH|POP|DISABLE_\w+\(.*\))[\r\n]*$/); # qt macros
|
||||||
$$requires = $1 if ($line =~ m/^QT_REQUIRE_CONFIG\((.*)\);[\r\n]*$/);
|
$$requires = $1 if ($line =~ m/^QT_REQUIRE_CONFIG\((.*)\);[\r\n]*$/);
|
||||||
@ -336,6 +334,7 @@ sub check_header {
|
|||||||
$header_skip_qt_begin_namespace_test = 1 if ($ignore_for_qt_begin_namespace_check{$header});
|
$header_skip_qt_begin_namespace_test = 1 if ($ignore_for_qt_begin_namespace_check{$header});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local $/ = "\x0a";
|
||||||
open(F, "<$iheader") or return;
|
open(F, "<$iheader") or return;
|
||||||
my $qt_begin_namespace_found = 0;
|
my $qt_begin_namespace_found = 0;
|
||||||
my $qt_end_namespace_found = 0;
|
my $qt_end_namespace_found = 0;
|
||||||
@ -344,7 +343,7 @@ sub check_header {
|
|||||||
my $stop_processing = 0;
|
my $stop_processing = 0;
|
||||||
my $we_mean_it = 0;
|
my $we_mean_it = 0;
|
||||||
while ($line = <F>) {
|
while ($line = <F>) {
|
||||||
chomp $line;
|
$line =~ s/\x0d?\x0a//;
|
||||||
my $output_line = 1;
|
my $output_line = 1;
|
||||||
if ($line =~ /^ *\# *pragma (qt_no_included_check|qt_sync_stop_processing)/) {
|
if ($line =~ /^ *\# *pragma (qt_no_included_check|qt_sync_stop_processing)/) {
|
||||||
$stop_processing = 1;
|
$stop_processing = 1;
|
||||||
@ -965,9 +964,10 @@ foreach my $lib (@modules_to_sync) {
|
|||||||
#push @files, "$out_basedir/include/Qt/$t" if(-e "$out_basedir/include/Qt/$t");
|
#push @files, "$out_basedir/include/Qt/$t" if(-e "$out_basedir/include/Qt/$t");
|
||||||
foreach my $file (@files) {
|
foreach my $file (@files) {
|
||||||
my $remove_file = 0;
|
my $remove_file = 0;
|
||||||
|
local $/ = "\x0a";
|
||||||
if(open(F, "<$file")) {
|
if(open(F, "<$file")) {
|
||||||
while(my $line = <F>) {
|
while(my $line = <F>) {
|
||||||
chomp $line;
|
$line =~ s/\x0d?\x0a//;
|
||||||
if($line =~ /^\#include \"([^\"]*)\"$/) {
|
if($line =~ /^\#include \"([^\"]*)\"$/) {
|
||||||
my $include = $1;
|
my $include = $1;
|
||||||
$include = $subdir . "/" . $include unless(substr($include, 0, 1) eq "/");
|
$include = $subdir . "/" . $include unless(substr($include, 0, 1) eq "/");
|
||||||
|
@ -1 +1,2 @@
|
|||||||
SOURCES = arch.cpp
|
SOURCES = arch.cpp
|
||||||
|
include(write_info.pri)
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
option(host_build)
|
option(host_build)
|
||||||
SOURCES = arch.cpp
|
SOURCES = arch.cpp
|
||||||
|
include(write_info.pri)
|
||||||
|
14
config.tests/arch/write_info.pri
Normal file
14
config.tests/arch/write_info.pri
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
targetinfofile = $$basename(_PRO_FILE_)
|
||||||
|
targetinfofile ~= s/pro$/target.txt/
|
||||||
|
|
||||||
|
win32 {
|
||||||
|
ext = .exe
|
||||||
|
} else:wasm {
|
||||||
|
equals(WASM_OBJECT_FILES, 1): \
|
||||||
|
ext = .o
|
||||||
|
else: \
|
||||||
|
ext = .wasm
|
||||||
|
}
|
||||||
|
|
||||||
|
content = $${file_prefix}$${TARGET}$${ext}
|
||||||
|
write_file($$OUT_PWD/$$targetinfofile, content)
|
@ -203,9 +203,8 @@ Build environment:
|
|||||||
-android-ndk-platform Set Android platform
|
-android-ndk-platform Set Android platform
|
||||||
-android-ndk-host .... Set Android NDK host (linux-x86, linux-x86_64, etc.)
|
-android-ndk-host .... Set Android NDK host (linux-x86, linux-x86_64, etc.)
|
||||||
[$ANDROID_NDK_HOST]
|
[$ANDROID_NDK_HOST]
|
||||||
-android-arch ........ Set Android architecture (armeabi, armeabi-v7a,
|
-android-abis ....... Comma separated Android abis, default is:
|
||||||
arm64-v8a, x86, x86_64)
|
armeabi-v7a,arm64-v8a,x86,x86_64
|
||||||
-android-toolchain-version ... Set Android toolchain version
|
|
||||||
-android-style-assets Automatically extract style assets from the device at
|
-android-style-assets Automatically extract style assets from the device at
|
||||||
run time. This option makes the Android style behave
|
run time. This option makes the Android style behave
|
||||||
correctly, but also makes the Android platform plugin
|
correctly, but also makes the Android platform plugin
|
||||||
@ -297,8 +296,7 @@ Gui, printing, widget options:
|
|||||||
-gbm ............... Enable backends for GBM [auto] (Linux only)
|
-gbm ............... Enable backends for GBM [auto] (Linux only)
|
||||||
-kms ............... Enable backends for KMS [auto] (Linux only)
|
-kms ............... Enable backends for KMS [auto] (Linux only)
|
||||||
-linuxfb ........... Enable Linux Framebuffer support [auto] (Linux only)
|
-linuxfb ........... Enable Linux Framebuffer support [auto] (Linux only)
|
||||||
-xcb ............... Enable X11 support. Select used xcb-* libraries [system/qt/no]
|
-xcb ............... Enable X11 support [auto] (Linux only)
|
||||||
(-qt-xcb still uses system version of libxcb itself)
|
|
||||||
|
|
||||||
Input backends:
|
Input backends:
|
||||||
-libudev............ Enable udev support [auto]
|
-libudev............ Enable udev support [auto]
|
||||||
@ -307,7 +305,7 @@ Gui, printing, widget options:
|
|||||||
-libinput .......... Enable libinput support [auto]
|
-libinput .......... Enable libinput support [auto]
|
||||||
-mtdev ............. Enable mtdev support [auto]
|
-mtdev ............. Enable mtdev support [auto]
|
||||||
-tslib ............. Enable tslib support [auto]
|
-tslib ............. Enable tslib support [auto]
|
||||||
-xcb-xinput ........ Enable XInput2 support [auto]
|
-bundled-xcb-xinput Use bundled XInput2 support [auto]
|
||||||
-xkbcommon ......... Enable key mapping support [auto]
|
-xkbcommon ......... Enable key mapping support [auto]
|
||||||
|
|
||||||
Image formats:
|
Image formats:
|
||||||
|
@ -51,11 +51,11 @@
|
|||||||
"translationdir": "string",
|
"translationdir": "string",
|
||||||
|
|
||||||
"android-arch": "string",
|
"android-arch": "string",
|
||||||
|
"android-abis": "string",
|
||||||
"android-ndk": "string",
|
"android-ndk": "string",
|
||||||
"android-ndk-host": "string",
|
"android-ndk-host": "string",
|
||||||
"android-ndk-platform": "string",
|
"android-ndk-platform": "string",
|
||||||
"android-sdk": "string",
|
"android-sdk": "string",
|
||||||
"android-toolchain-version": "string",
|
|
||||||
|
|
||||||
"android-style-assets": "boolean",
|
"android-style-assets": "boolean",
|
||||||
"appstore-compliant": "boolean",
|
"appstore-compliant": "boolean",
|
||||||
|
@ -286,37 +286,13 @@ defineTest(qtConfTest_architecture) {
|
|||||||
!qtConfTest_compile($${1}): \
|
!qtConfTest_compile($${1}): \
|
||||||
error("Could not determine $$eval($${1}.label). See config.log for details.")
|
error("Could not determine $$eval($${1}.label). See config.log for details.")
|
||||||
|
|
||||||
host = $$eval($${1}.host)
|
|
||||||
isEmpty(host): host = false
|
|
||||||
file_prefix =
|
|
||||||
exts = -
|
|
||||||
$$host {
|
|
||||||
equals(QMAKE_HOST.os, Windows): \
|
|
||||||
exts = .exe
|
|
||||||
} else {
|
|
||||||
win32 {
|
|
||||||
exts = .exe
|
|
||||||
} else:android {
|
|
||||||
file_prefix = lib
|
|
||||||
exts = .so
|
|
||||||
} else:wasm {
|
|
||||||
exts = .wasm .o
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
test = $$eval($${1}.test)
|
test = $$eval($${1}.test)
|
||||||
output = $$eval($${1}.output)
|
output = $$eval($${1}.output)
|
||||||
test_out_dir = $$OUT_PWD/$$basename(QMAKE_CONFIG_TESTS_DIR)/$$test
|
test_out_dir = $$OUT_PWD/$$basename(QMAKE_CONFIG_TESTS_DIR)/$$test
|
||||||
test_out_file =
|
test_out_file = $$test_out_dir/$$cat($$test_out_dir/$${output}.target.txt)
|
||||||
for(ext, exts) {
|
exists($$test_out_file): \
|
||||||
equals(ext, -): ext =
|
content = $$cat($$test_out_file, blob)
|
||||||
f = $$test_out_dir/$$file_prefix$$output$$ext
|
else: \
|
||||||
exists($$f) {
|
|
||||||
test_out_file = $$f
|
|
||||||
break()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
isEmpty(test_out_file): \
|
|
||||||
error("$$eval($${1}.label) detection binary not found.")
|
error("$$eval($${1}.label) detection binary not found.")
|
||||||
content = $$cat($$test_out_file, blob)
|
content = $$cat($$test_out_file, blob)
|
||||||
|
|
||||||
@ -597,14 +573,7 @@ defineTest(qtConfOutput_prepareOptions) {
|
|||||||
qtConfFatalError("Cannot find Android NDK." \
|
qtConfFatalError("Cannot find Android NDK." \
|
||||||
"Please use -android-ndk option to specify one.")
|
"Please use -android-ndk option to specify one.")
|
||||||
|
|
||||||
ndk_tc_ver = $$eval(config.input.android-toolchain-version)
|
ndk_tc_pfx = $$ndk_root/toolchains/llvm/prebuilt
|
||||||
isEmpty(ndk_tc_ver): \
|
|
||||||
ndk_tc_ver = 4.9
|
|
||||||
!exists($$ndk_root/toolchains/arm-linux-androideabi-$$ndk_tc_ver/prebuilt/*): \
|
|
||||||
qtConfFatalError("Cannot detect Android NDK toolchain." \
|
|
||||||
"Please use -android-toolchain-version to specify it.")
|
|
||||||
|
|
||||||
ndk_tc_pfx = $$ndk_root/toolchains/arm-linux-androideabi-$$ndk_tc_ver/prebuilt
|
|
||||||
ndk_host = $$eval(config.input.android-ndk-host)
|
ndk_host = $$eval(config.input.android-ndk-host)
|
||||||
isEmpty(ndk_host): \
|
isEmpty(ndk_host): \
|
||||||
ndk_host = $$getenv(ANDROID_NDK_HOST)
|
ndk_host = $$getenv(ANDROID_NDK_HOST)
|
||||||
@ -642,10 +611,11 @@ defineTest(qtConfOutput_prepareOptions) {
|
|||||||
qtConfFatalError("Specified Android NDK host is invalid.")
|
qtConfFatalError("Specified Android NDK host is invalid.")
|
||||||
}
|
}
|
||||||
|
|
||||||
target_arch = $$eval(config.input.android-arch)
|
android_abis = $$eval(config.input.android-abis)
|
||||||
isEmpty(target_arch): \
|
isEmpty(android_abis): \
|
||||||
target_arch = armeabi-v7a
|
android_abis = $$eval(config.input.android-arch)
|
||||||
|
isEmpty(android_abis): \
|
||||||
|
android_abis = armeabi-v7a,arm64-v8a,x86,x86_64
|
||||||
platform = $$eval(config.input.android-ndk-platform)
|
platform = $$eval(config.input.android-ndk-platform)
|
||||||
isEmpty(platform): \
|
isEmpty(platform): \
|
||||||
platform = android-21
|
platform = android-21
|
||||||
@ -655,8 +625,7 @@ defineTest(qtConfOutput_prepareOptions) {
|
|||||||
"DEFAULT_ANDROID_NDK_ROOT = $$val_escape(ndk_root)" \
|
"DEFAULT_ANDROID_NDK_ROOT = $$val_escape(ndk_root)" \
|
||||||
"DEFAULT_ANDROID_PLATFORM = $$platform" \
|
"DEFAULT_ANDROID_PLATFORM = $$platform" \
|
||||||
"DEFAULT_ANDROID_NDK_HOST = $$ndk_host" \
|
"DEFAULT_ANDROID_NDK_HOST = $$ndk_host" \
|
||||||
"DEFAULT_ANDROID_TARGET_ARCH = $$target_arch" \
|
"DEFAULT_ANDROID_ABIS = $$split(android_abis, ',')"
|
||||||
"DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION = $$ndk_tc_ver"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export($${currentConfig}.output.devicePro)
|
export($${currentConfig}.output.devicePro)
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 39 KiB |
@ -304,8 +304,8 @@
|
|||||||
\snippet threads/mandelbrot/mandelbrotwidget.cpp 12
|
\snippet threads/mandelbrot/mandelbrotwidget.cpp 12
|
||||||
|
|
||||||
The wheel event handler is reimplemented to make the mouse wheel
|
The wheel event handler is reimplemented to make the mouse wheel
|
||||||
control the zoom level. QWheelEvent::delta() returns the angle of
|
control the zoom level. QWheelEvent::angleDelta() returns the angle
|
||||||
the wheel mouse movement, in eights of a degree. For most mice,
|
of the wheel mouse movement, in eighths of a degree. For most mice,
|
||||||
one wheel step corresponds to 15 degrees. We find out how many
|
one wheel step corresponds to 15 degrees. We find out how many
|
||||||
mouse steps we have and determine the resulting zoom factor.
|
mouse steps we have and determine the resulting zoom factor.
|
||||||
For example, if we have two wheel steps in the positive direction
|
For example, if we have two wheel steps in the positive direction
|
||||||
|
@ -176,7 +176,7 @@ void MandelbrotWidget::keyPressEvent(QKeyEvent *event)
|
|||||||
//! [12]
|
//! [12]
|
||||||
void MandelbrotWidget::wheelEvent(QWheelEvent *event)
|
void MandelbrotWidget::wheelEvent(QWheelEvent *event)
|
||||||
{
|
{
|
||||||
int numDegrees = event->delta() / 8;
|
int numDegrees = event->angleDelta().y() / 8;
|
||||||
double numSteps = numDegrees / 15.0f;
|
double numSteps = numDegrees / 15.0f;
|
||||||
zoom(pow(ZoomInFactor, numSteps));
|
zoom(pow(ZoomInFactor, numSteps));
|
||||||
}
|
}
|
||||||
|
@ -55,11 +55,10 @@ Window::Window(QWidget *parent)
|
|||||||
m_iconSize(64, 64)
|
m_iconSize(64, 64)
|
||||||
{
|
{
|
||||||
m_ui.setupUi(this);
|
m_ui.setupUi(this);
|
||||||
QButtonGroup *buttonGroup = findChild<QButtonGroup *>(); // ### workaround for uic in 4.4
|
|
||||||
m_ui.easingCurvePicker->setIconSize(m_iconSize);
|
m_ui.easingCurvePicker->setIconSize(m_iconSize);
|
||||||
m_ui.easingCurvePicker->setMinimumHeight(m_iconSize.height() + 50);
|
m_ui.easingCurvePicker->setMinimumHeight(m_iconSize.height() + 50);
|
||||||
buttonGroup->setId(m_ui.lineRadio, 0);
|
m_ui.buttonGroup->setId(m_ui.lineRadio, 0);
|
||||||
buttonGroup->setId(m_ui.circleRadio, 1);
|
m_ui.buttonGroup->setId(m_ui.circleRadio, 1);
|
||||||
|
|
||||||
QEasingCurve dummy;
|
QEasingCurve dummy;
|
||||||
m_ui.periodSpinBox->setValue(dummy.period());
|
m_ui.periodSpinBox->setValue(dummy.period());
|
||||||
@ -68,7 +67,7 @@ Window::Window(QWidget *parent)
|
|||||||
|
|
||||||
connect(m_ui.easingCurvePicker, &QListWidget::currentRowChanged,
|
connect(m_ui.easingCurvePicker, &QListWidget::currentRowChanged,
|
||||||
this, &Window::curveChanged);
|
this, &Window::curveChanged);
|
||||||
connect(buttonGroup, QOverload<int>::of(&QButtonGroup::buttonClicked),
|
connect(m_ui.buttonGroup, QOverload<int>::of(&QButtonGroup::buttonClicked),
|
||||||
this, &Window::pathChanged);
|
this, &Window::pathChanged);
|
||||||
connect(m_ui.periodSpinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
|
connect(m_ui.periodSpinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
|
||||||
this, &Window::periodChanged);
|
this, &Window::periodChanged);
|
||||||
|
@ -50,16 +50,13 @@
|
|||||||
|
|
||||||
#include "animation.h"
|
#include "animation.h"
|
||||||
|
|
||||||
#include <QPointF>
|
|
||||||
#include <QVector>
|
|
||||||
#include <QIODevice>
|
#include <QIODevice>
|
||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
|
|
||||||
class Frame
|
class Frame
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Frame() {
|
Frame() = default;
|
||||||
}
|
|
||||||
|
|
||||||
int nodeCount() const
|
int nodeCount() const
|
||||||
{
|
{
|
||||||
@ -85,9 +82,8 @@ private:
|
|||||||
QVector<QPointF> m_nodePositions;
|
QVector<QPointF> m_nodePositions;
|
||||||
};
|
};
|
||||||
|
|
||||||
Animation::Animation()
|
Animation::Animation() : m_currentFrame(0)
|
||||||
{
|
{
|
||||||
m_currentFrame = 0;
|
|
||||||
m_frames.append(new Frame);
|
m_frames.append(new Frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,6 +99,8 @@ void Animation::setTotalFrames(int totalFrames)
|
|||||||
|
|
||||||
while (totalFrames < m_frames.size())
|
while (totalFrames < m_frames.size())
|
||||||
delete m_frames.takeLast();
|
delete m_frames.takeLast();
|
||||||
|
|
||||||
|
setCurrentFrame(m_currentFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Animation::totalFrames() const
|
int Animation::totalFrames() const
|
||||||
@ -112,7 +110,7 @@ int Animation::totalFrames() const
|
|||||||
|
|
||||||
void Animation::setCurrentFrame(int currentFrame)
|
void Animation::setCurrentFrame(int currentFrame)
|
||||||
{
|
{
|
||||||
m_currentFrame = qMax(qMin(currentFrame, totalFrames()-1), 0);
|
m_currentFrame = qBound(0, currentFrame, totalFrames() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Animation::currentFrame() const
|
int Animation::currentFrame() const
|
||||||
@ -177,18 +175,16 @@ void Animation::load(QIODevice *device)
|
|||||||
int frameCount;
|
int frameCount;
|
||||||
stream >> frameCount;
|
stream >> frameCount;
|
||||||
|
|
||||||
for (int i=0; i<frameCount; ++i) {
|
for (int i = 0; i < frameCount; ++i) {
|
||||||
|
|
||||||
int nodeCount;
|
int nodeCount;
|
||||||
stream >> nodeCount;
|
stream >> nodeCount;
|
||||||
|
|
||||||
Frame *frame = new Frame;
|
Frame *frame = new Frame;
|
||||||
frame->setNodeCount(nodeCount);
|
frame->setNodeCount(nodeCount);
|
||||||
|
|
||||||
for (int j=0; j<nodeCount; ++j) {
|
for (int j = 0; j < nodeCount; ++j) {
|
||||||
QPointF pos;
|
QPointF pos;
|
||||||
stream >> pos;
|
stream >> pos;
|
||||||
|
|
||||||
frame->setNodePos(j, pos);
|
frame->setNodePos(j, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,8 +52,8 @@
|
|||||||
#define ANIMATION_H
|
#define ANIMATION_H
|
||||||
|
|
||||||
#include <QPointF>
|
#include <QPointF>
|
||||||
#include <QList>
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
#include <QVector>
|
||||||
|
|
||||||
class Frame;
|
class Frame;
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
@ -85,7 +85,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_name;
|
QString m_name;
|
||||||
QList<Frame *> m_frames;
|
QVector<Frame *> m_frames;
|
||||||
int m_currentFrame;
|
int m_currentFrame;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -51,13 +51,8 @@
|
|||||||
#include "graphicsview.h"
|
#include "graphicsview.h"
|
||||||
#include "stickman.h"
|
#include "stickman.h"
|
||||||
|
|
||||||
#include <QtGui/QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QtWidgets/QGraphicsScene>
|
#include <QGraphicsScene>
|
||||||
#include <QtWidgets/QGraphicsView>
|
|
||||||
|
|
||||||
GraphicsView::GraphicsView(QWidget *parent)
|
|
||||||
: QGraphicsView(parent), m_editor(nullptr)
|
|
||||||
{}
|
|
||||||
|
|
||||||
void GraphicsView::keyPressEvent(QKeyEvent *e)
|
void GraphicsView::keyPressEvent(QKeyEvent *e)
|
||||||
{
|
{
|
||||||
@ -66,7 +61,8 @@ void GraphicsView::keyPressEvent(QKeyEvent *e)
|
|||||||
emit keyPressed(Qt::Key(e->key()));
|
emit keyPressed(Qt::Key(e->key()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsView::resizeEvent(QResizeEvent *)
|
void GraphicsView::resizeEvent(QResizeEvent *e)
|
||||||
{
|
{
|
||||||
fitInView(scene()->sceneRect());
|
fitInView(scene()->sceneRect());
|
||||||
|
QGraphicsView::resizeEvent(e);
|
||||||
}
|
}
|
||||||
|
@ -51,24 +51,20 @@
|
|||||||
#ifndef GRAPHICSVIEW_H
|
#ifndef GRAPHICSVIEW_H
|
||||||
#define GRAPHICSVIEW_H
|
#define GRAPHICSVIEW_H
|
||||||
|
|
||||||
#include <QtWidgets/QGraphicsView>
|
#include <QGraphicsView>
|
||||||
|
|
||||||
class MainWindow;
|
|
||||||
class GraphicsView: public QGraphicsView
|
class GraphicsView: public QGraphicsView
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
GraphicsView(QWidget *parent = nullptr);
|
using QGraphicsView::QGraphicsView;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void resizeEvent(QResizeEvent *event) override;
|
void resizeEvent(QResizeEvent *e) override;
|
||||||
void keyPressEvent(QKeyEvent *) override;
|
void keyPressEvent(QKeyEvent *e) override;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void keyPressed(int key);
|
void keyPressed(int key);
|
||||||
|
|
||||||
private:
|
|
||||||
MainWindow *m_editor;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -54,8 +54,15 @@
|
|||||||
#include "animation.h"
|
#include "animation.h"
|
||||||
#include "graphicsview.h"
|
#include "graphicsview.h"
|
||||||
|
|
||||||
#include <QtCore>
|
#include <QEventTransition>
|
||||||
#include <QtWidgets>
|
#include <QFile>
|
||||||
|
#include <QParallelAnimationGroup>
|
||||||
|
#include <QPropertyAnimation>
|
||||||
|
#include <QRandomGenerator>
|
||||||
|
#include <QSignalTransition>
|
||||||
|
#include <QState>
|
||||||
|
#include <QStateMachine>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
class KeyPressTransition: public QSignalTransition
|
class KeyPressTransition: public QSignalTransition
|
||||||
{
|
{
|
||||||
@ -107,7 +114,7 @@ LifeCycle::LifeCycle(StickMan *stickMan, GraphicsView *keyReceiver)
|
|||||||
// Create animation group to be used for all transitions
|
// Create animation group to be used for all transitions
|
||||||
m_animationGroup = new QParallelAnimationGroup();
|
m_animationGroup = new QParallelAnimationGroup();
|
||||||
const int stickManNodeCount = m_stickMan->nodeCount();
|
const int stickManNodeCount = m_stickMan->nodeCount();
|
||||||
for (int i=0; i<stickManNodeCount; ++i) {
|
for (int i = 0; i < stickManNodeCount; ++i) {
|
||||||
QPropertyAnimation *pa = new QPropertyAnimation(m_stickMan->node(i), "pos");
|
QPropertyAnimation *pa = new QPropertyAnimation(m_stickMan->node(i), "pos");
|
||||||
m_animationGroup->addAnimation(pa);
|
m_animationGroup->addAnimation(pa);
|
||||||
}
|
}
|
||||||
@ -175,7 +182,7 @@ void LifeCycle::addActivity(const QString &fileName, Qt::Key key, QObject *sende
|
|||||||
QState *state = makeState(m_alive, fileName);
|
QState *state = makeState(m_alive, fileName);
|
||||||
m_alive->addTransition(new KeyPressTransition(m_keyReceiver, key, state));
|
m_alive->addTransition(new KeyPressTransition(m_keyReceiver, key, state));
|
||||||
|
|
||||||
if (sender || signal)
|
if (sender && signal)
|
||||||
m_alive->addTransition(sender, signal, state);
|
m_alive->addTransition(sender, signal, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,13 +199,13 @@ QState *LifeCycle::makeState(QState *parentState, const QString &animationFileNa
|
|||||||
|
|
||||||
const int frameCount = animation.totalFrames();
|
const int frameCount = animation.totalFrames();
|
||||||
QState *previousState = nullptr;
|
QState *previousState = nullptr;
|
||||||
for (int i=0; i<frameCount; ++i) {
|
for (int i = 0; i < frameCount; ++i) {
|
||||||
animation.setCurrentFrame(i);
|
animation.setCurrentFrame(i);
|
||||||
|
|
||||||
//! [1]
|
//! [1]
|
||||||
QState *frameState = new QState(topLevel);
|
QState *frameState = new QState(topLevel);
|
||||||
const int nodeCount = animation.nodeCount();
|
const int nodeCount = animation.nodeCount();
|
||||||
for (int j=0; j<nodeCount; ++j)
|
for (int j = 0; j < nodeCount; ++j)
|
||||||
frameState->assignProperty(m_stickMan->node(j), "pos", animation.nodePos(j));
|
frameState->assignProperty(m_stickMan->node(j), "pos", animation.nodePos(j));
|
||||||
//! [1]
|
//! [1]
|
||||||
|
|
||||||
|
@ -53,16 +53,16 @@
|
|||||||
|
|
||||||
#include <Qt>
|
#include <Qt>
|
||||||
|
|
||||||
class StickMan;
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QStateMachine;
|
|
||||||
class QAnimationGroup;
|
|
||||||
class QState;
|
|
||||||
class QAbstractState;
|
class QAbstractState;
|
||||||
class QAbstractTransition;
|
class QAbstractTransition;
|
||||||
|
class QAnimationGroup;
|
||||||
class QObject;
|
class QObject;
|
||||||
|
class QState;
|
||||||
|
class QStateMachine;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
class GraphicsView;
|
class GraphicsView;
|
||||||
|
class StickMan;
|
||||||
class LifeCycle
|
class LifeCycle
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -70,7 +70,8 @@ public:
|
|||||||
~LifeCycle();
|
~LifeCycle();
|
||||||
|
|
||||||
void setDeathAnimation(const QString &fileName);
|
void setDeathAnimation(const QString &fileName);
|
||||||
void addActivity(const QString &fileName, Qt::Key key, QObject *sender = NULL, const char *signal = NULL);
|
void addActivity(const QString &fileName, Qt::Key key,
|
||||||
|
QObject *sender = nullptr, const char *signal = nullptr);
|
||||||
|
|
||||||
void start();
|
void start();
|
||||||
|
|
||||||
|
@ -51,13 +51,13 @@
|
|||||||
#ifndef NODE_H
|
#ifndef NODE_H
|
||||||
#define NODE_H
|
#define NODE_H
|
||||||
|
|
||||||
#include <QGraphicsItem>
|
#include <QGraphicsObject>
|
||||||
|
|
||||||
class Node: public QGraphicsObject
|
class Node: public QGraphicsObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit Node(const QPointF &pos, QGraphicsItem *parent = 0);
|
explicit Node(const QPointF &pos, QGraphicsItem *parent = nullptr);
|
||||||
~Node();
|
~Node();
|
||||||
|
|
||||||
QRectF boundingRect() const override;
|
QRectF boundingRect() const override;
|
||||||
|
@ -51,12 +51,7 @@
|
|||||||
#include "rectbutton.h"
|
#include "rectbutton.h"
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
|
||||||
RectButton::RectButton(QString buttonText) : m_ButtonText(buttonText)
|
RectButton::RectButton(const QString &buttonText) : m_ButtonText(buttonText)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
RectButton::~RectButton()
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,19 +57,19 @@ class RectButton : public QGraphicsObject
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
RectButton(QString buttonText);
|
RectButton(const QString &buttonText);
|
||||||
~RectButton();
|
|
||||||
|
|
||||||
QRectF boundingRect() const override;
|
QRectF boundingRect() const override;
|
||||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QString m_ButtonText;
|
|
||||||
|
|
||||||
void mousePressEvent (QGraphicsSceneMouseEvent *event) override;
|
void mousePressEvent (QGraphicsSceneMouseEvent *event) override;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void clicked();
|
void clicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_ButtonText;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RECTBUTTON_H
|
#endif // RECTBUTTON_H
|
||||||
|
@ -52,10 +52,9 @@
|
|||||||
#include "node.h"
|
#include "node.h"
|
||||||
|
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QTimer>
|
#include <QtMath>
|
||||||
#include <qmath.h>
|
|
||||||
|
|
||||||
static const qreal Coords[NodeCount * 2] = {
|
static constexpr qreal Coords[NodeCount * 2] = {
|
||||||
0.0, -150.0, // head, #0
|
0.0, -150.0, // head, #0
|
||||||
|
|
||||||
0.0, -100.0, // body pentagon, top->bottom, left->right, #1 - 5
|
0.0, -100.0, // body pentagon, top->bottom, left->right, #1 - 5
|
||||||
@ -81,7 +80,7 @@ static const qreal Coords[NodeCount * 2] = {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int Bones[BoneCount * 2] = {
|
static constexpr int Bones[BoneCount * 2] = {
|
||||||
0, 1, // neck
|
0, 1, // neck
|
||||||
|
|
||||||
1, 2, // body
|
1, 2, // body
|
||||||
@ -117,19 +116,13 @@ static const int Bones[BoneCount * 2] = {
|
|||||||
|
|
||||||
StickMan::StickMan()
|
StickMan::StickMan()
|
||||||
{
|
{
|
||||||
m_sticks = true;
|
|
||||||
m_isDead = false;
|
|
||||||
m_pixmap = QPixmap("images/head.png");
|
|
||||||
m_penColor = Qt::white;
|
|
||||||
m_fillColor = Qt::black;
|
|
||||||
|
|
||||||
// Set up start position of limbs
|
// Set up start position of limbs
|
||||||
for (int i=0; i<NodeCount; ++i) {
|
for (int i = 0; i < NodeCount; ++i) {
|
||||||
m_nodes[i] = new Node(QPointF(Coords[i * 2], Coords[i * 2 + 1]), this);
|
m_nodes[i] = new Node(QPointF(Coords[i * 2], Coords[i * 2 + 1]), this);
|
||||||
connect(m_nodes[i], &Node::positionChanged, this, &StickMan::childPositionChanged);
|
connect(m_nodes[i], &Node::positionChanged, this, &StickMan::childPositionChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i=0; i<BoneCount; ++i) {
|
for (int i = 0; i < BoneCount; ++i) {
|
||||||
int n1 = Bones[i * 2];
|
int n1 = Bones[i * 2];
|
||||||
int n2 = Bones[i * 2 + 1];
|
int n2 = Bones[i * 2 + 1];
|
||||||
|
|
||||||
@ -137,16 +130,12 @@ StickMan::StickMan()
|
|||||||
Node *node2 = m_nodes[n2];
|
Node *node2 = m_nodes[n2];
|
||||||
|
|
||||||
QPointF dist = node1->pos() - node2->pos();
|
QPointF dist = node1->pos() - node2->pos();
|
||||||
m_perfectBoneLengths[i] = sqrt(pow(dist.x(),2) + pow(dist.y(),2));
|
m_perfectBoneLengths[i] = sqrt(pow(dist.x(), 2) + pow(dist.y(), 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
startTimer(10);
|
startTimer(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
StickMan::~StickMan()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void StickMan::childPositionChanged()
|
void StickMan::childPositionChanged()
|
||||||
{
|
{
|
||||||
prepareGeometryChange();
|
prepareGeometryChange();
|
||||||
@ -155,7 +144,7 @@ void StickMan::childPositionChanged()
|
|||||||
void StickMan::setDrawSticks(bool on)
|
void StickMan::setDrawSticks(bool on)
|
||||||
{
|
{
|
||||||
m_sticks = on;
|
m_sticks = on;
|
||||||
for (int i=0;i<nodeCount();++i) {
|
for (int i = 0; i < nodeCount(); ++i) {
|
||||||
Node *node = m_nodes[i];
|
Node *node = m_nodes[i];
|
||||||
node->setVisible(on);
|
node->setVisible(on);
|
||||||
}
|
}
|
||||||
@ -188,7 +177,7 @@ void StickMan::stabilize()
|
|||||||
{
|
{
|
||||||
static const qreal threshold = 0.001;
|
static const qreal threshold = 0.001;
|
||||||
|
|
||||||
for (int i=0; i<BoneCount; ++i) {
|
for (int i = 0; i < BoneCount; ++i) {
|
||||||
int n1 = Bones[i * 2];
|
int n1 = Bones[i * 2];
|
||||||
int n2 = Bones[i * 2 + 1];
|
int n2 = Bones[i * 2 + 1];
|
||||||
|
|
||||||
@ -236,7 +225,7 @@ void StickMan::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidge
|
|||||||
stabilize();
|
stabilize();
|
||||||
if (m_sticks) {
|
if (m_sticks) {
|
||||||
painter->setPen(Qt::white);
|
painter->setPen(Qt::white);
|
||||||
for (int i=0; i<BoneCount; ++i) {
|
for (int i = 0; i < BoneCount; ++i) {
|
||||||
int n1 = Bones[i * 2];
|
int n1 = Bones[i * 2];
|
||||||
int n2 = Bones[i * 2 + 1];
|
int n2 = Bones[i * 2 + 1];
|
||||||
|
|
||||||
|
@ -57,8 +57,6 @@ static const int NodeCount = 16;
|
|||||||
static const int BoneCount = 24;
|
static const int BoneCount = 24;
|
||||||
|
|
||||||
class Node;
|
class Node;
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
class StickMan: public QGraphicsObject
|
class StickMan: public QGraphicsObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -67,7 +65,6 @@ class StickMan: public QGraphicsObject
|
|||||||
Q_PROPERTY(bool isDead WRITE setIsDead READ isDead)
|
Q_PROPERTY(bool isDead WRITE setIsDead READ isDead)
|
||||||
public:
|
public:
|
||||||
StickMan();
|
StickMan();
|
||||||
~StickMan();
|
|
||||||
|
|
||||||
QRectF boundingRect() const override;
|
QRectF boundingRect() const override;
|
||||||
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
|
||||||
@ -101,13 +98,11 @@ private:
|
|||||||
Node *m_nodes[NodeCount];
|
Node *m_nodes[NodeCount];
|
||||||
qreal m_perfectBoneLengths[BoneCount];
|
qreal m_perfectBoneLengths[BoneCount];
|
||||||
|
|
||||||
uint m_sticks : 1;
|
bool m_sticks = true;
|
||||||
uint m_isDead : 1;
|
bool m_isDead = false;
|
||||||
uint m_reserved : 30;
|
|
||||||
|
|
||||||
QPixmap m_pixmap;
|
QColor m_penColor = Qt::white;
|
||||||
QColor m_penColor;
|
QColor m_fillColor = Qt::black;
|
||||||
QColor m_fillColor;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // STICKMAN_H
|
#endif // STICKMAN_H
|
||||||
|
@ -51,22 +51,13 @@
|
|||||||
//Own
|
//Own
|
||||||
#include "animationmanager.h"
|
#include "animationmanager.h"
|
||||||
|
|
||||||
//Qt
|
#include <QAbstractAnimation>
|
||||||
#include <QtCore/QAbstractAnimation>
|
|
||||||
#include <QtCore/QDebug>
|
|
||||||
|
|
||||||
// the universe's only animation manager
|
|
||||||
AnimationManager *AnimationManager::instance = nullptr;
|
|
||||||
|
|
||||||
AnimationManager::AnimationManager()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
AnimationManager *AnimationManager::self()
|
AnimationManager *AnimationManager::self()
|
||||||
{
|
{
|
||||||
if (!instance)
|
// the universe's only animation manager
|
||||||
instance = new AnimationManager;
|
static AnimationManager s_instance;
|
||||||
return instance;
|
return &s_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimationManager::registerAnimation(QAbstractAnimation *anim)
|
void AnimationManager::registerAnimation(QAbstractAnimation *anim)
|
||||||
|
@ -51,7 +51,7 @@
|
|||||||
#ifndef ANIMATIONMANAGER_H
|
#ifndef ANIMATIONMANAGER_H
|
||||||
#define ANIMATIONMANAGER_H
|
#define ANIMATIONMANAGER_H
|
||||||
|
|
||||||
#include <QtCore/QObject>
|
#include <QObject>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QAbstractAnimation;
|
class QAbstractAnimation;
|
||||||
@ -59,9 +59,10 @@ QT_END_NAMESPACE
|
|||||||
|
|
||||||
class AnimationManager : public QObject
|
class AnimationManager : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
AnimationManager() = default;
|
||||||
|
~AnimationManager() = default;
|
||||||
public:
|
public:
|
||||||
AnimationManager();
|
|
||||||
void registerAnimation(QAbstractAnimation *anim);
|
void registerAnimation(QAbstractAnimation *anim);
|
||||||
void unregisterAnimation(QAbstractAnimation *anim);
|
void unregisterAnimation(QAbstractAnimation *anim);
|
||||||
void unregisterAllAnimations();
|
void unregisterAllAnimations();
|
||||||
@ -75,8 +76,7 @@ private slots:
|
|||||||
void unregisterAnimation_helper(QObject *obj);
|
void unregisterAnimation_helper(QObject *obj);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static AnimationManager *instance;
|
QVector<QAbstractAnimation *> animations;
|
||||||
QList<QAbstractAnimation *> animations;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ANIMATIONMANAGER_H
|
#endif // ANIMATIONMANAGER_H
|
||||||
|
@ -52,18 +52,17 @@
|
|||||||
#include "boat.h"
|
#include "boat.h"
|
||||||
#include "boat_p.h"
|
#include "boat_p.h"
|
||||||
#include "bomb.h"
|
#include "bomb.h"
|
||||||
#include "pixmapitem.h"
|
|
||||||
#include "graphicsscene.h"
|
#include "graphicsscene.h"
|
||||||
#include "animationmanager.h"
|
#include "animationmanager.h"
|
||||||
#include "qanimationstate.h"
|
#include "qanimationstate.h"
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtCore/QPropertyAnimation>
|
#include <QFinalState>
|
||||||
#include <QtCore/QStateMachine>
|
#include <QHistoryState>
|
||||||
#include <QtCore/QHistoryState>
|
#include <QPropertyAnimation>
|
||||||
#include <QtCore/QFinalState>
|
#include <QSequentialAnimationGroup>
|
||||||
#include <QtCore/QState>
|
#include <QState>
|
||||||
#include <QtCore/QSequentialAnimationGroup>
|
#include <QStateMachine>
|
||||||
|
|
||||||
static QAbstractAnimation *setupDestroyAnimation(Boat *boat)
|
static QAbstractAnimation *setupDestroyAnimation(Boat *boat)
|
||||||
{
|
{
|
||||||
@ -181,7 +180,7 @@ Boat::Boat()
|
|||||||
launchStateLeft->addTransition(historyState);
|
launchStateLeft->addTransition(historyState);
|
||||||
launchStateRight->addTransition(historyState);
|
launchStateRight->addTransition(historyState);
|
||||||
|
|
||||||
QFinalState *final = new QFinalState(machine);
|
QFinalState *finalState = new QFinalState(machine);
|
||||||
|
|
||||||
//This state play the destroyed animation
|
//This state play the destroyed animation
|
||||||
QAnimationState *destroyedState = new QAnimationState(machine);
|
QAnimationState *destroyedState = new QAnimationState(machine);
|
||||||
@ -191,10 +190,10 @@ Boat::Boat()
|
|||||||
moving->addTransition(this, &Boat::boatDestroyed, destroyedState);
|
moving->addTransition(this, &Boat::boatDestroyed, destroyedState);
|
||||||
|
|
||||||
//Transition to final state when the destroyed animation is finished
|
//Transition to final state when the destroyed animation is finished
|
||||||
destroyedState->addTransition(destroyedState, &QAnimationState::animationFinished, final);
|
destroyedState->addTransition(destroyedState, &QAnimationState::animationFinished, finalState);
|
||||||
|
|
||||||
//The machine has finished to be executed, then the boat is dead
|
//The machine has finished to be executed, then the boat is dead
|
||||||
connect(machine,&QState::finished, this, &Boat::boatExecutionFinished);
|
connect(machine, &QState::finished, this, &Boat::boatExecutionFinished);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,12 +48,11 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef __BOAT__H__
|
#ifndef BOAT_H
|
||||||
#define __BOAT__H__
|
#define BOAT_H
|
||||||
|
|
||||||
#include "pixmapitem.h"
|
#include "pixmapitem.h"
|
||||||
|
|
||||||
class Bomb;
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QVariantAnimation;
|
class QVariantAnimation;
|
||||||
class QAbstractAnimation;
|
class QAbstractAnimation;
|
||||||
@ -101,4 +100,4 @@ private:
|
|||||||
QStateMachine *machine;
|
QStateMachine *machine;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__BOAT__H__
|
#endif // BOAT_H
|
||||||
|
@ -67,7 +67,9 @@
|
|||||||
#include "graphicsscene.h"
|
#include "graphicsscene.h"
|
||||||
|
|
||||||
// Qt
|
// Qt
|
||||||
#include <QtWidgets/QKeyEventTransition>
|
#include <QGraphicsRotation>
|
||||||
|
#include <QKeyEventTransition>
|
||||||
|
#include <QState>
|
||||||
|
|
||||||
static const int MAX_BOMB = 5;
|
static const int MAX_BOMB = 5;
|
||||||
|
|
||||||
@ -88,7 +90,7 @@ protected:
|
|||||||
return (boat->currentSpeed() == 1);
|
return (boat->currentSpeed() == 1);
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Boat * boat;
|
Boat *boat;
|
||||||
};
|
};
|
||||||
|
|
||||||
//These transtion test if we have to move the boat (i.e current speed was 0 or another value)
|
//These transtion test if we have to move the boat (i.e current speed was 0 or another value)
|
||||||
@ -118,7 +120,7 @@ protected:
|
|||||||
boat->updateBoatMovement();
|
boat->updateBoatMovement();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Boat * boat;
|
Boat *boat;
|
||||||
int key;
|
int key;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -139,7 +141,7 @@ protected:
|
|||||||
return (boat->bombsLaunched() < MAX_BOMB);
|
return (boat->bombsLaunched() < MAX_BOMB);
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Boat * boat;
|
Boat *boat;
|
||||||
};
|
};
|
||||||
|
|
||||||
//This state is describing when the boat is moving right
|
//This state is describing when the boat is moving right
|
||||||
@ -157,7 +159,7 @@ protected:
|
|||||||
boat->updateBoatMovement();
|
boat->updateBoatMovement();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Boat * boat;
|
Boat *boat;
|
||||||
};
|
};
|
||||||
|
|
||||||
//This state is describing when the boat is moving left
|
//This state is describing when the boat is moving left
|
||||||
@ -175,7 +177,7 @@ protected:
|
|||||||
boat->updateBoatMovement();
|
boat->updateBoatMovement();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Boat * boat;
|
Boat *boat;
|
||||||
};
|
};
|
||||||
|
|
||||||
//This state is describing when the boat is in a stand by position
|
//This state is describing when the boat is in a stand by position
|
||||||
@ -194,7 +196,7 @@ protected:
|
|||||||
boat->updateBoatMovement();
|
boat->updateBoatMovement();
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Boat * boat;
|
Boat *boat;
|
||||||
};
|
};
|
||||||
|
|
||||||
//This state is describing the launch of the torpedo on the right
|
//This state is describing the launch of the torpedo on the right
|
||||||
@ -216,7 +218,7 @@ protected:
|
|||||||
boat->setBombsLaunched(boat->bombsLaunched() + 1);
|
boat->setBombsLaunched(boat->bombsLaunched() + 1);
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Boat * boat;
|
Boat *boat;
|
||||||
};
|
};
|
||||||
|
|
||||||
//This state is describing the launch of the torpedo on the left
|
//This state is describing the launch of the torpedo on the left
|
||||||
@ -238,7 +240,7 @@ protected:
|
|||||||
boat->setBombsLaunched(boat->bombsLaunched() + 1);
|
boat->setBombsLaunched(boat->bombsLaunched() + 1);
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Boat * boat;
|
Boat *boat;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BOAT_P_H
|
#endif // BOAT_P_H
|
||||||
|
@ -51,15 +51,14 @@
|
|||||||
//Own
|
//Own
|
||||||
#include "bomb.h"
|
#include "bomb.h"
|
||||||
#include "submarine.h"
|
#include "submarine.h"
|
||||||
#include "pixmapitem.h"
|
|
||||||
#include "animationmanager.h"
|
#include "animationmanager.h"
|
||||||
#include "qanimationstate.h"
|
#include "qanimationstate.h"
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtCore/QSequentialAnimationGroup>
|
#include <QFinalState>
|
||||||
#include <QtCore/QPropertyAnimation>
|
#include <QPropertyAnimation>
|
||||||
#include <QtCore/QStateMachine>
|
#include <QSequentialAnimationGroup>
|
||||||
#include <QtCore/QFinalState>
|
#include <QStateMachine>
|
||||||
|
|
||||||
Bomb::Bomb() : PixmapItem(QString("bomb"), GraphicsScene::Big)
|
Bomb::Bomb() : PixmapItem(QString("bomb"), GraphicsScene::Big)
|
||||||
{
|
{
|
||||||
@ -83,7 +82,7 @@ void Bomb::launch(Bomb::Direction direction)
|
|||||||
anim->setEndValue(QPointF(x() + delta*2,scene()->height()));
|
anim->setEndValue(QPointF(x() + delta*2,scene()->height()));
|
||||||
anim->setDuration(y()/2*60);
|
anim->setDuration(y()/2*60);
|
||||||
launchAnimation->addAnimation(anim);
|
launchAnimation->addAnimation(anim);
|
||||||
connect(anim,&QVariantAnimation::valueChanged,this,&Bomb::onAnimationLaunchValueChanged);
|
connect(anim, &QVariantAnimation::valueChanged, this, &Bomb::onAnimationLaunchValueChanged);
|
||||||
connect(this, &Bomb::bombExploded, launchAnimation, &QAbstractAnimation::stop);
|
connect(this, &Bomb::bombExploded, launchAnimation, &QAbstractAnimation::stop);
|
||||||
//We setup the state machine of the bomb
|
//We setup the state machine of the bomb
|
||||||
QStateMachine *machine = new QStateMachine(this);
|
QStateMachine *machine = new QStateMachine(this);
|
||||||
@ -93,18 +92,18 @@ void Bomb::launch(Bomb::Direction direction)
|
|||||||
launched->setAnimation(launchAnimation);
|
launched->setAnimation(launchAnimation);
|
||||||
|
|
||||||
//End
|
//End
|
||||||
QFinalState *final = new QFinalState(machine);
|
QFinalState *finalState = new QFinalState(machine);
|
||||||
|
|
||||||
machine->setInitialState(launched);
|
machine->setInitialState(launched);
|
||||||
|
|
||||||
//### Add a nice animation when the bomb is destroyed
|
//### Add a nice animation when the bomb is destroyed
|
||||||
launched->addTransition(this, &Bomb::bombExploded,final);
|
launched->addTransition(this, &Bomb::bombExploded, finalState);
|
||||||
|
|
||||||
//If the animation is finished, then we move to the final state
|
//If the animation is finished, then we move to the final state
|
||||||
launched->addTransition(launched, &QAnimationState::animationFinished, final);
|
launched->addTransition(launched, &QAnimationState::animationFinished, finalState);
|
||||||
|
|
||||||
//The machine has finished to be executed, then the boat is dead
|
//The machine has finished to be executed, then the boat is dead
|
||||||
connect(machine,&QState::finished,this, &Bomb::bombExecutionFinished);
|
connect(machine,&QState::finished, this, &Bomb::bombExecutionFinished);
|
||||||
|
|
||||||
machine->start();
|
machine->start();
|
||||||
|
|
||||||
|
@ -48,8 +48,8 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef __BOMB__H__
|
#ifndef BOMB_H
|
||||||
#define __BOMB__H__
|
#define BOMB_H
|
||||||
|
|
||||||
#include "pixmapitem.h"
|
#include "pixmapitem.h"
|
||||||
|
|
||||||
@ -73,4 +73,4 @@ private slots:
|
|||||||
void onAnimationLaunchValueChanged(const QVariant &);
|
void onAnimationLaunchValueChanged(const QVariant &);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__BOMB__H__
|
#endif // BOMB_H
|
||||||
|
@ -55,38 +55,33 @@
|
|||||||
#include "submarine.h"
|
#include "submarine.h"
|
||||||
#include "torpedo.h"
|
#include "torpedo.h"
|
||||||
#include "bomb.h"
|
#include "bomb.h"
|
||||||
#include "pixmapitem.h"
|
|
||||||
#include "animationmanager.h"
|
#include "animationmanager.h"
|
||||||
#include "qanimationstate.h"
|
#include "qanimationstate.h"
|
||||||
#include "progressitem.h"
|
#include "progressitem.h"
|
||||||
#include "textinformationitem.h"
|
#include "textinformationitem.h"
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtCore/QPropertyAnimation>
|
#include <QAction>
|
||||||
#include <QtCore/QSequentialAnimationGroup>
|
#include <QApplication>
|
||||||
#include <QtCore/QParallelAnimationGroup>
|
#include <QFile>
|
||||||
#include <QtCore/QStateMachine>
|
#include <QFinalState>
|
||||||
#include <QtCore/QFinalState>
|
#include <QParallelAnimationGroup>
|
||||||
#include <QtCore/QPauseAnimation>
|
#include <QPropertyAnimation>
|
||||||
#include <QtWidgets/QAction>
|
#include <QSequentialAnimationGroup>
|
||||||
#include <QtCore/QDir>
|
#include <QStateMachine>
|
||||||
#include <QtWidgets/QApplication>
|
#include <QXmlStreamReader>
|
||||||
#include <QtWidgets/QMessageBox>
|
|
||||||
#include <QtWidgets/QGraphicsView>
|
|
||||||
#include <QtWidgets/QGraphicsSceneMouseEvent>
|
|
||||||
#include <QtCore/QXmlStreamReader>
|
|
||||||
|
|
||||||
GraphicsScene::GraphicsScene(int x, int y, int width, int height, Mode mode)
|
GraphicsScene::GraphicsScene(int x, int y, int width, int height, Mode mode, QObject *parent)
|
||||||
: QGraphicsScene(x , y, width, height), mode(mode), boat(new Boat)
|
: QGraphicsScene(x, y, width, height, parent), mode(mode), boat(new Boat)
|
||||||
{
|
{
|
||||||
PixmapItem *backgroundItem = new PixmapItem(QString("background"),mode);
|
PixmapItem *backgroundItem = new PixmapItem(QStringLiteral("background"), mode);
|
||||||
backgroundItem->setZValue(1);
|
backgroundItem->setZValue(1);
|
||||||
backgroundItem->setPos(0,0);
|
backgroundItem->setPos(0,0);
|
||||||
addItem(backgroundItem);
|
addItem(backgroundItem);
|
||||||
|
|
||||||
PixmapItem *surfaceItem = new PixmapItem(QString("surface"),mode);
|
PixmapItem *surfaceItem = new PixmapItem(QStringLiteral("surface"), mode);
|
||||||
surfaceItem->setZValue(3);
|
surfaceItem->setZValue(3);
|
||||||
surfaceItem->setPos(0,sealLevel() - surfaceItem->boundingRect().height()/2);
|
surfaceItem->setPos(0, sealLevel() - surfaceItem->boundingRect().height() / 2);
|
||||||
addItem(surfaceItem);
|
addItem(surfaceItem);
|
||||||
|
|
||||||
//The item that display score and level
|
//The item that display score and level
|
||||||
@ -137,8 +132,8 @@ qreal GraphicsScene::sealLevel() const
|
|||||||
|
|
||||||
void GraphicsScene::setupScene(QAction *newAction, QAction *quitAction)
|
void GraphicsScene::setupScene(QAction *newAction, QAction *quitAction)
|
||||||
{
|
{
|
||||||
static const int nLetters = 10;
|
static constexpr int nLetters = 10;
|
||||||
static struct {
|
static constexpr struct {
|
||||||
char const *pix;
|
char const *pix;
|
||||||
qreal initX, initY;
|
qreal initX, initY;
|
||||||
qreal destX, destY;
|
qreal destX, destY;
|
||||||
@ -154,8 +149,8 @@ void GraphicsScene::setupScene(QAction *newAction, QAction *quitAction)
|
|||||||
{"q", 200, 2000, 510, 250 },
|
{"q", 200, 2000, 510, 250 },
|
||||||
{"excl", 0, 2000, 570, 220 } };
|
{"excl", 0, 2000, 570, 220 } };
|
||||||
|
|
||||||
QSequentialAnimationGroup * lettersGroupMoving = new QSequentialAnimationGroup(this);
|
QSequentialAnimationGroup *lettersGroupMoving = new QSequentialAnimationGroup(this);
|
||||||
QParallelAnimationGroup * lettersGroupFading = new QParallelAnimationGroup(this);
|
QParallelAnimationGroup *lettersGroupFading = new QParallelAnimationGroup(this);
|
||||||
|
|
||||||
for (int i = 0; i < nLetters; ++i) {
|
for (int i = 0; i < nLetters; ++i) {
|
||||||
PixmapItem *logo = new PixmapItem(QLatin1String(":/logo-") + logoData[i].pix, this);
|
PixmapItem *logo = new PixmapItem(QLatin1String(":/logo-") + logoData[i].pix, this);
|
||||||
@ -180,7 +175,7 @@ void GraphicsScene::setupScene(QAction *newAction, QAction *quitAction)
|
|||||||
PlayState *gameState = new PlayState(this, machine);
|
PlayState *gameState = new PlayState(this, machine);
|
||||||
|
|
||||||
//Final state
|
//Final state
|
||||||
QFinalState *final = new QFinalState(machine);
|
QFinalState *finalState = new QFinalState(machine);
|
||||||
|
|
||||||
//Animation when the player enter in the game
|
//Animation when the player enter in the game
|
||||||
QAnimationState *lettersMovingState = new QAnimationState(machine);
|
QAnimationState *lettersMovingState = new QAnimationState(machine);
|
||||||
@ -198,8 +193,8 @@ void GraphicsScene::setupScene(QAction *newAction, QAction *quitAction)
|
|||||||
gameState->addTransition(newAction, &QAction::triggered, gameState);
|
gameState->addTransition(newAction, &QAction::triggered, gameState);
|
||||||
|
|
||||||
//Wanna quit, then connect to CTRL+Q
|
//Wanna quit, then connect to CTRL+Q
|
||||||
gameState->addTransition(quitAction, &QAction::triggered, final);
|
gameState->addTransition(quitAction, &QAction::triggered, finalState);
|
||||||
lettersMovingState->addTransition(quitAction, &QAction::triggered, final);
|
lettersMovingState->addTransition(quitAction, &QAction::triggered, finalState);
|
||||||
|
|
||||||
//Welcome screen is the initial state
|
//Welcome screen is the initial state
|
||||||
machine->setInitialState(lettersMovingState);
|
machine->setInitialState(lettersMovingState);
|
||||||
@ -213,21 +208,24 @@ void GraphicsScene::setupScene(QAction *newAction, QAction *quitAction)
|
|||||||
void GraphicsScene::addItem(Bomb *bomb)
|
void GraphicsScene::addItem(Bomb *bomb)
|
||||||
{
|
{
|
||||||
bombs.insert(bomb);
|
bombs.insert(bomb);
|
||||||
connect(bomb,&Bomb::bombExecutionFinished,this, &GraphicsScene::onBombExecutionFinished);
|
connect(bomb, &Bomb::bombExecutionFinished,
|
||||||
|
this, &GraphicsScene::onBombExecutionFinished);
|
||||||
QGraphicsScene::addItem(bomb);
|
QGraphicsScene::addItem(bomb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsScene::addItem(Torpedo *torpedo)
|
void GraphicsScene::addItem(Torpedo *torpedo)
|
||||||
{
|
{
|
||||||
torpedos.insert(torpedo);
|
torpedos.insert(torpedo);
|
||||||
connect(torpedo,&Torpedo::torpedoExecutionFinished,this, &GraphicsScene::onTorpedoExecutionFinished);
|
connect(torpedo, &Torpedo::torpedoExecutionFinished,
|
||||||
|
this, &GraphicsScene::onTorpedoExecutionFinished);
|
||||||
QGraphicsScene::addItem(torpedo);
|
QGraphicsScene::addItem(torpedo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsScene::addItem(SubMarine *submarine)
|
void GraphicsScene::addItem(SubMarine *submarine)
|
||||||
{
|
{
|
||||||
submarines.insert(submarine);
|
submarines.insert(submarine);
|
||||||
connect(submarine,&SubMarine::subMarineExecutionFinished,this, &GraphicsScene::onSubMarineExecutionFinished);
|
connect(submarine, &SubMarine::subMarineExecutionFinished,
|
||||||
|
this, &GraphicsScene::onSubMarineExecutionFinished);
|
||||||
QGraphicsScene::addItem(submarine);
|
QGraphicsScene::addItem(submarine);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,15 +237,18 @@ void GraphicsScene::addItem(QGraphicsItem *item)
|
|||||||
void GraphicsScene::onBombExecutionFinished()
|
void GraphicsScene::onBombExecutionFinished()
|
||||||
{
|
{
|
||||||
Bomb *bomb = qobject_cast<Bomb *>(sender());
|
Bomb *bomb = qobject_cast<Bomb *>(sender());
|
||||||
|
if (!bomb)
|
||||||
|
return;
|
||||||
bombs.remove(bomb);
|
bombs.remove(bomb);
|
||||||
bomb->deleteLater();
|
bomb->deleteLater();
|
||||||
if (boat)
|
boat->setBombsLaunched(boat->bombsLaunched() - 1);
|
||||||
boat->setBombsLaunched(boat->bombsLaunched() - 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GraphicsScene::onTorpedoExecutionFinished()
|
void GraphicsScene::onTorpedoExecutionFinished()
|
||||||
{
|
{
|
||||||
Torpedo *torpedo = qobject_cast<Torpedo *>(sender());
|
Torpedo *torpedo = qobject_cast<Torpedo *>(sender());
|
||||||
|
if (!torpedo)
|
||||||
|
return;
|
||||||
torpedos.remove(torpedo);
|
torpedos.remove(torpedo);
|
||||||
torpedo->deleteLater();
|
torpedo->deleteLater();
|
||||||
}
|
}
|
||||||
@ -255,6 +256,8 @@ void GraphicsScene::onTorpedoExecutionFinished()
|
|||||||
void GraphicsScene::onSubMarineExecutionFinished()
|
void GraphicsScene::onSubMarineExecutionFinished()
|
||||||
{
|
{
|
||||||
SubMarine *submarine = qobject_cast<SubMarine *>(sender());
|
SubMarine *submarine = qobject_cast<SubMarine *>(sender());
|
||||||
|
if (!submarine)
|
||||||
|
return;
|
||||||
submarines.remove(submarine);
|
submarines.remove(submarine);
|
||||||
if (submarines.count() == 0)
|
if (submarines.count() == 0)
|
||||||
emit allSubMarineDestroyed(submarine->points());
|
emit allSubMarineDestroyed(submarine->points());
|
||||||
@ -266,16 +269,22 @@ void GraphicsScene::onSubMarineExecutionFinished()
|
|||||||
void GraphicsScene::clearScene()
|
void GraphicsScene::clearScene()
|
||||||
{
|
{
|
||||||
for (SubMarine *sub : qAsConst(submarines)) {
|
for (SubMarine *sub : qAsConst(submarines)) {
|
||||||
|
// make sure to not go into onSubMarineExecutionFinished
|
||||||
|
sub->disconnect(this);
|
||||||
sub->destroy();
|
sub->destroy();
|
||||||
sub->deleteLater();
|
sub->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Torpedo *torpedo : qAsConst(torpedos)) {
|
for (Torpedo *torpedo : qAsConst(torpedos)) {
|
||||||
|
// make sure to not go into onTorpedoExecutionFinished
|
||||||
|
torpedo->disconnect(this);
|
||||||
torpedo->destroy();
|
torpedo->destroy();
|
||||||
torpedo->deleteLater();
|
torpedo->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Bomb *bomb : qAsConst(bombs)) {
|
for (Bomb *bomb : qAsConst(bombs)) {
|
||||||
|
// make sure to not go into onBombExecutionFinished
|
||||||
|
bomb->disconnect(this);
|
||||||
bomb->destroy();
|
bomb->destroy();
|
||||||
bomb->deleteLater();
|
bomb->deleteLater();
|
||||||
}
|
}
|
||||||
|
@ -48,13 +48,12 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef __GRAPHICSSCENE__H__
|
#ifndef GRAPHICSSCENE_H
|
||||||
#define __GRAPHICSSCENE__H__
|
#define GRAPHICSSCENE_H
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtWidgets/QGraphicsScene>
|
#include <QGraphicsScene>
|
||||||
#include <QtCore/QSet>
|
#include <QSet>
|
||||||
#include <QtCore/QState>
|
|
||||||
|
|
||||||
|
|
||||||
class Boat;
|
class Boat;
|
||||||
@ -78,18 +77,18 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct SubmarineDescription {
|
struct SubmarineDescription {
|
||||||
int type;
|
int type = 0;
|
||||||
int points;
|
int points = 0;
|
||||||
QString name;
|
QString name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LevelDescription {
|
struct LevelDescription {
|
||||||
int id;
|
int id = 0;
|
||||||
QString name;
|
QString name;
|
||||||
QList<QPair<int,int> > submarines;
|
QVector<QPair<int, int>> submarines;
|
||||||
};
|
};
|
||||||
|
|
||||||
GraphicsScene(int x, int y, int width, int height, Mode mode = Big);
|
GraphicsScene(int x, int y, int width, int height, Mode mode, QObject *parent = nullptr);
|
||||||
qreal sealLevel() const;
|
qreal sealLevel() const;
|
||||||
void setupScene(QAction *newAction, QAction *quitAction);
|
void setupScene(QAction *newAction, QAction *quitAction);
|
||||||
void addItem(Bomb *bomb);
|
void addItem(Bomb *bomb);
|
||||||
@ -127,5 +126,5 @@ private:
|
|||||||
friend class UpdateScoreTransition;
|
friend class UpdateScoreTransition;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__GRAPHICSSCENE__H__
|
#endif // GRAPHICSSCENE_H
|
||||||
|
|
||||||
|
@ -56,11 +56,10 @@
|
|||||||
#include <QGraphicsView>
|
#include <QGraphicsView>
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QMenuBar>
|
|
||||||
#include <QLayout>
|
#include <QLayout>
|
||||||
|
|
||||||
#ifndef QT_NO_OPENGL
|
#ifndef QT_NO_OPENGL
|
||||||
# include <QtOpenGL/QtOpenGL>
|
# include <QtOpenGL>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent)
|
MainWindow::MainWindow(QWidget *parent)
|
||||||
@ -74,10 +73,10 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
quitAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q));
|
quitAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_Q));
|
||||||
|
|
||||||
if (QApplication::arguments().contains("-fullscreen")) {
|
if (QApplication::arguments().contains("-fullscreen")) {
|
||||||
scene = new GraphicsScene(0, 0, 750, 400, GraphicsScene::Small);
|
scene = new GraphicsScene(0, 0, 750, 400, GraphicsScene::Small, this);
|
||||||
setWindowState(Qt::WindowFullScreen);
|
setWindowState(Qt::WindowFullScreen);
|
||||||
} else {
|
} else {
|
||||||
scene = new GraphicsScene(0, 0, 880, 630);
|
scene = new GraphicsScene(0, 0, 880, 630, GraphicsScene::Big, this);
|
||||||
layout()->setSizeConstraint(QLayout::SetFixedSize);
|
layout()->setSizeConstraint(QLayout::SetFixedSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,11 +48,11 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef __MAINWINDOW__H__
|
#ifndef MAINWINDOW_H
|
||||||
#define __MAINWINDOW__H__
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtWidgets/QMainWindow>
|
#include <QMainWindow>
|
||||||
class GraphicsScene;
|
class GraphicsScene;
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QGraphicsView;
|
class QGraphicsView;
|
||||||
@ -69,4 +69,4 @@ private:
|
|||||||
QGraphicsView *view;
|
QGraphicsView *view;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__MAINWINDOW__H__
|
#endif // MAINWINDOW_H
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
//Qt
|
//Qt
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
|
|
||||||
PixmapItem::PixmapItem(const QString &fileName,GraphicsScene::Mode mode, QGraphicsItem * parent)
|
PixmapItem::PixmapItem(const QString &fileName, GraphicsScene::Mode mode, QGraphicsItem *parent)
|
||||||
: QGraphicsObject(parent)
|
: QGraphicsObject(parent)
|
||||||
{
|
{
|
||||||
if (mode == GraphicsScene::Big)
|
if (mode == GraphicsScene::Big)
|
||||||
@ -63,7 +63,8 @@ PixmapItem::PixmapItem(const QString &fileName,GraphicsScene::Mode mode, QGraphi
|
|||||||
pix = QPixmap(QStringLiteral(":/small/") + fileName);
|
pix = QPixmap(QStringLiteral(":/small/") + fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
PixmapItem::PixmapItem(const QString &fileName, QGraphicsScene *scene) : QGraphicsObject(), pix(fileName)
|
PixmapItem::PixmapItem(const QString &fileName, QGraphicsScene *scene)
|
||||||
|
: QGraphicsObject(), pix(fileName)
|
||||||
{
|
{
|
||||||
scene->addItem(this);
|
scene->addItem(this);
|
||||||
}
|
}
|
||||||
|
@ -48,14 +48,14 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef __PIXMAPITEM__H__
|
#ifndef PIXMAPITEM_H
|
||||||
#define __PIXMAPITEM__H__
|
#define PIXMAPITEM_H
|
||||||
|
|
||||||
//Own
|
//Own
|
||||||
#include "graphicsscene.h"
|
#include "graphicsscene.h"
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtWidgets/QGraphicsObject>
|
#include <QGraphicsObject>
|
||||||
|
|
||||||
class PixmapItem : public QGraphicsObject
|
class PixmapItem : public QGraphicsObject
|
||||||
{
|
{
|
||||||
@ -69,4 +69,4 @@ private:
|
|||||||
QPixmap pix;
|
QPixmap pix;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__PIXMAPITEM__H__
|
#endif // PIXMAPITEM_H
|
||||||
|
@ -49,10 +49,11 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include "progressitem.h"
|
#include "progressitem.h"
|
||||||
#include "pixmapitem.h"
|
|
||||||
|
|
||||||
ProgressItem::ProgressItem (QGraphicsItem * parent)
|
#include <QFont>
|
||||||
: QGraphicsTextItem(parent), currentLevel(1), currentScore(0)
|
|
||||||
|
ProgressItem::ProgressItem(QGraphicsItem *parent)
|
||||||
|
: QGraphicsTextItem(parent)
|
||||||
{
|
{
|
||||||
setFont(QFont("Comic Sans MS"));
|
setFont(QFont("Comic Sans MS"));
|
||||||
setPos(parentItem()->boundingRect().topRight() - QPointF(180, -5));
|
setPos(parentItem()->boundingRect().topRight() - QPointF(180, -5));
|
||||||
|
@ -52,19 +52,19 @@
|
|||||||
#define PROGRESSITEM_H
|
#define PROGRESSITEM_H
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtWidgets/QGraphicsTextItem>
|
#include <QGraphicsTextItem>
|
||||||
|
|
||||||
class ProgressItem : public QGraphicsTextItem
|
class ProgressItem : public QGraphicsTextItem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ProgressItem(QGraphicsItem * parent = 0);
|
ProgressItem(QGraphicsItem *parent = nullptr);
|
||||||
void setLevel(int level);
|
void setLevel(int level);
|
||||||
void setScore(int score);
|
void setScore(int score);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateProgress();
|
void updateProgress();
|
||||||
int currentLevel;
|
int currentLevel = 1;
|
||||||
int currentScore;
|
int currentScore = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PROGRESSITEM_H
|
#endif // PROGRESSITEM_H
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
#include "qanimationstate.h"
|
#include "qanimationstate.h"
|
||||||
|
|
||||||
#include <QtCore/qstate.h>
|
#include <QAbstractAnimation>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ void QAnimationState::setAnimation(QAbstractAnimation *animation)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
//Disconnect from the previous animation if exist
|
//Disconnect from the previous animation if exist
|
||||||
if(m_animation)
|
if (m_animation)
|
||||||
disconnect(m_animation, &QAbstractAnimation::finished, this, &QAnimationState::animationFinished);
|
disconnect(m_animation, &QAbstractAnimation::finished, this, &QAnimationState::animationFinished);
|
||||||
|
|
||||||
m_animation = animation;
|
m_animation = animation;
|
||||||
|
@ -51,13 +51,7 @@
|
|||||||
#ifndef QANIMATIONSTATE_H
|
#ifndef QANIMATIONSTATE_H
|
||||||
#define QANIMATIONSTATE_H
|
#define QANIMATIONSTATE_H
|
||||||
|
|
||||||
#ifndef QT_STATEMACHINE_SOLUTION
|
#include <QState>
|
||||||
# include <QtCore/qstate.h>
|
|
||||||
# include <QtCore/qabstractanimation.h>
|
|
||||||
#else
|
|
||||||
# include "qstate.h"
|
|
||||||
# include "qabstractanimation.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
@ -67,7 +61,7 @@ class QAnimationState : public QState
|
|||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
QAnimationState(QState *parent = 0);
|
QAnimationState(QState *parent = nullptr);
|
||||||
~QAnimationState();
|
~QAnimationState();
|
||||||
|
|
||||||
void setAnimation(QAbstractAnimation *animation);
|
void setAnimation(QAbstractAnimation *animation);
|
||||||
|
@ -59,12 +59,12 @@
|
|||||||
#include "textinformationitem.h"
|
#include "textinformationitem.h"
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtWidgets/QMessageBox>
|
#include <QFinalState>
|
||||||
#include <QtWidgets/QGraphicsView>
|
#include <QGraphicsView>
|
||||||
#include <QtCore/QStateMachine>
|
#include <QKeyEventTransition>
|
||||||
#include <QtWidgets/QKeyEventTransition>
|
#include <QMessageBox>
|
||||||
#include <QtCore/QFinalState>
|
#include <QRandomGenerator>
|
||||||
#include <QtCore/QRandomGenerator>
|
#include <QStateMachine>
|
||||||
|
|
||||||
PlayState::PlayState(GraphicsScene *scene, QState *parent)
|
PlayState::PlayState(GraphicsScene *scene, QState *parent)
|
||||||
: QState(parent), scene(scene), machine(nullptr),
|
: QState(parent), scene(scene), machine(nullptr),
|
||||||
@ -146,7 +146,7 @@ void PlayState::onEntry(QEvent *)
|
|||||||
machine->setInitialState(levelState);
|
machine->setInitialState(levelState);
|
||||||
|
|
||||||
//Final state
|
//Final state
|
||||||
QFinalState *final = new QFinalState(machine);
|
QFinalState *finalState = new QFinalState(machine);
|
||||||
|
|
||||||
//This transition is triggered when the player press space after completing a level
|
//This transition is triggered when the player press space after completing a level
|
||||||
CustomSpaceTransition *spaceTransition = new CustomSpaceTransition(scene->views().at(0), this, QEvent::KeyPress, Qt::Key_Space);
|
CustomSpaceTransition *spaceTransition = new CustomSpaceTransition(scene->views().at(0), this, QEvent::KeyPress, Qt::Key_Space);
|
||||||
@ -154,7 +154,7 @@ void PlayState::onEntry(QEvent *)
|
|||||||
winState->addTransition(spaceTransition);
|
winState->addTransition(spaceTransition);
|
||||||
|
|
||||||
//We lost we should reach the final state
|
//We lost we should reach the final state
|
||||||
lostState->addTransition(lostState, &QState::finished, final);
|
lostState->addTransition(lostState, &QState::finished, finalState);
|
||||||
|
|
||||||
machine->start();
|
machine->start();
|
||||||
}
|
}
|
||||||
@ -181,11 +181,9 @@ void LevelState::initializeLevel()
|
|||||||
scene->progressItem->setScore(game->score);
|
scene->progressItem->setScore(game->score);
|
||||||
scene->progressItem->setLevel(game->currentLevel + 1);
|
scene->progressItem->setLevel(game->currentLevel + 1);
|
||||||
|
|
||||||
GraphicsScene::LevelDescription currentLevelDescription = scene->levelsData.value(game->currentLevel);
|
const GraphicsScene::LevelDescription currentLevelDescription = scene->levelsData.value(game->currentLevel);
|
||||||
|
for (const QPair<int,int> &subContent : currentLevelDescription.submarines) {
|
||||||
|
|
||||||
for (int i = 0; i < currentLevelDescription.submarines.size(); ++i ) {
|
|
||||||
|
|
||||||
QPair<int,int> subContent = currentLevelDescription.submarines.at(i);
|
|
||||||
GraphicsScene::SubmarineDescription submarineDesc = scene->submarinesData.at(subContent.first);
|
GraphicsScene::SubmarineDescription submarineDesc = scene->submarinesData.at(subContent.first);
|
||||||
|
|
||||||
for (int j = 0; j < subContent.second; ++j ) {
|
for (int j = 0; j < subContent.second; ++j ) {
|
||||||
@ -202,9 +200,10 @@ void LevelState::initializeLevel()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Pause State */
|
/** Pause State */
|
||||||
PauseState::PauseState(GraphicsScene *scene, QState *parent) : QState(parent),scene(scene)
|
PauseState::PauseState(GraphicsScene *scene, QState *parent) : QState(parent), scene(scene)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void PauseState::onEntry(QEvent *)
|
void PauseState::onEntry(QEvent *)
|
||||||
{
|
{
|
||||||
AnimationManager::self()->pauseAll();
|
AnimationManager::self()->pauseAll();
|
||||||
@ -324,8 +323,7 @@ bool WinTransition::eventTest(QEvent *event)
|
|||||||
|
|
||||||
/** Space transition */
|
/** Space transition */
|
||||||
CustomSpaceTransition::CustomSpaceTransition(QWidget *widget, PlayState *game, QEvent::Type type, int key)
|
CustomSpaceTransition::CustomSpaceTransition(QWidget *widget, PlayState *game, QEvent::Type type, int key)
|
||||||
: QKeyEventTransition(widget, type, key),
|
: QKeyEventTransition(widget, type, key), game(game)
|
||||||
game(game)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,15 +52,11 @@
|
|||||||
#define STATES_H
|
#define STATES_H
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtCore/QState>
|
#include <QKeyEventTransition>
|
||||||
#include <QtCore/QSignalTransition>
|
#include <QSignalTransition>
|
||||||
#include <QtCore/QPropertyAnimation>
|
#include <QState>
|
||||||
#include <QtWidgets/QKeyEventTransition>
|
|
||||||
#include <QtCore/QSet>
|
|
||||||
|
|
||||||
class GraphicsScene;
|
class GraphicsScene;
|
||||||
class Boat;
|
|
||||||
class SubMarine;
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QStateMachine;
|
class QStateMachine;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
@ -68,7 +64,7 @@ QT_END_NAMESPACE
|
|||||||
class PlayState : public QState
|
class PlayState : public QState
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit PlayState(GraphicsScene *scene, QState *parent = 0);
|
explicit PlayState(GraphicsScene *scene, QState *parent = nullptr);
|
||||||
~PlayState();
|
~PlayState();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -92,7 +88,7 @@ private :
|
|||||||
class LevelState : public QState
|
class LevelState : public QState
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LevelState(GraphicsScene *scene, PlayState *game, QState *parent = 0);
|
LevelState(GraphicsScene *scene, PlayState *game, QState *parent = nullptr);
|
||||||
protected:
|
protected:
|
||||||
void onEntry(QEvent *) override;
|
void onEntry(QEvent *) override;
|
||||||
private :
|
private :
|
||||||
@ -104,7 +100,7 @@ private :
|
|||||||
class PauseState : public QState
|
class PauseState : public QState
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit PauseState(GraphicsScene *scene, QState *parent = 0);
|
explicit PauseState(GraphicsScene *scene, QState *parent = nullptr);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void onEntry(QEvent *) override;
|
void onEntry(QEvent *) override;
|
||||||
@ -116,7 +112,7 @@ private :
|
|||||||
class LostState : public QState
|
class LostState : public QState
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LostState(GraphicsScene *scene, PlayState *game, QState *parent = 0);
|
LostState(GraphicsScene *scene, PlayState *game, QState *parent = nullptr);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void onEntry(QEvent *) override;
|
void onEntry(QEvent *) override;
|
||||||
@ -129,7 +125,7 @@ private :
|
|||||||
class WinState : public QState
|
class WinState : public QState
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WinState(GraphicsScene *scene, PlayState *game, QState *parent = 0);
|
WinState(GraphicsScene *scene, PlayState *game, QState *parent = nullptr);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void onEntry(QEvent *) override;
|
void onEntry(QEvent *) override;
|
||||||
@ -154,7 +150,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
bool eventTest(QEvent *event) override;
|
bool eventTest(QEvent *event) override;
|
||||||
private:
|
private:
|
||||||
PlayState * game;
|
PlayState *game;
|
||||||
GraphicsScene *scene;
|
GraphicsScene *scene;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -166,7 +162,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
bool eventTest(QEvent *event) override;
|
bool eventTest(QEvent *event) override;
|
||||||
private:
|
private:
|
||||||
PlayState * game;
|
PlayState *game;
|
||||||
GraphicsScene *scene;
|
GraphicsScene *scene;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -52,15 +52,14 @@
|
|||||||
#include "submarine.h"
|
#include "submarine.h"
|
||||||
#include "submarine_p.h"
|
#include "submarine_p.h"
|
||||||
#include "torpedo.h"
|
#include "torpedo.h"
|
||||||
#include "pixmapitem.h"
|
|
||||||
#include "graphicsscene.h"
|
#include "graphicsscene.h"
|
||||||
#include "animationmanager.h"
|
#include "animationmanager.h"
|
||||||
#include "qanimationstate.h"
|
#include "qanimationstate.h"
|
||||||
|
|
||||||
#include <QtCore/QPropertyAnimation>
|
#include <QFinalState>
|
||||||
#include <QtCore/QStateMachine>
|
#include <QPropertyAnimation>
|
||||||
#include <QtCore/QFinalState>
|
#include <QStateMachine>
|
||||||
#include <QtCore/QSequentialAnimationGroup>
|
#include <QSequentialAnimationGroup>
|
||||||
|
|
||||||
static QAbstractAnimation *setupDestroyAnimation(SubMarine *sub)
|
static QAbstractAnimation *setupDestroyAnimation(SubMarine *sub)
|
||||||
{
|
{
|
||||||
@ -86,9 +85,8 @@ SubMarine::SubMarine(int type, const QString &name, int points) : PixmapItem(QSt
|
|||||||
|
|
||||||
graphicsRotation = new QGraphicsRotation(this);
|
graphicsRotation = new QGraphicsRotation(this);
|
||||||
graphicsRotation->setAxis(Qt::YAxis);
|
graphicsRotation->setAxis(Qt::YAxis);
|
||||||
graphicsRotation->setOrigin(QVector3D(size().width()/2, size().height()/2, 0));
|
graphicsRotation->setOrigin(QVector3D(size().width() / 2, size().height() / 2, 0));
|
||||||
QList<QGraphicsTransform *> r;
|
QList<QGraphicsTransform *> r({graphicsRotation});
|
||||||
r.append(graphicsRotation);
|
|
||||||
setTransformations(r);
|
setTransformations(r);
|
||||||
|
|
||||||
//We setup the state machine of the submarine
|
//We setup the state machine of the submarine
|
||||||
@ -112,7 +110,7 @@ SubMarine::SubMarine(int type, const QString &name, int points) : PixmapItem(QSt
|
|||||||
machine->setInitialState(moving);
|
machine->setInitialState(moving);
|
||||||
|
|
||||||
//End
|
//End
|
||||||
QFinalState *final = new QFinalState(machine);
|
QFinalState *finalState = new QFinalState(machine);
|
||||||
|
|
||||||
//If the moving animation is finished we move to the return state
|
//If the moving animation is finished we move to the return state
|
||||||
movement->addTransition(movement, &QAnimationState::animationFinished, rotation);
|
movement->addTransition(movement, &QAnimationState::animationFinished, rotation);
|
||||||
@ -128,7 +126,7 @@ SubMarine::SubMarine(int type, const QString &name, int points) : PixmapItem(QSt
|
|||||||
moving->addTransition(this, &SubMarine::subMarineDestroyed, destroyedState);
|
moving->addTransition(this, &SubMarine::subMarineDestroyed, destroyedState);
|
||||||
|
|
||||||
//Transition to final state when the destroyed animation is finished
|
//Transition to final state when the destroyed animation is finished
|
||||||
destroyedState->addTransition(destroyedState, &QAnimationState::animationFinished, final);
|
destroyedState->addTransition(destroyedState, &QAnimationState::animationFinished, finalState);
|
||||||
|
|
||||||
//The machine has finished to be executed, then the submarine is dead
|
//The machine has finished to be executed, then the submarine is dead
|
||||||
connect(machine,&QState::finished,this, &SubMarine::subMarineExecutionFinished);
|
connect(machine,&QState::finished,this, &SubMarine::subMarineExecutionFinished);
|
||||||
@ -145,9 +143,8 @@ void SubMarine::setCurrentDirection(SubMarine::Movement direction)
|
|||||||
{
|
{
|
||||||
if (this->direction == direction)
|
if (this->direction == direction)
|
||||||
return;
|
return;
|
||||||
if (direction == SubMarine::Right && this->direction == SubMarine::None) {
|
if (direction == SubMarine::Right && this->direction == SubMarine::None)
|
||||||
graphicsRotation->setAngle(180);
|
graphicsRotation->setAngle(180);
|
||||||
}
|
|
||||||
this->direction = direction;
|
this->direction = direction;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,9 +155,8 @@ enum SubMarine::Movement SubMarine::currentDirection() const
|
|||||||
|
|
||||||
void SubMarine::setCurrentSpeed(int speed)
|
void SubMarine::setCurrentSpeed(int speed)
|
||||||
{
|
{
|
||||||
if (speed < 0 || speed > 3) {
|
if (speed < 0 || speed > 3)
|
||||||
qWarning("SubMarine::setCurrentSpeed : The speed is invalid");
|
qWarning("SubMarine::setCurrentSpeed : The speed is invalid");
|
||||||
}
|
|
||||||
this->speed = speed;
|
this->speed = speed;
|
||||||
emit subMarineStateChanged();
|
emit subMarineStateChanged();
|
||||||
}
|
}
|
||||||
@ -172,7 +168,7 @@ int SubMarine::currentSpeed() const
|
|||||||
|
|
||||||
void SubMarine::launchTorpedo(int speed)
|
void SubMarine::launchTorpedo(int speed)
|
||||||
{
|
{
|
||||||
Torpedo * torp = new Torpedo();
|
Torpedo *torp = new Torpedo;
|
||||||
GraphicsScene *scene = static_cast<GraphicsScene *>(this->scene());
|
GraphicsScene *scene = static_cast<GraphicsScene *>(this->scene());
|
||||||
scene->addItem(torp);
|
scene->addItem(torp);
|
||||||
torp->setPos(pos());
|
torp->setPos(pos());
|
||||||
|
@ -48,15 +48,12 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef __SUBMARINE__H__
|
#ifndef SUBMARINE_H
|
||||||
#define __SUBMARINE__H__
|
#define SUBMARINE_H
|
||||||
|
|
||||||
//Qt
|
|
||||||
#include <QtWidgets/QGraphicsTransform>
|
|
||||||
|
|
||||||
#include "pixmapitem.h"
|
#include "pixmapitem.h"
|
||||||
|
|
||||||
class Torpedo;
|
#include <QGraphicsRotation>
|
||||||
|
|
||||||
class SubMarine : public PixmapItem
|
class SubMarine : public PixmapItem
|
||||||
{
|
{
|
||||||
@ -99,4 +96,4 @@ private:
|
|||||||
QGraphicsRotation *graphicsRotation;
|
QGraphicsRotation *graphicsRotation;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__SUBMARINE__H__
|
#endif // SUBMARINE_H
|
||||||
|
@ -68,16 +68,15 @@
|
|||||||
#include "qanimationstate.h"
|
#include "qanimationstate.h"
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtCore/QPropertyAnimation>
|
#include <QPropertyAnimation>
|
||||||
#include <QtCore/QRandomGenerator>
|
#include <QRandomGenerator>
|
||||||
#include <QtWidgets/QGraphicsScene>
|
|
||||||
|
|
||||||
//This state is describing when the boat is moving right
|
//This state is describing when the boat is moving right
|
||||||
class MovementState : public QAnimationState
|
class MovementState : public QAnimationState
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit MovementState(SubMarine *submarine, QState *parent = 0) : QAnimationState(parent)
|
explicit MovementState(SubMarine *submarine, QState *parent = nullptr) : QAnimationState(parent)
|
||||||
{
|
{
|
||||||
movementAnimation = new QPropertyAnimation(submarine, "pos");
|
movementAnimation = new QPropertyAnimation(submarine, "pos");
|
||||||
connect(movementAnimation, &QPropertyAnimation::valueChanged,
|
connect(movementAnimation, &QPropertyAnimation::valueChanged,
|
||||||
@ -117,7 +116,7 @@ private:
|
|||||||
class ReturnState : public QAnimationState
|
class ReturnState : public QAnimationState
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit ReturnState(SubMarine *submarine, QState *parent = 0) : QAnimationState(parent)
|
explicit ReturnState(SubMarine *submarine, QState *parent = nullptr) : QAnimationState(parent)
|
||||||
{
|
{
|
||||||
returnAnimation = new QPropertyAnimation(submarine->rotation(), "angle");
|
returnAnimation = new QPropertyAnimation(submarine->rotation(), "angle");
|
||||||
returnAnimation->setDuration(500);
|
returnAnimation->setDuration(500);
|
||||||
|
@ -50,14 +50,15 @@
|
|||||||
#include "textinformationitem.h"
|
#include "textinformationitem.h"
|
||||||
#include "pixmapitem.h"
|
#include "pixmapitem.h"
|
||||||
|
|
||||||
TextInformationItem::TextInformationItem (QGraphicsItem * parent)
|
TextInformationItem::TextInformationItem (QGraphicsItem *parent)
|
||||||
: QGraphicsTextItem(parent)
|
: QGraphicsTextItem(parent)
|
||||||
{
|
{
|
||||||
setFont(QFont("Comic Sans MS", 15));
|
setFont(QFont("Comic Sans MS", 15));
|
||||||
}
|
}
|
||||||
#include <QDebug>
|
|
||||||
void TextInformationItem::setMessage(const QString& text)
|
void TextInformationItem::setMessage(const QString &text)
|
||||||
{
|
{
|
||||||
setHtml(text);
|
setHtml(text);
|
||||||
setPos(parentItem()->boundingRect().center().x() - boundingRect().size().width()/2 , parentItem()->boundingRect().center().y());
|
setPos(parentItem()->boundingRect().center().x() - boundingRect().size().width() / 2,
|
||||||
|
parentItem()->boundingRect().center().y());
|
||||||
}
|
}
|
||||||
|
@ -52,13 +52,13 @@
|
|||||||
#define TEXTINFORMATIONITEM_H
|
#define TEXTINFORMATIONITEM_H
|
||||||
|
|
||||||
//Qt
|
//Qt
|
||||||
#include <QtWidgets/QGraphicsTextItem>
|
#include <QGraphicsTextItem>
|
||||||
|
|
||||||
class TextInformationItem : public QGraphicsTextItem
|
class TextInformationItem : public QGraphicsTextItem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TextInformationItem(QGraphicsItem * parent = 0);
|
TextInformationItem(QGraphicsItem *parent = nullptr);
|
||||||
void setMessage(const QString& text);
|
void setMessage(const QString &text);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TEXTINFORMATIONITEM_H
|
#endif // TEXTINFORMATIONITEM_H
|
||||||
|
@ -50,15 +50,14 @@
|
|||||||
|
|
||||||
//Own
|
//Own
|
||||||
#include "torpedo.h"
|
#include "torpedo.h"
|
||||||
#include "pixmapitem.h"
|
|
||||||
#include "boat.h"
|
#include "boat.h"
|
||||||
#include "graphicsscene.h"
|
#include "graphicsscene.h"
|
||||||
#include "animationmanager.h"
|
#include "animationmanager.h"
|
||||||
#include "qanimationstate.h"
|
#include "qanimationstate.h"
|
||||||
|
|
||||||
#include <QtCore/QPropertyAnimation>
|
#include <QPropertyAnimation>
|
||||||
#include <QtCore/QStateMachine>
|
#include <QStateMachine>
|
||||||
#include <QtCore/QFinalState>
|
#include <QFinalState>
|
||||||
|
|
||||||
Torpedo::Torpedo() : PixmapItem(QString::fromLatin1("torpedo"),GraphicsScene::Big),
|
Torpedo::Torpedo() : PixmapItem(QString::fromLatin1("torpedo"),GraphicsScene::Big),
|
||||||
currentSpeed(0)
|
currentSpeed(0)
|
||||||
@ -70,11 +69,11 @@ void Torpedo::launch()
|
|||||||
{
|
{
|
||||||
QPropertyAnimation *launchAnimation = new QPropertyAnimation(this, "pos");
|
QPropertyAnimation *launchAnimation = new QPropertyAnimation(this, "pos");
|
||||||
AnimationManager::self()->registerAnimation(launchAnimation);
|
AnimationManager::self()->registerAnimation(launchAnimation);
|
||||||
launchAnimation->setEndValue(QPointF(x(),qobject_cast<GraphicsScene *>(scene())->sealLevel() - 15));
|
launchAnimation->setEndValue(QPointF(x(), qobject_cast<GraphicsScene *>(scene())->sealLevel() - 15));
|
||||||
launchAnimation->setEasingCurve(QEasingCurve::InQuad);
|
launchAnimation->setEasingCurve(QEasingCurve::InQuad);
|
||||||
launchAnimation->setDuration(y()/currentSpeed*10);
|
launchAnimation->setDuration(y() / currentSpeed * 10);
|
||||||
connect(launchAnimation,&QVariantAnimation::valueChanged,this,&Torpedo::onAnimationLaunchValueChanged);
|
connect(launchAnimation, &QVariantAnimation::valueChanged, this, &Torpedo::onAnimationLaunchValueChanged);
|
||||||
connect(this,&Torpedo::torpedoExploded, launchAnimation, &QAbstractAnimation::stop);
|
connect(this, &Torpedo::torpedoExploded, launchAnimation, &QAbstractAnimation::stop);
|
||||||
|
|
||||||
//We setup the state machine of the torpedo
|
//We setup the state machine of the torpedo
|
||||||
QStateMachine *machine = new QStateMachine(this);
|
QStateMachine *machine = new QStateMachine(this);
|
||||||
@ -84,18 +83,18 @@ void Torpedo::launch()
|
|||||||
launched->setAnimation(launchAnimation);
|
launched->setAnimation(launchAnimation);
|
||||||
|
|
||||||
//End
|
//End
|
||||||
QFinalState *final = new QFinalState(machine);
|
QFinalState *finalState = new QFinalState(machine);
|
||||||
|
|
||||||
machine->setInitialState(launched);
|
machine->setInitialState(launched);
|
||||||
|
|
||||||
//### Add a nice animation when the torpedo is destroyed
|
//### Add a nice animation when the torpedo is destroyed
|
||||||
launched->addTransition(this, &Torpedo::torpedoExploded,final);
|
launched->addTransition(this, &Torpedo::torpedoExploded, finalState);
|
||||||
|
|
||||||
//If the animation is finished, then we move to the final state
|
//If the animation is finished, then we move to the final state
|
||||||
launched->addTransition(launched, &QAnimationState::animationFinished, final);
|
launched->addTransition(launched, &QAnimationState::animationFinished, finalState);
|
||||||
|
|
||||||
//The machine has finished to be executed, then the boat is dead
|
//The machine has finished to be executed, then the boat is dead
|
||||||
connect(machine,&QState::finished,this, &Torpedo::torpedoExecutionFinished);
|
connect(machine, &QState::finished, this, &Torpedo::torpedoExecutionFinished);
|
||||||
|
|
||||||
machine->start();
|
machine->start();
|
||||||
}
|
}
|
||||||
|
@ -48,8 +48,8 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef __TORPEDO__H__
|
#ifndef TORPEDO_H
|
||||||
#define __TORPEDO__H__
|
#define TORPEDO_H
|
||||||
|
|
||||||
#include "pixmapitem.h"
|
#include "pixmapitem.h"
|
||||||
|
|
||||||
@ -73,4 +73,4 @@ private:
|
|||||||
int currentSpeed;
|
int currentSpeed;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__TORPEDO__H__
|
#endif // TORPEDO_H
|
||||||
|
@ -128,10 +128,6 @@ void ColorEdit::mousePressEvent(QMouseEvent *event)
|
|||||||
QColor color(m_color);
|
QColor color(m_color);
|
||||||
QColorDialog dialog(color, 0);
|
QColorDialog dialog(color, 0);
|
||||||
dialog.setOption(QColorDialog::ShowAlphaChannel, true);
|
dialog.setOption(QColorDialog::ShowAlphaChannel, true);
|
||||||
// The ifdef block is a workaround for the beta, TODO: remove when bug 238525 is fixed
|
|
||||||
#if 0 // Used to be included in Qt4 for Q_WS_MAC
|
|
||||||
dialog.setOption(QColorDialog::DontUseNativeDialog, true);
|
|
||||||
#endif
|
|
||||||
dialog.move(280, 120);
|
dialog.move(280, 120);
|
||||||
if (dialog.exec() == QDialog::Rejected)
|
if (dialog.exec() == QDialog::Rejected)
|
||||||
return;
|
return;
|
||||||
|
@ -68,7 +68,7 @@
|
|||||||
void GraphicsView::wheelEvent(QWheelEvent *e)
|
void GraphicsView::wheelEvent(QWheelEvent *e)
|
||||||
{
|
{
|
||||||
if (e->modifiers() & Qt::ControlModifier) {
|
if (e->modifiers() & Qt::ControlModifier) {
|
||||||
if (e->delta() > 0)
|
if (e->angleDelta().y() > 0)
|
||||||
view->zoomIn(6);
|
view->zoomIn(6);
|
||||||
else
|
else
|
||||||
view->zoomOut(6);
|
view->zoomOut(6);
|
||||||
|
@ -190,7 +190,7 @@ void GraphWidget::timerEvent(QTimerEvent *event)
|
|||||||
//! [5]
|
//! [5]
|
||||||
void GraphWidget::wheelEvent(QWheelEvent *event)
|
void GraphWidget::wheelEvent(QWheelEvent *event)
|
||||||
{
|
{
|
||||||
scaleView(pow((double)2, -event->delta() / 240.0));
|
scaleView(pow((double)2, -event->angleDelta().y() / 240.0));
|
||||||
}
|
}
|
||||||
//! [5]
|
//! [5]
|
||||||
#endif
|
#endif
|
||||||
|
@ -65,8 +65,10 @@ int main(int argc, char *argv[])
|
|||||||
parser.setApplicationDescription("Qt Dir View Example");
|
parser.setApplicationDescription("Qt Dir View Example");
|
||||||
parser.addHelpOption();
|
parser.addHelpOption();
|
||||||
parser.addVersionOption();
|
parser.addVersionOption();
|
||||||
QCommandLineOption dontUseCustomDirectoryIconsOption("c", "Set QFileIconProvider::DontUseCustomDirectoryIcons");
|
QCommandLineOption dontUseCustomDirectoryIconsOption("c", "Set QFileSystemModel::DontUseCustomDirectoryIcons");
|
||||||
parser.addOption(dontUseCustomDirectoryIconsOption);
|
parser.addOption(dontUseCustomDirectoryIconsOption);
|
||||||
|
QCommandLineOption dontWatchOption("w", "Set QFileSystemModel::DontWatch");
|
||||||
|
parser.addOption(dontWatchOption);
|
||||||
parser.addPositionalArgument("directory", "The directory to start in.");
|
parser.addPositionalArgument("directory", "The directory to start in.");
|
||||||
parser.process(app);
|
parser.process(app);
|
||||||
const QString rootPath = parser.positionalArguments().isEmpty()
|
const QString rootPath = parser.positionalArguments().isEmpty()
|
||||||
@ -75,7 +77,9 @@ int main(int argc, char *argv[])
|
|||||||
QFileSystemModel model;
|
QFileSystemModel model;
|
||||||
model.setRootPath("");
|
model.setRootPath("");
|
||||||
if (parser.isSet(dontUseCustomDirectoryIconsOption))
|
if (parser.isSet(dontUseCustomDirectoryIconsOption))
|
||||||
model.iconProvider()->setOptions(QFileIconProvider::DontUseCustomDirectoryIcons);
|
model.setOption(QFileSystemModel::DontUseCustomDirectoryIcons);
|
||||||
|
if (parser.isSet(dontWatchOption))
|
||||||
|
model.setOption(QFileSystemModel::DontWatchForChanges);
|
||||||
QTreeView tree;
|
QTreeView tree;
|
||||||
tree.setModel(&model);
|
tree.setModel(&model);
|
||||||
if (!rootPath.isEmpty()) {
|
if (!rootPath.isEmpty()) {
|
||||||
|
@ -260,7 +260,7 @@ void XFormView::timerEvent(QTimerEvent *e)
|
|||||||
#if QT_CONFIG(wheelevent)
|
#if QT_CONFIG(wheelevent)
|
||||||
void XFormView::wheelEvent(QWheelEvent *e)
|
void XFormView::wheelEvent(QWheelEvent *e)
|
||||||
{
|
{
|
||||||
m_scale += e->delta() / qreal(600);
|
m_scale += e->angleDelta().y() / qreal(600);
|
||||||
m_scale = qMax(qreal(0.1), qMin(qreal(4), m_scale));
|
m_scale = qMax(qreal(0.1), qMin(qreal(4), m_scale));
|
||||||
emit scaleChanged(int(m_scale*1000));
|
emit scaleChanged(int(m_scale*1000));
|
||||||
}
|
}
|
||||||
|
@ -248,7 +248,7 @@ static const char *encodingToolTips[]
|
|||||||
{
|
{
|
||||||
QT_TRANSLATE_NOOP("EncodingDialog", "Unicode points for use with any encoding (C++, Python)"),
|
QT_TRANSLATE_NOOP("EncodingDialog", "Unicode points for use with any encoding (C++, Python)"),
|
||||||
QT_TRANSLATE_NOOP("EncodingDialog", "QString::fromUtf8()"),
|
QT_TRANSLATE_NOOP("EncodingDialog", "QString::fromUtf8()"),
|
||||||
QT_TRANSLATE_NOOP("EncodingDialog", "QStringViewLiteral(), wchar_t on Windows"),
|
QT_TRANSLATE_NOOP("EncodingDialog", "wchar_t on Windows, char16_t everywhere"),
|
||||||
QT_TRANSLATE_NOOP("EncodingDialog", "wchar_t on Unix (Ucs4)"),
|
QT_TRANSLATE_NOOP("EncodingDialog", "wchar_t on Unix (Ucs4)"),
|
||||||
QT_TRANSLATE_NOOP("EncodingDialog", "QLatin1String")
|
QT_TRANSLATE_NOOP("EncodingDialog", "QLatin1String")
|
||||||
};
|
};
|
||||||
|
@ -53,12 +53,6 @@
|
|||||||
#include "languagechooser.h"
|
#include "languagechooser.h"
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
|
|
||||||
#if 0 // Used to be included in Qt4 for Q_WS_MAC
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
extern void qt_mac_set_menubar_merge(bool merge);
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LanguageChooser::LanguageChooser(const QString& defaultLang, QWidget *parent)
|
LanguageChooser::LanguageChooser(const QString& defaultLang, QWidget *parent)
|
||||||
: QDialog(parent, Qt::WindowStaysOnTopHint)
|
: QDialog(parent, Qt::WindowStaysOnTopHint)
|
||||||
{
|
{
|
||||||
@ -95,10 +89,6 @@ LanguageChooser::LanguageChooser(const QString& defaultLang, QWidget *parent)
|
|||||||
mainLayout->addWidget(buttonBox);
|
mainLayout->addWidget(buttonBox);
|
||||||
setLayout(mainLayout);
|
setLayout(mainLayout);
|
||||||
|
|
||||||
#if 0 // Used to be included in Qt4 for Q_WS_MAC
|
|
||||||
qt_mac_set_menubar_merge(false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
setWindowTitle("I18N");
|
setWindowTitle("I18N");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,15 +93,16 @@ void ButtonTester::mouseDoubleClickEvent(QMouseEvent *e)
|
|||||||
void ButtonTester::wheelEvent (QWheelEvent *e)
|
void ButtonTester::wheelEvent (QWheelEvent *e)
|
||||||
{
|
{
|
||||||
QString result;
|
QString result;
|
||||||
if (e->delta() > 0) {
|
const bool vertical = qAbs(e->angleDelta().y()) >= qAbs(e->angleDelta().x());
|
||||||
|
const int delta = vertical ? e->angleDelta().y() : e->angleDelta().x();
|
||||||
if (e->orientation() == Qt::Vertical) {
|
if (delta > 0) {
|
||||||
|
if (vertical) {
|
||||||
result = "Mouse Wheel Event: UP";
|
result = "Mouse Wheel Event: UP";
|
||||||
} else {
|
} else {
|
||||||
result = "Mouse Wheel Event: LEFT";
|
result = "Mouse Wheel Event: LEFT";
|
||||||
}
|
}
|
||||||
} else if (e->delta() < 0) {
|
} else if (delta < 0) {
|
||||||
if (e->orientation() == Qt::Vertical) {
|
if (vertical) {
|
||||||
result = "Mouse Wheel Event: DOWN";
|
result = "Mouse Wheel Event: DOWN";
|
||||||
} else {
|
} else {
|
||||||
result = "Mouse Wheel Event: RIGHT";
|
result = "Mouse Wheel Event: RIGHT";
|
||||||
|
@ -8,43 +8,108 @@ CONFIG += android_install unversioned_soname unversioned_libname
|
|||||||
include(../common/linux.conf)
|
include(../common/linux.conf)
|
||||||
include(../common/gcc-base-unix.conf)
|
include(../common/gcc-base-unix.conf)
|
||||||
include(../common/clang.conf)
|
include(../common/clang.conf)
|
||||||
include(../common/android-base-head.conf)
|
|
||||||
|
|
||||||
NDK_LLVM_PATH = $$NDK_ROOT/toolchains/llvm/prebuilt/$$NDK_HOST
|
load(device_config)
|
||||||
QMAKE_CC = $$NDK_LLVM_PATH/bin/clang
|
|
||||||
QMAKE_CXX = $$NDK_LLVM_PATH/bin/clang++
|
|
||||||
|
|
||||||
equals(ANDROID_TARGET_ARCH, armeabi-v7a): \
|
# In early configure setup; nothing useful to be done here.
|
||||||
QMAKE_CFLAGS += -target armv7-none-linux-androideabi
|
isEmpty(DEFAULT_ANDROID_NDK_ROOT): return()
|
||||||
else: equals(ANDROID_TARGET_ARCH, armeabi): \
|
|
||||||
QMAKE_CFLAGS += -target armv5te-none-linux-androideabi
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, arm64-v8a): \
|
|
||||||
QMAKE_CFLAGS += -target aarch64-none-linux-android
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, x86): \
|
|
||||||
QMAKE_CFLAGS += -target i686-none-linux-android -mstackrealign
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, x86_64): \
|
|
||||||
QMAKE_CFLAGS += -target x86_64-none-linux-android
|
|
||||||
|
|
||||||
QMAKE_CFLAGS += -gcc-toolchain $$NDK_TOOLCHAIN_PATH -fno-limit-debug-info
|
NDK_ROOT = $$(ANDROID_NDK_ROOT)
|
||||||
|
isEmpty(NDK_ROOT): NDK_ROOT = $$DEFAULT_ANDROID_NDK_ROOT
|
||||||
|
|
||||||
QMAKE_LINK = $$QMAKE_CXX $$QMAKE_CFLAGS -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++
|
!exists($$NDK_ROOT): error("You need to set the ANDROID_NDK_ROOT environment variable to point to your Android NDK.")
|
||||||
equals(ANDROID_TARGET_ARCH, armeabi-v7a): QMAKE_LINK += -Wl,--exclude-libs,libunwind.a
|
|
||||||
|
|
||||||
QMAKE_CFLAGS += -DANDROID_HAS_WSTRING --sysroot=$$NDK_ROOT/sysroot \
|
NDK_HOST = $$(ANDROID_NDK_HOST)
|
||||||
-isystem $$NDK_ROOT/sysroot/usr/include/$$NDK_TOOLS_PREFIX \
|
isEmpty(NDK_HOST): NDK_HOST = $$DEFAULT_ANDROID_NDK_HOST
|
||||||
-isystem $$NDK_ROOT/sources/cxx-stl/llvm-libc++/include \
|
|
||||||
-isystem $$NDK_ROOT/sources/android/support/include \
|
|
||||||
-isystem $$NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include
|
|
||||||
|
|
||||||
ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/llvm-libc++/libs/$$ANDROID_TARGET_ARCH
|
ANDROID_PLATFORM = $$(ANDROID_NDK_PLATFORM)
|
||||||
|
isEmpty(ANDROID_PLATFORM): ANDROID_PLATFORM = $$DEFAULT_ANDROID_PLATFORM
|
||||||
|
|
||||||
ANDROID_STDCPP_PATH = $$ANDROID_SOURCES_CXX_STL_LIBDIR/libc++_shared.so
|
ANDROID_SDK_ROOT = $$(ANDROID_SDK_ROOT)
|
||||||
|
isEmpty(ANDROID_SDK_ROOT): ANDROID_SDK_ROOT = $$DEFAULT_ANDROID_SDK_ROOT
|
||||||
|
|
||||||
|
ANDROID_SDK_BUILD_TOOLS_REVISION = $$(ANDROID_BUILD_TOOLS_REVISION)
|
||||||
|
isEmpty(ANDROID_SDK_BUILD_TOOLS_REVISION) {
|
||||||
|
SDK_BUILD_TOOLS_REVISIONS = $$files($$ANDROID_SDK_ROOT/build-tools/*)
|
||||||
|
for (REVISION, SDK_BUILD_TOOLS_REVISIONS) {
|
||||||
|
BASENAME = $$basename(REVISION)
|
||||||
|
greaterThan(BASENAME, $$ANDROID_SDK_BUILD_TOOLS_REVISION): ANDROID_SDK_BUILD_TOOLS_REVISION = $$BASENAME
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ALL_ANDROID_ABIS = $$(ALL_ANDROID_ABIS)
|
||||||
|
isEmpty(ALL_ANDROID_ABIS): ALL_ANDROID_ABIS = $$DEFAULT_ANDROID_ABIS
|
||||||
|
isEmpty(ALL_ANDROID_ABIS): ALL_ANDROID_ABIS = arm64-v8a armeabi-v7a x86_64 x86
|
||||||
|
|
||||||
|
CONFIG += $$ANDROID_PLATFORM
|
||||||
|
|
||||||
|
QMAKE_PCH_OUTPUT_EXT = .gch
|
||||||
|
|
||||||
|
QMAKE_CFLAGS_PRECOMPILE = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
|
||||||
|
QMAKE_CFLAGS_USE_PRECOMPILE = -include ${QMAKE_PCH_OUTPUT_BASE}
|
||||||
|
QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
|
||||||
|
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
|
||||||
|
|
||||||
|
NDK_LLVM_PATH = $$NDK_ROOT/toolchains/llvm/prebuilt/$$NDK_HOST
|
||||||
|
QMAKE_CC = $$NDK_LLVM_PATH/bin/clang
|
||||||
|
QMAKE_CXX = $$NDK_LLVM_PATH/bin/clang++
|
||||||
|
QMAKE_LINK = $$QMAKE_CXX
|
||||||
|
QMAKE_OBJCOPY = $$NDK_LLVM_PATH/bin/llvm-objcopy
|
||||||
|
QMAKE_AR = $$NDK_LLVM_PATH/bin/llvm-ar cqs
|
||||||
|
QMAKE_OBJCOPY = $$NDK_LLVM_PATH/bin/llvm-objcopy
|
||||||
|
QMAKE_NM = $$NDK_LLVM_PATH/bin/llvm-nm -P
|
||||||
|
|
||||||
|
QMAKE_CFLAGS_OPTIMIZE = -Oz
|
||||||
|
QMAKE_CFLAGS_OPTIMIZE_FULL = -Oz
|
||||||
|
|
||||||
|
QMAKE_CFLAGS_WARN_ON = -Wall -W
|
||||||
|
QMAKE_CFLAGS_WARN_OFF =
|
||||||
|
QMAKE_CFLAGS_SHLIB = -fPIC
|
||||||
|
QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
|
||||||
|
QMAKE_CFLAGS_THREAD = -D_REENTRANT
|
||||||
|
QMAKE_CFLAGS_HIDESYMS = -fvisibility=hidden
|
||||||
|
QMAKE_CFLAGS_NEON = -mfpu=neon
|
||||||
|
|
||||||
|
QMAKE_LFLAGS_APP = -Wl,--no-undefined -Wl,-z,noexecstack -shared
|
||||||
|
QMAKE_LFLAGS_SHLIB = -Wl,--no-undefined -Wl,-z,noexecstack -shared
|
||||||
|
QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
|
||||||
|
QMAKE_LFLAGS_NOUNDEF = -Wl,--no-undefined
|
||||||
|
QMAKE_LFLAGS_RPATH = -Wl,-rpath=
|
||||||
|
QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link=
|
||||||
|
|
||||||
|
QMAKE_LIBS_X11 =
|
||||||
|
QMAKE_LIBS_THREAD =
|
||||||
|
QMAKE_LIBS_OPENGL =
|
||||||
|
QMAKE_INCDIR_POST =
|
||||||
|
QMAKE_INCDIR_X11 =
|
||||||
|
QMAKE_LIBDIR_X11 =
|
||||||
|
QMAKE_INCDIR_OPENGL =
|
||||||
|
QMAKE_LIBDIR_OPENGL =
|
||||||
|
|
||||||
ANDROID_USE_LLVM = true
|
ANDROID_USE_LLVM = true
|
||||||
|
|
||||||
exists($$ANDROID_SOURCES_CXX_STL_LIBDIR/libc++.so): \
|
armeabi-v7a.sdk = armeabi-v7a
|
||||||
ANDROID_CXX_STL_LIBS = -lc++
|
armeabi-v7a.target = armeabi-v7a
|
||||||
else: \
|
armeabi-v7a.dir_affix = armeabi-v7a
|
||||||
ANDROID_CXX_STL_LIBS = $$ANDROID_SOURCES_CXX_STL_LIBDIR/libc++.so.$$replace(ANDROID_PLATFORM, "android-", "")
|
armeabi-v7a.CONFIG = armeabi-v7a
|
||||||
|
armeabi-v7a.deployment_identifier = armeabi-v7a
|
||||||
|
|
||||||
include(../common/android-base-tail.conf)
|
arm64-v8a.sdk = arm64-v8a
|
||||||
|
arm64-v8a.target = arm64-v8a
|
||||||
|
arm64-v8a.dir_affix = arm64-v8a
|
||||||
|
arm64-v8a.CONFIG = arm64-v8a
|
||||||
|
arm64-v8a.deployment_identifier = arm64-v8a
|
||||||
|
|
||||||
|
x86.sdk = x86
|
||||||
|
x86.target = x86
|
||||||
|
x86.dir_affix = x86
|
||||||
|
x86.CONFIG = x86
|
||||||
|
x86.deployment_identifier = x86
|
||||||
|
|
||||||
|
x86_64.sdk = x86_64
|
||||||
|
x86_64.target = x86_64
|
||||||
|
x86_64.dir_affix = x86_64
|
||||||
|
x86_64.CONFIG = x86_64
|
||||||
|
x86_64.deployment_identifier = x86_64
|
||||||
|
|
||||||
|
load(qt_config)
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
# qmake configuration for building with android-g++
|
|
||||||
MAKEFILE_GENERATOR = UNIX
|
|
||||||
QMAKE_PLATFORM = android
|
|
||||||
QMAKE_COMPILER = gcc
|
|
||||||
|
|
||||||
CONFIG += android_install unversioned_soname unversioned_libname plugin_with_soname android_deployment_settings
|
|
||||||
|
|
||||||
include(../common/linux.conf)
|
|
||||||
include(../common/gcc-base-unix.conf)
|
|
||||||
include(../common/android-base-head.conf)
|
|
||||||
|
|
||||||
QMAKE_CC = $${CROSS_COMPILE}gcc
|
|
||||||
QMAKE_CXX = $${CROSS_COMPILE}g++
|
|
||||||
QMAKE_LINK = $$QMAKE_CXX
|
|
||||||
|
|
||||||
ANDROID_SOURCES_CXX_STL_LIBDIR = $$NDK_ROOT/sources/cxx-stl/gnu-libstdc++/$$NDK_TOOLCHAIN_VERSION/libs/$$ANDROID_TARGET_ARCH
|
|
||||||
ANDROID_STDCPP_PATH = $$ANDROID_SOURCES_CXX_STL_LIBDIR/libgnustl_shared.so
|
|
||||||
ANDROID_CXX_STL_LIBS = -lgnustl_shared -lgcc
|
|
||||||
ANDROID_USE_LLVM = false
|
|
||||||
|
|
||||||
exists($$NDK_ROOT/sysroot/usr/include): \
|
|
||||||
QMAKE_CFLAGS += --sysroot=$$NDK_ROOT/sysroot \
|
|
||||||
-isystem $$NDK_ROOT/sysroot/usr/include/$$NDK_TOOLS_PREFIX
|
|
||||||
else: QMAKE_CFLAGS += --sysroot=$$ANDROID_PLATFORM_ROOT_PATH
|
|
||||||
|
|
||||||
QMAKE_CFLAGS += -isystem $$NDK_ROOT/sources/cxx-stl/gnu-libstdc++/$$NDK_TOOLCHAIN_VERSION/include \
|
|
||||||
-isystem $$ANDROID_SOURCES_CXX_STL_LIBDIR/include
|
|
||||||
|
|
||||||
equals(ANDROID_TARGET_ARCH, armeabi)|equals(ANDROID_TARGET_ARCH, armeabi-v7a): \
|
|
||||||
LIBGCC_PATH_FULL = $$system("$$QMAKE_CXX -mthumb-interwork -print-libgcc-file-name")
|
|
||||||
else: \
|
|
||||||
LIBGCC_PATH_FULL = $$system("$$QMAKE_CXX -print-libgcc-file-name")
|
|
||||||
ANDROID_SOURCES_CXX_STL_LIBDIR += $$dirname(LIBGCC_PATH_FULL)
|
|
||||||
|
|
||||||
include(../common/android-base-tail.conf)
|
|
@ -1,177 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
**
|
|
||||||
** Copyright (C) 2016 The Qt Company Ltd.
|
|
||||||
** Contact: https://www.qt.io/licensing/
|
|
||||||
**
|
|
||||||
** This file is part of the qmake spec of the Qt Toolkit.
|
|
||||||
**
|
|
||||||
** $QT_BEGIN_LICENSE:LGPL$
|
|
||||||
** Commercial License Usage
|
|
||||||
** Licensees holding valid commercial Qt licenses may use this file in
|
|
||||||
** accordance with the commercial license agreement provided with the
|
|
||||||
** Software or, alternatively, in accordance with the terms contained in
|
|
||||||
** a written agreement between you and The Qt Company. For licensing terms
|
|
||||||
** and conditions see https://www.qt.io/terms-conditions. For further
|
|
||||||
** information use the contact form at https://www.qt.io/contact-us.
|
|
||||||
**
|
|
||||||
** GNU Lesser General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
||||||
** General Public License version 3 as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.LGPL3 included in the
|
|
||||||
** packaging of this file. Please review the following information to
|
|
||||||
** ensure the GNU Lesser General Public License version 3 requirements
|
|
||||||
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
|
|
||||||
**
|
|
||||||
** GNU General Public License Usage
|
|
||||||
** Alternatively, this file may be used under the terms of the GNU
|
|
||||||
** General Public License version 2.0 or (at your option) the GNU General
|
|
||||||
** Public license version 3 or any later version approved by the KDE Free
|
|
||||||
** Qt Foundation. The licenses are as published by the Free Software
|
|
||||||
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
|
|
||||||
** included in the packaging of this file. Please review the following
|
|
||||||
** information to ensure the GNU General Public License requirements will
|
|
||||||
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
|
|
||||||
** https://www.gnu.org/licenses/gpl-3.0.html.
|
|
||||||
**
|
|
||||||
** $QT_END_LICENSE$
|
|
||||||
**
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef QPLATFORMDEFS_H
|
|
||||||
#define QPLATFORMDEFS_H
|
|
||||||
|
|
||||||
// Get Qt defines/settings
|
|
||||||
|
|
||||||
#include "qglobal.h"
|
|
||||||
|
|
||||||
// Set any POSIX/XOPEN defines at the top of this file to turn on specific APIs
|
|
||||||
|
|
||||||
// 1) need to reset default environment if _BSD_SOURCE is defined
|
|
||||||
// 2) need to specify POSIX thread interfaces explicitly in glibc 2.0
|
|
||||||
// 3) it seems older glibc need this to include the X/Open stuff
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
// We are hot - unistd.h should have turned on the specific APIs we requested
|
|
||||||
|
|
||||||
#include <features.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <grp.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <dlfcn.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/ipc.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/wait.h>
|
|
||||||
|
|
||||||
#ifndef _GNU_SOURCE
|
|
||||||
# define _GNU_SOURCE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef QT_LARGEFILE_SUPPORT
|
|
||||||
#define QT_STATBUF struct stat64
|
|
||||||
#define QT_STATBUF4TSTAT struct stat64
|
|
||||||
#define QT_STAT ::stat64
|
|
||||||
#define QT_FSTAT ::fstat64
|
|
||||||
#define QT_LSTAT ::lstat64
|
|
||||||
#define QT_OPEN ::open64
|
|
||||||
#define QT_TRUNCATE ::truncate64
|
|
||||||
#define QT_FTRUNCATE ::ftruncate64
|
|
||||||
#define QT_LSEEK ::lseek64
|
|
||||||
#else
|
|
||||||
#define QT_STATBUF struct stat
|
|
||||||
#define QT_STATBUF4TSTAT struct stat
|
|
||||||
#define QT_STAT ::stat
|
|
||||||
#define QT_FSTAT ::fstat
|
|
||||||
#define QT_LSTAT ::lstat
|
|
||||||
#define QT_OPEN ::open
|
|
||||||
#define QT_TRUNCATE ::truncate
|
|
||||||
#define QT_FTRUNCATE ::ftruncate
|
|
||||||
#define QT_LSEEK ::lseek
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef QT_LARGEFILE_SUPPORT
|
|
||||||
#define QT_FOPEN ::fopen64
|
|
||||||
#define QT_FSEEK ::fseeko64
|
|
||||||
#define QT_FTELL ::ftello64
|
|
||||||
#define QT_FGETPOS ::fgetpos64
|
|
||||||
#define QT_FSETPOS ::fsetpos64
|
|
||||||
#define QT_MMAP ::mmap64
|
|
||||||
#define QT_FPOS_T fpos64_t
|
|
||||||
#define QT_OFF_T off64_t
|
|
||||||
#else
|
|
||||||
#define QT_FOPEN ::fopen
|
|
||||||
#define QT_FSEEK ::fseek
|
|
||||||
#define QT_FTELL ::ftell
|
|
||||||
#define QT_FGETPOS ::fgetpos
|
|
||||||
#define QT_FSETPOS ::fsetpos
|
|
||||||
#define QT_MMAP ::mmap
|
|
||||||
#define QT_FPOS_T fpos_t
|
|
||||||
#define QT_OFF_T long
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define QT_STAT_REG S_IFREG
|
|
||||||
#define QT_STAT_DIR S_IFDIR
|
|
||||||
#define QT_STAT_MASK S_IFMT
|
|
||||||
#define QT_STAT_LNK S_IFLNK
|
|
||||||
#define QT_SOCKET_CONNECT ::connect
|
|
||||||
#define QT_SOCKET_BIND ::bind
|
|
||||||
#define QT_FILENO fileno
|
|
||||||
#define QT_CLOSE ::close
|
|
||||||
#define QT_READ ::read
|
|
||||||
#define QT_WRITE ::write
|
|
||||||
#define QT_ACCESS ::access
|
|
||||||
#define QT_GETCWD ::getcwd
|
|
||||||
#define QT_CHDIR ::chdir
|
|
||||||
#define QT_MKDIR ::mkdir
|
|
||||||
#define QT_RMDIR ::rmdir
|
|
||||||
#define QT_OPEN_LARGEFILE O_LARGEFILE
|
|
||||||
#define QT_OPEN_RDONLY O_RDONLY
|
|
||||||
#define QT_OPEN_WRONLY O_WRONLY
|
|
||||||
#define QT_OPEN_RDWR O_RDWR
|
|
||||||
#define QT_OPEN_CREAT O_CREAT
|
|
||||||
#define QT_OPEN_TRUNC O_TRUNC
|
|
||||||
#define QT_OPEN_APPEND O_APPEND
|
|
||||||
#define QT_OPEN_EXCL O_EXCL
|
|
||||||
|
|
||||||
// Directory iteration
|
|
||||||
#define QT_DIR DIR
|
|
||||||
|
|
||||||
#define QT_OPENDIR ::opendir
|
|
||||||
#define QT_CLOSEDIR ::closedir
|
|
||||||
|
|
||||||
#if defined(QT_LARGEFILE_SUPPORT) \
|
|
||||||
&& defined(QT_USE_XOPEN_LFS_EXTENSIONS) \
|
|
||||||
&& !defined(QT_NO_READDIR64)
|
|
||||||
#define QT_DIRENT struct dirent64
|
|
||||||
#define QT_READDIR ::readdir64
|
|
||||||
#define QT_READDIR_R ::readdir64_r
|
|
||||||
#else
|
|
||||||
#define QT_DIRENT struct dirent
|
|
||||||
#define QT_READDIR ::readdir
|
|
||||||
#define QT_READDIR_R ::readdir_r
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define QT_SOCKET_CONNECT ::connect
|
|
||||||
#define QT_SOCKET_BIND ::bind
|
|
||||||
|
|
||||||
|
|
||||||
#define QT_SIGNAL_RETTYPE void
|
|
||||||
#define QT_SIGNAL_ARGS int
|
|
||||||
#define QT_SIGNAL_IGNORE SIG_IGN
|
|
||||||
|
|
||||||
#define QT_SOCKLEN_T socklen_t
|
|
||||||
|
|
||||||
#if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE >= 500)
|
|
||||||
#define QT_SNPRINTF ::snprintf
|
|
||||||
#define QT_VSNPRINTF ::vsnprintf
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // QPLATFORMDEFS_H
|
|
@ -1,72 +0,0 @@
|
|||||||
load(device_config)
|
|
||||||
|
|
||||||
# In early configure setup; nothing useful to be done here.
|
|
||||||
isEmpty(DEFAULT_ANDROID_NDK_ROOT): return()
|
|
||||||
|
|
||||||
NDK_ROOT = $$(ANDROID_NDK_ROOT)
|
|
||||||
isEmpty(NDK_ROOT): NDK_ROOT = $$DEFAULT_ANDROID_NDK_ROOT
|
|
||||||
|
|
||||||
NDK_HOST = $$(ANDROID_NDK_HOST)
|
|
||||||
isEmpty(NDK_HOST): NDK_HOST = $$DEFAULT_ANDROID_NDK_HOST
|
|
||||||
|
|
||||||
ANDROID_PLATFORM = $$(ANDROID_NDK_PLATFORM)
|
|
||||||
isEmpty(ANDROID_PLATFORM): ANDROID_PLATFORM = $$DEFAULT_ANDROID_PLATFORM
|
|
||||||
|
|
||||||
ANDROID_TARGET_ARCH = $$(ANDROID_TARGET_ARCH)
|
|
||||||
isEmpty(ANDROID_TARGET_ARCH): ANDROID_TARGET_ARCH = $$DEFAULT_ANDROID_TARGET_ARCH
|
|
||||||
|
|
||||||
NDK_TOOLCHAIN_PREFIX = $$(ANDROID_NDK_TOOLCHAIN_PREFIX)
|
|
||||||
isEmpty(NDK_TOOLCHAIN_PREFIX) {
|
|
||||||
equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLCHAIN_PREFIX = x86
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLCHAIN_PREFIX = x86_64
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLCHAIN_PREFIX = aarch64-linux-android
|
|
||||||
else: NDK_TOOLCHAIN_PREFIX = arm-linux-androideabi
|
|
||||||
}
|
|
||||||
|
|
||||||
NDK_TOOLS_PREFIX = $$(ANDROID_NDK_TOOLS_PREFIX)
|
|
||||||
isEmpty(NDK_TOOLS_PREFIX) {
|
|
||||||
equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLS_PREFIX = i686-linux-android
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLS_PREFIX = x86_64-linux-android
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLS_PREFIX = aarch64-linux-android
|
|
||||||
else: NDK_TOOLS_PREFIX = arm-linux-androideabi
|
|
||||||
}
|
|
||||||
|
|
||||||
NDK_TOOLCHAIN_VERSION = $$(ANDROID_NDK_TOOLCHAIN_VERSION)
|
|
||||||
isEmpty(NDK_TOOLCHAIN_VERSION): NDK_TOOLCHAIN_VERSION = $$DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION
|
|
||||||
|
|
||||||
equals(ANDROID_TARGET_ARCH, x86): ANDROID_ARCHITECTURE = x86
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, x86_64): ANDROID_ARCHITECTURE = x86_64
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, arm64-v8a): ANDROID_ARCHITECTURE = arm64
|
|
||||||
else: ANDROID_ARCHITECTURE = arm
|
|
||||||
|
|
||||||
!equals(NDK_TOOLCHAIN_VERSION, 4.4.3): ANDROID_CXXSTL_SUFFIX = -$$NDK_TOOLCHAIN_VERSION
|
|
||||||
|
|
||||||
NDK_TOOLCHAIN = $$NDK_TOOLCHAIN_PREFIX-$$NDK_TOOLCHAIN_VERSION
|
|
||||||
NDK_TOOLCHAIN_PATH = $$NDK_ROOT/toolchains/$$NDK_TOOLCHAIN/prebuilt/$$NDK_HOST
|
|
||||||
|
|
||||||
|
|
||||||
ANDROID_SDK_ROOT = $$(ANDROID_SDK_ROOT)
|
|
||||||
isEmpty(ANDROID_SDK_ROOT): ANDROID_SDK_ROOT = $$DEFAULT_ANDROID_SDK_ROOT
|
|
||||||
|
|
||||||
ANDROID_SDK_BUILD_TOOLS_REVISION = $$(ANDROID_BUILD_TOOLS_REVISION)
|
|
||||||
isEmpty(ANDROID_SDK_BUILD_TOOLS_REVISION) {
|
|
||||||
SDK_BUILD_TOOLS_REVISIONS = $$files($$ANDROID_SDK_ROOT/build-tools/*)
|
|
||||||
for (REVISION, SDK_BUILD_TOOLS_REVISIONS) {
|
|
||||||
BASENAME = $$basename(REVISION)
|
|
||||||
greaterThan(BASENAME, $$ANDROID_SDK_BUILD_TOOLS_REVISION): ANDROID_SDK_BUILD_TOOLS_REVISION = $$BASENAME
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CONFIG += $$ANDROID_PLATFORM
|
|
||||||
QMAKE_CFLAGS = -D__ANDROID_API__=$$replace(ANDROID_PLATFORM, "android-", "")
|
|
||||||
|
|
||||||
ANDROID_PLATFORM_ROOT_PATH = $$NDK_ROOT/platforms/$$ANDROID_PLATFORM/arch-$$ANDROID_ARCHITECTURE/
|
|
||||||
|
|
||||||
CROSS_COMPILE = $$NDK_TOOLCHAIN_PATH/bin/$$NDK_TOOLS_PREFIX-
|
|
||||||
|
|
||||||
QMAKE_PCH_OUTPUT_EXT = .gch
|
|
||||||
|
|
||||||
QMAKE_CFLAGS_PRECOMPILE = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
|
|
||||||
QMAKE_CFLAGS_USE_PRECOMPILE = -include ${QMAKE_PCH_OUTPUT_BASE}
|
|
||||||
QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
|
|
||||||
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
|
|
@ -1,90 +0,0 @@
|
|||||||
# In early configure setup; nothing useful to be done here.
|
|
||||||
isEmpty(DEFAULT_ANDROID_NDK_ROOT): return()
|
|
||||||
|
|
||||||
# -fstack-protector-strong offers good protection against stack smashing attacks.
|
|
||||||
# It is (currently) enabled only on Android because we know for sure that Andoroid compilers supports it
|
|
||||||
QMAKE_CFLAGS += -fstack-protector-strong -DANDROID
|
|
||||||
|
|
||||||
equals(ANDROID_TARGET_ARCH, armeabi-v7a): \
|
|
||||||
QMAKE_CFLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -fno-builtin-memmove
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, armeabi): \
|
|
||||||
QMAKE_CFLAGS += -march=armv5te -mtune=xscale -msoft-float -fno-builtin-memmove
|
|
||||||
# -fno-builtin-memmove is used to workaround https://code.google.com/p/android/issues/detail?id=81692
|
|
||||||
|
|
||||||
QMAKE_CFLAGS_WARN_ON = -Wall -W
|
|
||||||
QMAKE_CFLAGS_WARN_OFF =
|
|
||||||
equals(ANDROID_TARGET_ARCH, armeabi-v7a) | equals(ANDROID_TARGET_ARCH, armeabi) {
|
|
||||||
CONFIG += optimize_size
|
|
||||||
QMAKE_CFLAGS_DEBUG = -g -marm -O0
|
|
||||||
equals(ANDROID_TARGET_ARCH, armeabi):if(equals(NDK_TOOLCHAIN_VERSION, 4.8)|equals(NDK_TOOLCHAIN_VERSION, 4.9)) {
|
|
||||||
DEFINES += QT_OS_ANDROID_GCC_48_WORKAROUND
|
|
||||||
} else {
|
|
||||||
QMAKE_CFLAGS_RELEASE += -mthumb
|
|
||||||
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -mthumb
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QMAKE_CFLAGS_SHLIB = -fPIC
|
|
||||||
QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
|
|
||||||
QMAKE_CFLAGS_THREAD = -D_REENTRANT
|
|
||||||
QMAKE_CFLAGS_HIDESYMS = -fvisibility=hidden
|
|
||||||
QMAKE_CFLAGS_NEON = -mfpu=neon
|
|
||||||
|
|
||||||
QMAKE_CFLAGS_GNUC99 = -std=gnu99
|
|
||||||
QMAKE_CFLAGS_GNUC11 = -std=gnu11
|
|
||||||
QMAKE_CXXFLAGS_CXX11 = -std=c++11
|
|
||||||
QMAKE_CXXFLAGS_CXX14 = -std=c++14
|
|
||||||
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
|
|
||||||
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
|
|
||||||
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++14
|
|
||||||
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
|
|
||||||
|
|
||||||
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
|
|
||||||
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
|
|
||||||
QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
|
|
||||||
QMAKE_CXXFLAGS_RELEASE += $$QMAKE_CFLAGS_RELEASE
|
|
||||||
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
|
|
||||||
QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_DEBUG
|
|
||||||
QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB
|
|
||||||
QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
|
|
||||||
QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
|
|
||||||
QMAKE_CXXFLAGS_HIDESYMS = $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
|
|
||||||
|
|
||||||
# modifications to linux.conf
|
|
||||||
QMAKE_AR = $${CROSS_COMPILE}ar cqs
|
|
||||||
QMAKE_OBJCOPY = $${CROSS_COMPILE}objcopy
|
|
||||||
QMAKE_NM = $${CROSS_COMPILE}nm -P
|
|
||||||
|
|
||||||
QMAKE_STRIP =
|
|
||||||
#$${CROSS_COMPILE}strip
|
|
||||||
|
|
||||||
QMAKE_RANLIB = $${CROSS_COMPILE}ranlib
|
|
||||||
|
|
||||||
QMAKE_INCDIR_POST =
|
|
||||||
QMAKE_LIBDIR_POST = $$ANDROID_SOURCES_CXX_STL_LIBDIR
|
|
||||||
QMAKE_INCDIR_X11 =
|
|
||||||
QMAKE_LIBDIR_X11 =
|
|
||||||
QMAKE_INCDIR_OPENGL =
|
|
||||||
QMAKE_LIBDIR_OPENGL =
|
|
||||||
|
|
||||||
QMAKE_LINK_SHLIB = $$QMAKE_LINK
|
|
||||||
QMAKE_LFLAGS = --sysroot=$$ANDROID_PLATFORM_ROOT_PATH
|
|
||||||
equals(ANDROID_TARGET_ARCH, x86_64) QMAKE_LFLAGS += -L$$ANDROID_PLATFORM_ROOT_PATH/usr/lib64
|
|
||||||
QMAKE_LFLAGS_APP = -Wl,--no-undefined -Wl,-z,noexecstack -shared
|
|
||||||
QMAKE_LFLAGS_SHLIB = -Wl,--no-undefined -Wl,-z,noexecstack -shared
|
|
||||||
QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
|
|
||||||
QMAKE_LFLAGS_NOUNDEF = -Wl,--no-undefined
|
|
||||||
QMAKE_LFLAGS_RPATH = -Wl,-rpath=
|
|
||||||
QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link=
|
|
||||||
|
|
||||||
QMAKE_LIBS_PRIVATE = $$ANDROID_CXX_STL_LIBS -llog -lz -lm -ldl -lc
|
|
||||||
QMAKE_LIBS_X11 =
|
|
||||||
QMAKE_LIBS_THREAD =
|
|
||||||
QMAKE_LIBS_EGL = -lEGL
|
|
||||||
QMAKE_LIBS_OPENGL =
|
|
||||||
QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
|
|
||||||
|
|
||||||
|
|
||||||
!exists($$NDK_ROOT): error("You need to set the ANDROID_NDK_ROOT environment variable to point to your Android NDK.")
|
|
||||||
|
|
||||||
load(qt_config)
|
|
@ -84,7 +84,7 @@ QMAKE_RUN_CXX_IMP_BATCH = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ @<<
|
|||||||
|
|
||||||
QMAKE_LINK = link
|
QMAKE_LINK = link
|
||||||
QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT
|
QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT
|
||||||
QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO
|
QMAKE_LFLAGS_RELEASE = /OPT:REF /INCREMENTAL:NO
|
||||||
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /INCREMENTAL:NO
|
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /INCREMENTAL:NO
|
||||||
QMAKE_LFLAGS_DEBUG = /DEBUG
|
QMAKE_LFLAGS_DEBUG = /DEBUG
|
||||||
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE
|
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:CONSOLE
|
||||||
|
@ -4,29 +4,46 @@ APK_PATH = $$shell_path($$OUT_PWD/android-build/$${TARGET}.apk)
|
|||||||
apk_install_target.depends = first
|
apk_install_target.depends = first
|
||||||
apk_install_target.commands = $(MAKE) -f $(MAKEFILE) INSTALL_ROOT=$$OUT_PWD/android-build install
|
apk_install_target.commands = $(MAKE) -f $(MAKEFILE) INSTALL_ROOT=$$OUT_PWD/android-build install
|
||||||
|
|
||||||
apk.target = apk
|
|
||||||
apk.depends = apk_install_target
|
|
||||||
qtPrepareTool(ANDROIDDEPLOYQT, androiddeployqt)
|
qtPrepareTool(ANDROIDDEPLOYQT, androiddeployqt)
|
||||||
isEmpty(ANDROID_DEPLOYMENT_SETTINGS_FILE): ANDROID_DEPLOYMENT_SETTINGS_FILE = $$OUT_PWD/android-$$TARGET-deployment-settings.json
|
isEmpty(ANDROID_DEPLOYMENT_SETTINGS_FILE): ANDROID_DEPLOYMENT_SETTINGS_FILE = $$OUT_PWD/android-$$TARGET-deployment-settings.json
|
||||||
contains(QMAKE_HOST.os, Windows): extension = .exe
|
contains(QMAKE_HOST.os, Windows): extension = .exe
|
||||||
|
|
||||||
|
apk.target = apk
|
||||||
|
apk.depends = apk_install_target
|
||||||
apk.commands = $$ANDROIDDEPLOYQT --input $$ANDROID_DEPLOYMENT_SETTINGS_FILE --output $$OUT_PWD/android-build --apk $$APK_PATH
|
apk.commands = $$ANDROIDDEPLOYQT --input $$ANDROID_DEPLOYMENT_SETTINGS_FILE --output $$OUT_PWD/android-build --apk $$APK_PATH
|
||||||
|
|
||||||
|
aab.target = aab
|
||||||
|
aab.depends = apk_install_target
|
||||||
|
aab.commands = $$ANDROIDDEPLOYQT --input $$ANDROID_DEPLOYMENT_SETTINGS_FILE --output $$OUT_PWD/android-build --aab --apk $$APK_PATH
|
||||||
} else {
|
} else {
|
||||||
|
prepareRecursiveTarget(aab)
|
||||||
prepareRecursiveTarget(apk)
|
prepareRecursiveTarget(apk)
|
||||||
prepareRecursiveTarget(apk_install_target)
|
prepareRecursiveTarget(apk_install_target)
|
||||||
}
|
}
|
||||||
QMAKE_EXTRA_TARGETS *= apk apk_install_target
|
|
||||||
|
|
||||||
contains(TEMPLATE, ".*app") {
|
build_pass {
|
||||||
!android_app {
|
contains(TEMPLATE, ".*app") {
|
||||||
!contains(TARGET, ".so"): TARGET = lib$${TARGET}.so
|
!android_app {
|
||||||
QMAKE_LFLAGS += -Wl,-soname,$$shell_quote($$TARGET)
|
!contains(TARGET, ".so") {
|
||||||
|
single_arch:TARGET = lib$${TARGET}.so
|
||||||
|
else:TARGET = lib$${TARGET}_$${QT_ARCH}.so
|
||||||
|
}
|
||||||
|
QMAKE_LFLAGS += -Wl,-soname,$$shell_quote($$TARGET)
|
||||||
|
|
||||||
android_install {
|
android_install {
|
||||||
target.path=/libs/$$ANDROID_TARGET_ARCH/
|
target.path=/libs/$$ANDROID_TARGET_ARCH/
|
||||||
INSTALLS *= target
|
INSTALLS *= target
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else: contains(TEMPLATE, "lib"):!static:!QTDIR_build:android_install {
|
||||||
|
target.path = /libs/$$ANDROID_TARGET_ARCH/
|
||||||
|
INSTALLS *= target
|
||||||
}
|
}
|
||||||
} else: contains(TEMPLATE, "lib"):!static:!QTDIR_build:android_install {
|
} else {
|
||||||
target.path = /libs/$$ANDROID_TARGET_ARCH/
|
QMAKE_EXTRA_TARGETS *= aab apk apk_install_target
|
||||||
INSTALLS *= target
|
|
||||||
|
android-build-distclean.commands = \
|
||||||
|
$$QMAKE_DEL_TREE $$shell_quote($$shell_path($$OUT_PWD/android-build))
|
||||||
|
QMAKE_EXTRA_TARGETS *= android-build-distclean
|
||||||
|
CLEAN_DEPS += android-build-distclean
|
||||||
}
|
}
|
||||||
|
@ -17,32 +17,21 @@ contains(TEMPLATE, ".*app"):!build_pass:!android-embedded {
|
|||||||
isEmpty(NDK_ROOT): NDK_ROOT = $$DEFAULT_ANDROID_NDK_ROOT
|
isEmpty(NDK_ROOT): NDK_ROOT = $$DEFAULT_ANDROID_NDK_ROOT
|
||||||
FILE_CONTENT += " \"ndk\": $$emitString($$NDK_ROOT),"
|
FILE_CONTENT += " \"ndk\": $$emitString($$NDK_ROOT),"
|
||||||
|
|
||||||
equals(ANDROID_USE_LLVM, true) {
|
FILE_CONTENT += " \"toolchain-prefix\": \"llvm\","
|
||||||
FILE_CONTENT += " \"toolchain-prefix\": \"llvm\","
|
FILE_CONTENT += " \"tool-prefix\": \"llvm\","
|
||||||
FILE_CONTENT += " \"tool-prefix\": \"llvm\","
|
|
||||||
} else {
|
|
||||||
NDK_TOOLCHAIN_PREFIX = $$(ANDROID_NDK_TOOLCHAIN_PREFIX)
|
|
||||||
isEmpty(NDK_TOOLCHAIN_PREFIX) {
|
|
||||||
equals(ANDROID_TARGET_ARCH, x86): NDK_TOOLCHAIN_PREFIX = x86
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, x86_64): NDK_TOOLCHAIN_PREFIX = x86_64
|
|
||||||
else: equals(ANDROID_TARGET_ARCH, arm64-v8a): NDK_TOOLCHAIN_PREFIX = aarch64-linux-android
|
|
||||||
else: NDK_TOOLCHAIN_PREFIX = arm-linux-androideabi
|
|
||||||
}
|
|
||||||
FILE_CONTENT += " \"toolchain-prefix\": $$emitString($$NDK_TOOLCHAIN_PREFIX),"
|
|
||||||
FILE_CONTENT += " \"tool-prefix\": $$emitString($$NDK_TOOLS_PREFIX),"
|
|
||||||
}
|
|
||||||
|
|
||||||
NDK_TOOLCHAIN_VERSION = $$(ANDROID_NDK_TOOLCHAIN_VERSION)
|
|
||||||
isEmpty(NDK_TOOLCHAIN_VERSION): NDK_TOOLCHAIN_VERSION = $$DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION
|
|
||||||
FILE_CONTENT += " \"toolchain-version\": $$emitString($$NDK_TOOLCHAIN_VERSION),"
|
|
||||||
|
|
||||||
NDK_HOST = $$(ANDROID_NDK_HOST)
|
NDK_HOST = $$(ANDROID_NDK_HOST)
|
||||||
isEmpty(NDK_HOST): NDK_HOST = $$DEFAULT_ANDROID_NDK_HOST
|
isEmpty(NDK_HOST): NDK_HOST = $$DEFAULT_ANDROID_NDK_HOST
|
||||||
FILE_CONTENT += " \"ndk-host\": $$emitString($$NDK_HOST),"
|
FILE_CONTENT += " \"ndk-host\": $$emitString($$NDK_HOST),"
|
||||||
|
|
||||||
ANDROID_TARGET_ARCH = $$(ANDROID_TARGET_ARCH)
|
for (arch, ANDROID_ABIS) {
|
||||||
isEmpty(ANDROID_TARGET_ARCH): ANDROID_TARGET_ARCH = $$DEFAULT_ANDROID_TARGET_ARCH
|
equals(arch, x86): libs_arch = i686-linux-android
|
||||||
FILE_CONTENT += " \"target-architecture\": $$emitString($$ANDROID_TARGET_ARCH),"
|
else: equals(arch, x86_64): libs_arch = x86_64-linux-android
|
||||||
|
else: equals(arch, arm64-v8a): libs_arch = aarch64-linux-android
|
||||||
|
else: libs_arch = arm-linux-androideabi
|
||||||
|
ARCHS += "$$emitString($$arch):$$emitString($$libs_arch)"
|
||||||
|
}
|
||||||
|
FILE_CONTENT += " \"architectures\": {$$join(ARCHS,", ")},"
|
||||||
|
|
||||||
# Explicitly set qt dependencies of application for deployment
|
# Explicitly set qt dependencies of application for deployment
|
||||||
!isEmpty(ANDROID_DEPLOYMENT_DEPENDENCIES): \
|
!isEmpty(ANDROID_DEPLOYMENT_DEPENDENCIES): \
|
||||||
@ -74,13 +63,11 @@ contains(TEMPLATE, ".*app"):!build_pass:!android-embedded {
|
|||||||
QML_ROOT_PATH = $$_PRO_FILE_PWD_
|
QML_ROOT_PATH = $$_PRO_FILE_PWD_
|
||||||
FILE_CONTENT += " \"qml-root-path\": $$emitString($$QML_ROOT_PATH),"
|
FILE_CONTENT += " \"qml-root-path\": $$emitString($$QML_ROOT_PATH),"
|
||||||
FILE_CONTENT += " \"stdcpp-path\": $$emitString($$ANDROID_STDCPP_PATH),"
|
FILE_CONTENT += " \"stdcpp-path\": $$emitString($$ANDROID_STDCPP_PATH),"
|
||||||
FILE_CONTENT += " \"useLLVM\": $$ANDROID_USE_LLVM,"
|
FILE_CONTENT += ""
|
||||||
|
FILE_CONTENT += " \"application-binary\": $$emitString($$TARGET)"
|
||||||
FILE_CONTENT += " \"application-binary\": $$emitString($$absolute_path($$DESTDIR, $$OUT_PWD)/$$TARGET)"
|
|
||||||
FILE_CONTENT += "}"
|
FILE_CONTENT += "}"
|
||||||
|
|
||||||
isEmpty(ANDROID_DEPLOYMENT_SETTINGS_FILE): ANDROID_DEPLOYMENT_SETTINGS_FILE = $$OUT_PWD/android-$$TARGET-deployment-settings.json
|
isEmpty(ANDROID_DEPLOYMENT_SETTINGS_FILE): ANDROID_DEPLOYMENT_SETTINGS_FILE = $$OUT_PWD/android-$$TARGET-deployment-settings.json
|
||||||
|
|
||||||
write_file($$ANDROID_DEPLOYMENT_SETTINGS_FILE, FILE_CONTENT)|error()
|
write_file($$ANDROID_DEPLOYMENT_SETTINGS_FILE, FILE_CONTENT)|error()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
77
mkspecs/features/android/default_pre.prf
Normal file
77
mkspecs/features/android/default_pre.prf
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
load(default_pre)
|
||||||
|
|
||||||
|
build_pass:armeabi-v7a {
|
||||||
|
QT_ARCH = armeabi-v7a
|
||||||
|
} else:build_pass:arm64-v8a {
|
||||||
|
QT_ARCH = arm64-v8a
|
||||||
|
} else:build_pass:x86 {
|
||||||
|
QT_ARCH = x86
|
||||||
|
} else:build_pass:x86_64 {
|
||||||
|
QT_ARCH = x86_64
|
||||||
|
} else {
|
||||||
|
# default architecture
|
||||||
|
QT_ARCH = arm64-v8a
|
||||||
|
}
|
||||||
|
|
||||||
|
DEFAULT_ANDROID_TARGET_ARCH=$${QT_ARCH}
|
||||||
|
|
||||||
|
ANDROID_TARGET_ARCH = $$(ANDROID_TARGET_ARCH)
|
||||||
|
isEmpty(ANDROID_TARGET_ARCH): ANDROID_TARGET_ARCH = $$DEFAULT_ANDROID_TARGET_ARCH
|
||||||
|
|
||||||
|
# Follow https://android.googlesource.com/platform/ndk/+/ndk-release-r20/docs/BuildSystemMaintainers.md
|
||||||
|
|
||||||
|
equals(ANDROID_TARGET_ARCH, armeabi-v7a): \
|
||||||
|
QMAKE_CFLAGS = -target armv7a-linux-androideabi$$replace(ANDROID_PLATFORM, "android-", "")
|
||||||
|
else: equals(ANDROID_TARGET_ARCH, arm64-v8a): \
|
||||||
|
QMAKE_CFLAGS = -target aarch64-linux-android$$replace(ANDROID_PLATFORM, "android-", "")
|
||||||
|
else: equals(ANDROID_TARGET_ARCH, x86): \
|
||||||
|
QMAKE_CFLAGS = -target i686-linux-android$$replace(ANDROID_PLATFORM, "android-", "") -mstackrealign
|
||||||
|
else: equals(ANDROID_TARGET_ARCH, x86_64): \
|
||||||
|
QMAKE_CFLAGS = -target x86_64-linux-android$$replace(ANDROID_PLATFORM, "android-", "")
|
||||||
|
|
||||||
|
QMAKE_CFLAGS += -fno-limit-debug-info
|
||||||
|
|
||||||
|
QMAKE_LINK = $$QMAKE_CXX $$QMAKE_CFLAGS
|
||||||
|
|
||||||
|
ANDROID_STDCPP_PATH = $$NDK_LLVM_PATH/sysroot/usr/lib/
|
||||||
|
|
||||||
|
# -fstack-protector-strong offers good protection against stack smashing attacks.
|
||||||
|
# It is (currently) enabled only on Android because we know for sure that Android compilers supports it
|
||||||
|
QMAKE_CFLAGS += -fPIC -fstack-protector-strong -DANDROID
|
||||||
|
|
||||||
|
|
||||||
|
equals(ANDROID_TARGET_ARCH, armeabi-v7a) | equals(ANDROID_TARGET_ARCH, armeabi) {
|
||||||
|
CONFIG += optimize_size
|
||||||
|
QMAKE_CFLAGS_DEBUG = -g -marm -O0
|
||||||
|
QMAKE_CFLAGS_RELEASE += -mthumb
|
||||||
|
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -mthumb
|
||||||
|
}
|
||||||
|
|
||||||
|
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO
|
||||||
|
|
||||||
|
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
|
||||||
|
QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
|
||||||
|
QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
|
||||||
|
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
|
||||||
|
QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
|
||||||
|
QMAKE_CXXFLAGS_SHLIB = $$QMAKE_CFLAGS_SHLIB
|
||||||
|
QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
|
||||||
|
QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
|
||||||
|
|
||||||
|
QMAKE_LIBS_EGL = -lEGL
|
||||||
|
QMAKE_LIBS_OPENGL_ES2 = -lGLESv2
|
||||||
|
|
||||||
|
QMAKE_STRIP =
|
||||||
|
#$${CROSS_COMPILE}strip
|
||||||
|
|
||||||
|
|
||||||
|
equals(QT_ARCH, x86): CROSS_COMPILE = $$NDK_LLVM_PATH/bin/i686-linux-android-
|
||||||
|
else: equals(QT_ARCH, x86_64): CROSS_COMPILE = $$NDK_LLVM_PATH/bin/x86_64-linux-android-
|
||||||
|
else: equals(QT_ARCH, arm64-v8a): CROSS_COMPILE = $$NDK_LLVM_PATH/bin/aarch64-linux-android-
|
||||||
|
else: CROSS_COMPILE = $$NDK_LLVM_PATH/bin/arm-linux-androideabi-
|
||||||
|
|
||||||
|
QMAKE_RANLIB = $${CROSS_COMPILE}ranlib
|
||||||
|
QMAKE_LINK_SHLIB = $$QMAKE_LINK
|
||||||
|
QMAKE_LFLAGS =
|
||||||
|
|
||||||
|
QMAKE_LIBS_PRIVATE = -llog -lz -lm -ldl -lc
|
10
mkspecs/features/android/resolve_config.prf
Normal file
10
mkspecs/features/android/resolve_config.prf
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
load(resolve_config)
|
||||||
|
|
||||||
|
!equals(TEMPLATE, aux):!host_build:!single_arch:!java:android {
|
||||||
|
isEmpty(ANDROID_ABIS): ANDROID_ABIS = $$ALL_ANDROID_ABIS
|
||||||
|
|
||||||
|
ALL_ABIS = $$join(ANDROID_ABIS, _and_)
|
||||||
|
CONFIG += $$ALL_ABIS build_all
|
||||||
|
addExclusiveBuildsProper($$ALL_ABIS, $$ANDROID_ABIS)
|
||||||
|
unset(ALL_ABIS)
|
||||||
|
}
|
@ -138,8 +138,8 @@ CMAKE_RELEASE_TYPE =
|
|||||||
# the debug libraries at build time.
|
# the debug libraries at build time.
|
||||||
|
|
||||||
equals(QMAKE_HOST.os, Windows): CMAKE_BIN_SUFFIX = ".exe"
|
equals(QMAKE_HOST.os, Windows): CMAKE_BIN_SUFFIX = ".exe"
|
||||||
if(build_all|CONFIG(debug, debug|release)): CMAKE_DEBUG_TYPE = debug
|
if(debug_and_release:build_all)|CONFIG(debug, debug|release): CMAKE_DEBUG_TYPE = debug
|
||||||
if(build_all|CONFIG(release, debug|release)): CMAKE_RELEASE_TYPE = release
|
if(debug_and_release:build_all)|CONFIG(release, debug|release): CMAKE_RELEASE_TYPE = release
|
||||||
|
|
||||||
# CMAKE_DEBUG_AND_RELEASE is used to tell the _populate_$${CMAKE_MODULE_NAME}_target_properties
|
# CMAKE_DEBUG_AND_RELEASE is used to tell the _populate_$${CMAKE_MODULE_NAME}_target_properties
|
||||||
# functions whether a Configuration specific generator expression needs to be added to the values
|
# functions whether a Configuration specific generator expression needs to be added to the values
|
||||||
@ -153,67 +153,109 @@ if(build_all|CONFIG(release, debug|release)): CMAKE_RELEASE_TYPE = release
|
|||||||
# <CONFIG> equivalent to the value specified by CMAKE_BUILD_TYPE.
|
# <CONFIG> equivalent to the value specified by CMAKE_BUILD_TYPE.
|
||||||
# This means that when Qt was built in a Release configuration, and the application in a Debug
|
# This means that when Qt was built in a Release configuration, and the application in a Debug
|
||||||
# configuration, IMPORTED_LOCATION_RELEASE will be used for the Qt libraries.
|
# configuration, IMPORTED_LOCATION_RELEASE will be used for the Qt libraries.
|
||||||
debug_and_release {
|
#
|
||||||
|
# Note that we need to check for the "debug_and_release" feature, and not the CONFIG value, because
|
||||||
|
# the CONFIG value is always set to true on Windows in msvc-desktop.conf disregarding whether the
|
||||||
|
# configure line specified just -debug or just -release.
|
||||||
|
# This also means that if a user configures and builds Qt with -release, and then calls nmake debug
|
||||||
|
# to build debug libraries of Qt, the generated CMake file won't know about debug libraries,
|
||||||
|
# and will always link against the release libraries.
|
||||||
|
qtConfig(debug_and_release) {
|
||||||
CMAKE_DEBUG_AND_RELEASE = TRUE
|
CMAKE_DEBUG_AND_RELEASE = TRUE
|
||||||
} else {
|
} else {
|
||||||
CMAKE_DEBUG_AND_RELEASE = FALSE
|
CMAKE_DEBUG_AND_RELEASE = FALSE
|
||||||
}
|
}
|
||||||
|
|
||||||
contains(CONFIG, plugin) {
|
contains(CONFIG, plugin) {
|
||||||
!isEmpty(PLUGIN_EXTENDS):!equals(PLUGIN_EXTENDS, -) {
|
equals(PLUGIN_EXTENDS, -) {
|
||||||
count(PLUGIN_EXTENDS, 1, greaterThan): \
|
CMAKE_PLUGIN_EXTENDS = -
|
||||||
error("Plugin declares to extend multiple modules. We don't handle that ...")
|
|
||||||
PLUGIN_MODULE_NAME = $$PLUGIN_EXTENDS
|
|
||||||
} else {
|
} else {
|
||||||
PLUGIN_MODULE_NAME =
|
list_plugin_extends =
|
||||||
for (mod, QT_MODULES) {
|
for (p, PLUGIN_EXTENDS) {
|
||||||
contains(QT.$${mod}.plugin_types, $$PLUGIN_TYPE) {
|
m = $$cmakeModuleName($$p)
|
||||||
!isEmpty(PLUGIN_MODULE_NAME): \
|
list_plugin_extends += Qt5::$$m
|
||||||
error("Multiple modules claim plugin type '$$PLUGIN_TYPE' ($$mod, in addition to $$PLUGIN_MODULE_NAME)")
|
|
||||||
PLUGIN_MODULE_NAME = $$mod
|
|
||||||
break()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
isEmpty(PLUGIN_MODULE_NAME): error("No module claims plugin type '$$PLUGIN_TYPE'")
|
CMAKE_PLUGIN_EXTENDS = $$join(list_plugin_extends, ";")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PLUGIN_MODULE_NAME =
|
||||||
|
unique_qt_modules = $$unique(QT_MODULES) # In case modules appear in multiple places
|
||||||
|
for (mod, unique_qt_modules) {
|
||||||
|
contains(QT.$${mod}.plugin_types, $$PLUGIN_TYPE) {
|
||||||
|
!isEmpty(PLUGIN_MODULE_NAME): \
|
||||||
|
error("Multiple modules claim plugin type '$$PLUGIN_TYPE' ($$mod, in addition to $$PLUGIN_MODULE_NAME)")
|
||||||
|
PLUGIN_MODULE_NAME = $$mod
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isEmpty(PLUGIN_MODULE_NAME): error("No module claims plugin type '$$PLUGIN_TYPE'")
|
||||||
|
|
||||||
|
sorted_deps = $$sort_depends(QT_PLUGIN.$${CMAKE_QT_STEM}.DEPENDS, QT.)
|
||||||
|
mod_deps =
|
||||||
|
lib_deps =
|
||||||
|
aux_mod_deps =
|
||||||
|
aux_lib_deps =
|
||||||
|
for (dep, sorted_deps) {
|
||||||
|
cdep = $$cmakeModuleName($$dep)
|
||||||
|
mod_deps += $$cdep
|
||||||
|
lib_deps += Qt5::$$cdep
|
||||||
|
}
|
||||||
|
CMAKE_PLUGIN_MODULE_DEPS = $$join(mod_deps, ";")
|
||||||
|
CMAKE_PLUGIN_QT5_MODULE_DEPS = $$join(lib_deps, ";")
|
||||||
|
|
||||||
CMAKE_MODULE_NAME = $$cmakeModuleName($$PLUGIN_MODULE_NAME)
|
CMAKE_MODULE_NAME = $$cmakeModuleName($$PLUGIN_MODULE_NAME)
|
||||||
|
|
||||||
CMAKE_PLUGIN_NAME = $$PLUGIN_CLASS_NAME
|
CMAKE_PLUGIN_NAME = $$PLUGIN_CLASS_NAME
|
||||||
|
CMAKE_PLUGIN_TYPE = $$PLUGIN_TYPE
|
||||||
|
CMAKE_PLUGIN_TYPE_ESCAPED = $$replace(PLUGIN_TYPE, [-/], _)
|
||||||
|
|
||||||
win32 {
|
win32 {
|
||||||
isEmpty(CMAKE_STATIC_TYPE) {
|
isEmpty(CMAKE_STATIC_TYPE) {
|
||||||
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/$${TARGET}.dll
|
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}.dll
|
||||||
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/$${TARGET}d.dll
|
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}d.dll
|
||||||
|
CMAKE_PRL_FILE_LOCATION_RELEASE = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}.prl
|
||||||
|
CMAKE_PRL_FILE_LOCATION_DEBUG = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}d.prl
|
||||||
} else:mingw {
|
} else:mingw {
|
||||||
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${TARGET}.a
|
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}.a
|
||||||
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${TARGET}d.a
|
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}d.a
|
||||||
|
CMAKE_PRL_FILE_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}.prl
|
||||||
|
CMAKE_PRL_FILE_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}d.prl
|
||||||
} else { # MSVC static
|
} else { # MSVC static
|
||||||
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/$${TARGET}.lib
|
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}.lib
|
||||||
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/$${TARGET}d.lib
|
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}d.lib
|
||||||
|
CMAKE_PRL_FILE_LOCATION_RELEASE = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}.prl
|
||||||
|
CMAKE_PRL_FILE_LOCATION_DEBUG = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}d.prl
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mac {
|
mac {
|
||||||
isEmpty(CMAKE_STATIC_TYPE): CMAKE_PlUGIN_EXT = .dylib
|
isEmpty(CMAKE_STATIC_TYPE): CMAKE_PLUGIN_EXT = .dylib
|
||||||
else: CMAKE_PlUGIN_EXT = .a
|
else: CMAKE_PLUGIN_EXT = .a
|
||||||
|
|
||||||
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${TARGET}$${CMAKE_PlUGIN_EXT}
|
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}$${CMAKE_PLUGIN_EXT}
|
||||||
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${TARGET}$${CMAKE_PlUGIN_EXT}
|
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}_debug$${CMAKE_PLUGIN_EXT}
|
||||||
|
CMAKE_PRL_FILE_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}.prl
|
||||||
|
CMAKE_PRL_FILE_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}_debug.prl
|
||||||
} else {
|
} else {
|
||||||
isEmpty(CMAKE_STATIC_TYPE): CMAKE_PlUGIN_EXT = .so
|
isEmpty(CMAKE_STATIC_TYPE): CMAKE_PLUGIN_EXT = .so
|
||||||
else: CMAKE_PlUGIN_EXT = .a
|
else: CMAKE_PLUGIN_EXT = .a
|
||||||
|
|
||||||
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${TARGET}$${CMAKE_PlUGIN_EXT}
|
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}$${CMAKE_PLUGIN_EXT}
|
||||||
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${TARGET}$${CMAKE_PlUGIN_EXT}
|
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}$${CMAKE_PLUGIN_EXT}
|
||||||
|
CMAKE_PRL_FILE_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}.prl
|
||||||
|
CMAKE_PRL_FILE_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}.prl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cmake_target_file.input = $$PWD/data/cmake/Qt5PluginTarget.cmake.in
|
cmake_target_file.input = $$PWD/data/cmake/Qt5PluginTarget.cmake.in
|
||||||
cmake_target_file.output = $$CMAKE_OUT_DIR/Qt5$${CMAKE_MODULE_NAME}/Qt5$${CMAKE_MODULE_NAME}_$${PLUGIN_CLASS_NAME}.cmake
|
cmake_target_file.output = $$CMAKE_OUT_DIR/Qt5$${CMAKE_MODULE_NAME}/Qt5$${CMAKE_MODULE_NAME}_$${PLUGIN_CLASS_NAME}.cmake
|
||||||
|
cmake_qt5_plugin_import_file.input = $$PWD/data/cmake/Qt5ImportPlugin.cpp.in
|
||||||
|
cmake_qt5_plugin_import_file.output = $$CMAKE_OUT_DIR/Qt5$${CMAKE_MODULE_NAME}/Qt5$${CMAKE_MODULE_NAME}_$${PLUGIN_CLASS_NAME}_Import.cpp
|
||||||
|
|
||||||
!build_pass:QMAKE_SUBSTITUTES += \
|
!build_pass {
|
||||||
cmake_target_file
|
QMAKE_SUBSTITUTES += cmake_target_file
|
||||||
|
static|staticlib: QMAKE_SUBSTITUTES += cmake_qt5_plugin_import_file
|
||||||
|
}
|
||||||
|
|
||||||
cmake_qt5_plugin_file.files = $$cmake_target_file.output
|
cmake_qt5_plugin_file.files = $$cmake_target_file.output
|
||||||
|
static|staticlib: cmake_qt5_plugin_file.files += $$cmake_qt5_plugin_import_file.output
|
||||||
cmake_qt5_plugin_file.path = $$[QT_INSTALL_LIBS]/cmake/Qt5$${CMAKE_MODULE_NAME}
|
cmake_qt5_plugin_file.path = $$[QT_INSTALL_LIBS]/cmake/Qt5$${CMAKE_MODULE_NAME}
|
||||||
INSTALLS += cmake_qt5_plugin_file
|
INSTALLS += cmake_qt5_plugin_file
|
||||||
|
|
||||||
@ -244,6 +286,7 @@ CMAKE_MODULE_DEPS = $$join(mod_deps, ";")
|
|||||||
CMAKE_QT5_MODULE_DEPS = $$join(lib_deps, ";")
|
CMAKE_QT5_MODULE_DEPS = $$join(lib_deps, ";")
|
||||||
CMAKE_INTERFACE_MODULE_DEPS = $$join(aux_mod_deps, ";")
|
CMAKE_INTERFACE_MODULE_DEPS = $$join(aux_mod_deps, ";")
|
||||||
CMAKE_INTERFACE_QT5_MODULE_DEPS = $$join(aux_lib_deps, ";")
|
CMAKE_INTERFACE_QT5_MODULE_DEPS = $$join(aux_lib_deps, ";")
|
||||||
|
CMAKE_MODULE_PLUGIN_TYPES = $$join(QT.$${MODULE}.plugin_types, ";")
|
||||||
|
|
||||||
mac {
|
mac {
|
||||||
!isEmpty(CMAKE_STATIC_TYPE) {
|
!isEmpty(CMAKE_STATIC_TYPE) {
|
||||||
|
@ -317,6 +317,22 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME})
|
|||||||
list(REMOVE_DUPLICATES Qt5$${CMAKE_MODULE_NAME}_EXECUTABLE_COMPILE_FLAGS)
|
list(REMOVE_DUPLICATES Qt5$${CMAKE_MODULE_NAME}_EXECUTABLE_COMPILE_FLAGS)
|
||||||
!!ENDIF // TEMPLATE != aux
|
!!ENDIF // TEMPLATE != aux
|
||||||
|
|
||||||
|
# It can happen that the same FooConfig.cmake file is included when calling find_package()
|
||||||
|
# on some Qt component. An example of that is when using a Qt static build with auto inclusion
|
||||||
|
# of plugins:
|
||||||
|
#
|
||||||
|
# Qt5WidgetsConfig.cmake -> Qt5GuiConfig.cmake -> Qt5Gui_QSvgIconPlugin.cmake ->
|
||||||
|
# Qt5SvgConfig.cmake -> Qt5WidgetsConfig.cmake ->
|
||||||
|
# finish processing of second Qt5WidgetsConfig.cmake ->
|
||||||
|
# return to first Qt5WidgetsConfig.cmake ->
|
||||||
|
# add_library cannot create imported target "Qt5::Widgets".
|
||||||
|
#
|
||||||
|
# Make sure to return early in the original Config inclusion, because the target has already
|
||||||
|
# been defined as part of the second inclusion.
|
||||||
|
if(TARGET Qt5::$${CMAKE_MODULE_NAME})
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
set(_Qt5$${CMAKE_MODULE_NAME}_LIB_DEPENDENCIES \"$${CMAKE_QT5_MODULE_DEPS}\")
|
set(_Qt5$${CMAKE_MODULE_NAME}_LIB_DEPENDENCIES \"$${CMAKE_QT5_MODULE_DEPS}\")
|
||||||
|
|
||||||
!!IF !isEmpty(CMAKE_INTERFACE_QT5_MODULE_DEPS)
|
!!IF !isEmpty(CMAKE_INTERFACE_QT5_MODULE_DEPS)
|
||||||
@ -381,6 +397,8 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME})
|
|||||||
set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} PROPERTY INTERFACE_QT_ENABLED_FEATURES $$join(QT.$${MODULE}.enabled_features, ";"))
|
set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} PROPERTY INTERFACE_QT_ENABLED_FEATURES $$join(QT.$${MODULE}.enabled_features, ";"))
|
||||||
set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} PROPERTY INTERFACE_QT_DISABLED_FEATURES $$join(QT.$${MODULE}.disabled_features, ";"))
|
set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} PROPERTY INTERFACE_QT_DISABLED_FEATURES $$join(QT.$${MODULE}.disabled_features, ";"))
|
||||||
|
|
||||||
|
set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} PROPERTY INTERFACE_QT_PLUGIN_TYPES \"$${CMAKE_MODULE_PLUGIN_TYPES}\")
|
||||||
|
|
||||||
set(_Qt5$${CMAKE_MODULE_NAME}_PRIVATE_DIRS_EXIST TRUE)
|
set(_Qt5$${CMAKE_MODULE_NAME}_PRIVATE_DIRS_EXIST TRUE)
|
||||||
foreach (_Qt5$${CMAKE_MODULE_NAME}_PRIVATE_DIR ${Qt5$${CMAKE_MODULE_NAME}_OWN_PRIVATE_INCLUDE_DIRS})
|
foreach (_Qt5$${CMAKE_MODULE_NAME}_PRIVATE_DIR ${Qt5$${CMAKE_MODULE_NAME}_OWN_PRIVATE_INCLUDE_DIRS})
|
||||||
if (NOT EXISTS ${_Qt5$${CMAKE_MODULE_NAME}_PRIVATE_DIR})
|
if (NOT EXISTS ${_Qt5$${CMAKE_MODULE_NAME}_PRIVATE_DIR})
|
||||||
@ -488,7 +506,8 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME})
|
|||||||
|
|
||||||
file(GLOB pluginTargets \"${CMAKE_CURRENT_LIST_DIR}/Qt5$${CMAKE_MODULE_NAME}_*Plugin.cmake\")
|
file(GLOB pluginTargets \"${CMAKE_CURRENT_LIST_DIR}/Qt5$${CMAKE_MODULE_NAME}_*Plugin.cmake\")
|
||||||
|
|
||||||
macro(_populate_$${CMAKE_MODULE_NAME}_plugin_properties Plugin Configuration PLUGIN_LOCATION)
|
macro(_populate_$${CMAKE_MODULE_NAME}_plugin_properties Plugin Configuration PLUGIN_LOCATION
|
||||||
|
IsDebugAndRelease)
|
||||||
set_property(TARGET Qt5::${Plugin} APPEND PROPERTY IMPORTED_CONFIGURATIONS ${Configuration})
|
set_property(TARGET Qt5::${Plugin} APPEND PROPERTY IMPORTED_CONFIGURATIONS ${Configuration})
|
||||||
|
|
||||||
!!IF isEmpty(CMAKE_PLUGIN_DIR_IS_ABSOLUTE)
|
!!IF isEmpty(CMAKE_PLUGIN_DIR_IS_ABSOLUTE)
|
||||||
@ -500,6 +519,36 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME})
|
|||||||
set_target_properties(Qt5::${Plugin} PROPERTIES
|
set_target_properties(Qt5::${Plugin} PROPERTIES
|
||||||
\"IMPORTED_LOCATION_${Configuration}\" ${imported_location}
|
\"IMPORTED_LOCATION_${Configuration}\" ${imported_location}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
!!IF !isEmpty(CMAKE_STATIC_TYPE)
|
||||||
|
set(_static_deps
|
||||||
|
${_Qt5${Plugin}_STATIC_${Configuration}_LIB_DEPENDENCIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
if(NOT "${IsDebugAndRelease}")
|
||||||
|
set(_genex_condition \"1\")
|
||||||
|
else()
|
||||||
|
if("${Configuration}" STREQUAL "DEBUG")
|
||||||
|
set(_genex_condition \"$<CONFIG:Debug>\")
|
||||||
|
else()
|
||||||
|
set(_genex_condition \"$<NOT:$<CONFIG:Debug>>\")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(_static_deps)
|
||||||
|
set(_static_deps_genex \"$<${_genex_condition}:${_static_deps}>\")
|
||||||
|
set_property(TARGET Qt5::${Plugin} APPEND PROPERTY INTERFACE_LINK_LIBRARIES
|
||||||
|
\"${_static_deps_genex}\"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_static_link_flags \"${_Qt5${Plugin}_STATIC_${Configuration}_LINK_FLAGS}\")
|
||||||
|
if(NOT CMAKE_VERSION VERSION_LESS \"3.13\" AND _static_link_flags)
|
||||||
|
set(_static_link_flags_genex \"$<${_genex_condition}:${_static_link_flags}>\")
|
||||||
|
set_property(TARGET Qt5::${Plugin} APPEND PROPERTY INTERFACE_LINK_OPTIONS
|
||||||
|
\"${_static_link_flags_genex}\"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
!!ENDIF
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
if (pluginTargets)
|
if (pluginTargets)
|
||||||
|
2
mkspecs/features/data/cmake/Qt5ImportPlugin.cpp.in
Normal file
2
mkspecs/features/data/cmake/Qt5ImportPlugin.cpp.in
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#include <QtPlugin>
|
||||||
|
Q_IMPORT_PLUGIN($$CMAKE_PLUGIN_NAME)
|
@ -1,11 +1,102 @@
|
|||||||
|
|
||||||
add_library(Qt5::$$CMAKE_PLUGIN_NAME MODULE IMPORTED)
|
add_library(Qt5::$$CMAKE_PLUGIN_NAME MODULE IMPORTED)
|
||||||
|
|
||||||
|
!!IF !isEmpty(CMAKE_STATIC_TYPE)
|
||||||
|
set(_Qt5$${CMAKE_PLUGIN_NAME}_MODULE_DEPENDENCIES \"$${CMAKE_PLUGIN_MODULE_DEPS}\")
|
||||||
|
|
||||||
|
foreach(_module_dep ${_Qt5$${CMAKE_PLUGIN_NAME}_MODULE_DEPENDENCIES})
|
||||||
|
if(NOT Qt5${_module_dep}_FOUND)
|
||||||
|
find_package(Qt5${_module_dep}
|
||||||
|
$$VERSION ${_Qt5$${CMAKE_MODULE_NAME}_FIND_VERSION_EXACT}
|
||||||
|
${_Qt5$${CMAKE_MODULE_NAME}_DEPENDENCIES_FIND_QUIET}
|
||||||
|
${_Qt5$${CMAKE_MODULE_NAME}_FIND_DEPENDENCIES_REQUIRED}
|
||||||
|
PATHS \"${CMAKE_CURRENT_LIST_DIR}/..\" NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
!!IF !isEmpty(CMAKE_RELEASE_TYPE)
|
!!IF !isEmpty(CMAKE_RELEASE_TYPE)
|
||||||
_populate_$${CMAKE_MODULE_NAME}_plugin_properties($$CMAKE_PLUGIN_NAME RELEASE \"$${CMAKE_PLUGIN_LOCATION_RELEASE}\")
|
!!IF isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE)
|
||||||
|
_qt5_$${CMAKE_MODULE_NAME}_process_prl_file(
|
||||||
|
\"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$${CMAKE_PLUGIN_DIR}$${CMAKE_PRL_FILE_LOCATION_RELEASE}\" RELEASE
|
||||||
|
_Qt5$${CMAKE_PLUGIN_NAME}_STATIC_RELEASE_LIB_DEPENDENCIES
|
||||||
|
_Qt5$${CMAKE_PLUGIN_NAME}_STATIC_RELEASE_LINK_FLAGS
|
||||||
|
)
|
||||||
|
!!ELSE
|
||||||
|
_qt5_$${CMAKE_MODULE_NAME}_process_prl_file(
|
||||||
|
\"$${CMAKE_PLUGIN_DIR}$${CMAKE_PRL_FILE_LOCATION_RELEASE}\" RELEASE
|
||||||
|
_Qt5$${CMAKE_PLUGIN_NAME}_STATIC_RELEASE_LIB_DEPENDENCIES
|
||||||
|
_Qt5$${CMAKE_PLUGIN_NAME}_STATIC_RELEASE_LINK_FLAGS
|
||||||
|
)
|
||||||
|
!!ENDIF
|
||||||
|
!!ENDIF
|
||||||
|
|
||||||
|
!!IF !isEmpty(CMAKE_DEBUG_TYPE)
|
||||||
|
!!IF isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE)
|
||||||
|
_qt5_$${CMAKE_MODULE_NAME}_process_prl_file(
|
||||||
|
\"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$${CMAKE_PLUGIN_DIR}$${CMAKE_PRL_FILE_LOCATION_DEBUG}\" DEBUG
|
||||||
|
_Qt5$${CMAKE_PLUGIN_NAME}_STATIC_DEBUG_LIB_DEPENDENCIES
|
||||||
|
_Qt5$${CMAKE_PLUGIN_NAME}_STATIC_DEBUG_LINK_FLAGS
|
||||||
|
)
|
||||||
|
!!ELSE
|
||||||
|
_qt5_$${CMAKE_MODULE_NAME}_process_prl_file(
|
||||||
|
\"$${CMAKE_PLUGIN_DIR}$${CMAKE_PRL_FILE_LOCATION_DEBUG}\" DEBUG
|
||||||
|
_Qt5$${CMAKE_PLUGIN_NAME}_STATIC_DEBUG_LIB_DEPENDENCIES
|
||||||
|
_Qt5$${CMAKE_PLUGIN_NAME}_STATIC_DEBUG_LINK_FLAGS
|
||||||
|
)
|
||||||
|
!!ENDIF
|
||||||
|
!!ENDIF
|
||||||
|
|
||||||
|
set_property(TARGET Qt5::$$CMAKE_PLUGIN_NAME PROPERTY INTERFACE_SOURCES
|
||||||
|
\"${CMAKE_CURRENT_LIST_DIR}/Qt5$${CMAKE_MODULE_NAME}_$${CMAKE_PLUGIN_NAME}_Import.cpp\"
|
||||||
|
)
|
||||||
|
!!ENDIF
|
||||||
|
|
||||||
|
!!IF !isEmpty(CMAKE_RELEASE_TYPE)
|
||||||
|
_populate_$${CMAKE_MODULE_NAME}_plugin_properties($$CMAKE_PLUGIN_NAME RELEASE \"$${CMAKE_PLUGIN_LOCATION_RELEASE}\" $${CMAKE_DEBUG_AND_RELEASE})
|
||||||
!!ENDIF
|
!!ENDIF
|
||||||
!!IF !isEmpty(CMAKE_DEBUG_TYPE)
|
!!IF !isEmpty(CMAKE_DEBUG_TYPE)
|
||||||
_populate_$${CMAKE_MODULE_NAME}_plugin_properties($$CMAKE_PLUGIN_NAME DEBUG \"$${CMAKE_PLUGIN_LOCATION_DEBUG}\")
|
_populate_$${CMAKE_MODULE_NAME}_plugin_properties($$CMAKE_PLUGIN_NAME DEBUG \"$${CMAKE_PLUGIN_LOCATION_DEBUG}\" $${CMAKE_DEBUG_AND_RELEASE})
|
||||||
!!ENDIF
|
!!ENDIF
|
||||||
|
|
||||||
list(APPEND Qt5$${CMAKE_MODULE_NAME}_PLUGINS Qt5::$$CMAKE_PLUGIN_NAME)
|
list(APPEND Qt5$${CMAKE_MODULE_NAME}_PLUGINS Qt5::$$CMAKE_PLUGIN_NAME)
|
||||||
|
set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} APPEND PROPERTY QT_ALL_PLUGINS_$${CMAKE_PLUGIN_TYPE_ESCAPED} Qt5::$${CMAKE_PLUGIN_NAME})
|
||||||
|
!!IF !isEmpty(CMAKE_STATIC_TYPE)
|
||||||
|
# $<GENEX_EVAL:...> wasn\'t added until CMake 3.12, so put a version guard around it
|
||||||
|
if(CMAKE_VERSION VERSION_LESS \"3.12\")
|
||||||
|
set(_manual_plugins_genex \"$<TARGET_PROPERTY:QT_PLUGINS>\")
|
||||||
|
set(_plugin_type_genex \"$<TARGET_PROPERTY:QT_PLUGINS_$${CMAKE_PLUGIN_TYPE_ESCAPED}>\")
|
||||||
|
set(_no_plugins_genex \"$<TARGET_PROPERTY:QT_NO_PLUGINS>\")
|
||||||
|
else()
|
||||||
|
set(_manual_plugins_genex \"$<GENEX_EVAL:$<TARGET_PROPERTY:QT_PLUGINS>>\")
|
||||||
|
set(_plugin_type_genex \"$<GENEX_EVAL:$<TARGET_PROPERTY:QT_PLUGINS_$${CMAKE_PLUGIN_TYPE_ESCAPED}>>\")
|
||||||
|
set(_no_plugins_genex \"$<GENEX_EVAL:$<TARGET_PROPERTY:QT_NO_PLUGINS>>\")
|
||||||
|
endif()
|
||||||
|
set(_user_specified_genex
|
||||||
|
\"$<IN_LIST:Qt5::$$CMAKE_PLUGIN_NAME,${_manual_plugins_genex};${_plugin_type_genex}>\"
|
||||||
|
)
|
||||||
|
string(CONCAT _plugin_genex
|
||||||
|
\"$<$<OR:\"
|
||||||
|
# Add this plugin if it\'s in the list of manual plugins or plugins for the type
|
||||||
|
\"${_user_specified_genex},\"
|
||||||
|
# Add this plugin if the list of plugins for the type is empty, the PLUGIN_EXTENDS
|
||||||
|
# is either empty or equal to the module name, and the user hasn\'t blacklisted it
|
||||||
|
\"$<AND:\"
|
||||||
|
\"$<STREQUAL:${_plugin_type_genex},>,\"
|
||||||
|
\"$<OR:\"
|
||||||
|
\"$<STREQUAL:$<TARGET_PROPERTY:Qt5::$${CMAKE_PLUGIN_NAME},QT_PLUGIN_EXTENDS>,Qt5::$${CMAKE_MODULE_NAME}>,\"
|
||||||
|
\"$<STREQUAL:$<TARGET_PROPERTY:Qt5::$${CMAKE_PLUGIN_NAME},QT_PLUGIN_EXTENDS>,>\"
|
||||||
|
\">,\"
|
||||||
|
\"$<NOT:$<IN_LIST:Qt5::$${CMAKE_PLUGIN_NAME},${_no_plugins_genex}>>\"
|
||||||
|
\">\"
|
||||||
|
\">:Qt5::$$CMAKE_PLUGIN_NAME>\"
|
||||||
|
)
|
||||||
|
set_property(TARGET Qt5::$${CMAKE_MODULE_NAME} APPEND PROPERTY INTERFACE_LINK_LIBRARIES
|
||||||
|
${_plugin_genex}
|
||||||
|
)
|
||||||
|
set_property(TARGET Qt5::$${CMAKE_PLUGIN_NAME} APPEND PROPERTY INTERFACE_LINK_LIBRARIES
|
||||||
|
\"$${CMAKE_PLUGIN_QT5_MODULE_DEPS}\"
|
||||||
|
)
|
||||||
|
!!ENDIF
|
||||||
|
set_property(TARGET Qt5::$${CMAKE_PLUGIN_NAME} PROPERTY QT_PLUGIN_TYPE \"$$CMAKE_PLUGIN_TYPE\")
|
||||||
|
set_property(TARGET Qt5::$${CMAKE_PLUGIN_NAME} PROPERTY QT_PLUGIN_EXTENDS \"$$CMAKE_PLUGIN_EXTENDS\")
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
|
|
||||||
|
load(qt_functions)
|
||||||
|
|
||||||
contains(TEMPLATE, subdirs) {
|
contains(TEMPLATE, subdirs) {
|
||||||
for(build, QMAKE_EXCLUSIVE_BUILDS) {
|
for(build, QMAKE_EXCLUSIVE_BUILDS) {
|
||||||
prepareRecursiveTarget($$build)
|
prepareRecursiveTarget($$build)
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
load(default_post)
|
load(default_post)
|
||||||
|
|
||||||
|
# Recompute SDK version in case the user set it explicitly
|
||||||
|
sdk_version = $$QMAKE_MAC_SDK_VERSION
|
||||||
|
QMAKE_MAC_SDK_VERSION = $$xcodeSDKInfo(SDKVersion)
|
||||||
|
|
||||||
contains(TEMPLATE, .*app) {
|
contains(TEMPLATE, .*app) {
|
||||||
!macx-xcode:if(isEmpty(BUILDS)|build_pass) {
|
!macx-xcode:if(isEmpty(BUILDS)|build_pass) {
|
||||||
# Detect changes to the platform SDK
|
# Detect changes to the platform SDK
|
||||||
@ -14,7 +18,7 @@ contains(TEMPLATE, .*app) {
|
|||||||
|
|
||||||
!versionAtLeast(QMAKE_MAC_SDK_VERSION, $$QT_MAC_SDK_VERSION_MIN): \
|
!versionAtLeast(QMAKE_MAC_SDK_VERSION, $$QT_MAC_SDK_VERSION_MIN): \
|
||||||
warning("Qt requires at least version $$QT_MAC_SDK_VERSION_MIN of the platform SDK," \
|
warning("Qt requires at least version $$QT_MAC_SDK_VERSION_MIN of the platform SDK," \
|
||||||
"you're using $${QMAKE_MAC_SDK_VERSION}. Please upgrade.")
|
"you're building against version $${QMAKE_MAC_SDK_VERSION}. Please upgrade.")
|
||||||
|
|
||||||
!isEmpty(QT_MAC_SDK_VERSION_MAX) {
|
!isEmpty(QT_MAC_SDK_VERSION_MAX) {
|
||||||
# For Qt developers only
|
# For Qt developers only
|
||||||
@ -244,6 +248,11 @@ macx-xcode {
|
|||||||
QMAKE_PCH_OUTPUT_EXT = _${QMAKE_PCH_ARCH}$${QMAKE_PCH_OUTPUT_EXT}
|
QMAKE_PCH_OUTPUT_EXT = _${QMAKE_PCH_ARCH}$${QMAKE_PCH_OUTPUT_EXT}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
!equals(sdk_version, $$QMAKE_MAC_SDK_VERSION) {
|
||||||
|
# Explicit SDK version has been set, respect that
|
||||||
|
QMAKE_LFLAGS += -Wl,-sdk_version -Wl,$$sdk_version
|
||||||
|
}
|
||||||
|
|
||||||
cache(QMAKE_XCODE_DEVELOPER_PATH, stash)
|
cache(QMAKE_XCODE_DEVELOPER_PATH, stash)
|
||||||
!isEmpty(QMAKE_XCODE_VERSION): \
|
!isEmpty(QMAKE_XCODE_VERSION): \
|
||||||
cache(QMAKE_XCODE_VERSION, stash)
|
cache(QMAKE_XCODE_VERSION, stash)
|
||||||
@ -261,7 +270,7 @@ xcode_product_bundle_identifier_setting.value = "$${xcode_product_bundle_identif
|
|||||||
QMAKE_MAC_XCODE_SETTINGS += xcode_product_bundle_identifier_setting
|
QMAKE_MAC_XCODE_SETTINGS += xcode_product_bundle_identifier_setting
|
||||||
|
|
||||||
!macx-xcode {
|
!macx-xcode {
|
||||||
generate_xcode_project.commands = @$(QMAKE) -spec macx-xcode $(EXPORT__PRO_FILE_)
|
generate_xcode_project.commands = @$(QMAKE) -spec macx-xcode $(EXPORT__PRO_FILE_) $$QMAKE_ARGS
|
||||||
generate_xcode_project.target = xcodeproj
|
generate_xcode_project.target = xcodeproj
|
||||||
QMAKE_EXTRA_VARIABLES += _PRO_FILE_
|
QMAKE_EXTRA_VARIABLES += _PRO_FILE_
|
||||||
QMAKE_EXTRA_TARGETS += generate_xcode_project
|
QMAKE_EXTRA_TARGETS += generate_xcode_project
|
||||||
|
@ -22,7 +22,11 @@ for(ever) {
|
|||||||
!defined(QMAKE_LIBS_$$nu, var): \
|
!defined(QMAKE_LIBS_$$nu, var): \
|
||||||
error("Library '$$lower($$replace(nu, _, -))' is not defined.")
|
error("Library '$$lower($$replace(nu, _, -))' is not defined.")
|
||||||
|
|
||||||
debug: \
|
android {
|
||||||
|
ABI_LIBS = $$eval(QMAKE_LIBS_$${nu}_$${QT_ARCH})
|
||||||
|
isEmpty(ABI_LIBS): ABI_LIBS = $$eval(QMAKE_LIBS_$${nu})
|
||||||
|
LIBS$${suffix} += $$ABI_LIBS
|
||||||
|
} else: debug: \
|
||||||
LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_DEBUG) $$eval(QMAKE_LIBS_$$nu)
|
LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_DEBUG) $$eval(QMAKE_LIBS_$$nu)
|
||||||
else: \
|
else: \
|
||||||
LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_RELEASE) $$eval(QMAKE_LIBS_$$nu)
|
LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_RELEASE) $$eval(QMAKE_LIBS_$$nu)
|
||||||
|
@ -52,15 +52,26 @@ builtin_resources {
|
|||||||
qmldir.base = $$qmldir_path
|
qmldir.base = $$qmldir_path
|
||||||
qmldir.files = $$qmldir_file
|
qmldir.files = $$qmldir_file
|
||||||
qmldir.path = $$[QT_INSTALL_QML]/$$TARGETPATH
|
qmldir.path = $$[QT_INSTALL_QML]/$$TARGETPATH
|
||||||
INSTALLS += qmldir
|
|
||||||
|
|
||||||
qmlfiles.base = $$_PRO_FILE_PWD_
|
qmlfiles.base = $$_PRO_FILE_PWD_
|
||||||
qmlfiles.files = $$fq_aux_qml_files
|
qmlfiles.files = $$fq_aux_qml_files
|
||||||
install_qml_files: qmlfiles.files += $$fq_qml_files
|
install_qml_files: qmlfiles.files += $$fq_qml_files
|
||||||
qmlfiles.path = $${qmldir.path}
|
qmlfiles.path = $${qmldir.path}
|
||||||
INSTALLS += qmlfiles
|
|
||||||
|
|
||||||
!debug_and_release|!build_all|CONFIG(release, debug|release) {
|
INSTALL_QML_FILES = false
|
||||||
|
|
||||||
|
android {
|
||||||
|
build_pass {
|
||||||
|
isEmpty(ANDROID_ABIS): ANDROID_ABIS = $$ALL_ANDROID_ABIS
|
||||||
|
ABI = $$first(ANDROID_ABIS)
|
||||||
|
equals(ABI, $$QT_ARCH): INSTALL_QML_FILES = true
|
||||||
|
}
|
||||||
|
} else: !debug_and_release|!build_all|CONFIG(release, debug|release): INSTALL_QML_FILES = true
|
||||||
|
|
||||||
|
equals(INSTALL_QML_FILES, true) {
|
||||||
|
INSTALLS += qmldir
|
||||||
|
INSTALLS += qmlfiles
|
||||||
|
|
||||||
!prefix_build {
|
!prefix_build {
|
||||||
COPIES += qmldir qmlfiles
|
COPIES += qmldir qmlfiles
|
||||||
} else {
|
} else {
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
ANDROID_DEPENDS_DIR = $$MODULE_BASE_OUTDIR/lib/
|
ANDROID_DEPENDS_DIR = $$MODULE_BASE_OUTDIR/lib/
|
||||||
DEPENDENCY_FILE = $$ANDROID_DEPENDS_DIR$$TARGET-android-dependencies.xml
|
DEPENDENCY_FILE = $$ANDROID_DEPENDS_DIR$$TARGET-android-dependencies.xml
|
||||||
|
|
||||||
!build_pass {
|
build_pass:!isEmpty(QT_ARCH): {
|
||||||
!isEmpty(MODULE_PLUGIN_TYPES) {
|
!isEmpty(MODULE_PLUGIN_TYPES) {
|
||||||
for(PLUGIN_TYPE, MODULE_PLUGIN_TYPES) {
|
for(PLUGIN_TYPE, MODULE_PLUGIN_TYPES) {
|
||||||
ANDROID_BUNDLED_FILES += "plugins/$$PLUGIN_TYPE"
|
ANDROID_BUNDLED_FILES += "plugins/$$PLUGIN_TYPE"
|
||||||
@ -46,6 +46,8 @@ DEPENDENCY_FILE = $$ANDROID_DEPENDS_DIR$$TARGET-android-dependencies.xml
|
|||||||
EXTENDS = $$section(LIB_FILE, ":", 1, 1)
|
EXTENDS = $$section(LIB_FILE, ":", 1, 1)
|
||||||
!isEmpty(EXTENDS): EXTENDS = "extends=\"$$EXTENDS\""
|
!isEmpty(EXTENDS): EXTENDS = "extends=\"$$EXTENDS\""
|
||||||
LIB_FILE = $$section(LIB_FILE, ":", 0, 0)
|
LIB_FILE = $$section(LIB_FILE, ":", 0, 0)
|
||||||
|
LIB_FILE = $$replace(LIB_FILE,".so", "_$${QT_ARCH}.so")
|
||||||
|
!isEmpty(EXTENDS): EXTENDS = $$replace(EXTENDS,".so", "_$${QT_ARCH}.so")
|
||||||
FILE_CONTENT += "<lib file=\"$$LIB_FILE\" $$EXTENDS />"
|
FILE_CONTENT += "<lib file=\"$$LIB_FILE\" $$EXTENDS />"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -54,12 +56,14 @@ DEPENDENCY_FILE = $$ANDROID_DEPENDS_DIR$$TARGET-android-dependencies.xml
|
|||||||
for(REPLACEMENT, ANDROID_LIB_DEPENDENCY_REPLACEMENTS) {
|
for(REPLACEMENT, ANDROID_LIB_DEPENDENCY_REPLACEMENTS) {
|
||||||
REPLACEMENT_FILE = $$section(REPLACEMENT, ":", 0, 0)
|
REPLACEMENT_FILE = $$section(REPLACEMENT, ":", 0, 0)
|
||||||
LIB_FILE = $$section(REPLACEMENT, ":", 1, 1)
|
LIB_FILE = $$section(REPLACEMENT, ":", 1, 1)
|
||||||
|
REPLACEMENT_FILE = $$replace(REPLACEMENT_FILE,".so", "_$${QT_ARCH}.so")
|
||||||
FILE_CONTENT += "<lib file=\"$$LIB_FILE\" replaces=\"$$REPLACEMENT_FILE\" />"
|
FILE_CONTENT += "<lib file=\"$$LIB_FILE\" replaces=\"$$REPLACEMENT_FILE\" />"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
!isEmpty(ANDROID_BUNDLED_FILES) {
|
!isEmpty(ANDROID_BUNDLED_FILES) {
|
||||||
for (BUNDLED_FILE, ANDROID_BUNDLED_FILES) {
|
for (BUNDLED_FILE, ANDROID_BUNDLED_FILES) {
|
||||||
|
BUNDLED_FILE = $$replace(BUNDLED_FILE,".so", "_$${QT_ARCH}.so")
|
||||||
FILE_CONTENT += "<bundled file=\"$$BUNDLED_FILE\" />"
|
FILE_CONTENT += "<bundled file=\"$$BUNDLED_FILE\" />"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -108,6 +108,10 @@ macos: CONFIG += testcase_no_bundle
|
|||||||
# Override MinGW's definition in _mingw.h
|
# Override MinGW's definition in _mingw.h
|
||||||
mingw: DEFINES += WINVER=0x0601 _WIN32_WINNT=0x0601
|
mingw: DEFINES += WINVER=0x0601 _WIN32_WINNT=0x0601
|
||||||
|
|
||||||
|
# By default, the following features should not be used in Qt's own
|
||||||
|
# implementation, so declare them invisible to Qt modules.
|
||||||
|
DEFINES += QT_NO_LINKED_LIST # QLinkedList
|
||||||
|
|
||||||
defineTest(qtBuildPart) {
|
defineTest(qtBuildPart) {
|
||||||
bp = $$eval($$upper($$section(_QMAKE_CONF_, /, -2, -2))_BUILD_PARTS)
|
bp = $$eval($$upper($$section(_QMAKE_CONF_, /, -2, -2))_BUILD_PARTS)
|
||||||
isEmpty(bp): bp = $$QT_BUILD_PARTS
|
isEmpty(bp): bp = $$QT_BUILD_PARTS
|
||||||
|
@ -560,7 +560,7 @@ defineTest(qtConfResolveLibs) {
|
|||||||
} else {
|
} else {
|
||||||
paths += $$lp
|
paths += $$lp
|
||||||
}
|
}
|
||||||
} else: contains(l, "^-l.*") {
|
} else: !android: contains(l, "^-l.*") {
|
||||||
lib = $$replace(l, "^-l", )
|
lib = $$replace(l, "^-l", )
|
||||||
lcan =
|
lcan =
|
||||||
integrity:contains(lib, "^.*\\.a") {
|
integrity:contains(lib, "^.*\\.a") {
|
||||||
@ -1905,8 +1905,11 @@ defineTest(qtConfCreateReportRecurse) {
|
|||||||
entry = $${1}.$$n
|
entry = $${1}.$$n
|
||||||
subKeys = $$eval($${entry}._KEYS_)
|
subKeys = $$eval($${entry}._KEYS_)
|
||||||
contains(subKeys, condition) {
|
contains(subKeys, condition) {
|
||||||
condition = $$eval($${entry}.condition)
|
r = true
|
||||||
r = $$qtConfEvaluate($$condition)
|
for (condition, $$qtConfScalarOrList($${entry}.condition)) {
|
||||||
|
r = $$qtConfEvaluate($$condition)
|
||||||
|
!$$r: break()
|
||||||
|
}
|
||||||
!qtConfIsBoolean($$r): \
|
!qtConfIsBoolean($$r): \
|
||||||
error("Evaluation of condition '$$condition' in report entry $${entry} yielded non-boolean value '$$r'.")
|
error("Evaluation of condition '$$condition' in report entry $${entry} yielded non-boolean value '$$r'.")
|
||||||
!$$r: next()
|
!$$r: next()
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
|
|
||||||
defineReplace(qtPlatformTargetSuffix) {
|
defineReplace(qtPlatformTargetSuffix) {
|
||||||
suffix =
|
suffix =
|
||||||
CONFIG(debug, debug|release) {
|
android: return($${suffix}_$${QT_ARCH})
|
||||||
|
else: CONFIG(debug, debug|release) {
|
||||||
!debug_and_release|build_pass {
|
!debug_and_release|build_pass {
|
||||||
mac: return($${suffix}_debug)
|
mac: return($${suffix}_debug)
|
||||||
win32: return($${suffix}d)
|
win32: return($${suffix}d)
|
||||||
|
@ -29,19 +29,19 @@ DLLDESTDIR = $$MODULE_BASE_OUTDIR/bin
|
|||||||
|
|
||||||
THE_TARGET = $$qt5LibraryTarget($$TARGET)
|
THE_TARGET = $$qt5LibraryTarget($$TARGET)
|
||||||
|
|
||||||
!build_pass {
|
MODULE = $$replace(TARGET, ^qt, )
|
||||||
MODULE = $$replace(TARGET, ^qt, )
|
MODULE ~= s,-,_,
|
||||||
MODULE ~= s,-,_,
|
MODULE_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules/qt_ext_$${MODULE}.pri
|
||||||
MODULE_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules/qt_ext_$${MODULE}.pri
|
ucmodule = $$upper($$MODULE)
|
||||||
ucmodule = $$upper($$MODULE)
|
win32|CONFIG(static, static|shared) {
|
||||||
|
prefix = $$QMAKE_PREFIX_STATICLIB
|
||||||
|
suffix = $$QMAKE_EXTENSION_STATICLIB
|
||||||
|
} else {
|
||||||
|
prefix = $$QMAKE_PREFIX_SHLIB
|
||||||
|
suffix = $$QMAKE_EXTENSION_SHLIB
|
||||||
|
}
|
||||||
|
|
||||||
win32|CONFIG(static, static|shared) {
|
!build_pass {
|
||||||
prefix = $$QMAKE_PREFIX_STATICLIB
|
|
||||||
suffix = $$QMAKE_EXTENSION_STATICLIB
|
|
||||||
} else {
|
|
||||||
prefix = $$QMAKE_PREFIX_SHLIB
|
|
||||||
suffix = $$QMAKE_EXTENSION_SHLIB
|
|
||||||
}
|
|
||||||
CC_USES =
|
CC_USES =
|
||||||
LD_USES =
|
LD_USES =
|
||||||
for (use, QMAKE_USE) {
|
for (use, QMAKE_USE) {
|
||||||
@ -58,7 +58,9 @@ THE_TARGET = $$qt5LibraryTarget($$TARGET)
|
|||||||
"QMAKE_DEPENDS_$${ucmodule}_LD =$$join(LD_USES, " ", " ")" \
|
"QMAKE_DEPENDS_$${ucmodule}_LD =$$join(LD_USES, " ", " ")" \
|
||||||
"QMAKE_INCDIR_$${ucmodule} = $$val_escape(MODULE_INCLUDEPATH)" \
|
"QMAKE_INCDIR_$${ucmodule} = $$val_escape(MODULE_INCLUDEPATH)" \
|
||||||
"QMAKE_DEFINES_$${ucmodule} = $$val_escape(MODULE_DEFINES)"
|
"QMAKE_DEFINES_$${ucmodule} = $$val_escape(MODULE_DEFINES)"
|
||||||
debug_and_release {
|
android {
|
||||||
|
MODULE_PRI_CONT += "QMAKE_LIBS_$${ucmodule} ="
|
||||||
|
} else: debug_and_release {
|
||||||
win32: \
|
win32: \
|
||||||
MODULE_DEBUG_LIBS = $$DESTDIR/$$prefix$${TARGET}d.$$suffix
|
MODULE_DEBUG_LIBS = $$DESTDIR/$$prefix$${TARGET}d.$$suffix
|
||||||
else: darwin: \
|
else: darwin: \
|
||||||
@ -76,6 +78,11 @@ THE_TARGET = $$qt5LibraryTarget($$TARGET)
|
|||||||
"QMAKE_LIBS_$${ucmodule} = $$val_escape(MODULE_LIBS)"
|
"QMAKE_LIBS_$${ucmodule} = $$val_escape(MODULE_LIBS)"
|
||||||
}
|
}
|
||||||
write_file($$MODULE_PRI, MODULE_PRI_CONT)|error()
|
write_file($$MODULE_PRI, MODULE_PRI_CONT)|error()
|
||||||
|
} else: android {
|
||||||
|
ABI_TARGET = $$qt5LibraryTarget($$TARGET)
|
||||||
|
ABI_MODULE_LIBS = $$DESTDIR/$$prefix$${ABI_TARGET}.$$suffix
|
||||||
|
MODULE_PRI_CONT = "QMAKE_LIBS_$${ucmodule}_$${QT_ARCH} = $$val_escape(ABI_MODULE_LIBS)"
|
||||||
|
write_file($$MODULE_PRI, MODULE_PRI_CONT, append)|error()
|
||||||
}
|
}
|
||||||
|
|
||||||
TARGET = $$THE_TARGET
|
TARGET = $$THE_TARGET
|
||||||
|
@ -93,7 +93,7 @@ header_module {
|
|||||||
DESTDIR = $$MODULE_BASE_OUTDIR/lib
|
DESTDIR = $$MODULE_BASE_OUTDIR/lib
|
||||||
DLLDESTDIR = $$MODULE_BASE_OUTDIR/bin
|
DLLDESTDIR = $$MODULE_BASE_OUTDIR/bin
|
||||||
|
|
||||||
CONFIG += qmake_cache target_qt
|
CONFIG += target_qt
|
||||||
|
|
||||||
QMAKE_DOCS_TARGETDIR = qt$${MODULE}
|
QMAKE_DOCS_TARGETDIR = qt$${MODULE}
|
||||||
|
|
||||||
|
@ -51,13 +51,12 @@ defineReplace(qtGetExportsForModule) {
|
|||||||
return($$result)
|
return($$result)
|
||||||
}
|
}
|
||||||
|
|
||||||
defineReplace(qtExportLibsForModule) {
|
defineReplace(qtExportDepsForModule) {
|
||||||
result =
|
result =
|
||||||
for (lib, QT.$${1}.libraries) {
|
for (lib, QT.$${1}.libraries) {
|
||||||
NAME = $$upper($$lib)
|
NAME = $$upper($$lib)
|
||||||
vars = \
|
vars = \
|
||||||
QMAKE_DEPENDS_$${NAME}_CC QMAKE_DEPENDS_$${NAME}_LD \
|
QMAKE_DEPENDS_$${NAME}_CC QMAKE_DEPENDS_$${NAME}_LD \
|
||||||
QMAKE_LIBS_$$NAME QMAKE_LIBS_$${NAME}_DEBUG QMAKE_LIBS_$${NAME}_RELEASE \
|
|
||||||
QMAKE_DEFINES_$$NAME QMAKE_INCDIR_$$NAME
|
QMAKE_DEFINES_$$NAME QMAKE_INCDIR_$$NAME
|
||||||
for (var, vars) {
|
for (var, vars) {
|
||||||
expvar = $$var
|
expvar = $$var
|
||||||
@ -71,6 +70,24 @@ defineReplace(qtExportLibsForModule) {
|
|||||||
return($$result)
|
return($$result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defineReplace(qtExportLibsForModule) {
|
||||||
|
result =
|
||||||
|
for (lib, QT.$${1}.libraries) {
|
||||||
|
NAME = $$upper($$lib)
|
||||||
|
vars = \
|
||||||
|
QMAKE_LIBS_$$NAME QMAKE_LIBS_$${NAME}_DEBUG QMAKE_LIBS_$${NAME}_RELEASE
|
||||||
|
for (var, vars) {
|
||||||
|
expvar = $$var
|
||||||
|
expvar ~= s/^QMAKE_/QMAKE_EXPORT_/
|
||||||
|
defined($$expvar, var):equals($$expvar, -): next()
|
||||||
|
!defined($$expvar, var): expvar = $$var
|
||||||
|
defined($$expvar, var): \
|
||||||
|
result += "$$var$${2} = $$val_escape($$expvar)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return($$result)
|
||||||
|
}
|
||||||
|
|
||||||
!build_pass {
|
!build_pass {
|
||||||
|
|
||||||
# Create a module .pri file
|
# Create a module .pri file
|
||||||
@ -160,6 +177,7 @@ defineReplace(qtExportLibsForModule) {
|
|||||||
"QT.$${MODULE}_private.module_config =$$join(module_build_type, " ", " ")" \
|
"QT.$${MODULE}_private.module_config =$$join(module_build_type, " ", " ")" \
|
||||||
$$qtGetFeaturesForModule($${MODULE}_private) \
|
$$qtGetFeaturesForModule($${MODULE}_private) \
|
||||||
"" \
|
"" \
|
||||||
|
$$qtExportDepsForModule($${MODULE}_private) \
|
||||||
$$qtExportLibsForModule($${MODULE}_private)
|
$$qtExportLibsForModule($${MODULE}_private)
|
||||||
write_file($$MODULE_PRIVATE_PRI, MODULE_PRIVATE_PRI_CONT)|error()
|
write_file($$MODULE_PRIVATE_PRI, MODULE_PRIVATE_PRI_CONT)|error()
|
||||||
}
|
}
|
||||||
@ -220,7 +238,10 @@ defineReplace(qtExportLibsForModule) {
|
|||||||
}
|
}
|
||||||
cache(QT_MODULES, transient)
|
cache(QT_MODULES, transient)
|
||||||
|
|
||||||
} # !build_pass
|
} else:android:!no_private_module:!internal_module {
|
||||||
|
MODULE_PRIVATE_PRI_CONT = $$qtExportLibsForModule($${MODULE}_private, _$${QT_ARCH})
|
||||||
|
write_file($$MODULE_PRIVATE_PRI, MODULE_PRIVATE_PRI_CONT, append)|error()
|
||||||
|
}
|
||||||
|
|
||||||
# Schedule the regular .pri file for installation
|
# Schedule the regular .pri file for installation
|
||||||
CONFIG += qt_install_module
|
CONFIG += qt_install_module
|
||||||
|
@ -14,6 +14,8 @@ load(device_config)
|
|||||||
QMAKE_CFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES
|
QMAKE_CFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES
|
||||||
QMAKE_CXXFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES
|
QMAKE_CXXFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES
|
||||||
QMAKE_LFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES
|
QMAKE_LFLAGS += -s WASM_OBJECT_FILES=$$WASM_OBJECT_FILES
|
||||||
|
} else {
|
||||||
|
EMCC_COMMON_LFLAGS += -s \"BINARYEN_TRAP_MODE=\'clamp\'\"
|
||||||
}
|
}
|
||||||
|
|
||||||
EMTERP_FLAGS = \
|
EMTERP_FLAGS = \
|
||||||
@ -29,8 +31,7 @@ EMCC_COMMON_LFLAGS = \
|
|||||||
-s USE_WEBGL2=1 \
|
-s USE_WEBGL2=1 \
|
||||||
-s NO_EXIT_RUNTIME=0 \
|
-s NO_EXIT_RUNTIME=0 \
|
||||||
-s ERROR_ON_UNDEFINED_SYMBOLS=1 \
|
-s ERROR_ON_UNDEFINED_SYMBOLS=1 \
|
||||||
--bind \
|
--bind
|
||||||
-s \"BINARYEN_TRAP_MODE=\'clamp\'\"
|
|
||||||
|
|
||||||
# The -s arguments can also be used with release builds,
|
# The -s arguments can also be used with release builds,
|
||||||
# but are here in debug for clarity.
|
# but are here in debug for clarity.
|
||||||
|
@ -39,6 +39,11 @@ QMAKE_CXXFLAGS += -Wno-microsoft-enum-value
|
|||||||
QMAKE_LINK = lld-link
|
QMAKE_LINK = lld-link
|
||||||
QMAKE_LIB = llvm-lib /NOLOGO
|
QMAKE_LIB = llvm-lib /NOLOGO
|
||||||
|
|
||||||
|
QMAKE_CXXFLAGS_CXX11 = -std:c++11
|
||||||
|
QMAKE_CXXFLAGS_CXX14 = -std:c++14
|
||||||
|
QMAKE_CXXFLAGS_CXX1Z = -std:c++17
|
||||||
|
QMAKE_CXXFLAGS_CXX2A = -std:c++latest
|
||||||
|
|
||||||
QMAKE_CFLAGS_LTCG = -flto=thin
|
QMAKE_CFLAGS_LTCG = -flto=thin
|
||||||
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
|
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
|
||||||
QMAKE_CFLAGS_LTCG_FATOBJECTS = -flto
|
QMAKE_CFLAGS_LTCG_FATOBJECTS = -flto
|
||||||
@ -49,6 +54,4 @@ QMAKE_LFLAGS_LTCG =
|
|||||||
QMAKE_CFLAGS_OPTIMIZE_SIZE = /clang:-Oz
|
QMAKE_CFLAGS_OPTIMIZE_SIZE = /clang:-Oz
|
||||||
QMAKE_CFLAGS_OPTIMIZE_FULL = /clang:-O3
|
QMAKE_CFLAGS_OPTIMIZE_FULL = /clang:-O3
|
||||||
|
|
||||||
QMAKE_LFLAGS_RELEASE += /OPT:REF,ICF,LBR
|
|
||||||
|
|
||||||
load(qt_config)
|
load(qt_config)
|
||||||
|
@ -28,6 +28,7 @@ QOBJS = \
|
|||||||
qmetatype.o qsystemerror.o qvariant.o \
|
qmetatype.o qsystemerror.o qvariant.o \
|
||||||
quuid.o \
|
quuid.o \
|
||||||
qarraydata.o qbitarray.o qbytearray.o qbytearraymatcher.o \
|
qarraydata.o qbitarray.o qbytearray.o qbytearraymatcher.o \
|
||||||
|
qcalendar.o qgregoriancalendar.o qromancalendar.o \
|
||||||
qcryptographichash.o qdatetime.o qhash.o qlist.o \
|
qcryptographichash.o qdatetime.o qhash.o qlist.o \
|
||||||
qlocale.o qlocale_tools.o qmap.o qregexp.o qringbuffer.o \
|
qlocale.o qlocale_tools.o qmap.o qregexp.o qringbuffer.o \
|
||||||
qstringbuilder.o qstring.o qstringlist.o qversionnumber.o \
|
qstringbuilder.o qstring.o qstringlist.o qversionnumber.o \
|
||||||
@ -114,7 +115,10 @@ DEPEND_SRC = \
|
|||||||
$(SOURCE_PATH)/src/corelib/text/qstring.cpp \
|
$(SOURCE_PATH)/src/corelib/text/qstring.cpp \
|
||||||
$(SOURCE_PATH)/src/corelib/text/qstringlist.cpp \
|
$(SOURCE_PATH)/src/corelib/text/qstringlist.cpp \
|
||||||
$(SOURCE_PATH)/src/corelib/text/qvsnprintf.cpp \
|
$(SOURCE_PATH)/src/corelib/text/qvsnprintf.cpp \
|
||||||
|
$(SOURCE_PATH)/src/corelib/time/qcalendar.cpp \
|
||||||
$(SOURCE_PATH)/src/corelib/time/qdatetime.cpp \
|
$(SOURCE_PATH)/src/corelib/time/qdatetime.cpp \
|
||||||
|
$(SOURCE_PATH)/src/corelib/time/qgregoriancalendar.cpp \
|
||||||
|
$(SOURCE_PATH)/src/corelib/time/qromancalendar.cpp \
|
||||||
$(SOURCE_PATH)/src/corelib/tools/qarraydata.cpp \
|
$(SOURCE_PATH)/src/corelib/tools/qarraydata.cpp \
|
||||||
$(SOURCE_PATH)/src/corelib/tools/qbitarray.cpp \
|
$(SOURCE_PATH)/src/corelib/tools/qbitarray.cpp \
|
||||||
$(SOURCE_PATH)/src/corelib/tools/qcryptographichash.cpp \
|
$(SOURCE_PATH)/src/corelib/tools/qcryptographichash.cpp \
|
||||||
@ -428,6 +432,15 @@ qfileinfo.o: $(SOURCE_PATH)/src/corelib/io/qfileinfo.cpp
|
|||||||
qdatetime.o: $(SOURCE_PATH)/src/corelib/time/qdatetime.cpp
|
qdatetime.o: $(SOURCE_PATH)/src/corelib/time/qdatetime.cpp
|
||||||
$(CXX) -c -o $@ $(CXXFLAGS) $<
|
$(CXX) -c -o $@ $(CXXFLAGS) $<
|
||||||
|
|
||||||
|
qcalendar.o: $(SOURCE_PATH)/src/corelib/time/qcalendar.cpp
|
||||||
|
$(CXX) -c -o $@ $(CXXFLAGS) $<
|
||||||
|
|
||||||
|
qgregoriancalendar.o: $(SOURCE_PATH)/src/corelib/time/qgregoriancalendar.cpp
|
||||||
|
$(CXX) -c -o $@ $(CXXFLAGS) $<
|
||||||
|
|
||||||
|
qromancalendar.o: $(SOURCE_PATH)/src/corelib/time/qromancalendar.cpp
|
||||||
|
$(CXX) -c -o $@ $(CXXFLAGS) $<
|
||||||
|
|
||||||
qstringlist.o: $(SOURCE_PATH)/src/corelib/text/qstringlist.cpp
|
qstringlist.o: $(SOURCE_PATH)/src/corelib/text/qstringlist.cpp
|
||||||
$(CXX) -c -o $@ $(CXXFLAGS) $<
|
$(CXX) -c -o $@ $(CXXFLAGS) $<
|
||||||
|
|
||||||
|
@ -71,6 +71,7 @@ QTOBJS= \
|
|||||||
qbytearray.obj \
|
qbytearray.obj \
|
||||||
qvsnprintf.obj \
|
qvsnprintf.obj \
|
||||||
qbytearraymatcher.obj \
|
qbytearraymatcher.obj \
|
||||||
|
qcalendar.obj \
|
||||||
qdatetime.obj \
|
qdatetime.obj \
|
||||||
qdir.obj \
|
qdir.obj \
|
||||||
qdiriterator.obj \
|
qdiriterator.obj \
|
||||||
@ -83,6 +84,7 @@ QTOBJS= \
|
|||||||
qfileinfo.obj \
|
qfileinfo.obj \
|
||||||
qendian.obj \
|
qendian.obj \
|
||||||
qglobal.obj \
|
qglobal.obj \
|
||||||
|
qgregoriancalendar.obj \
|
||||||
qhash.obj \
|
qhash.obj \
|
||||||
qiodevice.obj \
|
qiodevice.obj \
|
||||||
qringbuffer.obj \
|
qringbuffer.obj \
|
||||||
@ -97,6 +99,7 @@ QTOBJS= \
|
|||||||
qoperatingsystemversion.obj \
|
qoperatingsystemversion.obj \
|
||||||
qoperatingsystemversion_win.obj \
|
qoperatingsystemversion_win.obj \
|
||||||
qregexp.obj \
|
qregexp.obj \
|
||||||
|
qromancalendar.obj \
|
||||||
qutfcodec.obj \
|
qutfcodec.obj \
|
||||||
qstring.obj \
|
qstring.obj \
|
||||||
qstringlist.obj \
|
qstringlist.obj \
|
||||||
|
@ -2583,10 +2583,8 @@
|
|||||||
|
|
||||||
\section1 RC_FILE
|
\section1 RC_FILE
|
||||||
|
|
||||||
Specifies the name of the resource file for the application.
|
Windows only. Specifies the name of the Windows resource file (.rc) for the
|
||||||
The value of this variable is typically handled by
|
target. See \l{Adding Windows Resource Files}.
|
||||||
qmake or \l{#QMAKESPEC}{qmake.conf} and rarely
|
|
||||||
needs to be modified.
|
|
||||||
|
|
||||||
\target RC_CODEPAGE
|
\target RC_CODEPAGE
|
||||||
\section1 RC_CODEPAGE
|
\section1 RC_CODEPAGE
|
||||||
@ -2649,7 +2647,9 @@
|
|||||||
|
|
||||||
\section1 RES_FILE
|
\section1 RES_FILE
|
||||||
|
|
||||||
Specifies the name of the compiled Windows resource file for the target.
|
Windows only. Specifies the name of the Windows resource compiler's output
|
||||||
|
file for this target. See \l{RC_FILE} and \l{Adding Windows Resource Files}.
|
||||||
|
|
||||||
The value of this variable is typically handled by
|
The value of this variable is typically handled by
|
||||||
qmake or \l{#QMAKESPEC}{qmake.conf} and rarely
|
qmake or \l{#QMAKESPEC}{qmake.conf} and rarely
|
||||||
needs to be modified.
|
needs to be modified.
|
||||||
|
@ -764,27 +764,13 @@ MakefileGenerator::init()
|
|||||||
ProStringList incDirs = v["DEPENDPATH"] + v["QMAKE_ABSOLUTE_SOURCE_PATH"];
|
ProStringList incDirs = v["DEPENDPATH"] + v["QMAKE_ABSOLUTE_SOURCE_PATH"];
|
||||||
if(project->isActiveConfig("depend_includepath"))
|
if(project->isActiveConfig("depend_includepath"))
|
||||||
incDirs += v["INCLUDEPATH"];
|
incDirs += v["INCLUDEPATH"];
|
||||||
QList<QMakeLocalFileName> deplist;
|
QVector<QMakeLocalFileName> deplist;
|
||||||
deplist.reserve(incDirs.size());
|
deplist.reserve(incDirs.size());
|
||||||
for (ProStringList::Iterator it = incDirs.begin(); it != incDirs.end(); ++it)
|
for (ProStringList::Iterator it = incDirs.begin(); it != incDirs.end(); ++it)
|
||||||
deplist.append(QMakeLocalFileName((*it).toQString()));
|
deplist.append(QMakeLocalFileName((*it).toQString()));
|
||||||
QMakeSourceFileInfo::setDependencyPaths(deplist);
|
QMakeSourceFileInfo::setDependencyPaths(deplist);
|
||||||
debug_msg(1, "Dependency Directories: %s",
|
debug_msg(1, "Dependency Directories: %s",
|
||||||
incDirs.join(QString(" :: ")).toLatin1().constData());
|
incDirs.join(QString(" :: ")).toLatin1().constData());
|
||||||
//cache info
|
|
||||||
if(project->isActiveConfig("qmake_cache")) {
|
|
||||||
QString cache_file;
|
|
||||||
if(!project->isEmpty("QMAKE_INTERNAL_CACHE_FILE")) {
|
|
||||||
cache_file = QDir::fromNativeSeparators(project->first("QMAKE_INTERNAL_CACHE_FILE").toQString());
|
|
||||||
} else {
|
|
||||||
cache_file = ".qmake.internal.cache";
|
|
||||||
if(project->isActiveConfig("build_pass"))
|
|
||||||
cache_file += ".BUILD." + project->first("BUILD_PASS");
|
|
||||||
}
|
|
||||||
if(cache_file.indexOf('/') == -1)
|
|
||||||
cache_file.prepend(Option::output_dir + '/');
|
|
||||||
QMakeSourceFileInfo::setCacheFile(cache_file);
|
|
||||||
}
|
|
||||||
|
|
||||||
//add to dependency engine
|
//add to dependency engine
|
||||||
for(x = 0; x < compilers.count(); ++x) {
|
for(x = 0; x < compilers.count(); ++x) {
|
||||||
@ -1839,7 +1825,7 @@ static QStringList splitDeps(const QString &indeps, bool lineMode)
|
|||||||
|
|
||||||
QString MakefileGenerator::resolveDependency(const QDir &outDir, const QString &file)
|
QString MakefileGenerator::resolveDependency(const QDir &outDir, const QString &file)
|
||||||
{
|
{
|
||||||
const QList<QMakeLocalFileName> &depdirs = QMakeSourceFileInfo::dependencyPaths();
|
const QVector<QMakeLocalFileName> &depdirs = QMakeSourceFileInfo::dependencyPaths();
|
||||||
for (const auto &depdir : depdirs) {
|
for (const auto &depdir : depdirs) {
|
||||||
const QString &local = depdir.local();
|
const QString &local = depdir.local();
|
||||||
QString lf = outDir.absoluteFilePath(local + '/' + file);
|
QString lf = outDir.absoluteFilePath(local + '/' + file);
|
||||||
@ -3105,7 +3091,7 @@ MakefileGenerator::findFileForDep(const QMakeLocalFileName &dep, const QMakeLoca
|
|||||||
|
|
||||||
if(Option::output_dir != qmake_getpwd()
|
if(Option::output_dir != qmake_getpwd()
|
||||||
&& QDir::isRelativePath(dep.real())) { //is it from the shadow tree
|
&& QDir::isRelativePath(dep.real())) { //is it from the shadow tree
|
||||||
QList<QMakeLocalFileName> depdirs = QMakeSourceFileInfo::dependencyPaths();
|
QVector<QMakeLocalFileName> depdirs = QMakeSourceFileInfo::dependencyPaths();
|
||||||
depdirs.prepend(fileInfo(file.real()).absoluteDir().path());
|
depdirs.prepend(fileInfo(file.real()).absoluteDir().path());
|
||||||
QString pwd = qmake_getpwd();
|
QString pwd = qmake_getpwd();
|
||||||
if(pwd.at(pwd.length()-1) != '/')
|
if(pwd.at(pwd.length()-1) != '/')
|
||||||
@ -3456,4 +3442,13 @@ QString MakefileGenerator::shellQuote(const QString &str)
|
|||||||
return isWindowsShell() ? IoUtils::shellQuoteWin(str) : IoUtils::shellQuoteUnix(str);
|
return isWindowsShell() ? IoUtils::shellQuoteWin(str) : IoUtils::shellQuoteUnix(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns the name of the variable that contains the fully resolved target
|
||||||
|
* (including DESTDIR) of this generator.
|
||||||
|
*/
|
||||||
|
ProKey MakefileGenerator::fullTargetVariable() const
|
||||||
|
{
|
||||||
|
return "TARGET";
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -276,6 +276,7 @@ public:
|
|||||||
virtual bool openOutput(QFile &, const QString &build) const;
|
virtual bool openOutput(QFile &, const QString &build) const;
|
||||||
bool isWindowsShell() const { return Option::dir_sep == QLatin1String("\\"); }
|
bool isWindowsShell() const { return Option::dir_sep == QLatin1String("\\"); }
|
||||||
QString shellQuote(const QString &str);
|
QString shellQuote(const QString &str);
|
||||||
|
virtual ProKey fullTargetVariable() const;
|
||||||
};
|
};
|
||||||
Q_DECLARE_TYPEINFO(MakefileGenerator::Compiler, Q_MOVABLE_TYPE);
|
Q_DECLARE_TYPEINFO(MakefileGenerator::Compiler, Q_MOVABLE_TYPE);
|
||||||
Q_DECLARE_OPERATORS_FOR_FLAGS(MakefileGenerator::FileFixifyTypes)
|
Q_DECLARE_OPERATORS_FOR_FLAGS(MakefileGenerator::FileFixifyTypes)
|
||||||
|
@ -60,21 +60,14 @@ QT_BEGIN_NAMESPACE
|
|||||||
inline bool qmake_endOfLine(const char &c) { return (c == '\r' || c == '\n'); }
|
inline bool qmake_endOfLine(const char &c) { return (c == '\r' || c == '\n'); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define QMAKE_USE_CACHE
|
QMakeLocalFileName::QMakeLocalFileName(const QString &name)
|
||||||
|
: real_name(name)
|
||||||
QMakeLocalFileName::QMakeLocalFileName(const QString &name) : is_null(name.isNull())
|
|
||||||
{
|
{
|
||||||
if(!name.isEmpty()) {
|
|
||||||
if(name.at(0) == QLatin1Char('"') && name.at(name.length()-2) == QLatin1Char('"'))
|
|
||||||
real_name = name.mid(1, name.length()-2);
|
|
||||||
else
|
|
||||||
real_name = name;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
const QString
|
const QString
|
||||||
&QMakeLocalFileName::local() const
|
&QMakeLocalFileName::local() const
|
||||||
{
|
{
|
||||||
if(!is_null && local_name.isNull())
|
if (!isNull() && local_name.isNull())
|
||||||
local_name = Option::normalizePath(real_name);
|
local_name = Option::normalizePath(real_name);
|
||||||
return local_name;
|
return local_name;
|
||||||
}
|
}
|
||||||
@ -199,10 +192,10 @@ void QMakeSourceFileInfo::dependTreeWalker(SourceFile *node, SourceDependChildre
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QMakeSourceFileInfo::setDependencyPaths(const QList<QMakeLocalFileName> &l)
|
void QMakeSourceFileInfo::setDependencyPaths(const QVector<QMakeLocalFileName> &l)
|
||||||
{
|
{
|
||||||
// Ensure that depdirs does not contain the same paths several times, to minimize the stats
|
// Ensure that depdirs does not contain the same paths several times, to minimize the stats
|
||||||
QList<QMakeLocalFileName> ll;
|
QVector<QMakeLocalFileName> ll;
|
||||||
for (int i = 0; i < l.count(); ++i) {
|
for (int i = 0; i < l.count(); ++i) {
|
||||||
if (!ll.contains(l.at(i)))
|
if (!ll.contains(l.at(i)))
|
||||||
ll.append(l.at(i));
|
ll.append(l.at(i));
|
||||||
@ -265,19 +258,10 @@ QMakeSourceFileInfo::QMakeSourceFileInfo(const QString &cf)
|
|||||||
//buffer
|
//buffer
|
||||||
spare_buffer = nullptr;
|
spare_buffer = nullptr;
|
||||||
spare_buffer_size = 0;
|
spare_buffer_size = 0;
|
||||||
|
|
||||||
//cache
|
|
||||||
cachefile = cf;
|
|
||||||
if(!cachefile.isEmpty())
|
|
||||||
loadCache(cachefile);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QMakeSourceFileInfo::~QMakeSourceFileInfo()
|
QMakeSourceFileInfo::~QMakeSourceFileInfo()
|
||||||
{
|
{
|
||||||
//cache
|
|
||||||
if(!cachefile.isEmpty() /*&& files_changed*/)
|
|
||||||
saveCache(cachefile);
|
|
||||||
|
|
||||||
//buffer
|
//buffer
|
||||||
if(spare_buffer) {
|
if(spare_buffer) {
|
||||||
free(spare_buffer);
|
free(spare_buffer);
|
||||||
@ -290,12 +274,6 @@ QMakeSourceFileInfo::~QMakeSourceFileInfo()
|
|||||||
delete includes;
|
delete includes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QMakeSourceFileInfo::setCacheFile(const QString &cf)
|
|
||||||
{
|
|
||||||
cachefile = cf;
|
|
||||||
loadCache(cachefile);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QMakeSourceFileInfo::addSourceFiles(const ProStringList &l, uchar seek,
|
void QMakeSourceFileInfo::addSourceFiles(const ProStringList &l, uchar seek,
|
||||||
QMakeSourceFileInfo::SourceFileType type)
|
QMakeSourceFileInfo::SourceFileType type)
|
||||||
{
|
{
|
||||||
@ -853,8 +831,8 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!exists) { //path lookup
|
if(!exists) { //path lookup
|
||||||
for(QList<QMakeLocalFileName>::Iterator it = depdirs.begin(); it != depdirs.end(); ++it) {
|
for (const QMakeLocalFileName &depdir : qAsConst(depdirs)) {
|
||||||
QMakeLocalFileName f((*it).real() + Option::dir_sep + lfn.real());
|
QMakeLocalFileName f(depdir.real() + Option::dir_sep + lfn.real());
|
||||||
QFileInfo fi(findFileInfo(f));
|
QFileInfo fi(findFileInfo(f));
|
||||||
if(fi.exists() && !fi.isDir()) {
|
if(fi.exists() && !fi.isDir()) {
|
||||||
lfn = fixPathForFile(f);
|
lfn = fixPathForFile(f);
|
||||||
@ -1054,151 +1032,4 @@ bool QMakeSourceFileInfo::findMocs(SourceFile *file)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void QMakeSourceFileInfo::saveCache(const QString &cf)
|
|
||||||
{
|
|
||||||
#ifdef QMAKE_USE_CACHE
|
|
||||||
if(cf.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
QFile file(QMakeLocalFileName(cf).local());
|
|
||||||
if(file.open(QIODevice::WriteOnly)) {
|
|
||||||
QTextStream stream(&file);
|
|
||||||
stream << QMAKE_VERSION_STR << endl << endl; //version
|
|
||||||
{ //cache verification
|
|
||||||
QMap<QString, QStringList> verify = getCacheVerification();
|
|
||||||
stream << verify.count() << endl;
|
|
||||||
for(QMap<QString, QStringList>::iterator it = verify.begin();
|
|
||||||
it != verify.end(); ++it) {
|
|
||||||
stream << it.key() << endl << it.value().join(';') << endl;
|
|
||||||
}
|
|
||||||
stream << endl;
|
|
||||||
}
|
|
||||||
if(files->nodes) {
|
|
||||||
for(int file = 0; file < files->num_nodes; ++file) {
|
|
||||||
for(SourceFiles::SourceFileNode *node = files->nodes[file]; node; node = node->next) {
|
|
||||||
stream << node->file->file.local() << endl; //source
|
|
||||||
stream << node->file->type << endl; //type
|
|
||||||
|
|
||||||
//depends
|
|
||||||
stream << ";";
|
|
||||||
if(node->file->deps) {
|
|
||||||
for(int depend = 0; depend < node->file->deps->used_nodes; ++depend) {
|
|
||||||
if(depend)
|
|
||||||
stream << ";";
|
|
||||||
stream << node->file->deps->children[depend]->file.local();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stream << endl;
|
|
||||||
|
|
||||||
stream << node->file->mocable << endl; //mocable
|
|
||||||
stream << endl; //just for human readability
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stream.flush();
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
Q_UNUSED(cf);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void QMakeSourceFileInfo::loadCache(const QString &cf)
|
|
||||||
{
|
|
||||||
if(cf.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifdef QMAKE_USE_CACHE
|
|
||||||
QMakeLocalFileName cache_file(cf);
|
|
||||||
int fd = open(QMakeLocalFileName(cf).local().toLatin1(), O_RDONLY);
|
|
||||||
if(fd == -1)
|
|
||||||
return;
|
|
||||||
QFileInfo cache_fi = findFileInfo(cache_file);
|
|
||||||
if(!cache_fi.exists() || cache_fi.isDir())
|
|
||||||
return;
|
|
||||||
|
|
||||||
QFile file;
|
|
||||||
if (!file.open(fd, QIODevice::ReadOnly))
|
|
||||||
return;
|
|
||||||
QTextStream stream(&file);
|
|
||||||
|
|
||||||
if (stream.readLine() == QMAKE_VERSION_STR) { //version check
|
|
||||||
stream.skipWhiteSpace();
|
|
||||||
|
|
||||||
bool verified = true;
|
|
||||||
{ //cache verification
|
|
||||||
QMap<QString, QStringList> verify;
|
|
||||||
int len = stream.readLine().toInt();
|
|
||||||
for(int i = 0; i < len; ++i) {
|
|
||||||
QString var = stream.readLine();
|
|
||||||
QString val = stream.readLine();
|
|
||||||
verify.insert(var, val.split(';', QString::SkipEmptyParts));
|
|
||||||
}
|
|
||||||
verified = verifyCache(verify);
|
|
||||||
}
|
|
||||||
if(verified) {
|
|
||||||
stream.skipWhiteSpace();
|
|
||||||
if(!files)
|
|
||||||
files = new SourceFiles;
|
|
||||||
while(!stream.atEnd()) {
|
|
||||||
QString source = stream.readLine();
|
|
||||||
QString type = stream.readLine();
|
|
||||||
QString depends = stream.readLine();
|
|
||||||
QString mocable = stream.readLine();
|
|
||||||
stream.skipWhiteSpace();
|
|
||||||
|
|
||||||
QMakeLocalFileName fn(source);
|
|
||||||
QFileInfo fi = findFileInfo(fn);
|
|
||||||
|
|
||||||
SourceFile *file = files->lookupFile(fn);
|
|
||||||
if(!file) {
|
|
||||||
file = new SourceFile;
|
|
||||||
file->file = fn;
|
|
||||||
files->addFile(file);
|
|
||||||
file->type = (SourceFileType)type.toInt();
|
|
||||||
file->exists = fi.exists();
|
|
||||||
}
|
|
||||||
if(fi.exists() && fi.lastModified() < cache_fi.lastModified()) {
|
|
||||||
if(!file->dep_checked) { //get depends
|
|
||||||
if(!file->deps)
|
|
||||||
file->deps = new SourceDependChildren;
|
|
||||||
file->dep_checked = true;
|
|
||||||
QStringList depend_list = depends.split(";", QString::SkipEmptyParts);
|
|
||||||
for(int depend = 0; depend < depend_list.size(); ++depend) {
|
|
||||||
QMakeLocalFileName dep_fn(depend_list.at(depend));
|
|
||||||
QFileInfo dep_fi(findFileInfo(dep_fn));
|
|
||||||
SourceFile *dep = files->lookupFile(dep_fn);
|
|
||||||
if(!dep) {
|
|
||||||
dep = new SourceFile;
|
|
||||||
dep->file = dep_fn;
|
|
||||||
dep->exists = dep_fi.exists();
|
|
||||||
dep->type = QMakeSourceFileInfo::TYPE_UNKNOWN;
|
|
||||||
files->addFile(dep);
|
|
||||||
}
|
|
||||||
dep->included_count++;
|
|
||||||
file->deps->addChild(dep);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!file->moc_checked) { //get mocs
|
|
||||||
file->moc_checked = true;
|
|
||||||
file->mocable = mocable.toInt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
QMap<QString, QStringList> QMakeSourceFileInfo::getCacheVerification()
|
|
||||||
{
|
|
||||||
return QMap<QString, QStringList>();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool QMakeSourceFileInfo::verifyCache(const QMap<QString, QStringList> &v)
|
|
||||||
{
|
|
||||||
return v == getCacheVerification();
|
|
||||||
}
|
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include <qstringlist.h>
|
#include <qstringlist.h>
|
||||||
#include <qfileinfo.h>
|
#include <qfileinfo.h>
|
||||||
|
#include <qvector.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
@ -40,13 +41,14 @@ struct SourceFile;
|
|||||||
struct SourceDependChildren;
|
struct SourceDependChildren;
|
||||||
class SourceFiles;
|
class SourceFiles;
|
||||||
|
|
||||||
class QMakeLocalFileName {
|
class QMakeLocalFileName
|
||||||
bool is_null;
|
{
|
||||||
mutable QString real_name, local_name;
|
QString real_name;
|
||||||
|
mutable QString local_name;
|
||||||
public:
|
public:
|
||||||
QMakeLocalFileName() : is_null(true) {}
|
QMakeLocalFileName() = default;
|
||||||
QMakeLocalFileName(const QString &);
|
QMakeLocalFileName(const QString &);
|
||||||
bool isNull() const { return is_null; }
|
bool isNull() const { return real_name.isNull(); }
|
||||||
inline const QString &real() const { return real_name; }
|
inline const QString &real() const { return real_name; }
|
||||||
const QString &local() const;
|
const QString &local() const;
|
||||||
|
|
||||||
@ -64,7 +66,7 @@ private:
|
|||||||
//quick project lookups
|
//quick project lookups
|
||||||
SourceFiles *files, *includes;
|
SourceFiles *files, *includes;
|
||||||
bool files_changed;
|
bool files_changed;
|
||||||
QList<QMakeLocalFileName> depdirs;
|
QVector<QMakeLocalFileName> depdirs;
|
||||||
QStringList systemIncludes;
|
QStringList systemIncludes;
|
||||||
|
|
||||||
//sleezy buffer code
|
//sleezy buffer code
|
||||||
@ -77,9 +79,6 @@ private:
|
|||||||
bool findDeps(SourceFile *);
|
bool findDeps(SourceFile *);
|
||||||
void dependTreeWalker(SourceFile *, SourceDependChildren *);
|
void dependTreeWalker(SourceFile *, SourceDependChildren *);
|
||||||
|
|
||||||
//cache
|
|
||||||
QString cachefile;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual QMakeLocalFileName fixPathForFile(const QMakeLocalFileName &, bool forOpen=false);
|
virtual QMakeLocalFileName fixPathForFile(const QMakeLocalFileName &, bool forOpen=false);
|
||||||
virtual QMakeLocalFileName findFileForDep(const QMakeLocalFileName &, const QMakeLocalFileName &);
|
virtual QMakeLocalFileName findFileForDep(const QMakeLocalFileName &, const QMakeLocalFileName &);
|
||||||
@ -90,8 +89,8 @@ public:
|
|||||||
QMakeSourceFileInfo(const QString &cachefile="");
|
QMakeSourceFileInfo(const QString &cachefile="");
|
||||||
virtual ~QMakeSourceFileInfo();
|
virtual ~QMakeSourceFileInfo();
|
||||||
|
|
||||||
QList<QMakeLocalFileName> dependencyPaths() const { return depdirs; }
|
QVector<QMakeLocalFileName> dependencyPaths() const { return depdirs; }
|
||||||
void setDependencyPaths(const QList<QMakeLocalFileName> &);
|
void setDependencyPaths(const QVector<QMakeLocalFileName> &);
|
||||||
|
|
||||||
enum DependencyMode { Recursive, NonRecursive };
|
enum DependencyMode { Recursive, NonRecursive };
|
||||||
inline void setDependencyMode(DependencyMode mode) { dep_mode = mode; }
|
inline void setDependencyMode(DependencyMode mode) { dep_mode = mode; }
|
||||||
@ -112,12 +111,6 @@ public:
|
|||||||
|
|
||||||
bool mocable(const QString &file);
|
bool mocable(const QString &file);
|
||||||
|
|
||||||
virtual QMap<QString, QStringList> getCacheVerification();
|
|
||||||
virtual bool verifyCache(const QMap<QString, QStringList> &);
|
|
||||||
void setCacheFile(const QString &cachefile); //auto caching
|
|
||||||
void loadCache(const QString &cf);
|
|
||||||
void saveCache(const QString &cf);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DependencyMode dep_mode;
|
DependencyMode dep_mode;
|
||||||
};
|
};
|
||||||
|
@ -33,6 +33,10 @@
|
|||||||
#include "project.h"
|
#include "project.h"
|
||||||
#include "cachekeys.h"
|
#include "cachekeys.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iterator>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
#define BUILDSMETATYPE 1
|
#define BUILDSMETATYPE 1
|
||||||
#define SUBDIRSMETATYPE 2
|
#define SUBDIRSMETATYPE 2
|
||||||
|
|
||||||
@ -58,6 +62,7 @@ private:
|
|||||||
void clearBuilds();
|
void clearBuilds();
|
||||||
MakefileGenerator *processBuild(const ProString &);
|
MakefileGenerator *processBuild(const ProString &);
|
||||||
void accumulateVariableFromBuilds(const ProKey &name, Build *build) const;
|
void accumulateVariableFromBuilds(const ProKey &name, Build *build) const;
|
||||||
|
void checkForConflictingTargets() const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -186,6 +191,7 @@ BuildsMetaMakefileGenerator::write()
|
|||||||
if(!build->makefile) {
|
if(!build->makefile) {
|
||||||
ret = false;
|
ret = false;
|
||||||
} else if(build == glue) {
|
} else if(build == glue) {
|
||||||
|
checkForConflictingTargets();
|
||||||
accumulateVariableFromBuilds("QMAKE_INTERNAL_INCLUDED_FILES", build);
|
accumulateVariableFromBuilds("QMAKE_INTERNAL_INCLUDED_FILES", build);
|
||||||
ret = build->makefile->writeProjectMakefile();
|
ret = build->makefile->writeProjectMakefile();
|
||||||
} else {
|
} else {
|
||||||
@ -239,6 +245,39 @@ void BuildsMetaMakefileGenerator::accumulateVariableFromBuilds(const ProKey &nam
|
|||||||
values.removeDuplicates();
|
values.removeDuplicates();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BuildsMetaMakefileGenerator::checkForConflictingTargets() const
|
||||||
|
{
|
||||||
|
if (makefiles.count() < 3) {
|
||||||
|
// Checking for conflicts only makes sense if we have more than one BUILD,
|
||||||
|
// and the last entry in makefiles is the "glue" Build.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
using TargetInfo = std::pair<Build *, ProString>;
|
||||||
|
QVector<TargetInfo> targets;
|
||||||
|
const int last = makefiles.count() - 1;
|
||||||
|
targets.resize(last);
|
||||||
|
for (int i = 0; i < last; ++i) {
|
||||||
|
Build *b = makefiles.at(i);
|
||||||
|
auto mkf = b->makefile;
|
||||||
|
auto prj = mkf->projectFile();
|
||||||
|
targets[i] = std::make_pair(b, prj->first(mkf->fullTargetVariable()));
|
||||||
|
}
|
||||||
|
std::stable_sort(targets.begin(), targets.end(),
|
||||||
|
[](const TargetInfo &lhs, const TargetInfo &rhs)
|
||||||
|
{
|
||||||
|
return lhs.second < rhs.second;
|
||||||
|
});
|
||||||
|
for (auto prev = targets.begin(), it = std::next(prev); it != targets.end(); ++prev, ++it) {
|
||||||
|
if (prev->second == it->second) {
|
||||||
|
warn_msg(WarnLogic, "Targets of builds '%s' and '%s' conflict: %s.",
|
||||||
|
qPrintable(prev->first->build),
|
||||||
|
qPrintable(it->first->build),
|
||||||
|
qPrintable(prev->second.toQString()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class SubdirsMetaMakefileGenerator : public MetaMakefileGenerator
|
class SubdirsMetaMakefileGenerator : public MetaMakefileGenerator
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
@ -215,7 +215,7 @@ ProjectGenerator::init()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//setup deplist
|
//setup deplist
|
||||||
QList<QMakeLocalFileName> deplist;
|
QVector<QMakeLocalFileName> deplist;
|
||||||
{
|
{
|
||||||
const ProStringList &d = v["DEPENDPATH"];
|
const ProStringList &d = v["DEPENDPATH"];
|
||||||
for(int i = 0; i < d.size(); ++i)
|
for(int i = 0; i < d.size(); ++i)
|
||||||
|
@ -392,7 +392,7 @@ UnixMakefileGenerator::fixLibFlag(const ProString &lib)
|
|||||||
bool
|
bool
|
||||||
UnixMakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
|
UnixMakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
|
||||||
{
|
{
|
||||||
QList<QMakeLocalFileName> libdirs, frameworkdirs;
|
QVector<QMakeLocalFileName> libdirs, frameworkdirs;
|
||||||
int libidx = 0, fwidx = 0;
|
int libidx = 0, fwidx = 0;
|
||||||
for (const ProString &dlib : project->values("QMAKE_DEFAULT_LIBDIRS"))
|
for (const ProString &dlib : project->values("QMAKE_DEFAULT_LIBDIRS"))
|
||||||
libdirs.append(QMakeLocalFileName(dlib.toQString()));
|
libdirs.append(QMakeLocalFileName(dlib.toQString()));
|
||||||
@ -418,9 +418,8 @@ UnixMakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
|
|||||||
libdirs.insert(libidx++, f);
|
libdirs.insert(libidx++, f);
|
||||||
} else if(opt.startsWith("-l")) {
|
} else if(opt.startsWith("-l")) {
|
||||||
QString lib = opt.mid(2);
|
QString lib = opt.mid(2);
|
||||||
for (QList<QMakeLocalFileName>::Iterator dep_it = libdirs.begin();
|
for (const QMakeLocalFileName &libdir : qAsConst(libdirs)) {
|
||||||
dep_it != libdirs.end(); ++dep_it) {
|
QString libBase = libdir.local() + '/'
|
||||||
QString libBase = (*dep_it).local() + '/'
|
|
||||||
+ project->first("QMAKE_PREFIX_SHLIB") + lib;
|
+ project->first("QMAKE_PREFIX_SHLIB") + lib;
|
||||||
if (linkPrl && processPrlFile(libBase, true))
|
if (linkPrl && processPrlFile(libBase, true))
|
||||||
goto found;
|
goto found;
|
||||||
|
@ -1447,7 +1447,36 @@ UnixMakefileGenerator::libtoolFileName(bool fixify)
|
|||||||
void
|
void
|
||||||
UnixMakefileGenerator::writeLibtoolFile()
|
UnixMakefileGenerator::writeLibtoolFile()
|
||||||
{
|
{
|
||||||
|
auto fixDependencyLibs
|
||||||
|
= [this](const ProStringList &libs)
|
||||||
|
{
|
||||||
|
ProStringList result;
|
||||||
|
for (auto lib : libs) {
|
||||||
|
auto fi = fileInfo(lib.toQString());
|
||||||
|
if (fi.isAbsolute()) {
|
||||||
|
const QString libDirArg = "-L" + fi.path();
|
||||||
|
if (!result.contains(libDirArg))
|
||||||
|
result += libDirArg;
|
||||||
|
QString namespec = fi.fileName();
|
||||||
|
int dotPos = namespec.lastIndexOf('.');
|
||||||
|
if (dotPos != -1 && namespec.startsWith("lib")) {
|
||||||
|
namespec.truncate(dotPos);
|
||||||
|
namespec.remove(0, 3);
|
||||||
|
} else {
|
||||||
|
debug_msg(1, "Ignoring dependency library %s",
|
||||||
|
lib.toLatin1().constData());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
result += "-l" + namespec;
|
||||||
|
} else {
|
||||||
|
result += lib;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
QString fname = libtoolFileName(), lname = fname;
|
QString fname = libtoolFileName(), lname = fname;
|
||||||
|
debug_msg(1, "Writing libtool file %s", fname.toLatin1().constData());
|
||||||
mkdir(fileInfo(fname).path());
|
mkdir(fileInfo(fname).path());
|
||||||
int slsh = lname.lastIndexOf(Option::dir_sep);
|
int slsh = lname.lastIndexOf(Option::dir_sep);
|
||||||
if(slsh != -1)
|
if(slsh != -1)
|
||||||
@ -1485,12 +1514,11 @@ UnixMakefileGenerator::writeLibtoolFile()
|
|||||||
<< ".a'\n\n";
|
<< ".a'\n\n";
|
||||||
|
|
||||||
t << "# Libraries that this one depends upon.\n";
|
t << "# Libraries that this one depends upon.\n";
|
||||||
|
static const ProKey libVars[] = { "LIBS", "QMAKE_LIBS" };
|
||||||
ProStringList libs;
|
ProStringList libs;
|
||||||
libs << "LIBS" << "QMAKE_LIBS";
|
for (auto var : libVars)
|
||||||
t << "dependency_libs='";
|
libs += fixLibFlags(var);
|
||||||
for (ProStringList::ConstIterator it = libs.cbegin(); it != libs.cend(); ++it)
|
t << "dependency_libs='" << fixDependencyLibs(libs).join(' ') << "'\n\n";
|
||||||
t << fixLibFlags((*it).toKey()).join(' ') << ' ';
|
|
||||||
t << "'\n\n";
|
|
||||||
|
|
||||||
t << "# Version information for " << lname << "\n";
|
t << "# Version information for " << lname << "\n";
|
||||||
int maj = project->first("VER_MAJ").toInt();
|
int maj = project->first("VER_MAJ").toInt();
|
||||||
|
@ -342,7 +342,11 @@ void MingwMakefileGenerator::writeRcFilePart(QTextStream &t)
|
|||||||
if (defines.isEmpty())
|
if (defines.isEmpty())
|
||||||
defines = ProString(" $(DEFINES)");
|
defines = ProString(" $(DEFINES)");
|
||||||
|
|
||||||
t << escapeDependencyPath(var("RES_FILE")) << ": " << escapeDependencyPath(rc_file) << "\n\t"
|
addSourceFile(rc_file, QMakeSourceFileInfo::SEEK_DEPS);
|
||||||
|
const QStringList rcDeps = QStringList(rc_file) << dependencies(rc_file);
|
||||||
|
|
||||||
|
t << escapeDependencyPath(var("RES_FILE")) << ": "
|
||||||
|
<< escapeDependencyPaths(rcDeps).join(' ') << "\n\t"
|
||||||
<< var("QMAKE_RC") << " -i " << escapeFilePath(rc_file) << " -o " << fileVar("RES_FILE")
|
<< var("QMAKE_RC") << " -i " << escapeFilePath(rc_file) << " -o " << fileVar("RES_FILE")
|
||||||
<< incPathStr << defines << "\n\n";
|
<< incPathStr << defines << "\n\n";
|
||||||
}
|
}
|
||||||
|
@ -300,14 +300,17 @@ inline XmlOutput::xml_output valueTagT( const triState v)
|
|||||||
return valueTag(v == _True ? "true" : "false");
|
return valueTag(v == _True ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString vcxCommandSeparator()
|
static QString commandLinesForOutput(QStringList commands)
|
||||||
{
|
{
|
||||||
// MSBuild puts the contents of the custom commands into a batch file and calls it.
|
// MSBuild puts the contents of the custom commands into a batch file and calls it.
|
||||||
// As we want every sub-command to be error-checked (as is done by makefile-based
|
// As we want every sub-command to be error-checked (as is done by makefile-based
|
||||||
// backends), we insert the checks ourselves, using the undocumented jump target.
|
// backends), we insert the checks ourselves, using the undocumented jump target.
|
||||||
static QString cmdSep =
|
static QString errchk = QStringLiteral("if errorlevel 1 goto VCEnd");
|
||||||
QLatin1String("
if errorlevel 1 goto VCEnd
");
|
for (int i = commands.count() - 2; i >= 0; --i) {
|
||||||
return cmdSep;
|
if (!commands.at(i).startsWith("rem", Qt::CaseInsensitive))
|
||||||
|
commands.insert(i + 1, errchk);
|
||||||
|
}
|
||||||
|
return commands.join('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString unquote(const QString &value)
|
static QString unquote(const QString &value)
|
||||||
@ -1658,7 +1661,7 @@ void VCXProjectWriter::write(XmlOutput &xml, const VCCustomBuildTool &tool)
|
|||||||
{
|
{
|
||||||
xml << tag("Command")
|
xml << tag("Command")
|
||||||
<< attrTag("Condition", condition)
|
<< attrTag("Condition", condition)
|
||||||
<< valueTag(tool.CommandLine.join(vcxCommandSeparator()));
|
<< valueTag(commandLinesForOutput(tool.CommandLine));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !tool.Description.isEmpty() )
|
if ( !tool.Description.isEmpty() )
|
||||||
@ -1712,7 +1715,7 @@ void VCXProjectWriter::write(XmlOutput &xml, const VCEventTool &tool)
|
|||||||
{
|
{
|
||||||
xml
|
xml
|
||||||
<< tag(tool.EventName)
|
<< tag(tool.EventName)
|
||||||
<< tag(_Command) << valueTag(tool.CommandLine.join(vcxCommandSeparator()))
|
<< tag(_Command) << valueTag(commandLinesForOutput(tool.CommandLine))
|
||||||
<< tag(_Message) << valueTag(tool.Description)
|
<< tag(_Message) << valueTag(tool.Description)
|
||||||
<< closetag(tool.EventName);
|
<< closetag(tool.EventName);
|
||||||
}
|
}
|
||||||
|
@ -209,7 +209,9 @@ bool VcprojGenerator::writeProjectMakefile()
|
|||||||
|
|
||||||
struct VcsolutionDepend {
|
struct VcsolutionDepend {
|
||||||
QString uuid;
|
QString uuid;
|
||||||
QString vcprojFile, orig_target, target;
|
QString vcprojFile;
|
||||||
|
QString projectName;
|
||||||
|
QString target;
|
||||||
Target targetType;
|
Target targetType;
|
||||||
QStringList dependencies;
|
QStringList dependencies;
|
||||||
};
|
};
|
||||||
@ -433,7 +435,8 @@ ProStringList VcprojGenerator::collectDependencies(QMakeProject *proj, QHash<QSt
|
|||||||
Option::qmake_mode = old_mode;
|
Option::qmake_mode = old_mode;
|
||||||
|
|
||||||
// We assume project filename is [QMAKE_PROJECT_NAME].vcproj
|
// We assume project filename is [QMAKE_PROJECT_NAME].vcproj
|
||||||
QString vcproj = tmp_vcproj.project->first("QMAKE_PROJECT_NAME") + project->first("VCPROJ_EXTENSION");
|
const ProString projectName = tmp_vcproj.project->first("QMAKE_PROJECT_NAME");
|
||||||
|
const QString vcproj = projectName + project->first("VCPROJ_EXTENSION");
|
||||||
QString vcprojDir = Option::output_dir;
|
QString vcprojDir = Option::output_dir;
|
||||||
|
|
||||||
// If file doesn't exsist, then maybe the users configuration
|
// If file doesn't exsist, then maybe the users configuration
|
||||||
@ -445,14 +448,14 @@ ProStringList VcprojGenerator::collectDependencies(QMakeProject *proj, QHash<QSt
|
|||||||
|
|
||||||
VcsolutionDepend *newDep = new VcsolutionDepend;
|
VcsolutionDepend *newDep = new VcsolutionDepend;
|
||||||
newDep->vcprojFile = vcprojDir + Option::dir_sep + vcproj;
|
newDep->vcprojFile = vcprojDir + Option::dir_sep + vcproj;
|
||||||
newDep->orig_target = tmp_proj.first("QMAKE_ORIG_TARGET").toQString();
|
newDep->projectName = projectName.toQString();
|
||||||
newDep->target = tmp_proj.first("MSVCPROJ_TARGET").toQString().section(Option::dir_sep, -1);
|
newDep->target = tmp_proj.first("MSVCPROJ_TARGET").toQString().section(Option::dir_sep, -1);
|
||||||
newDep->targetType = tmp_vcproj.projectTarget;
|
newDep->targetType = tmp_vcproj.projectTarget;
|
||||||
newDep->uuid = tmp_proj.isEmpty("QMAKE_UUID") ? getProjectUUID(Option::fixPathToLocalOS(vcprojDir + QDir::separator() + vcproj)).toString().toUpper(): tmp_proj.first("QMAKE_UUID").toQString();
|
newDep->uuid = tmp_proj.isEmpty("QMAKE_UUID") ? getProjectUUID(Option::fixPathToLocalOS(vcprojDir + QDir::separator() + vcproj)).toString().toUpper(): tmp_proj.first("QMAKE_UUID").toQString();
|
||||||
// We want to store it as the .lib name.
|
// We want to store it as the .lib name.
|
||||||
if (newDep->target.endsWith(".dll"))
|
if (newDep->target.endsWith(".dll"))
|
||||||
newDep->target = newDep->target.left(newDep->target.length()-3) + "lib";
|
newDep->target = newDep->target.left(newDep->target.length()-3) + "lib";
|
||||||
projGuids.insert(newDep->orig_target, newDep->target);
|
projGuids.insert(newDep->projectName, newDep->target);
|
||||||
|
|
||||||
if (tmpList.size()) {
|
if (tmpList.size()) {
|
||||||
const ProStringList depends = tmpList;
|
const ProStringList depends = tmpList;
|
||||||
@ -591,7 +594,7 @@ void VcprojGenerator::writeSubDirs(QTextStream &t)
|
|||||||
for (QList<VcsolutionDepend*>::Iterator it = solution_cleanup.begin(); it != solution_cleanup.end(); ++it) {
|
for (QList<VcsolutionDepend*>::Iterator it = solution_cleanup.begin(); it != solution_cleanup.end(); ++it) {
|
||||||
// ### quoting rules?
|
// ### quoting rules?
|
||||||
t << _slnProjectBeg << _slnMSVCvcprojGUID << _slnProjectMid
|
t << _slnProjectBeg << _slnMSVCvcprojGUID << _slnProjectMid
|
||||||
<< "\"" << (*it)->orig_target << "\", \"" << (*it)->vcprojFile
|
<< "\"" << (*it)->projectName << "\", \"" << (*it)->vcprojFile
|
||||||
<< "\", \"" << (*it)->uuid << "\"";
|
<< "\", \"" << (*it)->uuid << "\"";
|
||||||
|
|
||||||
debug_msg(1, "Project %s has dependencies: %s", (*it)->target.toLatin1().constData(), (*it)->dependencies.join(" ").toLatin1().constData());
|
debug_msg(1, "Project %s has dependencies: %s", (*it)->target.toLatin1().constData(), (*it)->dependencies.join(" ").toLatin1().constData());
|
||||||
@ -937,6 +940,15 @@ void VcprojGenerator::initProject()
|
|||||||
vcProject.SccProjectName = project->first("SCCPROJECTNAME").toQString();
|
vcProject.SccProjectName = project->first("SCCPROJECTNAME").toQString();
|
||||||
vcProject.SccLocalPath = project->first("SCCLOCALPATH").toQString();
|
vcProject.SccLocalPath = project->first("SCCLOCALPATH").toQString();
|
||||||
vcProject.flat_files = project->isActiveConfig("flat");
|
vcProject.flat_files = project->isActiveConfig("flat");
|
||||||
|
|
||||||
|
// Set up the full target path for target conflict checking.
|
||||||
|
const QChar slash = QLatin1Char('/');
|
||||||
|
QString destdir = QDir::fromNativeSeparators(var("DESTDIR"));
|
||||||
|
if (!destdir.endsWith(slash))
|
||||||
|
destdir.append(slash);
|
||||||
|
project->values("DEST_TARGET") = ProStringList(destdir
|
||||||
|
+ project->first("TARGET")
|
||||||
|
+ project->first("TARGET_EXT"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void VcprojGenerator::initConfiguration()
|
void VcprojGenerator::initConfiguration()
|
||||||
|
@ -79,7 +79,7 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
|
|||||||
ProStringList impexts = project->values("QMAKE_LIB_EXTENSIONS");
|
ProStringList impexts = project->values("QMAKE_LIB_EXTENSIONS");
|
||||||
if (impexts.isEmpty())
|
if (impexts.isEmpty())
|
||||||
impexts = project->values("QMAKE_EXTENSION_STATICLIB");
|
impexts = project->values("QMAKE_EXTENSION_STATICLIB");
|
||||||
QList<QMakeLocalFileName> dirs;
|
QVector<QMakeLocalFileName> dirs;
|
||||||
int libidx = 0;
|
int libidx = 0;
|
||||||
for (const ProString &dlib : project->values("QMAKE_DEFAULT_LIBDIRS"))
|
for (const ProString &dlib : project->values("QMAKE_DEFAULT_LIBDIRS"))
|
||||||
dirs.append(QMakeLocalFileName(dlib.toQString()));
|
dirs.append(QMakeLocalFileName(dlib.toQString()));
|
||||||
@ -104,8 +104,7 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
|
|||||||
QString lib = arg.toQString();
|
QString lib = arg.toQString();
|
||||||
ProString verovr =
|
ProString verovr =
|
||||||
project->first(ProKey("QMAKE_" + lib.toUpper() + "_VERSION_OVERRIDE"));
|
project->first(ProKey("QMAKE_" + lib.toUpper() + "_VERSION_OVERRIDE"));
|
||||||
for (QList<QMakeLocalFileName>::Iterator dir_it = dirs.begin();
|
for (auto dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) {
|
||||||
dir_it != dirs.end(); ++dir_it) {
|
|
||||||
QString cand = (*dir_it).real() + Option::dir_sep + lib;
|
QString cand = (*dir_it).real() + Option::dir_sep + lib;
|
||||||
if (linkPrl && processPrlFile(cand, true)) {
|
if (linkPrl && processPrlFile(cand, true)) {
|
||||||
(*it) = cand;
|
(*it) = cand;
|
||||||
@ -128,8 +127,7 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
|
|||||||
if (processPrlFile(lib, false))
|
if (processPrlFile(lib, false))
|
||||||
(*it) = lib;
|
(*it) = lib;
|
||||||
} else {
|
} else {
|
||||||
for (QList<QMakeLocalFileName>::Iterator dir_it = dirs.begin();
|
for (auto dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) {
|
||||||
dir_it != dirs.end(); ++dir_it) {
|
|
||||||
QString cand = (*dir_it).real() + Option::dir_sep + lib;
|
QString cand = (*dir_it).real() + Option::dir_sep + lib;
|
||||||
if (processPrlFile(cand, false)) {
|
if (processPrlFile(cand, false)) {
|
||||||
(*it) = cand;
|
(*it) = cand;
|
||||||
@ -669,6 +667,9 @@ void Win32MakefileGenerator::writeRcFilePart(QTextStream &t)
|
|||||||
incPathStr += escapeFilePath(path);
|
incPathStr += escapeFilePath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
addSourceFile(rc_file, QMakeSourceFileInfo::SEEK_DEPS);
|
||||||
|
const QStringList rcDeps = QStringList(rc_file) << dependencies(rc_file);
|
||||||
|
|
||||||
// The resource tool may use defines. This might be the same defines passed in as the
|
// The resource tool may use defines. This might be the same defines passed in as the
|
||||||
// compiler, since you may use these defines in the .rc file itself.
|
// compiler, since you may use these defines in the .rc file itself.
|
||||||
// As the escape syntax for the command line defines for RC is different from that for CL,
|
// As the escape syntax for the command line defines for RC is different from that for CL,
|
||||||
@ -680,7 +681,8 @@ void Win32MakefileGenerator::writeRcFilePart(QTextStream &t)
|
|||||||
// Also, we need to add the _DEBUG define manually since the compiler defines this symbol
|
// Also, we need to add the _DEBUG define manually since the compiler defines this symbol
|
||||||
// by itself, and we use it in the automatically created rc file when VERSION is defined
|
// by itself, and we use it in the automatically created rc file when VERSION is defined
|
||||||
// in the .pro file.
|
// in the .pro file.
|
||||||
t << escapeDependencyPath(res_file) << ": " << escapeDependencyPath(rc_file) << "\n\t"
|
t << escapeDependencyPath(res_file) << ": "
|
||||||
|
<< escapeDependencyPaths(rcDeps).join(' ') << "\n\t"
|
||||||
<< var("QMAKE_RC") << (project->isActiveConfig("debug") ? " -D_DEBUG" : "")
|
<< var("QMAKE_RC") << (project->isActiveConfig("debug") ? " -D_DEBUG" : "")
|
||||||
<< defines << incPathStr << " -fo " << escapeFilePath(res_file)
|
<< defines << incPathStr << " -fo " << escapeFilePath(res_file)
|
||||||
<< ' ' << escapeFilePath(rc_file);
|
<< ' ' << escapeFilePath(rc_file);
|
||||||
@ -815,4 +817,9 @@ QString Win32MakefileGenerator::getManifestFileForRcFile() const
|
|||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ProKey Win32MakefileGenerator::fullTargetVariable() const
|
||||||
|
{
|
||||||
|
return "DEST_TARGET";
|
||||||
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -64,6 +64,9 @@ protected:
|
|||||||
void processRcFileVar();
|
void processRcFileVar();
|
||||||
static QString cQuoted(const QString &str);
|
static QString cQuoted(const QString &str);
|
||||||
virtual QString getManifestFileForRcFile() const;
|
virtual QString getManifestFileForRcFile() const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ProKey fullTargetVariable() const override;
|
||||||
};
|
};
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user