aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgenotrance <dev@genotrance.com>2019-01-17 20:26:51 -0600
committerGitHub <noreply@github.com>2019-01-17 20:26:51 -0600
commit09d9794bb648ed2e0eb94bce1cebdbb66adf1c0f (patch)
tree6b0e8c3ef6ce6ad8f073bcc65d375c0230aa0c56
parent43193f59500e69c2ce9257ad890d924680df6e97 (diff)
downloadnimterop-09d9794bb648ed2e0eb94bce1cebdbb66adf1c0f.tar.gz
nimterop-09d9794bb648ed2e0eb94bce1cebdbb66adf1c0f.zip
Walkdir (#43)
* Fix walkDir, cCompile mode, add tsoloud, fix void * * No tsoloud on Travis Linux
-rw-r--r--README.md6
-rw-r--r--nimterop.nimble12
-rw-r--r--nimterop/cimport.nim53
-rw-r--r--nimterop/grammar.nim5
-rw-r--r--tests/tsoloud.nim37
5 files changed, 99 insertions, 14 deletions
diff --git a/README.md b/README.md
index 457903f..a4d3098 100644
--- a/README.md
+++ b/README.md
@@ -63,6 +63,12 @@ Detailed documentation is still forthcoming.
`cImport("header.h", recurse=true)` - import all supported definitions from header file and #includes
+`cCompile("file.c")` - compile C/C++ implementation into binary
+
+`cCompile("path/to/*.c")` - compile in all files matching wildcard
+
+`cCompile("path/to/dir", "cpp")` - compile in all C++ files found recursively
+
`cAddSearchDir("XXX")` - add directory XXX to search path in calls to `cSearchPath()`
`cAddStdDir("XXX")` - add standard "c" [default] or "cpp" include paths to search path
diff --git a/nimterop.nimble b/nimterop.nimble
index ca9040e..11d8342 100644
--- a/nimterop.nimble
+++ b/nimterop.nimble
@@ -12,10 +12,14 @@ installDirs = @["nimterop"]
requires "nim >= 0.19.0", "regex >= 0.10.0", "cligen >= 0.9.17"
-proc execCmd(cmd:string)=
+proc execCmd(cmd: string) =
echo cmd
exec cmd
+proc tsoloud() =
+ execCmd "nim c -r tests/tsoloud.nim"
+ execCmd "nim cpp -r tests/tsoloud.nim"
+
task test, "Test":
execCmd "nim c -r tests/tnimterop_c.nim"
execCmd "nim cpp -r tests/tnimterop_c.nim"
@@ -23,3 +27,9 @@ task test, "Test":
when defined(windows):
execCmd "nim c -r tests/tmath.nim"
execCmd "nim cpp -r tests/tmath.nim"
+ when not defined(OSX):
+ when defined(Windows):
+ tsoloud()
+ else:
+ if not existsEnv("TRAVIS"):
+ tsoloud() \ No newline at end of file
diff --git a/nimterop/cimport.nim b/nimterop/cimport.nim
index 91de727..2ff6251 100644
--- a/nimterop/cimport.nim
+++ b/nimterop/cimport.nim
@@ -1,6 +1,6 @@
import macros, os, strformat, strutils
-const CIMPORT = 1
+const CIMPORT {.used.} = 1
include "."/globals
@@ -23,6 +23,36 @@ proc findPath(path: string, fail = true): string =
else:
return ""
+proc walkDirImpl(indir, inext: string, file=true): seq[string] =
+ let
+ dir = joinPathIfRel(getProjectPath(), indir)
+ ext =
+ if inext.len != 0:
+ when not defined(Windows):
+ "-name " & inext
+ else:
+ "\\" & inext
+ else:
+ ""
+
+ let
+ cmd =
+ when defined(Windows):
+ if file:
+ "cmd /c dir /s/b/a-d " & dir.replace("/", "\\") & ext
+ else:
+ "cmd /c dir /s/b/ad " & dir.replace("/", "\\")
+ else:
+ if file:
+ "find $1 -type f $2" % [dir, ext]
+ else:
+ "find $1 -type d" % dir
+
+ (output, ret) = gorgeEx(cmd)
+
+ if ret == 0:
+ result = output.splitLines()
+
proc getToast(fullpath: string, recurse: bool = false): string =
var
cmd = when defined(Windows): "cmd /c " else: ""
@@ -125,12 +155,11 @@ macro cAddStdDir*(mode = "c"): untyped =
result.add quote do:
cAddSearchDir(`sline`)
-macro cCompile*(path: static string): untyped =
+macro cCompile*(path: static string, mode = "c"): untyped =
result = newNimNode(nnkStmtList)
var
stmt = ""
- flags = ""
proc fcompile(file: string): string =
let fn = file.splitFile().name
@@ -147,22 +176,26 @@ macro cCompile*(path: static string): untyped =
else:
return "{.compile: (\"../$#\", \"$#.o\").}" % [file.replace("\\", "/"), ufn]
- proc dcompile(dir: string) =
- for f in walkFiles(dir):
- stmt &= fcompile(f) & "\n"
+ proc dcompile(dir: string, ext=""): string =
+ let
+ files = walkDirImpl(dir, ext)
+
+ for f in files:
+ if f.len != 0:
+ result &= fcompile(f) & "\n"
if path.contains("*") or path.contains("?"):
- dcompile(path)
+ stmt &= dcompile(path)
else:
let fpath = findPath(path)
if fileExists(fpath):
stmt &= fcompile(fpath) & "\n"
elif dirExists(fpath):
- if flags.contains("cpp"):
+ if mode.strVal().contains("cpp"):
for i in @["*.C", "*.cpp", "*.c++", "*.cc", "*.cxx"]:
- dcompile(fpath / i)
+ stmt &= dcompile(fpath, i)
else:
- dcompile(fpath / "*.c")
+ stmt &= dcompile(fpath, "*.c")
result.add stmt.parseStmt()
diff --git a/nimterop/grammar.nim b/nimterop/grammar.nim
index e6a0fe2..d2632b8 100644
--- a/nimterop/grammar.nim
+++ b/nimterop/grammar.nim
@@ -82,8 +82,7 @@ proc initGrammar() =
pname = "a" & $count
count += 1
i += 1
- if ptyp != "object":
- pout &= &"{pname}: {getPtrType(pptr&ptyp)},"
+ pout &= &"{pname}: {getPtrType(pptr&ptyp)},"
# typedef int X
# typedef X Y
@@ -149,7 +148,7 @@ proc initGrammar() =
flen = gStateRT.data[i].val.getIdentifier()
gStateRT.typeStr &= &" {name}* = {aptr}array[{flen}, {getPtrType(tptr&typ)}]\n"
else:
- if name == typ or typ == "object":
+ if name == typ:
gStateRT.typeStr &= &" {name}* = object\n"
else:
gStateRT.typeStr &= &" {name}* = {getPtrType(tptr&typ)}\n"
diff --git a/tests/tsoloud.nim b/tests/tsoloud.nim
new file mode 100644
index 0000000..544c1af
--- /dev/null
+++ b/tests/tsoloud.nim
@@ -0,0 +1,37 @@
+import os, nimterop/[cimport, git]
+
+gitPull("https://github.com/jarikomppa/soloud", "soloud", "include/*\nsrc/*\n")
+
+cDebug()
+
+const
+ inc = "soloud/include"
+ src = "soloud/src"
+
+cIncludeDir(inc)
+
+when defined(Linux):
+ {.passL: "-lpthread".}
+ cDefine("WITH_OSS")
+ cCompile(src/"backend/oss/*.cpp")
+
+when defined(Windows):
+ {.passC: "-msse".}
+ {.passL: "-lwinmm".}
+ cDefine("WITH_WINMM")
+ cCompile(src/"backend/winmm/*.cpp")
+
+cCompile(src/"c_api/soloud_c.cpp")
+cCompile(src/"core/*.cpp")
+cCompile(src/"audiosource", "cpp")
+cCompile(src/"audiosource", "c")
+cCompile(src/"filter/*.cpp")
+
+cImport(inc/"soloud_c.h")
+
+var
+ s = Soloud_create()
+
+echo s.Soloud_init()
+
+s.Soloud_destroy() \ No newline at end of file