1 /++ 2 BindBC utils 3 +/ 4 module sily.bindbc; 5 6 import std.string: toStringz; 7 import std.traits; 8 9 import bindbc.loader; 10 11 import sily.logger; 12 13 /** 14 Loads generic bindbc library. 15 Example: 16 --- 17 loadBincBCLib!(bindbc.opengl, GLSupport, loadOpenGL, glSupport, "OpenGL"); 18 loadBincBCLib!(bindbc.sfml, SFMLSupport, loadSFMLWindow, sfmlSupport, "SFML Window"); 19 --- 20 */ 21 bool loadBincBCLib 22 (alias moduleName, alias support, alias loader, alias supportSuccess, string name, 23 int L = __LINE__, string F = __FILE__)(Log p_logger = Log()) { 24 const string supn = __traits(identifier, support); 25 const string lodn = __traits(identifier, loader); 26 const string sucn = __traits(identifier, supportSuccess); 27 const string modn = __traits(identifier, moduleName); 28 import sily.logger: info, error; 29 mixin( 30 `import bindbc.` ~ modn ~ `;` ~ 31 supn ~ ` ret = ` ~ lodn ~`(); 32 if (ret != ` ~ sucn ~ `) { 33 if (ret == ` ~ supn ~ `.noLibrary) { 34 p_logger.error!(L, F)("Failed to load ` ~ name ~ ` library"); 35 } else 36 if (ret == ` ~ supn ~ `.badLibrary) { 37 p_logger.error!(L, F)("Failed to load one or more ` ~ name ~ ` symbols"); 38 } else { 39 p_logger.error!(L, F)("Unknown error. Failed to load ` ~ name ~ ` library"); 40 } 41 return false; 42 } 43 p_logger.info!(L, F)("` ~ name ~ ` library successfully loaded"); 44 `); 45 return true; 46 } 47 48 /++ 49 Sets search path for bindbc dll libraries. 50 Windows only, has no effect on linux 51 +/ 52 void setBincBCLibPath(string path) { 53 version(Windows) setCustomLoaderSearchPath(path.toStringz); 54 } 55 56 /++ 57 Resets search path for bindbc dll libraries. 58 Windows only, has no effect on linux 59 +/ 60 void resetBincBCLibPath() { 61 version(Windows) setCustomLoaderSearchPath(null); 62 }