summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-10-23 00:34:32 +0800
committerruki <[email protected]>2021-10-23 00:34:32 +0800
commit55eaa73edf4b3bace71ec1a71b957c34374442b2 (patch)
tree3188a26ef8c1c59ce233ce91c731dfa79cce508d
parent62d3e0c681f25cb48560d07461a92738b55a0b6d (diff)
fix nim
-rw-r--r--xmake/modules/core/tools/nim.lua27
-rw-r--r--xmake/rules/nim/xmake.lua153
2 files changed, 40 insertions, 140 deletions
diff --git a/xmake/modules/core/tools/nim.lua b/xmake/modules/core/tools/nim.lua
index d142e3f0e..0eece46cf 100644
--- a/xmake/modules/core/tools/nim.lua
+++ b/xmake/modules/core/tools/nim.lua
@@ -98,8 +98,12 @@ function nf_includedir(self, dir)
end
-- make the link flag
-function nf_link(self, lib)
- return "--passL:-l" .. lib
+function nf_link(self, lib, target)
+ if target:is_plat("windows") then
+ return "--passL:" .. lib .. ".lib"
+ else
+ return "--passL:-l" .. lib
+ end
end
-- make the linkdir flag
@@ -126,6 +130,24 @@ function buildargv(self, sourcefiles, targetkind, targetfile, flags)
table.insert(flags_extra, "--passC:-DPreMain=PreMain_" .. uniquekey)
table.insert(flags_extra, "--passC:-DPreMainInner=PreMainInner_" .. uniquekey)
end
+ if targetkind ~= "static" and is_plat("windows") then
+ -- fix link flags for windows
+ -- @see https://github.com/nim-lang/Nim/issues/19033
+ local flags_new = {}
+ local flags_link = {}
+ for _, flag in ipairs(flags) do
+ if flag:find("passL:", 1, true) then
+ table.insert(flags_link, flag)
+ else
+ table.insert(flags_new, flag)
+ end
+ end
+ if #flags_link > 0 then
+ table.insert(flags_new, "--passL:-link")
+ table.join2(flags_new, flags_link)
+ end
+ flags = flags_new
+ end
return self:program(), table.join("c", flags, flags_extra, "-o:" .. targetfile, sourcefiles)
end
@@ -136,3 +158,4 @@ function build(self, sourcefiles, targetkind, targetfile, flags)
os.runv(program, argv, {envs = self:runenvs()})
end
+
diff --git a/xmake/rules/nim/xmake.lua b/xmake/rules/nim/xmake.lua
index 4ecb12fc7..7d65c9c12 100644
--- a/xmake/rules/nim/xmake.lua
+++ b/xmake/rules/nim/xmake.lua
@@ -15,146 +15,23 @@
-- Copyright (C) 2015-present, TBOOX Open Source Group.
--
-- @author ruki
--- @file nim.lua
+-- @file xmake.lua
--
--- imports
-import("core.base.option")
-import("core.project.config")
-import("core.project.project")
+-- define rule: nim.build
+rule("nim.build")
+ set_sourcekinds("nc")
+ on_load(function (target)
+ local cachedir = path.join(target:autogendir(), "nimcache")
+ target:add("ncflags", "--nimcache:" .. cachedir, {force = true})
+ end)
+ on_build("build.target")
--- init it
---
--- @see https://nim-lang.org/docs/nimc.html
-function init(self)
-
- -- init arflags
- self:set("ncarflags", "--app:staticlib", "--noMain")
-
- -- init shflags
- self:set("ncshflags", "--app:lib", "--noMain")
-end
-
--- make the warning flag
-function nf_warning(self, level)
- local maps =
- {
- none = "--warning:X:off"
- , less = "--warning:X:on"
- , more = "--warning:X:on"
- , all = "--warning:X:on"
- , allextra = "--warning:X:on"
- , everything = "--warning:X:on"
- , error = "--warningAsError:X:on"
- }
- return maps[level]
-end
-
--- make the define flag
-function nf_define(self, macro)
- return "--define:" .. macro
-end
-
--- make the undefine flag
-function nf_undefine(self, macro)
- return "--undef:" .. macro
-end
-
--- make the optimize flag
-function nf_optimize(self, level)
- local maps =
- {
- none = "--opt:none"
- , fast = "-d:release"
- , faster = "-d:release"
- , fastest = "-d:release"
- , smallest = {"-d:release", "--opt:size"}
- , aggressive = "-d:danger"
- }
- return maps[level]
-end
-
--- make the symbol flag
-function nf_symbol(self, level)
- local maps =
- {
- debug = "--debugger:native"
- }
- return maps[level]
-end
-
--- make the strip flag
-function nf_strip(self, level, target)
- if target:is_plat("linux", "macosx", "bsd") then
- if level == "debug" or level == "all" then
- return "--passL:-s"
- end
- end
-end
-
--- make the includedir flag
-function nf_includedir(self, dir)
- return {"--passC:-I" .. path.translate(dir)}
-end
-
--- make the link flag
-function nf_link(self, lib, target)
- if target:is_plat("windows") then
- return "--passL:" .. lib .. ".lib"
- else
- return "--passL:-l" .. lib
- end
-end
-
--- make the linkdir flag
-function nf_linkdir(self, dir, target)
- if target:is_plat("windows") then
- return {"--passL:-libpath:" .. path.translate(dir)}
- else
- return {"--passL:-L" .. path.translate(dir)}
- end
-end
-
--- make the build arguments list
-function buildargv(self, sourcefiles, targetkind, targetfile, flags)
- local flags_extra = {}
- if targetkind == "static" then
- -- fix multiple definition of `NimMain', it is only workaround solution
- -- we need to wait for this problem to be resolved
- --
- -- @see https://github.com/nim-lang/Nim/issues/15955
- local uniquekey = hash.uuid(targetfile):split("-", {plain = true})[1]
- table.insert(flags_extra, "--passC:-DNimMain=NimMain_" .. uniquekey)
- table.insert(flags_extra, "--passC:-DNimMainInner=NimMainInner_" .. uniquekey)
- table.insert(flags_extra, "--passC:-DNimMainModule=NimMainModule_" .. uniquekey)
- table.insert(flags_extra, "--passC:-DPreMain=PreMain_" .. uniquekey)
- table.insert(flags_extra, "--passC:-DPreMainInner=PreMainInner_" .. uniquekey)
- end
- if targetkind ~= "static" and is_plat("windows") then
- -- fix link flags for windows
- -- @see https://github.com/nim-lang/Nim/issues/19033
- local flags_new = {}
- local flags_link = {}
- for _, flag in ipairs(flags) do
- if flag:find("passL:", 1, true) then
- table.insert(flags_link, flag)
- else
- table.insert(flags_new, flag)
- end
- end
- if #flags_link > 0 then
- table.insert(flags_new, "--passL:-link")
- table.join2(flags_new, flags_link)
- end
- flags = flags_new
- end
- return self:program(), table.join("c", flags, flags_extra, "-o:" .. targetfile, sourcefiles)
-end
+-- define rule: nim
+rule("nim")
--- build the target file
-function build(self, sourcefiles, targetkind, targetfile, flags)
- os.mkdir(path.directory(targetfile))
- local program, argv = buildargv(self, sourcefiles, targetkind, targetfile, flags)
- os.runv(program, argv, {envs = self:runenvs()})
-end
+ -- add build rules
+ add_deps("nim.build")
+ -- inherit links and linkdirs of all dependent targets by default
+ add_deps("utils.inherit.links")