-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathupdate_bindings.nims
110 lines (94 loc) · 3.69 KB
/
update_bindings.nims
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import std/[os, strutils]
const
ProjectUrl = "https://github.com/planetis-m/naylib"
PkgDir = thisDir()
RaylibDir = PkgDir / "raylib"
RaylibGit = "https://github.com/raysan5/raylib.git"
RayLatestCommit = "87f17538d0103e4a863d23860c4bc0400fe12792"
DocsDir = PkgDir / "docs"
ToolsDir = PkgDir / "tools"
ApiDir = ToolsDir / "wrapper/api"
template `/.`(x: string): string =
when defined(posix): "./" & x else: x
proc fetchLatestRaylib() =
var firstTime = false
if not dirExists(RaylibDir):
firstTime = true
exec "git clone --depth 1 " & RaylibGit & " " & quoteShell(RaylibDir)
withDir(RaylibDir):
if not firstTime:
exec "git switch - --detach"
exec "git fetch --depth 100 origin " & RayLatestCommit
exec "git checkout " & RayLatestCommit
proc buildParser() =
withDir(ToolsDir / "parser"):
let src = "raylib_parser.c"
let exe = toExe("raylib_parser")
# if not fileExists(exe) or fileNewer(src, exe):
exec "cc " & src & " -o " & exe
proc buildMangler() =
withDir(ToolsDir / "mangler"):
let src = "naylib_mangler.nim"
let exe = toExe("naylib_mangler")
# if not fileExists(exe) or fileNewer(src, exe):
exec "nim c --mm:arc --panics:on -d:release " & src
proc buildWrapper() =
withDir(ToolsDir / "wrapper"):
let src = "naylib_wrapper.nim"
let exe = toExe("naylib_wrapper")
# if not fileExists(exe) or fileNewer(src, exe):
exec "nim c --mm:arc --panics:on -d:release -d:emiLenient " & src
proc genApiJson(lib, prefix, after: string) =
withDir(ToolsDir / "parser"):
mkDir(ApiDir)
let header = RaylibDir / "src" / (lib & ".h")
let apiJson = ApiDir / (lib & ".json")
let prefixArg = if prefix != "": "-d " & prefix else: ""
exec /.toExe("raylib_parser") & " -f JSON " & prefixArg & " -i " & header.quoteShell &
" -t " & after.quoteShell & " -o " & apiJson.quoteShell
proc genWrapper(lib: string) =
withDir(ToolsDir / "wrapper"):
let outp = PkgDir / "src" / (lib & ".nim")
let conf = "config" / (lib & ".cfg")
exec /.toExe("naylib_wrapper") & " -c:" & conf & " -o:" & outp
proc wrapRaylib(lib, prefix, after: string) =
genApiJson(lib, prefix, after)
genWrapper(lib)
task buildTools, "Build raylib_parser and naylib_wrapper":
buildParser()
buildWrapper()
buildMangler()
task genApi, "Generate API JSON files":
buildParser()
genApiJson("raylib", "RLAPI", "")
genApiJson("rcamera", "RLAPI", "#endif // RCAMERA_H")
genApiJson("raymath", "RMAPI", "")
genApiJson("rlgl", "", "#endif // RLGL_H")
task genWrappers, "Generate Nim wrappers":
genWrapper("raylib")
genWrapper("rcamera")
genWrapper("raymath")
genWrapper("rlgl")
task update, "Update the raylib git directory":
fetchLatestRaylib()
rmDir(PkgDir / "src/raylib")
cpDir(RaylibDir / "src", PkgDir / "src/raylib")
cpFile(RaylibDir / "parser/raylib_parser.c", ToolsDir / "parser/raylib_parser.c")
task mangle, "Mangle identifiers in raylib source":
buildMangler()
withDir(ToolsDir / "mangler"):
exec /.toExe("naylib_mangler") & " " & (PkgDir / "src/raylib")
task wrap, "Produce all raylib Nim wrappers":
buildToolsTask()
wrapRaylib("raylib", "RLAPI", "")
wrapRaylib("rcamera", "RLAPI", "#endif // RCAMERA_H")
wrapRaylib("raymath", "RMAPI", "")
wrapRaylib("rlgl", "", "#endif // RLGL_H")
task docs, "Generate documentation":
withDir(PkgDir):
for tmp in ["raymath", "raylib", "rlgl", "reasings", "rmem", "rcamera"]:
let doc = DocsDir / (tmp & ".html")
let src = "src" / tmp
let showNonExports = if tmp != "rmem": " --shownonexports" else: ""
exec "nim doc --verbosity:0 --git.url:" & ProjectUrl & showNonExports &
" --git.devel:main --git.commit:main --out:" & doc.quoteShell & " " & src