Mercurial > pub > dyncall > bindings
comparison lua/luadyncall/src/dynload.lua @ 0:0cfcc391201f
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:26:28 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:0cfcc391201f |
---|---|
1 require "smartptr" | |
2 | |
3 local dl = require "ldynload" | |
4 | |
5 --- load library given by name using operating-system level service. | |
6 -- @return smartptr that will free library if the object gets garbage collected. | |
7 | |
8 function loadlib(name) | |
9 local handle = dl.dlLoadLibrary(name) | |
10 if handle then return smartptr.new( handle, dl.dlFreeLibrary ) end | |
11 end | |
12 | |
13 --- resolve symbols | |
14 -- @param lib smartptr | |
15 -- @param name symbol to resolve to address | |
16 -- @return address light userpointer | |
17 function dynsym(lib, name) | |
18 local handle = lib() | |
19 return dl.dlFindSymbol( handle, name ) | |
20 end | |
21 | |
22 --- load shared library code | |
23 -- This mechanism uses a platform-independent interface to search for | |
24 -- the libraries. | |
25 -- On Linux, BSD, UNIX and Mac OS X the standard places such as "/", "/lib" are searched. | |
26 -- @param libnames a string separated by '|' (pipe) for the pure library name without prefix/suffixes. | |
27 | |
28 | |
29 function dynload(libnames) | |
30 | |
31 local lib | |
32 | |
33 if libnames == "" then | |
34 return loadlib(nil) | |
35 end | |
36 | |
37 -- Unix search paths | |
38 | |
39 local paths = { "", "./", "/lib/", "/usr/lib/", "/usr/local/lib/", "/opt/lib/", "/opt/local/lib/" } | |
40 local prefixes = { "", "lib" } | |
41 local suffixes = { "", ".dylib", ".so", ".so.0", ".dll" } | |
42 | |
43 -- Mac OS X Framework search paths | |
44 -- local fwpaths = { "", "/System" } | |
45 | |
46 for libname in libnames:gmatch("[^|]+") do | |
47 | |
48 for k,path in pairs(paths) do | |
49 for k,prefix in pairs(prefixes) do | |
50 for k,suffix in pairs(suffixes) do | |
51 local libpath = path .. prefix .. libname .. suffix | |
52 lib = loadlib(libpath) | |
53 if lib then return lib end | |
54 end | |
55 end | |
56 end | |
57 | |
58 -- search Mac OS X frameworks: | |
59 | |
60 lib = loadlib( libname .. ".framework/" .. libname ) | |
61 | |
62 --[[ | |
63 for k,fwpath in pairs(fwpaths) do | |
64 local libpath = fwpath .. "/Library/Frameworks/" .. libname .. ".framework/" .. libname | |
65 lib = ldynload.dlLoadLibrary(libpath) | |
66 if libhandle then break end | |
67 end | |
68 ]] | |
69 | |
70 if lib then return lib end | |
71 | |
72 end | |
73 | |
74 if not lib then error("unable to locate library "..libnames) end | |
75 | |
76 end | |
77 |