summaryrefslogtreecommitdiff
path: root/xmake/modules/private/tools
diff options
context:
space:
mode:
authorruki <[email protected]>2025-01-25 00:57:44 +0800
committerruki <[email protected]>2025-01-25 00:57:44 +0800
commitd1b1492b07d370f9cf06414490fc489c1dda6ed8 (patch)
treec339b2365597111f6f6f7d9ab7b42498af16c2c5 /xmake/modules/private/tools
parentd52893b18d6f837b10a61ac21b52da26238b201f (diff)
move parse_deps.lua
Diffstat (limited to 'xmake/modules/private/tools')
-rw-r--r--xmake/modules/private/tools/armcc/parse_deps.lua82
-rw-r--r--xmake/modules/private/tools/cl/parse_deps.lua96
-rw-r--r--xmake/modules/private/tools/cl/parse_deps_json.lua144
-rw-r--r--xmake/modules/private/tools/cl/parse_include.lua104
-rw-r--r--xmake/modules/private/tools/cl2000/parse_deps.lua23
-rw-r--r--xmake/modules/private/tools/cl6x/parse_deps.lua77
-rw-r--r--xmake/modules/private/tools/cl_json/parse_deps.lua144
-rw-r--r--xmake/modules/private/tools/gcc/parse_deps.lua143
-rw-r--r--xmake/modules/private/tools/rc/parse_deps.lua52
9 files changed, 0 insertions, 865 deletions
diff --git a/xmake/modules/private/tools/armcc/parse_deps.lua b/xmake/modules/private/tools/armcc/parse_deps.lua
deleted file mode 100644
index afde0a575..000000000
--- a/xmake/modules/private/tools/armcc/parse_deps.lua
+++ /dev/null
@@ -1,82 +0,0 @@
---!A cross-platform build utility based on Lua
---
--- Licensed under the Apache License, Version 2.0 (the "License");
--- you may not use this file except in compliance with the License.
--- You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS,
--- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--- See the License for the specific language governing permissions and
--- limitations under the License.
---
--- Copyright (C) 2015-present, TBOOX Open Source Group.
---
--- @author smalli
--- @file parse_deps_armcc.lua
---
-
--- imports
-import("core.project.project")
-import("core.base.hashset")
-
--- a placeholder for spaces in path
-local space_placeholder = "\001"
-
--- normailize path of a dependecy
-function _normailize_dep(dep, projectdir)
- if path.is_absolute(dep) then
- dep = path.translate(dep)
- else
- dep = path.absolute(dep, projectdir)
- end
- if dep:startswith(projectdir) then
- return path.relative(dep, projectdir)
- else
- return dep
- end
-end
-
--- parse depsfiles from string
---
--- parse_deps(io.readfile(depfile, {continuation = "\\"}))
---
--- eg.
--- build\\.objs\\apps\\cross\\cortex-m3\\release\\APPS\\main.c.o: APPS\\main.c\
--- build\\.objs\\apps\\cross\\cortex-m3\\release\\APPS\\main.c.o: D:\\Keil533\\ARM\\ARMCC\\bin\\..\\include\\stdarg.h\
--- build\\.objs\\apps\\cross\\cortex-m3\\release\\APPS\\main.c.o: D:\\Keil533\\ARM\\ARMCC\\bin\\..\\include\\stdio.h\
--- build\\.objs\\apps\\cross\\cortex-m3\\release\\APPS\\main.c.o: D:\\Keil533\\ARM\\ARMCC\\bin\\..\\include\\string.h\
--- build\\.objs\\apps\\cross\\cortex-m3\\release\\APPS\\main.c.o: APPS\\main.h\
---
---
-function main(depsdata)
- local block = 0
- local results = hashset.new()
- local projectdir = os.projectdir()
- local line = depsdata:rtrim() -- maybe there will be an empty newline at the end. so we trim it first
- local plain = {plain = true}
- line = line:replace("\\ ", space_placeholder, plain)
- for _, includefile in ipairs(line:split('\n', plain)) do
- if is_host("windows") and includefile:match("^%w\\:") then
- includefile = includefile:replace("\\:", ":", plain)
- end
- includefile = includefile:replace(space_placeholder, ' ', plain)
- local splitinfo = includefile:split(".o:", {plain = true})
- if #splitinfo < 2 then
- splitinfo = includefile:split(".obj:", {plain = true})
- end
- includefile = splitinfo[2]
- if includefile then
- includefile = includefile:replace(' ', '', plain)
- if #includefile > 0 then
- includefile = _normailize_dep(includefile, projectdir)
- if includefile then
- results:insert(includefile)
- end
- end
- end
- end
- return results:to_array()
-end
diff --git a/xmake/modules/private/tools/cl/parse_deps.lua b/xmake/modules/private/tools/cl/parse_deps.lua
deleted file mode 100644
index 187d655cd..000000000
--- a/xmake/modules/private/tools/cl/parse_deps.lua
+++ /dev/null
@@ -1,96 +0,0 @@
---!A cross-platform build utility based on Lua
---
--- Licensed under the Apache License, Version 2.0 (the "License");
--- you may not use this file except in compliance with the License.
--- You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS,
--- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--- See the License for the specific language governing permissions and
--- limitations under the License.
---
--- Copyright (C) 2015-present, TBOOX Open Source Group.
---
--- @author ruki
--- @file parse_deps.lua
---
-
--- imports
-import("core.project.project")
-import("core.base.hashset")
-import("parse_include")
-import("core.tool.toolchain")
-
--- get $VCInstallDir
-function _VCInstallDir()
- local VCInstallDir = _g.VCInstallDir
- if not VCInstallDir then
- local msvc = toolchain.load("msvc")
- if msvc then
- local vcvars = msvc:config("vcvars")
- if vcvars and vcvars.VCInstallDir then
- VCInstallDir = vcvars.VCInstallDir
- _g.VCInstallDir = VCInstallDir
- end
- end
- end
- return VCInstallDir
-end
-
--- get $WindowsSdkDir
-function _WindowsSdkDir()
- local WindowsSdkDir = _g.WindowsSdkDir
- if not WindowsSdkDir then
- local msvc = toolchain.load("msvc")
- if msvc then
- local vcvars = msvc:config("vcvars")
- if vcvars and vcvars.WindowsSdkDir then
- WindowsSdkDir = vcvars.WindowsSdkDir
- _g.WindowsSdkDir = WindowsSdkDir
- end
- end
- end
- return WindowsSdkDir
-end
-
-
--- normailize path of a dependecy
-function _normailize_dep(dep, projectdir)
- if path.is_absolute(dep) then
- dep = path.translate(dep)
- else
- dep = path.absolute(dep, projectdir)
- end
- local VCInstallDir = _VCInstallDir()
- local WindowsSdkDir = _WindowsSdkDir()
- if (VCInstallDir and dep:startswith(VCInstallDir)) or (WindowsSdkDir and dep:startswith(WindowsSdkDir)) then
- -- we ignore headerfiles in vc install directory
- return
- end
- if dep:startswith(projectdir) then
- return path.relative(dep, projectdir)
- else
- -- we also need to check header files outside project
- -- https://github.com/xmake-io/xmake/issues/1154
- return dep
- end
-end
-
--- parse depsfiles from string
-function main(depsdata)
- local results = hashset.new()
- for _, line in ipairs(depsdata:split("\n", {plain = true})) do
- local includefile = parse_include(line:trim())
- if includefile then
- includefile = _normailize_dep(includefile, os.projectdir())
- if includefile then
- results:insert(includefile)
- end
- end
- end
- return results:to_array()
-end
-
diff --git a/xmake/modules/private/tools/cl/parse_deps_json.lua b/xmake/modules/private/tools/cl/parse_deps_json.lua
deleted file mode 100644
index 50f728815..000000000
--- a/xmake/modules/private/tools/cl/parse_deps_json.lua
+++ /dev/null
@@ -1,144 +0,0 @@
---!A cross-platform build utility based on Lua
---
--- Licensed under the Apache License, Version 2.0 (the "License");
--- you may not use this file except in compliance with the License.
--- You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS,
--- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--- See the License for the specific language governing permissions and
--- limitations under the License.
---
--- Copyright (C) 2015-present, TBOOX Open Source Group.
---
--- @author ruki
--- @file parse_deps_json.lua
---
-
--- imports
-import("core.project.project")
-import("core.base.hashset")
-import("core.base.json")
-import("core.tool.toolchain")
-
--- get $VCInstallDir
-function _VCInstallDir()
- local VCInstallDir = _g.VCInstallDir
- if not VCInstallDir then
- local msvc = toolchain.load("msvc")
- if msvc then
- local vcvars = msvc:config("vcvars")
- if vcvars and vcvars.VCInstallDir then
- VCInstallDir = vcvars.VCInstallDir:lower() -- @note we need lower case for json/deps
- _g.VCInstallDir = VCInstallDir
- end
- end
- end
- return VCInstallDir
-end
-
--- get $WindowsSdkDir
-function _WindowsSdkDir()
- local WindowsSdkDir = _g.WindowsSdkDir
- if not WindowsSdkDir then
- local msvc = toolchain.load("msvc")
- if msvc then
- local vcvars = msvc:config("vcvars")
- if vcvars and vcvars.WindowsSdkDir then
- WindowsSdkDir = vcvars.WindowsSdkDir:lower() -- @note we need lower case for json/deps
- _g.WindowsSdkDir = WindowsSdkDir
- end
- end
- end
- return WindowsSdkDir
-end
-
--- normailize path of a dependecy
-function _normailize_dep(dep, projectdir)
- if path.is_absolute(dep) then
- dep = path.translate(dep)
- else
- dep = path.absolute(dep, projectdir)
- end
- dep = dep:lower()
- local VCInstallDir = _VCInstallDir()
- local WindowsSdkDir = _WindowsSdkDir()
- if (VCInstallDir and dep:startswith(VCInstallDir)) or (WindowsSdkDir and dep:startswith(WindowsSdkDir)) then
- -- we ignore headerfiles in vc install directory
- return
- end
- if dep:startswith(projectdir) then
- return path.relative(dep, projectdir)
- else
- -- we also need to check header files outside project
- -- https://github.com/xmake-io/xmake/issues/1154
- return dep
- end
-end
-
--- parse depsfiles from string
---
---[[
-{
- "Version": "1.2",
- "Data": {
- "Source": "c:\users\ruki\desktop\user_headerunit\src\main.cpp",
- "ProvidedModule": "",
- "Includes": [],
- "ImportedModules": [
- {
- "Name": "hello",
- "BMI": "c:\users\ruki\desktop\user_headerunit\src\hello.ifc"
- }
- ],
- "ImportedHeaderUnits": [
- {
- "Header": "c:\users\ruki\desktop\user_headerunit\src\header.hpp",
- "BMI": "c:\users\ruki\desktop\user_headerunit\src\header.hpp.ifc"
- }
- ]
- }
-}]]
-function main(depsdata)
-
- -- decode json data first
- depsdata = json.decode(depsdata)
-
- -- get includes
- local data
- if depsdata then
- data = depsdata.Data
- end
- if data then
- includes = data.Includes
- for _, item in ipairs(data.ImportedModules) do
- local bmifile = item.BMI
- if bmifile then
- includes = includes or {}
- table.insert(includes, bmifile)
- end
- end
- for _, item in ipairs(data.ImportedHeaderUnits) do
- local bmifile = item.BMI
- if bmifile then
- includes = includes or {}
- table.insert(includes, bmifile)
- end
- end
- end
-
- -- translate it
- local results = hashset.new()
- local projectdir = os.projectdir():lower() -- we need to generate lower string, because json values are all lower
- for _, includefile in ipairs(includes) do
- includefile = _normailize_dep(includefile, projectdir)
- if includefile then
- results:insert(includefile)
- end
- end
- return results:to_array()
-end
-
diff --git a/xmake/modules/private/tools/cl/parse_include.lua b/xmake/modules/private/tools/cl/parse_include.lua
deleted file mode 100644
index 700f9823f..000000000
--- a/xmake/modules/private/tools/cl/parse_include.lua
+++ /dev/null
@@ -1,104 +0,0 @@
---!A cross-platform build utility based on Lua
---
--- Licensed under the Apache License, Version 2.0 (the "License");
--- you may not use this file except in compliance with the License.
--- You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS,
--- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--- See the License for the specific language governing permissions and
--- limitations under the License.
---
--- Copyright (C) 2015-present, TBOOX Open Source Group.
---
--- @author ruki
--- @file parse_include.lua
---
-
--- imports
-import("core.project.project")
-import("core.base.hashset")
-import("core.tool.toolchain")
-import("core.cache.detectcache")
-import("lib.detect.find_tool")
-import("private.tools.vstool")
-
--- probe include note prefix from cl
-function probe_include_note_from_cl()
- local key = "cldeps.parse_include.note"
- local note = detectcache:get(key)
- if not note then
- local cl = find_tool("cl")
- if cl then
- local projectdir = os.tmpfile() .. ".cldeps"
- local sourcefile = path.join(projectdir, "main.c")
- local headerfile = path.join(projectdir, "foo.h")
- local objectfile = sourcefile .. ".obj"
- local outdata = try { function()
- local runenvs = toolchain.load("msvc"):runenvs()
- local argv = {"-nologo", "-showIncludes", "-c", "-Fo" .. objectfile, sourcefile}
- io.writefile(headerfile, "\n")
- io.writefile(sourcefile, [[
- #include "foo.h"
- int main (int argc, char** argv) {
- return 0;
- }
- ]])
- return vstool.iorunv(cl.program, argv, {envs = runenvs, curdir = projectdir})
- end}
- if outdata then
- for _, line in ipairs(outdata:split('\n', {plain = true})) do
- note = line:match("^(.-:.-: )")
- if note then
- break
- end
- end
- end
- os.tryrm(projectdir)
- end
- detectcache:set(key, note)
- detectcache:save()
- end
- return note
-end
-
--- get include notes prefix, e.g. "Note: including file: "
---
--- @note we cannot get better solution to distinguish between `includes` and `error infos`
---
-function get_include_notes()
- local notes = _g.notes
- if not notes then
- notes = {}
- local note = probe_include_note_from_cl()
- if note then
- table.insert(notes, note)
- end
- table.join2(notes, {
- "Note: including file: ", -- en
- "注意: 包含文件: ", -- zh
- "Remarque : inclusion du fichier : ", -- fr
- "メモ: インクルード ファイル: " -- jp
- })
- _g.notes = notes
- end
- return notes
-end
-
--- main entry
-function main(line)
- local notes = get_include_notes()
- for idx, note in ipairs(notes) do
- if line:startswith(note) then
- -- optimization: move this note to head
- if idx ~= 1 then
- table.insert(notes, 1, note)
- end
- return line:sub(#note):trim()
- end
- end
-end
-
diff --git a/xmake/modules/private/tools/cl2000/parse_deps.lua b/xmake/modules/private/tools/cl2000/parse_deps.lua
deleted file mode 100644
index e02cf0501..000000000
--- a/xmake/modules/private/tools/cl2000/parse_deps.lua
+++ /dev/null
@@ -1,23 +0,0 @@
---!A cross-platform build utility based on Lua
---
--- Licensed under the Apache License, Version 2.0 (the "License");
--- you may not use this file except in compliance with the License.
--- You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS,
--- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--- See the License for the specific language governing permissions and
--- limitations under the License.
---
--- Copyright (C) 2015-present, TBOOX Open Source Group.
---
--- @author ruki
--- @file parse_deps.lua
---
-
--- imports
-inherit("private.tools.cl6x.parse_deps")
-
diff --git a/xmake/modules/private/tools/cl6x/parse_deps.lua b/xmake/modules/private/tools/cl6x/parse_deps.lua
deleted file mode 100644
index a5d5ecd40..000000000
--- a/xmake/modules/private/tools/cl6x/parse_deps.lua
+++ /dev/null
@@ -1,77 +0,0 @@
---!A cross-platform build utility based on Lua
---
--- Licensed under the Apache License, Version 2.0 (the "License");
--- you may not use this file except in compliance with the License.
--- You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS,
--- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--- See the License for the specific language governing permissions and
--- limitations under the License.
---
--- Copyright (C) 2015-present, TBOOX Open Source Group.
---
--- @author ruki
--- @file parse_deps.lua
---
-
--- imports
-import("core.project.config")
-import("core.project.project")
-import("core.base.hashset")
-
--- normailize path of a dependecy
-function _normailize_dep(dep, projectdir)
- -- escape characters, e.g. \#Qt.Widget_pch.h -> #Qt.Widget_pch.h
- -- @see https://github.com/xmake-io/xmake/issues/4134
- -- https://github.com/xmake-io/xmake/issues/4273
- if not is_host("windows") then
- dep = dep:gsub("\\(.)", "%1")
- end
- if path.is_absolute(dep) then
- dep = path.translate(dep)
- else
- dep = path.absolute(dep, projectdir)
- end
- if dep:startswith(projectdir) then
- return path.relative(dep, projectdir)
- else
- -- we also need to check header files outside project
- -- https://github.com/xmake-io/xmake/issues/1154
- return dep
- end
-end
-
--- parse depsfiles from string
---
--- parse_deps(io.readfile(depfile, {continuation = "\\"}))
---
--- eg.
---
--- build/.objs/foo/linux/x86_64/release/src/foo.c.o: src/foo.c
--- build/.objs/foo/linux/x86_64/release/src/foo.c.o: src/foo.h
---
--- build/.objs/tests/linux/x86_64/release/src/main.c.o: src/main.c
--- build/.objs/tests/linux/x86_64/release/src/main.c.o: src/foo.h
--- build/.objs/tests/linux/x86_64/release/src/main.c.o: src/bar.h
--- build/.objs/tests/linux/x86_64/release/src/main.c.o: src/zoo.h
---
-function main(depsdata, opt)
- local results = hashset.new()
- local projectdir = os.projectdir()
- local line = depsdata:rtrim() -- maybe there will be an empty newline at the end. so we trim it first
- local plain = {plain = true}
- for _, includefile in ipairs(line:split('\n', plain)) do -- it will trim all internal spaces without `{strict = true}`
- includefile = includefile:split(": ", plain)[2]
- if includefile and #includefile > 0 then
- includefile = _normailize_dep(includefile, projectdir)
- if includefile then
- results:insert(includefile)
- end
- end
- end
- return results:to_array()
-end
diff --git a/xmake/modules/private/tools/cl_json/parse_deps.lua b/xmake/modules/private/tools/cl_json/parse_deps.lua
deleted file mode 100644
index 21b3c9a9d..000000000
--- a/xmake/modules/private/tools/cl_json/parse_deps.lua
+++ /dev/null
@@ -1,144 +0,0 @@
---!A cross-platform build utility based on Lua
---
--- Licensed under the Apache License, Version 2.0 (the "License");
--- you may not use this file except in compliance with the License.
--- You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS,
--- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--- See the License for the specific language governing permissions and
--- limitations under the License.
---
--- Copyright (C) 2015-present, TBOOX Open Source Group.
---
--- @author ruki
--- @file parse_deps.lua
---
-
--- imports
-import("core.project.project")
-import("core.base.hashset")
-import("core.base.json")
-import("core.tool.toolchain")
-
--- get $VCInstallDir
-function _VCInstallDir()
- local VCInstallDir = _g.VCInstallDir
- if not VCInstallDir then
- local msvc = toolchain.load("msvc")
- if msvc then
- local vcvars = msvc:config("vcvars")
- if vcvars and vcvars.VCInstallDir then
- VCInstallDir = vcvars.VCInstallDir:lower() -- @note we need lower case for json/deps
- _g.VCInstallDir = VCInstallDir
- end
- end
- end
- return VCInstallDir
-end
-
--- get $WindowsSdkDir
-function _WindowsSdkDir()
- local WindowsSdkDir = _g.WindowsSdkDir
- if not WindowsSdkDir then
- local msvc = toolchain.load("msvc")
- if msvc then
- local vcvars = msvc:config("vcvars")
- if vcvars and vcvars.WindowsSdkDir then
- WindowsSdkDir = vcvars.WindowsSdkDir:lower() -- @note we need lower case for json/deps
- _g.WindowsSdkDir = WindowsSdkDir
- end
- end
- end
- return WindowsSdkDir
-end
-
--- normailize path of a dependecy
-function _normailize_dep(dep, projectdir)
- if path.is_absolute(dep) then
- dep = path.translate(dep)
- else
- dep = path.absolute(dep, projectdir)
- end
- dep = dep:lower()
- local VCInstallDir = _VCInstallDir()
- local WindowsSdkDir = _WindowsSdkDir()
- if (VCInstallDir and dep:startswith(VCInstallDir)) or (WindowsSdkDir and dep:startswith(WindowsSdkDir)) then
- -- we ignore headerfiles in vc install directory
- return
- end
- if dep:startswith(projectdir) then
- return path.relative(dep, projectdir)
- else
- -- we also need to check header files outside project
- -- https://github.com/xmake-io/xmake/issues/1154
- return dep
- end
-end
-
--- parse depsfiles from string
---
---[[
-{
- "Version": "1.2",
- "Data": {
- "Source": "c:\users\ruki\desktop\user_headerunit\src\main.cpp",
- "ProvidedModule": "",
- "Includes": [],
- "ImportedModules": [
- {
- "Name": "hello",
- "BMI": "c:\users\ruki\desktop\user_headerunit\src\hello.ifc"
- }
- ],
- "ImportedHeaderUnits": [
- {
- "Header": "c:\users\ruki\desktop\user_headerunit\src\header.hpp",
- "BMI": "c:\users\ruki\desktop\user_headerunit\src\header.hpp.ifc"
- }
- ]
- }
-}]]
-function main(depsdata)
-
- -- decode json data first
- depsdata = json.decode(depsdata)
-
- -- get includes
- local data
- if depsdata then
- data = depsdata.Data
- end
- if data then
- includes = data.Includes
- for _, item in ipairs(data.ImportedModules) do
- local bmifile = item.BMI
- if bmifile then
- includes = includes or {}
- table.insert(includes, bmifile)
- end
- end
- for _, item in ipairs(data.ImportedHeaderUnits) do
- local bmifile = item.BMI
- if bmifile then
- includes = includes or {}
- table.insert(includes, bmifile)
- end
- end
- end
-
- -- translate it
- local results = hashset.new()
- local projectdir = os.projectdir():lower() -- we need to generate lower string, because json values are all lower
- for _, includefile in ipairs(includes) do
- includefile = _normailize_dep(includefile, projectdir)
- if includefile then
- results:insert(includefile)
- end
- end
- return results:to_array()
-end
-
diff --git a/xmake/modules/private/tools/gcc/parse_deps.lua b/xmake/modules/private/tools/gcc/parse_deps.lua
deleted file mode 100644
index b4b5cba7f..000000000
--- a/xmake/modules/private/tools/gcc/parse_deps.lua
+++ /dev/null
@@ -1,143 +0,0 @@
---!A cross-platform build utility based on Lua
---
--- Licensed under the Apache License, Version 2.0 (the "License");
--- you may not use this file except in compliance with the License.
--- You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS,
--- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--- See the License for the specific language governing permissions and
--- limitations under the License.
---
--- Copyright (C) 2015-present, TBOOX Open Source Group.
---
--- @author ruki
--- @file parse_deps.lua
---
-
--- imports
-import("core.project.config")
-import("core.project.project")
-import("core.base.hashset")
-
--- a placeholder for spaces in path
-local space_placeholder = "\001"
-
--- normailize path of a dependecy
-function _normailize_dep(dep, projectdir)
- -- escape characters, e.g. \#Qt.Widget_pch.h -> #Qt.Widget_pch.h
- -- @see https://github.com/xmake-io/xmake/issues/4134
- -- https://github.com/xmake-io/xmake/issues/4273
- if not is_host("windows") then
- dep = dep:gsub("\\(.)", "%1")
- end
- if path.is_absolute(dep) then
- dep = path.translate(dep)
- else
- dep = path.absolute(dep, projectdir)
- end
- if dep:startswith(projectdir) then
- return path.relative(dep, projectdir)
- else
- -- we also need to check header files outside project
- -- https://github.com/xmake-io/xmake/issues/1154
- return dep
- end
-end
-
--- load module mapper
-function _load_module_mapper(target)
- local mapper = {}
- local mapperfile = path.join(config.buildir(), target:name(), "mapper.txt")
- for line in io.lines(mapperfile) do
- local moduleinfo = line:split(" ", {plain = true})
- if #moduleinfo == 2 then
- mapper[moduleinfo[1]] = moduleinfo[2]
- end
- end
- return mapper
-end
-
--- parse depsfiles from string
---
--- parse_deps(io.readfile(depfile, {continuation = "\\"}))
---
--- eg.
--- strcpy.o: src/tbox/libc/string/strcpy.c src/tbox/libc/string/string.h \
--- src/tbox/libc/string/prefix.h src/tbox/libc/string/../prefix.h \
--- src/tbox/libc/string/../../prefix.h \
--- src/tbox/libc/string/../../prefix/prefix.h \
--- src/tbox/libc/string/../../prefix/config.h \
--- src/tbox/libc/string/../../prefix/../config.h \
--- build/iphoneos/x86_64/release/tbox.config.h \
---
--- with c++ modules (gcc):
--- build/.objs/dependence/linux/x86_64/release/src/foo.mpp.o: src/foo.mpp\
--- build/.objs/dependence/linux/x86_64/release/src/foo.mpp.o gcm.cache/foo.gcm: bar.c++m cat.c++m\
--- foo.c++m: gcm.cache/foo.gcm\
--- .PHONY: foo.c++m\
--- gcm.cache/foo.gcm:| build/.objs/dependence/linux/x86_64/release/src/foo.mpp.o\
--- CXX_IMPORTS += bar.c++m cat.c++m\
---
-function main(depsdata, opt)
-
- -- we assume there is only one valid line
- local block = 0
- local results = hashset.new()
- local projectdir = os.projectdir()
- local line = depsdata:rtrim() -- maybe there will be an empty newline at the end. so we trim it first
- local plain = {plain = true}
- line = line:replace("\\ ", space_placeholder, plain)
- for _, includefile in ipairs(line:split(' ', plain)) do -- it will trim all internal spaces without `{strict = true}`
- -- some gcc toolchains will some invalid paths (e.g. `d\:\xxx`), we need to fix it
- -- https://github.com/xmake-io/xmake/issues/1196
- if is_host("windows") and includefile:match("^%w\\:") then
- includefile = includefile:replace("\\:", ":", plain)
- end
- if includefile:endswith(":") then -- ignore "xxx.o:" prefix
- block = block + 1
- if block > 1 then
- -- skip other `xxx.o:` block
- break
- end
- else
- includefile = includefile:replace(space_placeholder, ' ', plain)
- includefile = includefile:split("\n", plain)[1]
- if #includefile > 0 then
- includefile = _normailize_dep(includefile, projectdir)
- if includefile then
- results:insert(includefile)
- end
- end
- end
- end
-
- -- translate .c++m module file path
- -- with c++ modules (gcc):
- -- CXX_IMPORTS += bar.c++m cat.c++m\
- --
- -- @see https://github.com/xmake-io/xmake/issues/3000
- -- https://github.com/xmake-io/xmake/issues/4215
- local target = opt and opt.target
- if target and line:find("CXX_IMPORTS += ", 1, true) then
- local mapper = _load_module_mapper(target)
- local modulefiles = line:split("CXX_IMPORTS += ", plain)[2]
- if modulefiles then
- for _, modulefile in ipairs(modulefiles:split(' ', plain)) do
- if modulefile:endswith(".c++m") then
- local modulekey = modulefile:sub(1, #modulefile - 5)
- local modulepath = mapper[modulekey]
- if modulepath then
- modulepath = _normailize_dep(modulepath, projectdir)
- results:insert(modulepath)
- end
- end
- end
- end
- end
-
- return results:to_array()
-end
diff --git a/xmake/modules/private/tools/rc/parse_deps.lua b/xmake/modules/private/tools/rc/parse_deps.lua
deleted file mode 100644
index 778f7b03f..000000000
--- a/xmake/modules/private/tools/rc/parse_deps.lua
+++ /dev/null
@@ -1,52 +0,0 @@
---!A cross-platform build utility based on Lua
---
--- Licensed under the Apache License, Version 2.0 (the "License");
--- you may not use this file except in compliance with the License.
--- You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software
--- distributed under the License is distributed on an "AS IS" BASIS,
--- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--- See the License for the specific language governing permissions and
--- limitations under the License.
---
--- Copyright (C) 2015-present, TBOOX Open Source Group.
---
--- @author ruki
--- @file parse_deps.lua
---
-
--- imports
-import("core.project.project")
-import("core.base.hashset")
-
--- normailize path of a dependecy
-function _normailize_dep(dep, projectdir)
- if path.is_absolute(dep) then
- dep = path.translate(dep)
- else
- dep = path.absolute(dep, projectdir)
- end
- if dep:startswith(projectdir) then
- return path.relative(dep, projectdir)
- else
- return deps
- end
-end
-
--- parse depsfiles from string
-function main(depsdata)
- local results = hashset.new()
- local projectdir = os.projectdir()
- for _, includefile in ipairs(depsdata:split('\n', {plain = true})) do
- if #includefile > 0 then
- includefile = _normailize_dep(includefile, projectdir)
- if includefile then
- results:insert(includefile)
- end
- end
- end
- return results:to_array()
-end