summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-05-15 15:35:58 +0800
committerruki <[email protected]>2022-05-15 15:35:58 +0800
commitc51efeaa184814aa65dbe90835aeb4330c43220f (patch)
tree28b7b64dfd10e64bc0e35d55e026cd57cb53188d
parent1fcec0d2fc97f359e6dd18753363564e7c0c608b (diff)
add cl for distcc
-rw-r--r--xmake/modules/private/service/distcc_build/client_session.lua50
-rw-r--r--xmake/modules/private/service/distcc_build/server_session.lua16
2 files changed, 62 insertions, 4 deletions
diff --git a/xmake/modules/private/service/distcc_build/client_session.lua b/xmake/modules/private/service/distcc_build/client_session.lua
index a07dbdfe0..46269e807 100644
--- a/xmake/modules/private/service/distcc_build/client_session.lua
+++ b/xmake/modules/private/service/distcc_build/client_session.lua
@@ -151,6 +151,56 @@ function client_session:_clangxx_iorunv(program, argv, opt)
return self:_gcc_iorunv(program, argv, opt)
end
+-- run compilation job for cl
+function client_session:_cl_iorunv(program, argv, opt)
+
+ -- get flags and source file
+ local flags = {}
+ local cppflags = {}
+ local skipped = 0
+ for _, flag in ipairs(argv) do
+ if flag == "-Fo" then
+ break
+ end
+
+ -- get preprocessor flags
+ table.insert(cppflags, flag)
+
+ -- get compiler flags
+ if flag == "-showIncludes" or flag == "/showIncludes" or
+ flag == "-sourceDependencies" or flag == "/sourceDependencies" or
+ flag:startswith("-I") or flag:startswith("/I") or
+ flag:startswith("-external:") or flag:startswith("/external:") then
+ skipped = 1
+ elseif flag == "-I" then
+ skipped = 2
+ end
+ if skipped > 0 then
+ skipped = skipped - 1
+ else
+ table.insert(flags, flag)
+ end
+ end
+ local objectfile = argv[#argv - 1]
+ local sourcefile = argv[#argv]
+ assert(objectfile and sourcefile, "%s: iorunv(%s): invalid arguments!", self, program)
+
+ -- do preprocess
+ local cppfile = objectfile:gsub("%.obj$", ".p")
+ local cppfiledir = path.directory(cppfile)
+ if not os.isdir(cppfiledir) then
+ os.mkdir(cppfiledir)
+ end
+ table.insert(cppflags, "-P")
+ table.insert(cppflags, "-Fo")
+ table.insert(cppflags, cppfile)
+ table.insert(cppflags, sourcefile)
+ os.runv(program, cppflags, opt)
+
+ -- do compile
+ self:_compile(sourcefile, cppfile, objectfile, flags, opt)
+end
+
-- do compile
function client_session:_compile(sourcefile, cppfile, objectfile, flags, opt)
local ok = false
diff --git a/xmake/modules/private/service/distcc_build/server_session.lua b/xmake/modules/private/service/distcc_build/server_session.lua
index 09ecb3c8d..3b05d9ceb 100644
--- a/xmake/modules/private/service/distcc_build/server_session.lua
+++ b/xmake/modules/private/service/distcc_build/server_session.lua
@@ -28,6 +28,7 @@ import("core.base.hashset")
import("core.base.scheduler")
import("core.tool.toolchain")
import("core.cache.memcache")
+import("private.tools.vstool")
import("private.service.server_config", {alias = "config"})
import("private.service.message")
@@ -194,20 +195,20 @@ function server_session:_tool(name, opt)
if toolchain_inst:check() then
local program, toolname = toolchain_inst:tool(toolkind)
assert(program, "%s/%s not found!", name, toolkind)
- cacheinfo = {program, toolname}
+ cacheinfo = {program, toolname, toolchain_inst:runenvs()}
self:_cache():set(cachekey, cacheinfo)
else
raise("toolchain(%s) not found!", name)
end
end
- return cacheinfo[1], cacheinfo[2]
+ return cacheinfo[1], cacheinfo[2], cacheinfo[3]
end
-- do compile job for gcc
function server_session:_gcc_compile(toolname, flags, sourcefile, objectfile, opt)
- local program, toolname_real = self:_tool(opt.toolchain, opt)
+ local program, toolname_real, runenvs = self:_tool(opt.toolchain, opt)
assert(toolname_real == toolname, "toolname is not matched, %s != %s", toolname, toolname_real)
- os.vrunv(program, table.join(flags, "-o", objectfile, sourcefile))
+ os.vrunv(program, table.join(flags, "-o", objectfile, sourcefile), {envs = runenvs})
end
-- do compile job for g++
@@ -225,6 +226,13 @@ function server_session:_clangxx_compile(toolname, flags, sourcefile, objectfile
return self:_gcc_compile(toolname, flags, sourcefile, objectfile, opt)
end
+-- do compile job for cl
+function server_session:_cl_compile(toolname, flags, sourcefile, objectfile, opt)
+ local program, toolname_real, runenvs = self:_tool(opt.toolchain, opt)
+ assert(toolname_real == toolname, "toolname is not matched, %s != %s", toolname, toolname_real)
+ vstool.runv(program, table.join(flags, "-Fo", objectfile, sourcefile), {envs = runenvs})
+end
+
function server_session:__tostring()
return string.format("<session %s>", self:id())
end