Selaa lähdekoodia

Add wayland protocols scanner rule (#2556)

* Add wayland protocols scanner rule

* improve example on wayland.protocols rule

* use before_buildcmd_file to simplify wayland.protocol rule

* Update wayland_protocols.lua

* Update wayland_protocols.lua

---------

Co-authored-by: ruki <[email protected]>
Arthur Laurent 2 vuotta sitten
vanhempi
commit
9eb73d2e8b
1 muutettua tiedostoa jossa 80 lisäystä ja 0 poistoa
  1. 80 0
      packages/w/wayland-protocols/rules/wayland_protocols.lua

+ 80 - 0
packages/w/wayland-protocols/rules/wayland_protocols.lua

@@ -0,0 +1,80 @@
+-- Generate source files from wayland protocol files
+-- for example
+--[[
+    if is_plat("linux") then
+        add_rules("[email protected]")
+        on_load(function(target)
+            local pkg = target:pkg("wayland-protocols")
+            local wayland_protocols_dir = path.join(target:pkg("wayland-protocols"):installdir() or "/usr", "share", "wayland-protocols")
+            local protocols = {path.join("stable", "xdg-shell", "xdg-shell.xml"),
+                               path.join("unstable", "xdg-decoration", "xdg-decoration-unstable-v1.xml")}
+            for _, protocol in ipairs(protocols) do
+                target:add("files", path.join(wayland_protocols_dir, protocol))
+            end
+        end)
+    end
+]]
+rule("wayland.protocols")
+    set_extensions(".xml")
+
+    on_load(function(target)
+        if target:rule("c++.build") then
+            local rule = target:rule("c++.build"):clone()
+            rule:add("deps", "wayland.protocols", {order = true})
+            target:rule_add(rule)
+        end
+    end)
+
+    on_config(function(target)
+        import("core.base.option")
+
+        local outputdir = target:extraconf("rules", "wayland.protocols", "outputdir") or path.join(target:autogendir(), "rules", "wayland.protocols")
+        if not os.isdir(outputdir) then
+            os.mkdir(outputdir)
+        end
+        target:add("includedirs", outputdir)
+
+        local dryrun = option.get("dry-run")
+        local sourcebatches = target:sourcebatches()
+        if not dryrun and sourcebatches["wayland.protocols"] and sourcebatches["wayland.protocols"].sourcefiles then
+            for _, protocol in ipairs(sourcebatches["wayland.protocols"].sourcefiles) do
+                local clientfile = path.join(outputdir, path.basename(protocol) .. ".h")
+                local privatefile = path.join(outputdir, path.basename(protocol) .. ".c")
+
+                -- for c++ module dependency discovery
+                if not os.exists(clientfile) then
+                    os.touch(clientfile)
+                end
+
+                target:add("files", privatefile, {always_added = true})
+            end
+        end
+    end)
+
+    before_buildcmd_file(function(target, batchcmds, sourcefile, opt)
+        import("lib.detect.find_tool")
+
+        local outputdir = target:extraconf("rules", "wayland.protocols", "outputdir") or path.join(target:autogendir(), "rules", "wayland.protocols")
+
+        local wayland_scanner = find_tool("wayland-scanner")
+        assert(wayland_scanner, "wayland-scanner not found! please install wayland package")
+
+        local clientfile = path.join(outputdir, path.basename(sourcefile) .. ".h")
+        local privatefile = path.join(outputdir, path.basename(sourcefile) .. ".c")
+
+        local client_flag = "client-header"
+        local private_flag = "private-code"
+
+        local client_flags = {client_flag, sourcefile, clientfile}
+        local private_flags = {private_flag, sourcefile, privatefile}
+
+        batchcmds:show_progress(opt.progress, "${color.build.object}generating.wayland.protocol.client %s", path.basename(sourcefile))
+        batchcmds:vexecv(wayland_scanner.program, client_flags)
+
+        batchcmds:show_progress(opt.progress, "${color.build.object}generating.wayland.protocol.private %s", path.basename(sourcefile))
+        batchcmds:vexecv(wayland_scanner.program, private_flags)
+
+        batchcmds:add_depfiles(sourcefile)
+        batchcmds:set_depmtime(os.mtime(privatefile))
+        batchcmds:set_depcache(target:dependfile(privatefile))
+    end)