summaryrefslogtreecommitdiff
path: root/xmake/modules/private
diff options
context:
space:
mode:
authorruki <[email protected]>2022-05-17 00:52:52 +0800
committerruki <[email protected]>2022-05-17 00:52:52 +0800
commit0894984d573ee66e8b8f860464f2fc0c6a8208c8 (patch)
treed35e70f9c4f14fe898ac51c68a3c64a2f6870ce1 /xmake/modules/private
parent61719b2242a0ea7f0bc263b4012f02b8f5daf216 (diff)
improve preprocess
Diffstat (limited to 'xmake/modules/private')
-rw-r--r--xmake/modules/private/service/distcc_build/client.lua9
-rw-r--r--xmake/modules/private/service/distcc_build/client_session.lua128
2 files changed, 9 insertions, 128 deletions
diff --git a/xmake/modules/private/service/distcc_build/client.lua b/xmake/modules/private/service/distcc_build/client.lua
index deca085c0..a814cdf6d 100644
--- a/xmake/modules/private/service/distcc_build/client.lua
+++ b/xmake/modules/private/service/distcc_build/client.lua
@@ -217,7 +217,7 @@ function distcc_build_client:clean()
end
-- run compilation job
-function distcc_build_client:iorunv(program, argv, opt)
+function distcc_build_client:compile(program, argv, opt)
-- get free host
local host = assert(self:_get_freehost(), "free host not found!")
@@ -228,8 +228,13 @@ function distcc_build_client:iorunv(program, argv, opt)
-- open the host session
local session = assert(self:_host_status_session_open(host), "open session failed!")
+ -- do preprocess
+ opt = opt or {}
+ local preprocess = assert(opt.preprocess, "preprocessor not found!")
+ local outdata, errdata, sourcefile, objectfile, cppfile, cppflags = preprocess(program, argv, opt)
+
-- do distcc compilation
- local outdata, errdata = session:iorunv(program, argv, opt)
+ session:compile(sourcefile, objectfile, cppfile, cppflags, opt)
-- close session
self:_host_status_session_close(host, session)
diff --git a/xmake/modules/private/service/distcc_build/client_session.lua b/xmake/modules/private/service/distcc_build/client_session.lua
index c42b969a5..71d048214 100644
--- a/xmake/modules/private/service/distcc_build/client_session.lua
+++ b/xmake/modules/private/service/distcc_build/client_session.lua
@@ -78,132 +78,8 @@ function client_session:is_opened()
end
-- run compilation job
-function client_session:iorunv(program, argv, opt)
+function client_session:compile(sourcefile, objectfile, cppfile, cppflags, opt)
assert(self:is_opened(), "%s: has been not opened!", self)
- opt = opt or {}
- local tool = opt.tool
- local toolname = tool:name()
- local iorunv = assert(self["_" .. toolname .. "_iorunv"], "%s: iorunv(%s) is not supported!", self, program)
- return iorunv(self, program, argv, opt)
-end
-
--- run compilation job for gcc
-function client_session:_gcc_iorunv(program, argv, opt)
-
- -- get flags and source file
- local flags = {}
- local cppflags = {}
- local skipped = program:endswith("cache") and 1 or 0
- for _, flag in ipairs(argv) do
- if flag == "-o" then
- break
- end
-
- -- get preprocessor flags
- table.insert(cppflags, flag)
-
- -- get compiler flags
- if flag == "-MMD" or flag:startswith("-I") or flag:startswith("--sysroot=") then
- skipped = 1
- elseif flag == "-MF" or flag == "-I" or flag == "-isystem" or flag == "-isysroot" or flag == "-gcc-toolchain" then
- skipped = 2
- elseif flag:endswith("xcrun") then
- skipped = 4
- 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 .. ".p"
- local cppfiledir = path.directory(cppfile)
- if not os.isdir(cppfiledir) then
- os.mkdir(cppfiledir)
- end
- table.insert(cppflags, "-E")
- table.insert(cppflags, "-o")
- table.insert(cppflags, cppfile)
- table.insert(cppflags, sourcefile)
- local outdata, errdata = os.iorunv(program, cppflags, opt)
-
- -- do compile
- self:_compile(sourcefile, cppfile, objectfile, flags, opt)
- return outdata, errdata
-end
-
--- run compilation job for g++
-function client_session:_gxx_iorunv(program, argv, opt)
- return self:_gcc_iorunv(program, argv, opt)
-end
-
--- run compilation job for clang
-function client_session:_clang_iorunv(program, argv, opt)
- return self:_gcc_iorunv(program, argv, opt)
-end
-
--- run compilation job for clang++
-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
- local objectfile
- for _, flag in ipairs(argv) do
- if flag:startswith("-Fo") or flag:startswith("/Fo") then
- objectfile = flag:sub(4)
- break
- end
-
- -- get preprocessor flags
- table.insert(cppflags, flag)
-
- -- get compiler flags
- if flag == "-showIncludes" or flag == "/showIncludes" or
- flag:startswith("-I") or flag:startswith("/I") or
- flag:startswith("-external:") or flag:startswith("/external:") then
- skipped = 1
- elseif flag == "-I" or flag == "-sourceDependencies" or flag == "/sourceDependencies" then
- skipped = 2
- end
- if skipped > 0 then
- skipped = skipped - 1
- else
- table.insert(flags, flag)
- end
- end
- local sourcefile = argv[#argv]
- assert(objectfile and sourcefile, "%s: iorunv(%s): invalid arguments!", self, program)
-
- -- do preprocess
- local cppfile = objectfile .. ".p"
- local cppfiledir = path.directory(cppfile)
- if not os.isdir(cppfiledir) then
- os.mkdir(cppfiledir)
- end
- table.insert(cppflags, "-P")
- table.insert(cppflags, "-Fi" .. cppfile)
- table.insert(cppflags, sourcefile)
- local outdata, errdata = os.iorunv(program, cppflags, opt)
-
- -- do compile
- self:_compile(sourcefile, cppfile, objectfile, flags, opt)
- return outdata, errdata
-end
-
--- do compile
-function client_session:_compile(sourcefile, cppfile, objectfile, flags, opt)
local ok = false
local errors
local tool = opt.tool
@@ -214,7 +90,7 @@ function client_session:_compile(sourcefile, cppfile, objectfile, flags, opt)
local toolchain = tool:toolchain():name()
local stream = self:stream()
if stream:send_msg(message.new_compile(self:id(), toolname, toolkind, plat, arch, toolchain,
- flags, path.filename(sourcefile), {token = self:token()})) and
+ cppflags, path.filename(sourcefile), {token = self:token()})) and
stream:send_file(cppfile, {compress = os.filesize(cppfile) > 4096}) and stream:flush() then
local recv = stream:recv_file(objectfile)
if recv ~= nil then