Merge remote-tracking branch 'origin/dev' into wip/qt6

Change-Id: I54741635460bb2d8f3fd0be535ee1968d6c442bb
This commit is contained in:
Alexandru Croitor 2019-09-04 14:33:40 +02:00
commit f255b1e8e2
768 changed files with 130342 additions and 82513 deletions

View File

@ -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)

View File

@ -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 "/");

View File

@ -1 +1,2 @@
SOURCES = arch.cpp SOURCES = arch.cpp
include(write_info.pri)

View File

@ -1,2 +1,3 @@
option(host_build) option(host_build)
SOURCES = arch.cpp SOURCES = arch.cpp
include(write_info.pri)

View 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)

View File

@ -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:

View File

@ -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",

View File

@ -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

View File

@ -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

View File

@ -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));
} }

View File

@ -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);

View File

@ -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);
} }

View File

@ -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;
}; };

View File

@ -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);
} }

View File

@ -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

View File

@ -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]

View File

@ -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();

View File

@ -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;

View File

@ -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()
{ {
} }

View File

@ -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

View File

@ -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];

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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);
} }

View File

@ -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

View File

@ -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

View File

@ -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();

View File

@ -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

View File

@ -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();
} }

View File

@ -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

View File

@ -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);
} }

View File

@ -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

View File

@ -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);
} }

View File

@ -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

View File

@ -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));

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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)
{ {
} }

View File

@ -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;
}; };

View File

@ -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());

View File

@ -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

View File

@ -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);

View File

@ -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());
} }

View File

@ -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

View File

@ -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();
} }

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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()) {

View File

@ -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));
} }

View File

@ -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")
}; };

View File

@ -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");
} }

View File

@ -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";

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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
} }

View File

@ -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()
} }

View 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

View 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)
}

View File

@ -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) {

View File

@ -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)

View File

@ -0,0 +1,2 @@
#include <QtPlugin>
Q_IMPORT_PLUGIN($$CMAKE_PLUGIN_NAME)

View File

@ -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\")

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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 {

View File

@ -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\" />"
} }
} }

View 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

View File

@ -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()

View File

@ -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)

View File

@ -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

View File

@ -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}

View File

@ -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

View File

@ -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.

View File

@ -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)

View File

@ -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) $<

View File

@ -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 \

View File

@ -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.

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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;
}; };

View File

@ -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:

View File

@ -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)

View File

@ -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;

View File

@ -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();

View File

@ -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";
} }

View File

@ -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("&#x000D;&#x000A;if errorlevel 1 goto VCEnd&#x000D;&#x000A;"); 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);
} }

View File

@ -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()

View File

@ -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

View File

@ -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