diff options
| author | ruki <[email protected]> | 2021-10-21 22:57:16 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2021-10-21 22:57:16 +0800 |
| commit | f0d5c879cadf8809566aa7e607c55252f6e471d5 (patch) | |
| tree | 4b3726b5780631655be48cc75c4de7c9a3fef62a | |
| parent | c03c36da556816137e18916dcca4517a8a10c6b7 (diff) | |
support static and shared library for nim
| -rw-r--r-- | tests/projects/nim/shared_library/src/foo.nim | 5 | ||||
| -rw-r--r-- | tests/projects/nim/shared_library/src/main.nim | 4 | ||||
| -rw-r--r-- | tests/projects/nim/shared_library/xmake.lua | 12 | ||||
| -rw-r--r-- | tests/projects/nim/static_library/src/bar.nim | 5 | ||||
| -rw-r--r-- | tests/projects/nim/static_library/src/foo.nim | 8 | ||||
| -rw-r--r-- | tests/projects/nim/static_library/src/main.nim | 5 | ||||
| -rw-r--r-- | tests/projects/nim/static_library/xmake.lua | 12 | ||||
| -rw-r--r-- | xmake/languages/nim/xmake.lua | 11 | ||||
| -rw-r--r-- | xmake/modules/core/tools/nim.lua | 45 |
9 files changed, 101 insertions, 6 deletions
diff --git a/tests/projects/nim/shared_library/src/foo.nim b/tests/projects/nim/shared_library/src/foo.nim new file mode 100644 index 000000000..4a3e920ff --- /dev/null +++ b/tests/projects/nim/shared_library/src/foo.nim @@ -0,0 +1,5 @@ +proc fibonacci(n: int): int {.cdecl, exportc, dynlib.} = + if n < 2: + result = n + else: + result = fibonacci(n - 1) + (n - 2).fibonacci diff --git a/tests/projects/nim/shared_library/src/main.nim b/tests/projects/nim/shared_library/src/main.nim new file mode 100644 index 000000000..c473c5401 --- /dev/null +++ b/tests/projects/nim/shared_library/src/main.nim @@ -0,0 +1,4 @@ +proc fibonacci(n: int): int {.cdecl, importc} + +echo fibonacci(2) + diff --git a/tests/projects/nim/shared_library/xmake.lua b/tests/projects/nim/shared_library/xmake.lua new file mode 100644 index 000000000..b560961d6 --- /dev/null +++ b/tests/projects/nim/shared_library/xmake.lua @@ -0,0 +1,12 @@ +add_rules("mode.debug", "mode.release") + +target("foo") + set_kind("shared") + add_files("src/foo.nim") + +target("test") + set_kind("binary") + add_deps("foo") + add_files("src/main.nim") + + diff --git a/tests/projects/nim/static_library/src/bar.nim b/tests/projects/nim/static_library/src/bar.nim new file mode 100644 index 000000000..911a3cc85 --- /dev/null +++ b/tests/projects/nim/static_library/src/bar.nim @@ -0,0 +1,5 @@ +proc bar(n: int): int {.cdecl, exportc} = + if n < 2: + result = n + else: + result = bar(n - 1) + (n - 2).bar diff --git a/tests/projects/nim/static_library/src/foo.nim b/tests/projects/nim/static_library/src/foo.nim new file mode 100644 index 000000000..ba0fcad5b --- /dev/null +++ b/tests/projects/nim/static_library/src/foo.nim @@ -0,0 +1,8 @@ +import bar + +proc foo(n: int): int {.cdecl, exportc} = + if n < 2: + result = n + else: + result = foo(n - 1) + (n - 2).foo + diff --git a/tests/projects/nim/static_library/src/main.nim b/tests/projects/nim/static_library/src/main.nim new file mode 100644 index 000000000..a91ba0614 --- /dev/null +++ b/tests/projects/nim/static_library/src/main.nim @@ -0,0 +1,5 @@ +proc foo(n: int): int {.cdecl, importc} +proc bar(n: int): int {.cdecl, importc} + +echo foo(2) +echo bar(2) diff --git a/tests/projects/nim/static_library/xmake.lua b/tests/projects/nim/static_library/xmake.lua new file mode 100644 index 000000000..7ef38314a --- /dev/null +++ b/tests/projects/nim/static_library/xmake.lua @@ -0,0 +1,12 @@ +add_rules("mode.debug", "mode.release") + +target("foo") + set_kind("static") + add_files("src/foo.nim") + +target("test") + set_kind("binary") + add_deps("foo") + add_files("src/main.nim") + + diff --git a/xmake/languages/nim/xmake.lua b/xmake/languages/nim/xmake.lua index a7ffab4f9..44deef165 100644 --- a/xmake/languages/nim/xmake.lua +++ b/xmake/languages/nim/xmake.lua @@ -31,12 +31,15 @@ language("nim") set_nameflags { object = { - "target.symbols" + "config.includedirs" + , "target.symbols" , "target.warnings" , "target.defines" , "target.undefines" , "target.optimize:check" , "target.vectorexts:check" + , "target.includedirs" + , "toolchain.includedirs" } , binary = { "config.linkdirs" @@ -46,6 +49,9 @@ language("nim") , "target.symbols" , "toolchain.linkdirs" , "toolchain.rpathdirs" + , "config.links" + , "target.links" + , "toolchain.links" } , shared = { "config.linkdirs" @@ -53,6 +59,9 @@ language("nim") , "target.strip" , "target.symbols" , "toolchain.linkdirs" + , "config.links" + , "target.links" + , "toolchain.links" } , static = { "target.strip" diff --git a/xmake/modules/core/tools/nim.lua b/xmake/modules/core/tools/nim.lua index 4cee95c95..20ec40353 100644 --- a/xmake/modules/core/tools/nim.lua +++ b/xmake/modules/core/tools/nim.lua @@ -24,13 +24,30 @@ import("core.project.config") import("core.project.project") -- init it +-- +-- @see https://nim-lang.org/docs/nimc.html function init(self) -- init arflags - self:set("ncarflags", "--app:staticlib") + self:set("ncarflags", "--app:staticlib", "--noMain") -- init shflags - self:set("ncshflags", "--app:lib") + 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 @@ -66,19 +83,37 @@ function nf_symbol(self, level) return maps[level] 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) - return "--passL:" .. lib + return "--passL:-l" .. lib end -- make the linkdir flag function nf_linkdir(self, dir) - return {"-L" .. dir} + return {"--passL:-L" .. path.translate(dir)} end -- make the build arguments list function buildargv(self, sourcefiles, targetkind, targetfile, flags) - return self:program(), table.join(flags, "c", "-o:" .. targetfile, sourcefiles) + 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 + return self:program(), table.join("c", flags, flags_extra, "-o:" .. targetfile, sourcefiles) end -- build the target file |
