summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-03-10 23:17:07 +0800
committerruki <[email protected]>2023-03-10 23:17:07 +0800
commit4e10f9b8a793b4bd1b16683b958e1c250cc1c3f3 (patch)
treefe018d94d1bd0b95d9428bbe6d1f27b20b876c5b
parent828030f000c92ac8e0c8c725b1205e18f3d7b84a (diff)
translate flags for ninja
-rw-r--r--xmake/plugins/project/ninja/build_ninja.lua46
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua6
2 files changed, 39 insertions, 13 deletions
diff --git a/xmake/plugins/project/ninja/build_ninja.lua b/xmake/plugins/project/ninja/build_ninja.lua
index 6d54f015c..a97aac804 100644
--- a/xmake/plugins/project/ninja/build_ninja.lua
+++ b/xmake/plugins/project/ninja/build_ninja.lua
@@ -70,6 +70,36 @@ function _get_relative_unix_path(filepath, outputdir)
return os.args(filepath)
end
+-- translate compiler flags
+function _translate_compflags(compflags, outputdir)
+ local flags = {}
+ for _, flag in ipairs(compflags) do
+ for _, pattern in ipairs({"[%-](I)(.*)", "[%-](isystem)(.*)"}) do
+ flag = flag:gsub(pattern, function (flag, dir)
+ dir = _get_relative_unix_path(dir, outputdir)
+ return "-" .. flag .. dir
+ end)
+ end
+ table.insert(flags, flag)
+ end
+ return flags
+end
+
+-- translate linker flags
+function _translate_linkflags(linkflags, outputdir)
+ local flags = {}
+ for _, flag in ipairs(linkflags) do
+ for _, pattern in ipairs({"[%-](L)(.*)", "[%-](F)(.*)"}) do
+ flag = flag:gsub(pattern, function (flag, dir)
+ dir = _get_relative_unix_path(dir, outputdir)
+ return "-" .. flag .. dir
+ end)
+ end
+ table.insert(flags, flag)
+ end
+ return flags
+end
+
-- add header
function _add_header(ninjafile)
ninjafile:print([[# this is the build file for project %s
@@ -81,9 +111,10 @@ function _add_header(ninjafile)
end
-- add rules for generator
-function _add_rules_for_generator(ninjafile)
+function _add_rules_for_generator(ninjafile, outputdir)
+ local projectdir = _get_relative_unix_path(os.projectdir(), outputdir)
ninjafile:print("rule gen")
- ninjafile:print(" command = xmake project -k ninja")
+ ninjafile:print(" command = xmake project -P %s -k ninja", projectdir)
ninjafile:print(" description = regenerating ninja files")
ninjafile:print("")
end
@@ -235,10 +266,10 @@ function _add_rules_for_linker(ninjafile)
end
-- add rules
-function _add_rules(ninjafile)
+function _add_rules(ninjafile, outputdir)
-- add rules for generator
- _add_rules_for_generator(ninjafile)
+ _add_rules_for_generator(ninjafile, outputdir)
-- add rules for complier
_add_rules_for_compiler(ninjafile)
@@ -256,8 +287,9 @@ end
function _add_build_for_object(ninjafile, target, sourcekind, sourcefile, objectfile, outputdir)
objectfile = _get_relative_unix_path(objectfile, outputdir)
sourcefile = _get_relative_unix_path(sourcefile, outputdir)
+ local compflags = compiler.compflags(sourcefile, {target = target})
ninjafile:print("build %s: %s %s", objectfile, sourcekind, sourcefile)
- ninjafile:print(" ARGS = %s", os.args(compiler.compflags(sourcefile, {target = target})))
+ ninjafile:print(" ARGS = %s", os.args(_translate_compflags(compflags, outputdir)))
ninjafile:print("")
end
@@ -305,7 +337,7 @@ function _add_build_for_target(ninjafile, target, outputdir)
end
end
ninjafile:print("")
- ninjafile:print(" ARGS = %s", os.args(target:linkflags()))
+ ninjafile:print(" ARGS = %s", os.args(_translate_linkflags(target:linkflags(), outputdir)))
ninjafile:print("")
-- build target objects
@@ -384,7 +416,7 @@ function make(outputdir)
_add_header(ninjafile)
-- add rules
- _add_rules(ninjafile)
+ _add_rules(ninjafile, outputdir)
-- add build rules for targets
_add_build_for_targets(ninjafile, outputdir)
diff --git a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
index ad0c6df5f..64a6f5419 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x_vcxproj.lua
@@ -168,8 +168,6 @@ function _make_compflags(sourcefile, targetinfo, vcxprojdir)
-- translate path for -Idir or /Idir
local flags = {}
for _, flag in ipairs(targetinfo.compflags[sourcefile]) do
-
- -- handle external includes as well
for _, pattern in ipairs({"[%-/](I)(.*)", "[%-/](external:I)(.*)"}) do
-- -Idir or /Idir
@@ -178,16 +176,12 @@ function _make_compflags(sourcefile, targetinfo, vcxprojdir)
return "/" .. flag .. dir
end)
end
-
- -- save flag
table.insert(flags, flag)
end
-- add -D__config_$(mode)__ and -D__config_$(arch)__ for the config header
table.insert(flags, "-D__config_" .. targetinfo.mode .. "__")
table.insert(flags, "-D__config_" .. targetinfo.arch .. "__")
-
- -- ok?
return flags
end