summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2020-04-06 23:15:55 +0800
committerGitHub <[email protected]>2020-04-06 23:15:55 +0800
commitcc765abc4843ca1a0bed451d7ae6d584bc9222b4 (patch)
tree4dd8e918e14076b1a4882728c4777c8ebbc31a10
parente39f9aa0eb208e74c827bbae1bc20fba9fbb01d7 (diff)
parent105bab82d3a915c1adee490a42c00a400ea6566e (diff)
Merge pull request #752 from shaoxie1986/dev
Support Qt private header
-rw-r--r--tests/projects/qt/with_private/src/main.cpp11
-rw-r--r--tests/projects/qt/with_private/src/mainwindow.cpp16
-rw-r--r--tests/projects/qt/with_private/src/mainwindow.h22
-rw-r--r--tests/projects/qt/with_private/src/mainwindow.ui24
-rw-r--r--tests/projects/qt/with_private/xmake.lua22
-rw-r--r--xmake/rules/qt/load.lua59
6 files changed, 138 insertions, 16 deletions
diff --git a/tests/projects/qt/with_private/src/main.cpp b/tests/projects/qt/with_private/src/main.cpp
new file mode 100644
index 000000000..b48f94ec8
--- /dev/null
+++ b/tests/projects/qt/with_private/src/main.cpp
@@ -0,0 +1,11 @@
+#include "mainwindow.h"
+#include <QApplication>
+
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+ MainWindow w;
+ w.show();
+
+ return a.exec();
+}
diff --git a/tests/projects/qt/with_private/src/mainwindow.cpp b/tests/projects/qt/with_private/src/mainwindow.cpp
new file mode 100644
index 000000000..4d9a6bcae
--- /dev/null
+++ b/tests/projects/qt/with_private/src/mainwindow.cpp
@@ -0,0 +1,16 @@
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+#include <private/qquicktext_p.h>
+MainWindow::MainWindow(QWidget *parent) :
+ QMainWindow(parent),
+ ui(new Ui::MainWindow)
+{
+ ui->setupUi(this);
+ QQuickText *text = new QQuickText();
+ delete text;
+}
+
+MainWindow::~MainWindow()
+{
+ delete ui;
+}
diff --git a/tests/projects/qt/with_private/src/mainwindow.h b/tests/projects/qt/with_private/src/mainwindow.h
new file mode 100644
index 000000000..8e06f4918
--- /dev/null
+++ b/tests/projects/qt/with_private/src/mainwindow.h
@@ -0,0 +1,22 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+
+namespace Ui {
+class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ explicit MainWindow(QWidget *parent = 0);
+ ~MainWindow();
+
+private:
+ Ui::MainWindow *ui;
+};
+
+#endif // MAINWINDOW_H
diff --git a/tests/projects/qt/with_private/src/mainwindow.ui b/tests/projects/qt/with_private/src/mainwindow.ui
new file mode 100644
index 000000000..1c59b695e
--- /dev/null
+++ b/tests/projects/qt/with_private/src/mainwindow.ui
@@ -0,0 +1,24 @@
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>MainWindow</string>
+ </property>
+ <widget class="QMenuBar" name="menuBar" />
+ <widget class="QToolBar" name="mainToolBar" />
+ <widget class="QWidget" name="centralWidget" />
+ <widget class="QStatusBar" name="statusBar" />
+ </widget>
+ <layoutDefault spacing="6" margin="11" />
+ <pixmapfunction></pixmapfunction>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/tests/projects/qt/with_private/xmake.lua b/tests/projects/qt/with_private/xmake.lua
new file mode 100644
index 000000000..6cc6378e7
--- /dev/null
+++ b/tests/projects/qt/with_private/xmake.lua
@@ -0,0 +1,22 @@
+
+-- add modes: debug and release
+add_rules("mode.debug", "mode.release")
+
+-- add target
+target("qt_demo")
+
+ -- add rules
+ add_rules("qt.widgetapp")
+ add_frameworks("QtCore", "QtGui", "QtWidgets", "QtQuick", "QtQuickPrivate", "QtQml", "QtQmlPrivate", "QtCorePrivate", "QtGuiPrivate")
+
+ -- add headers
+ add_headerfiles("src/*.h")
+
+ -- add files
+ add_files("src/*.cpp")
+ add_files("src/mainwindow.ui")
+
+ -- add files with Q_OBJECT meta (only for qt.moc)
+ add_files("src/mainwindow.h")
+
+
diff --git a/xmake/rules/qt/load.lua b/xmake/rules/qt/load.lua
index 62027aaa4..d035c734e 100644
--- a/xmake/rules/qt/load.lua
+++ b/xmake/rules/qt/load.lua
@@ -11,7 +11,7 @@
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
---
+--
-- Copyright (C) 2015-2020, TBOOX Open Source Group.
--
-- @author ruki
@@ -30,7 +30,7 @@ function _link(framework, major)
debug_suffix = "d"
elseif is_plat("mingw") then
debug_suffix = "d"
- elseif is_plat("android") then
+ elseif is_plat("android") or is_plat("linux") then
debug_suffix = ""
end
framework = "Qt" .. major .. framework:sub(3) .. (is_mode("debug") and debug_suffix or "")
@@ -46,7 +46,7 @@ function _find_static_links_3rd(linkdirs, major, libpattern)
debug_suffix = "d"
elseif is_plat("mingw") then
debug_suffix = "d"
- elseif is_plat("android") then
+ elseif is_plat("android") or is_plat("linux") then
debug_suffix = ""
end
for _, linkdir in ipairs(linkdirs) do
@@ -166,27 +166,54 @@ function main(target, opt)
-- translate qt frameworks
if framework:startswith("Qt") then
+ -- add private includedirs
+ if framework:lower():endswith("private") then
+ local private_dir = framework:sub(1, -#("private") - 1);
+ if is_plat("macosx") then
+ local frameworkdir = path.join(qt.sdkdir, "lib", framework .. ".framework")
+ if os.isdir(frameworkdir) then
+ target:add("includedirs", path.join(frameworkdir, "Headers", qt.sdkver))
+ target:add("includedirs", path.join(frameworkdir, "Headers", qt.sdkver, private_dir))
+ else
+ target:add("includedirs", path.join(qt.sdkdir, "include", private_dir, qt.sdkver, private_dir))
+ target:add("includedirs", path.join(qt.sdkdir, "include", private_dir, qt.sdkver))
+ end
+ else
+ target:add("includedirs", path.join(qt.sdkdir, "include", private_dir, qt.sdkver, private_dir))
+ target:add("includedirs", path.join(qt.sdkdir, "include", private_dir, qt.sdkver))
+ end
+ else
+ -- add defines
+ target:add("defines", "QT_" .. framework:sub(3):upper() .. "_LIB")
- -- add defines
- target:add("defines", "QT_" .. framework:sub(3):upper() .. "_LIB")
-
- -- add includedirs
- if is_plat("macosx") then
- local frameworkdir = path.join(qt.sdkdir, "lib", framework .. ".framework")
- if os.isdir(frameworkdir) then
- target:add("includedirs", path.join(frameworkdir, "Headers"))
- useframeworks = true
+ -- add includedirs
+ if is_plat("macosx") then
+ local frameworkdir = path.join(qt.sdkdir, "lib", framework .. ".framework")
+ if os.isdir(frameworkdir) then
+ target:add("includedirs", path.join(frameworkdir, "Headers"))
+ useframeworks = true
+ else
+ target:add("syslinks", _link(framework, major))
+ target:add("includedirs", path.join(qt.sdkdir, "include", framework))
+ end
else
target:add("syslinks", _link(framework, major))
target:add("includedirs", path.join(qt.sdkdir, "include", framework))
end
- else
- target:add("syslinks", _link(framework, major))
- target:add("includedirs", path.join(qt.sdkdir, "include", framework))
end
end
end
+ -- remove private frameworks
+ local local_frameworks = {}
+ for _, framework in ipairs(target:get("frameworks")) do
+ if not framework:lower():endswith("private") then
+ table.insert(local_frameworks, framework)
+ end
+ end
+
+ target:set("frameworks", local_frameworks)
+
-- add some static third-party links if exists, e.g. libqtmain.a, libqtfreetype.q, libqtlibpng.a
-- and exclude qt framework libraries, e.g. libQt5xxx.a, Qt5xxx.lib
target:add("syslinks", _find_static_links_3rd(qt.linkdirs, major, is_plat("windows") and "qt*.lib" or "libqt*.a"))
@@ -196,7 +223,7 @@ function main(target, opt)
target:add("syslinks", syslinks_user)
end
- -- add includedirs, linkdirs
+ -- add includedirs, linkdirs
if is_plat("macosx") then
target:add("frameworks", "DiskArbitration", "IOKit", "CoreFoundation", "CoreGraphics", "OpenGL")
target:add("frameworks", "Carbon", "Foundation", "AppKit", "Security", "SystemConfiguration")