diff --git a/xmake/rules/capnproto/capnp.lua b/xmake/rules/capnproto/capnp.lua index 747608755f6..1d704e47802 100644 --- a/xmake/rules/capnproto/capnp.lua +++ b/xmake/rules/capnproto/capnp.lua @@ -37,8 +37,45 @@ function _get_capnp(target) return assert(target:data("capnproto.capnp"), "capnp not found!") end +-- generate build commands +function load(target) + print(target:sourcebatches()) + -- get the first sourcefile + local sourcefile_capnp + local sourcebatch = target:sourcebatches()["capnproto.cpp"] + if sourcebatch and sourcebatch.sourcefiles then + sourcefile_capnp = sourcebatch.sourcefiles[1] + end + if not sourcefile_capnp then + return + end + + -- get c/c++ source file for capnproto + local prefixdir + local public + local fileconfig = target:fileconfig(sourcefile_capnp) + if fileconfig then + public = fileconfig.capnp_public + prefixdir = fileconfig.capnp_rootdir + end + local rootdir = path.join(target:autogendir(), "rules", "capnproto") + local filename = path.basename(sourcefile_capnp) .. ".capnp.c++" + local sourcefile_cx = target:autogenfile(sourcefile_capnp, {rootdir = rootdir, filename = filename}) + local sourcefile_dir = prefixdir and path.join(rootdir, prefixdir) or path.directory(sourcefile_cx) + + print("ADDINC",sourcefile_dir) + + -- add includedirs + target:add("includedirs", sourcefile_dir, {public = true}) + + -- add objectfile, @see https://github.com/xmake-io/xmake/issues/5426 + local objectfile = target:objectfile(sourcefile_cx) + table.insert(target:objectfiles(), objectfile) +end + -- generate build commands function buildcmd(target, batchcmds, sourcefile_capnp, opt) + print("CAPNPROTO buildcmd",sourcefile_capnp) -- get capnp local capnp = _get_capnp(target) @@ -56,12 +93,8 @@ function buildcmd(target, batchcmds, sourcefile_capnp, opt) local sourcefile_cx = target:autogenfile(sourcefile_capnp, {rootdir = rootdir, filename = filename}) local sourcefile_dir = prefixdir and path.join(rootdir, prefixdir) or path.directory(sourcefile_cx) - -- add includedirs - target:add("includedirs", sourcefile_dir, {public = public}) - -- add objectfile local objectfile = target:objectfile(sourcefile_cx) - table.insert(target:objectfiles(), objectfile) -- add commands batchcmds:mkdir(sourcefile_dir) @@ -77,10 +110,10 @@ function buildcmd(target, batchcmds, sourcefile_capnp, opt) table.insert(argv, path(prefixdir, function (p) return "--src-prefix=" .. p end)) end table.insert(argv, "-o") - table.insert(argv, path(sourcefile_dir, function (p) return "c++:" .. p end)) + table.insert(argv, path(rootdir, function (p) return "c++:" .. p end)) table.insert(argv, path(sourcefile_capnp)) batchcmds:vrunv(capnp, argv) - local configs = {includedirs = sourcefile_dir, languages = "c++14"} + local configs = {includedirs = sourcefile_dir, languages = (fileconfig and fileconfig.cpp_version) or "c++14"} if target:is_plat("windows") then configs.cxflags = "/TP" end diff --git a/xmake/rules/capnproto/xmake.lua b/xmake/rules/capnproto/xmake.lua index 651c5bd4744..81491baa1f5 100644 --- a/xmake/rules/capnproto/xmake.lua +++ b/xmake/rules/capnproto/xmake.lua @@ -20,7 +20,11 @@ -- define rule: capnproto.cpp rule("capnproto.cpp") + add_deps("c++") set_extensions(".capnp") + after_load(function (target) + return import("capnp").load(target) + end) before_buildcmd_file(function (target, batchcmds, sourcefile_capnp, opt) return import("capnp").buildcmd(target, batchcmds, sourcefile_capnp, opt) end)