|
@@ -0,0 +1,95 @@
|
|
|
+import std.stdio;
|
|
|
+import std.file;
|
|
|
+import std.path;
|
|
|
+import std.compiler;
|
|
|
+import std.system;
|
|
|
+import std.format;
|
|
|
+import std.conv;
|
|
|
+import argparse;
|
|
|
+import std.process;
|
|
|
+import iopipe.json.serialize;
|
|
|
+import iopipe.json.parser;
|
|
|
+import std.exception;
|
|
|
+import iopipe.traits;
|
|
|
+
|
|
|
+version(X86)
|
|
|
+ enum arch="x86";
|
|
|
+else version(X86_64)
|
|
|
+ enum arch="x86_64";
|
|
|
+else version(ARM)
|
|
|
+ enum arch="arm";
|
|
|
+else version(AArch64)
|
|
|
+ enum arch="arm64";
|
|
|
+else
|
|
|
+ static assert(false, "Unsupported architecture");
|
|
|
+
|
|
|
+// establish the runtime
|
|
|
+version(CRuntime_Microsoft)
|
|
|
+ enum CRT="MSVC";
|
|
|
+else version(CRuntime_Glibc)
|
|
|
+ enum CRT="glibc";
|
|
|
+else version(CppRuntime_Clang)
|
|
|
+ enum CRT="llvm";
|
|
|
+else
|
|
|
+ static assert(false, "Unsupported runtime");
|
|
|
+@(Command("install").Description("Install the raylib-d binary C libraries to a location that can be used for linking"))
|
|
|
+struct Args {
|
|
|
+ @(NamedArgument().Description("Copy libraries to the local directory"))
|
|
|
+ bool local;
|
|
|
+}
|
|
|
+
|
|
|
+enum baseDir = buildPath("install", "lib", os.to!string, arch.to!string, CRT.to!string);
|
|
|
+
|
|
|
+int realMain(Args args)
|
|
|
+{
|
|
|
+ writeln("raylib-d library installation");
|
|
|
+ // look at the dub.selections.json file
|
|
|
+ auto dubConfig = execute(["dub", "describe"]);
|
|
|
+ string raylibdPath;
|
|
|
+ if(dubConfig.status != 0)
|
|
|
+ {
|
|
|
+ stderr.writeln("Error executing dub describe: ", dubConfig.output);
|
|
|
+ return dubConfig.status;
|
|
|
+ }
|
|
|
+ char[] getRaylibPath(char[] jsonStr)
|
|
|
+ {
|
|
|
+ auto tokens = jsonTokenizer(jsonStr);
|
|
|
+ enforce(tokens.parseTo("packages"), "Could not find packages in dub json output!");
|
|
|
+ auto nt = tokens.next.token;
|
|
|
+ enforce(nt == JSONToken.ArrayStart, "Expected array start in packages");
|
|
|
+ while(nt != JSONToken.ArrayEnd)
|
|
|
+ {
|
|
|
+ tokens.releaseParsed();
|
|
|
+ tokens.startCache;
|
|
|
+ enforce(tokens.parseTo("name"), "Could not find package name in json file");
|
|
|
+ auto n = tokens.next;
|
|
|
+ jsonExpect(n, JSONToken.String, "Expected string for package name");
|
|
|
+ if(n.data(tokens.chain) == "raylib-d")
|
|
|
+ {
|
|
|
+ tokens.rewind;
|
|
|
+ tokens.parseTo("path");
|
|
|
+ auto p = tokens.next;
|
|
|
+ jsonExpect(p, JSONToken.String, "Expected string for path");
|
|
|
+ return p.data(tokens.chain);
|
|
|
+ }
|
|
|
+ tokens.rewind;
|
|
|
+ tokens.endCache;
|
|
|
+ nt = tokens.skipItem.token;
|
|
|
+ }
|
|
|
+ throw new Exception("Could not find raylib-d dependency for current project!");
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ auto path = getRaylibPath(dubConfig.output.dup);
|
|
|
+ auto libpath = buildPath(path, baseDir);
|
|
|
+ foreach(ent; dirEntries(libpath, SpanMode.shallow))
|
|
|
+ {
|
|
|
+ copy(ent.name, buildPath(".", ent.name.baseName));
|
|
|
+ }
|
|
|
+ } catch(Exception ex) {
|
|
|
+ stderr.writeln("Error: ", ex.msg);
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+mixin CLI!Args.main!realMain;
|