summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-10-21 22:57:16 +0800
committerruki <[email protected]>2021-10-21 22:57:16 +0800
commitf0d5c879cadf8809566aa7e607c55252f6e471d5 (patch)
tree4b3726b5780631655be48cc75c4de7c9a3fef62a
parentc03c36da556816137e18916dcca4517a8a10c6b7 (diff)
support static and shared library for nim
-rw-r--r--tests/projects/nim/shared_library/src/foo.nim5
-rw-r--r--tests/projects/nim/shared_library/src/main.nim4
-rw-r--r--tests/projects/nim/shared_library/xmake.lua12
-rw-r--r--tests/projects/nim/static_library/src/bar.nim5
-rw-r--r--tests/projects/nim/static_library/src/foo.nim8
-rw-r--r--tests/projects/nim/static_library/src/main.nim5
-rw-r--r--tests/projects/nim/static_library/xmake.lua12
-rw-r--r--xmake/languages/nim/xmake.lua11
-rw-r--r--xmake/modules/core/tools/nim.lua45
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