Kaynağa Gözat

Add nodeeditor (#1046)

* Add nodeeditor

* qt5base: add support for MinGW on Linux and macOS

* Small refactor

* final fix

* final fix2 --'
Jérôme Leclercq 3 yıl önce
ebeveyn
işleme
4359f03bcc

+ 34 - 0
packages/n/nodeeditor/patches/2.1.3/fix_qt.patch

@@ -0,0 +1,34 @@
+diff --git a/include/nodes/internal/NodePainterDelegate.hpp b/include/nodes/internal/NodePainterDelegate.hpp
+index d532619..f22496c 100644
+--- a/include/nodes/internal/NodePainterDelegate.hpp
++++ b/include/nodes/internal/NodePainterDelegate.hpp
+@@ -1,6 +1,6 @@
+ #pragma once
+ 
+-#include <QPainter>
++#include <QtGui/QPainter>
+ 
+ #include "NodeGeometry.hpp"
+ #include "NodeDataModel.hpp"
+diff --git a/include/nodes/internal/QStringStdHash.hpp b/include/nodes/internal/QStringStdHash.hpp
+index 3d47a3f..cc5eb68 100644
+--- a/include/nodes/internal/QStringStdHash.hpp
++++ b/include/nodes/internal/QStringStdHash.hpp
+@@ -1,5 +1,11 @@
+ #pragma once
+ 
++#include <QtCore/QtGlobal>
++
++#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
++
++// As of 5.14 there is a specialization std::hash<QString>
++
+ #include <functional>
+ 
+ #include <QtCore/QString>
+@@ -17,3 +23,5 @@ struct hash<QString>
+   }
+ };
+ }
++
++#endif

+ 46 - 0
packages/n/nodeeditor/xmake.lua

@@ -0,0 +1,46 @@
+package("nodeeditor")
+    set_homepage("https://github.com/paceholder/nodeeditor")
+    set_description("Qt Node Editor. Dataflow programming framework")
+    set_license("BSD-3")
+
+    set_urls("https://github.com/paceholder/nodeeditor/archive/refs/tags/$(version).tar.gz",
+             "https://github.com/paceholder/nodeeditor.git")
+    add_versions("2.1.3", "4e3194a04ac4a2a2bf4bc8eb6cc27d5cc154923143c1ecf579ce7f0115a90585")
+    add_patches("2.1.3", path.join(os.scriptdir(), "patches", "2.1.3", "fix_qt.patch"), "11b6e765f8c8b0002f84ef0c3eb7dde23076b0564679760b7f4c8ba7c7e46887")
+
+    add_deps("cmake")
+
+    on_load(function (package)
+        package:add("deps", "qt5core", "qt5gui", "qt5widgets", {debug = package:is_debug()})
+        if package:config("shared") then
+            package:add("defines", "NODE_EDITOR_SHARED")
+        else
+            package:add("defines", "NODE_EDITOR_STATIC")
+        end
+    end)
+
+    on_install("windows", "linux", "mingw", "macosx", function (package)
+        local qt = package:dep("qt5core"):fetch().qtdir
+
+        local configs = {"-DBUILD_EXAMPLES=OFF", "-DBUILD_TESTING=OFF"}
+        table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
+        table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:debug() and "Debug" or "Release"))
+        if qt then
+            table.insert(configs, "-DQt5_DIR=" .. path.join(qt.libdir, "cmake", "Qt5"))
+        end
+
+        import("package.tools.cmake").install(package, configs)
+    end)
+
+    on_test(function (package)
+        local cxflags
+        if not package:is_plat("windows") then
+            cxflags = "-fPIC"
+        end
+        assert(package:check_cxxsnippets({test = [[
+            void test() {
+                QtNodes::FlowScene scene(std::make_shared<QtNodes::DataModelRegistry>());
+                QtNodes::FlowView view(&scene);
+            }
+        ]]}, {configs = {languages = "c++14", cxflags = cxflags}, includes = {"nodes/FlowScene", "nodes/FlowView"}}))
+    end)

+ 39 - 52
packages/q/qt5base/xmake.lua

@@ -68,6 +68,7 @@ package("qt5base")
         import("core.tool.toolchain")
 
         local version = package:version()
+        local versionstr = version:shortstr()
 
         local host
         if is_host("windows") or package:is_plat("mingw") then
@@ -136,7 +137,7 @@ package("qt5base")
         elseif package:is_plat("macosx") then
             arch = "clang_64"
         elseif package:is_plat("android") then
-            if package:version():le("5.13") then
+            if version:le("5.13") then
                 if package:is_arch("x86_64", "x64") then
                     arch = "android_x86_64"
                 elseif package:is_arch("arm64", "arm64-v8a") then
@@ -152,66 +153,52 @@ package("qt5base")
         end
 
         local installdir = package:installdir()
-        os.vrunv("aqt", {"install-qt", "-O", installdir, host, target, version:shortstr(), arch})
+        os.vrunv("aqt", {"install-qt", "-O", installdir, host, target, versionstr, arch})
 
         -- move files to root
-        local subdirs = {}
-        if package:is_plat("linux") then
-            table.insert(subdirs, package:is_arch("x86_64") and "gcc_64" or "gcc_32")
-            table.insert(subdirs, package:is_arch("x86_64") and "clang_64" or "clang_32")
-        elseif package:is_plat("macosx") then
-            table.insert(subdirs, package:is_arch("x86_64") and "clang_64" or "clang_32")
-        elseif package:is_plat("windows") then
-            local vs = config.get("vs")
-            if vs then
-                table.insert(subdirs, package:is_arch("x64") and "msvc" .. vs .. "_64" or "msvc" .. vs .. "_32")
-                table.insert(subdirs, "msvc" .. vs)
-            end
-            table.insert(subdirs, package:is_arch("x64") and "msvc*_64" or "msvc*_32")
-            table.insert(subdirs, "msvc*")
-        elseif package:is_plat("mingw") then
-            table.insert(subdirs, package:is_arch("x86_64") and "mingw*_64" or "mingw*_32")
-        elseif package:is_plat("android") then
-            local subdir
-            if package:is_arch("arm64-v8a") then
-                subdir = "android_arm64_v8a"
-            elseif package:is_arch("armeabi-v7a", "armeabi", "armv7-a", "armv5te") then -- armv7-a/armv5te are deprecated
-                subdir = "android_armv7"
-            elseif package:is_arch("x86", "i386") then -- i386 is deprecated
-                subdir = "android_x86"
-            elseif package:is_arch("x86_64") then
-                subdir = "android_x86_64"
-            end
-            if subdir then
-                table.insert(subdirs, subdir)
+        os.mv(path.join(installdir, versionstr, "*", "*"), installdir)
+        os.rmdir(path.join(installdir, versionstr))
+
+        -- special case for cross-compilation using MinGW since we need binaries we can run on the host
+        if package:is_plat("mingw") and not is_host("windows") then
+            local runhost
+            if is_host("linux") then
+                runhost = "linux"
+            elseif is_host("macosx") then
+                runhost = "mac"
+            else
+                raise("unhandled host " .. os.host())
             end
-            table.insert(subdirs, "android")
-        elseif package:is_plat("wasm") then
-            table.insert(subdirs, "wasm_32")
-        else
-            table.insert(subdirs, "*")
-        end
 
-        local installeddir
-        for _, subdir in pairs(subdirs) do
-            local results = os.dirs(path.join(installdir, version, subdir), function (file, isdir) return false end)
-            if results and #results > 0 then
-                installeddir = results[1]
-                break
+            -- download qtbase to bin_host folder
+            os.vrunv("aqt", {"install-qt", "-O", path.join(installdir, "bin_host"), runhost, "desktop", versionstr, "--archives", "qtbase"})
+
+            -- add symbolic links for useful tools
+            local tools = {
+                moc = true,
+                qmake = true,
+                rcc = true,
+                uic = true
+            }
+
+            for _, file in pairs(os.files(path.join(installdir, "bin_host", versionstr, "*", "bin", "*"))) do
+                local filename = path.filename(file)
+                if (tools[filename]) then
+                    local targetpath = path.join(installdir, "bin", filename)
+                    os.ln(file, path.join(installdir, "bin", filename))
+
+                    -- some tools like CMake will try to run moc.exe, trick them
+                    os.rm(targetpath .. ".exe")
+                    os.ln(file, path.join(installdir, "bin", filename .. ".exe"))
+                end
             end
         end
-        assert(installdir, "couldn't find where qt was installed!")
 
-        os.mv(path.join(installeddir, "*"), installdir)
-        os.rmdir(path.join(installdir, version))
-
-        package:data_set("qt", qt_table(installdir, version:shortstr()))
+        package:data_set("qt", qt_table(installdir, versionstr))
     end)
 
     on_test(function (package)
         local qt = assert(package:data("qt"))
-        if not package:is_plat("mingw") then
-            os.vrun(path.join(qt.bindir, "moc") .. " -v")
-            os.vrun(path.join(qt.bindir, "rcc") .. " -v")
-        end
+        os.vrun(path.join(qt.bindir, "moc") .. " -v")
+        os.vrun(path.join(qt.bindir, "rcc") .. " -v")
     end)