diff options
| author | ruki <[email protected]> | 2022-05-15 15:35:58 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2022-05-15 15:35:58 +0800 |
| commit | c51efeaa184814aa65dbe90835aeb4330c43220f (patch) | |
| tree | 28b7b64dfd10e64bc0e35d55e026cd57cb53188d | |
| parent | 1fcec0d2fc97f359e6dd18753363564e7c0c608b (diff) | |
add cl for distcc
| -rw-r--r-- | xmake/modules/private/service/distcc_build/client_session.lua | 50 | ||||
| -rw-r--r-- | xmake/modules/private/service/distcc_build/server_session.lua | 16 |
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 |
