summaryrefslogtreecommitdiff
path: root/xmake/rules/platform/linux/driver/driver_modules.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2021-12-11 10:10:28 +0800
committerruki <[email protected]>2021-12-11 10:10:28 +0800
commita64f493f3b6812bef7f78fa973f11cc963d1b8a3 (patch)
treec09b8e6ad27b3a0ff878c442207eec03ad99e7ca /xmake/rules/platform/linux/driver/driver_modules.lua
parentec7711e4c84733a71b1932eeb59eed9844ea5b2d (diff)
get gcc_incluedir
Diffstat (limited to 'xmake/rules/platform/linux/driver/driver_modules.lua')
-rw-r--r--xmake/rules/platform/linux/driver/driver_modules.lua42
1 files changed, 41 insertions, 1 deletions
diff --git a/xmake/rules/platform/linux/driver/driver_modules.lua b/xmake/rules/platform/linux/driver/driver_modules.lua
index a482b8527..7addb3764 100644
--- a/xmake/rules/platform/linux/driver/driver_modules.lua
+++ b/xmake/rules/platform/linux/driver/driver_modules.lua
@@ -46,6 +46,43 @@ function _get_linux_headers_sdk(target)
return {version = version, sdkdir = linux_headersdir, includedir = includedir}
end
+-- get c system search include directory of gcc
+--
+-- e.g. gcc -E -Wp,-v -xc /dev/null
+--
+-- ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
+-- ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/10/include-fixed"
+-- ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include"
+-- #include "..." search starts here:
+-- #include <...> search starts here:
+-- /usr/lib/gcc/x86_64-linux-gnu/10/include <-- we need get it
+-- /usr/local/include
+-- /usr/include/x86_64-linux-gnu
+-- /usr/include
+-- End of search list.
+function _get_gcc_includedir(target)
+ local includedir = _g.includedir
+ if includedir == nil then
+ local gcc, toolname = target:tool("cc")
+ assert(toolname, "gcc")
+
+ local _, result = try {function () return os.iorunv(gcc, {"-E", "-Wp,-v", "-xc", os.nuldev()}) end}
+ if result then
+ for _, line in ipairs(result:split("\n", {plain = true})) do
+ line = line:trim()
+ if os.isdir(line) then
+ includedir = line
+ break
+ elseif line:startswith("End") then
+ break
+ end
+ end
+ end
+ _g.includedir = includedir or false
+ end
+ return includedir or nil
+end
+
function load(target)
-- we need only need binary kind, because we will rewrite on_link
target:set("kind", "binary")
@@ -66,7 +103,10 @@ function load(target)
archsubdir = path.join(sdkdir, "arch", "x86")
end
assert(archsubdir, "unknown arch(%s) for linux driver modules!", target:arch())
- target:add("sysincludedirs", "/usr/lib/gcc/x86_64-linux-gnu/10/include") -- TODO
+ local gcc_includedir = _get_gcc_includedir(target)
+ if gcc_includedir then
+ target:add("sysincludedirs", gcc_includedir)
+ end
target:add("includedirs", path.join(archsubdir, "include"))
target:add("includedirs", path.join(archsubdir, "include", "generated"))
target:add("includedirs", includedir)