commit
7aed05b4a8
7 changed files with 78 additions and 24 deletions
|
|
@ -17,7 +17,8 @@ proc execCmd(cmd:string)=
|
||||||
exec cmd
|
exec cmd
|
||||||
|
|
||||||
task test, "Test":
|
task test, "Test":
|
||||||
execCmd "nim c -r tests/tnimterop"
|
execCmd "nim c -r tests/tnimterop_c.nim"
|
||||||
|
execCmd "nim cpp -r tests/tnimterop_cpp.nim"
|
||||||
|
|
||||||
task installWithDeps, "install dependencies":
|
task installWithDeps, "install dependencies":
|
||||||
for a in ["http://github.com/genotrance/nimtreesitter?subdir=treesitter",
|
for a in ["http://github.com/genotrance/nimtreesitter?subdir=treesitter",
|
||||||
|
|
|
||||||
|
|
@ -2,20 +2,29 @@ import macros, os, strformat, strutils
|
||||||
|
|
||||||
import ast, getters, globals, lisp
|
import ast, getters, globals, lisp
|
||||||
|
|
||||||
|
proc interpPath(dir: string): string=
|
||||||
|
# TODO: more robust: needs a DirSep after "$projpath"
|
||||||
|
result = dir.replace("$projpath", getProjectPath())
|
||||||
|
|
||||||
|
proc joinPathIfRel(path1: string, path2: string): string =
|
||||||
|
if path2.isAbsolute:
|
||||||
|
result = path2
|
||||||
|
else:
|
||||||
|
result = joinPath(path1, path2)
|
||||||
|
|
||||||
proc findPath(path: string, fail = true): string =
|
proc findPath(path: string, fail = true): string =
|
||||||
# As is
|
# As is
|
||||||
result = path.replace("\\", "/")
|
result = path.replace("\\", "/")
|
||||||
if not fileExists(result) and not dirExists(result):
|
if not fileExists(result) and not dirExists(result):
|
||||||
# Relative to project path
|
# Relative to project path
|
||||||
result = joinPath(getProjectPath(), path).replace("\\", "/")
|
result = joinPathIfRel(getProjectPath(), path).replace("\\", "/")
|
||||||
if not fileExists(result) and not dirExists(result):
|
if not fileExists(result) and not dirExists(result):
|
||||||
if fail:
|
if fail:
|
||||||
echo "File or directory not found: " & path
|
doAssert false, "File or directory not found: " & path
|
||||||
quit(1)
|
|
||||||
else:
|
else:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
proc cSearchPath*(path: string): string =
|
proc cSearchPath*(path: string): string {.compileTime.}=
|
||||||
result = findPath(path, fail = false)
|
result = findPath(path, fail = false)
|
||||||
if result.len == 0:
|
if result.len == 0:
|
||||||
var found = false
|
var found = false
|
||||||
|
|
@ -24,9 +33,7 @@ proc cSearchPath*(path: string): string =
|
||||||
if fileExists(result) or dirExists(result):
|
if fileExists(result) or dirExists(result):
|
||||||
found = true
|
found = true
|
||||||
break
|
break
|
||||||
if not found:
|
doAssert found, "File or directory not found: " & path & " gSearchDirs: " & $gSearchDirs
|
||||||
echo "File or directory not found: " & path
|
|
||||||
quit(1)
|
|
||||||
|
|
||||||
macro cDebug*(): untyped =
|
macro cDebug*(): untyped =
|
||||||
gDebug = true
|
gDebug = true
|
||||||
|
|
@ -50,13 +57,12 @@ macro cDefine*(name: static string, val: static string = ""): untyped =
|
||||||
echo result.repr
|
echo result.repr
|
||||||
|
|
||||||
macro cAddSearchDir*(dir: static string): untyped =
|
macro cAddSearchDir*(dir: static string): untyped =
|
||||||
result = newNimNode(nnkStmtList)
|
var dir = interpPath(dir)
|
||||||
|
if dir notin gSearchDirs:
|
||||||
let fullpath = cSearchPath(dir)
|
gSearchDirs.add(dir)
|
||||||
if fullpath notin gSearchDirs:
|
|
||||||
gSearchDirs.add(fullpath)
|
|
||||||
|
|
||||||
macro cIncludeDir*(dir: static string): untyped =
|
macro cIncludeDir*(dir: static string): untyped =
|
||||||
|
var dir = interpPath(dir)
|
||||||
result = newNimNode(nnkStmtList)
|
result = newNimNode(nnkStmtList)
|
||||||
|
|
||||||
let
|
let
|
||||||
|
|
|
||||||
|
|
@ -40,4 +40,4 @@ int test_call_int();
|
||||||
struct STRUCT1 _test_call_int_param_(int param1);
|
struct STRUCT1 _test_call_int_param_(int param1);
|
||||||
STRUCT2 test_call_int_param2(int param1, STRUCT2 param2);
|
STRUCT2 test_call_int_param2(int param1, STRUCT2 param2);
|
||||||
STRUCT2 test_call_int_param3(int param1, struct STRUCT1 param2);
|
STRUCT2 test_call_int_param3(int param1, struct STRUCT1 param2);
|
||||||
ENUM2 test_call_int_param4(enum ENUM param1);
|
ENUM2 test_call_int_param4(enum ENUM param1);
|
||||||
|
|
|
||||||
5
tests/include/test2.cpp
Normal file
5
tests/include/test2.cpp
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
#include "test2.hpp"
|
||||||
|
|
||||||
|
int test_call_int() {
|
||||||
|
return 5;
|
||||||
|
}
|
||||||
24
tests/include/test2.hpp
Normal file
24
tests/include/test2.hpp
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define TEST_INT 512
|
||||||
|
#define TEST_FLOAT 5.12
|
||||||
|
#define TEST_HEX 0x512
|
||||||
|
|
||||||
|
int test_call_int();
|
||||||
|
|
||||||
|
struct Foo{
|
||||||
|
int bar;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Foo1{
|
||||||
|
int bar1;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct Foo2{
|
||||||
|
int bar2;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef Foo2<int> Foo2_int;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,16 +1,17 @@
|
||||||
|
import std/unittest
|
||||||
import nimterop/cimport
|
import nimterop/cimport
|
||||||
|
|
||||||
cDebug()
|
cDebug()
|
||||||
|
|
||||||
cDefine("FORCE")
|
cDefine("FORCE")
|
||||||
cIncludeDir "include"
|
cIncludeDir "$projpath/include"
|
||||||
cAddSearchDir "include"
|
cAddSearchDir "$projpath/include"
|
||||||
cCompile cSearchPath("test.c")
|
cCompile cSearchPath("test.c")
|
||||||
cImport cSearchPath "test.h"
|
cImport cSearchPath "test.h"
|
||||||
|
|
||||||
doAssert TEST_INT == 512
|
check TEST_INT == 512
|
||||||
doAssert TEST_FLOAT == 5.12
|
check TEST_FLOAT == 5.12
|
||||||
doAssert TEST_HEX == 0x512
|
check TEST_HEX == 0x512
|
||||||
|
|
||||||
var
|
var
|
||||||
pt: PRIMTYPE
|
pt: PRIMTYPE
|
||||||
|
|
@ -37,10 +38,10 @@ s3.field1 = 7
|
||||||
e = enum1
|
e = enum1
|
||||||
e2 = enum4
|
e2 = enum4
|
||||||
|
|
||||||
doAssert test_call_int() == 5
|
check test_call_int() == 5
|
||||||
doAssert test_call_int_param(5).field1 == 5
|
check test_call_int_param(5).field1 == 5
|
||||||
doAssert test_call_int_param2(5, s2).field1 == 11
|
check test_call_int_param2(5, s2).field1 == 11
|
||||||
doAssert test_call_int_param3(5, s).field1 == 10
|
check test_call_int_param3(5, s).field1 == 10
|
||||||
doAssert test_call_int_param4(e) == e2
|
check test_call_int_param4(e) == e2
|
||||||
|
|
||||||
cAddStdDir()
|
cAddStdDir()
|
||||||
17
tests/tnimterop_cpp.nim
Normal file
17
tests/tnimterop_cpp.nim
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
import nimterop/cimport
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
cDebug()
|
||||||
|
|
||||||
|
cIncludeDir "$projpath/include"
|
||||||
|
cAddSearchDir "$projpath/include"
|
||||||
|
cCompile cSearchPath "test2.cpp"
|
||||||
|
cImport cSearchPath "test2.hpp"
|
||||||
|
|
||||||
|
check TEST_INT == 512
|
||||||
|
check TEST_FLOAT == 5.12
|
||||||
|
check TEST_HEX == 0x512
|
||||||
|
check test_call_int() == 5
|
||||||
|
|
||||||
|
var foo: Foo
|
||||||
|
check foo.bar == 0
|
||||||
Loading…
Add table
Add a link
Reference in a new issue