diff options
| author | ruki <[email protected]> | 2021-10-23 00:34:32 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2021-10-23 00:34:32 +0800 |
| commit | 55eaa73edf4b3bace71ec1a71b957c34374442b2 (patch) | |
| tree | 3188a26ef8c1c59ce233ce91c731dfa79cce508d | |
| parent | 62d3e0c681f25cb48560d07461a92738b55a0b6d (diff) | |
fix nim
| -rw-r--r-- | xmake/modules/core/tools/nim.lua | 27 | ||||
| -rw-r--r-- | xmake/rules/nim/xmake.lua | 153 |
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") |
