|
|
|
@ -1,8 +1,8 @@ |
|
|
|
|
-- Generate source files from wayland protocol files |
|
|
|
|
-- for example |
|
|
|
|
-- Generate source files from wayland protocol files. |
|
|
|
|
-- Example: |
|
|
|
|
--[[ |
|
|
|
|
if is_plat("linux") then |
|
|
|
|
add_rules("wayland-protocols@wayland.protocols") |
|
|
|
|
add_rules("@wayland-protocols/wayland.protocols") |
|
|
|
|
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") |
|
|
|
@ -14,39 +14,64 @@ |
|
|
|
|
end) |
|
|
|
|
end |
|
|
|
|
]] |
|
|
|
|
-- Options: |
|
|
|
|
--[[ |
|
|
|
|
add_rules("@wayland-protocols/wayland.protocols", { |
|
|
|
|
outputdir = "...", -- Path for generated files, default is `path.join(target:autogendir(), "rules", "wayland.protocols")` |
|
|
|
|
client = "...", -- Path format for client protocol header files, default is `"%s.h"`, set to `false` to disable its generation |
|
|
|
|
server = "...", -- Path format for server protocol header files, default is `nil` |
|
|
|
|
code = "...", -- Path format for code files, default is `"%s.c"` |
|
|
|
|
public = false, -- Visibility for headers and symbols in generated code, can be `false` or `true`, default is `false` |
|
|
|
|
}) |
|
|
|
|
]] |
|
|
|
|
|
|
|
|
|
rule("wayland.protocols") |
|
|
|
|
set_extensions(".xml") |
|
|
|
|
|
|
|
|
|
on_load(function(target) |
|
|
|
|
on_config(function(target) |
|
|
|
|
import("core.base.option") |
|
|
|
|
|
|
|
|
|
local rule_name = "@wayland-protocols/wayland.protocols" |
|
|
|
|
|
|
|
|
|
if target:rule("c++.build") then |
|
|
|
|
local rule = target:rule("c++.build"):clone() |
|
|
|
|
rule:add("deps", "wayland.protocols", {order = true}) |
|
|
|
|
rule:add("deps", rule_name, {order = true}) |
|
|
|
|
target:rule_add(rule) |
|
|
|
|
end |
|
|
|
|
end) |
|
|
|
|
|
|
|
|
|
on_config(function(target) |
|
|
|
|
import("core.base.option") |
|
|
|
|
local public = target:extraconf("rules", rule_name, "public") |
|
|
|
|
|
|
|
|
|
local outputdir = target:extraconf("rules", "wayland.protocols", "outputdir") or path.join(target:autogendir(), "rules", "wayland.protocols") |
|
|
|
|
local outputdir = target:extraconf("rules", rule_name, "outputdir") or path.join(target:autogendir(), "rules", "wayland.protocols") |
|
|
|
|
if not os.isdir(outputdir) then |
|
|
|
|
os.mkdir(outputdir) |
|
|
|
|
end |
|
|
|
|
target:add("includedirs", outputdir) |
|
|
|
|
target:add("includedirs", outputdir, {public = public}) |
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
local sourcebatches = target:sourcebatches()[rule_name] |
|
|
|
|
if not dryrun and sourcebatches and sourcebatches.sourcefiles then |
|
|
|
|
local client = target:extraconf("rules", rule_name, "client") |
|
|
|
|
if client == nil then |
|
|
|
|
client = "%s.h" |
|
|
|
|
end |
|
|
|
|
local server = target:extraconf("rules", rule_name, "server") |
|
|
|
|
for _, protocol in ipairs(sourcebatches.sourcefiles) do |
|
|
|
|
local basename = path.basename(protocol) |
|
|
|
|
|
|
|
|
|
-- For C++ module dependency discovery |
|
|
|
|
if client then |
|
|
|
|
local clientfile = path.join(outputdir, client:format(basename)) |
|
|
|
|
os.touch(clientfile) |
|
|
|
|
end |
|
|
|
|
if server then |
|
|
|
|
local serverfile = path.join(outputdir, server:format(basename)) |
|
|
|
|
os.touch(serverfile) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
target:add("files", privatefile, {always_added = true}) |
|
|
|
|
-- Add code file to target |
|
|
|
|
local code = target:extraconf("rules", rule_name, "code") or "%s.c" |
|
|
|
|
local codefile = path.join(outputdir, code:format(basename)) |
|
|
|
|
target:add("files", codefile, {always_added = true}) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end) |
|
|
|
@ -54,27 +79,47 @@ rule("wayland.protocols") |
|
|
|
|
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 rule_name = "@wayland-protocols/wayland.protocols" |
|
|
|
|
|
|
|
|
|
local outputdir = target:extraconf("rules", rule_name, "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 basename = path.basename(sourcefile) |
|
|
|
|
|
|
|
|
|
local client_flag = "client-header" |
|
|
|
|
local private_flag = "private-code" |
|
|
|
|
-- Generate client protocol header |
|
|
|
|
local client = target:extraconf("rules", rule_name, "client") |
|
|
|
|
if client == nil then |
|
|
|
|
client = "%s.h" |
|
|
|
|
end |
|
|
|
|
if client then |
|
|
|
|
local clientfile = path.join(outputdir, client:format(basename)) |
|
|
|
|
local client_args = {"client-header", sourcefile, clientfile} |
|
|
|
|
batchcmds:show_progress(opt.progress, "${color.build.object}generating.wayland.protocol.client %s", basename) |
|
|
|
|
batchcmds:vexecv(wayland_scanner.program, client_args) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
local client_flags = {client_flag, sourcefile, clientfile} |
|
|
|
|
local private_flags = {private_flag, sourcefile, privatefile} |
|
|
|
|
-- Generate server protocol header |
|
|
|
|
local server = target:extraconf("rules", rule_name, "server") |
|
|
|
|
if server then |
|
|
|
|
local serverfile = path.join(outputdir, server:format(basename)) |
|
|
|
|
local server_args = {"server-header", sourcefile, serverfile} |
|
|
|
|
batchcmds:show_progress(opt.progress, "${color.build.object}generating.wayland.protocol.server %s", basename) |
|
|
|
|
batchcmds:vexecv(wayland_scanner.program, server_args) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
batchcmds:show_progress(opt.progress, "${color.build.object}generating.wayland.protocol.client %s", path.basename(sourcefile)) |
|
|
|
|
batchcmds:vexecv(wayland_scanner.program, client_flags) |
|
|
|
|
-- Generate code |
|
|
|
|
local public = target:extraconf("rules", rule_name, "public") |
|
|
|
|
local visibility = public and "public" or "private" |
|
|
|
|
|
|
|
|
|
batchcmds:show_progress(opt.progress, "${color.build.object}generating.wayland.protocol.private %s", path.basename(sourcefile)) |
|
|
|
|
batchcmds:vexecv(wayland_scanner.program, private_flags) |
|
|
|
|
local code = target:extraconf("rules", rule_name, "code") or "%s.c" |
|
|
|
|
local codefile = path.join(outputdir, code:format(basename)) |
|
|
|
|
local code_args = {visibility .. "-code", sourcefile, codefile} |
|
|
|
|
batchcmds:show_progress(opt.progress, "${color.build.object}generating.wayland.protocol.%s %s", visibility, basename) |
|
|
|
|
batchcmds:vexecv(wayland_scanner.program, code_args) |
|
|
|
|
|
|
|
|
|
batchcmds:add_depfiles(sourcefile) |
|
|
|
|
batchcmds:set_depmtime(os.mtime(privatefile)) |
|
|
|
|
batchcmds:set_depcache(target:dependfile(privatefile)) |
|
|
|
|
batchcmds:set_depmtime(os.mtime(codefile)) |
|
|
|
|
batchcmds:set_depcache(target:dependfile(codefile)) |
|
|
|
|
end) |
|
|
|
|