Change pyAssimps library detection routine to work on Linux as well
git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@564 67173fc5-114c-0410-ac8e-9d2fd5bffc1fpull/1/head
parent
93ed38e50b
commit
cc489f30e7
|
@ -8,60 +8,111 @@ import os
|
|||
import ctypes
|
||||
import structs
|
||||
import operator
|
||||
|
||||
from errors import AssimpError
|
||||
from ctypes import POINTER
|
||||
|
||||
additional_dirs, ext_whitelist = [],[]
|
||||
|
||||
# populate search directories and lists of allowed file extensions
|
||||
# depending on the platform we're running on.
|
||||
if os.name=='posix':
|
||||
additional_dirs.append('/usr/local/lib/')
|
||||
|
||||
# note - this won't catch libassimp.so.N.n, but
|
||||
# currently there's always a symlink called
|
||||
# libassimp.so in /usr/local/lib.
|
||||
ext_whitelist.append('.so')
|
||||
|
||||
elif os.name=='nt':
|
||||
ext_whitelist.append('.dll')
|
||||
|
||||
print(additional_dirs)
|
||||
def vec2tuple(x):
|
||||
"""
|
||||
Converts a VECTOR3D to a Tuple
|
||||
"""
|
||||
""" Converts a VECTOR3D to a Tuple """
|
||||
return (x.x, x.y, x.z)
|
||||
|
||||
|
||||
def try_load_functions(library,dll,candidates):
|
||||
"""try to functbind to aiImportFile and aiReleaseImport
|
||||
|
||||
library - path to current lib
|
||||
dll - ctypes handle to it
|
||||
candidates - receives matching candidates
|
||||
|
||||
They serve as signal functions to detect assimp,
|
||||
also they're currently the only functions we need.
|
||||
insert (library,aiImportFile,aiReleaseImport,dll)
|
||||
into 'candidates' if successful.
|
||||
|
||||
"""
|
||||
try:
|
||||
load = dll.aiImportFile
|
||||
release = dll.aiReleaseImport
|
||||
except AttributeError:
|
||||
#OK, this is a library, but it has not the functions we need
|
||||
pass
|
||||
else:
|
||||
#Library found!
|
||||
load.restype = POINTER(structs.Scene)
|
||||
|
||||
candidates.append((library, load, release, dll))
|
||||
|
||||
|
||||
def search_library():
|
||||
"""
|
||||
Loads the assimp-Library.
|
||||
|
||||
result (load-function, release-function)
|
||||
"""Loads the assimp-Library.
|
||||
|
||||
result (load-function, release-function)
|
||||
exception AssimpError if no library is found
|
||||
"""
|
||||
|
||||
"""
|
||||
#this path
|
||||
folder = os.path.dirname(__file__)
|
||||
|
||||
ctypes.windll.kernel32.SetErrorMode(0x8007)
|
||||
|
||||
|
||||
# silence 'DLL not found' message boxes on win
|
||||
try:
|
||||
ctypes.windll.kernel32.SetErrorMode(0x8007)
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
candidates = []
|
||||
|
||||
#test every file
|
||||
for filename in os.listdir(folder):
|
||||
library = os.path.join(folder, filename)
|
||||
|
||||
try:
|
||||
dll = ctypes.cdll.LoadLibrary(library)
|
||||
except:
|
||||
#OK, this except is evil. But different OSs will throw different
|
||||
#errors. So just ignore errors.
|
||||
pass
|
||||
else:
|
||||
#get the functions
|
||||
# test every file
|
||||
for curfolder in [folder]+additional_dirs:
|
||||
for filename in os.listdir(curfolder):
|
||||
# our minimum requirement for candidates is that
|
||||
# they should contain 'assimp' somewhere in
|
||||
# their name
|
||||
if filename.lower().find('assimp')==-1 or\
|
||||
os.path.splitext(filename)[-1].lower() not in ext_whitelist:
|
||||
continue
|
||||
|
||||
library = os.path.join(curfolder, filename)
|
||||
print 'Try ',library
|
||||
try:
|
||||
load = dll.aiImportFile
|
||||
release = dll.aiReleaseImport
|
||||
except AttributeError:
|
||||
#OK, this is a library, but it has not the functions we need
|
||||
pass
|
||||
else:
|
||||
#Library found!
|
||||
load.restype = POINTER(structs.Scene)
|
||||
|
||||
candidates.append((library, load, release, dll))
|
||||
dll = ctypes.cdll.LoadLibrary(library)
|
||||
except:
|
||||
# OK, this except is evil. But different OSs will throw different
|
||||
# errors. So just ignore any errors.
|
||||
continue
|
||||
|
||||
try_load_functions(library,dll,candidates)
|
||||
|
||||
if not candidates:
|
||||
#no library found
|
||||
# no library found
|
||||
raise AssimpError, "assimp library not found"
|
||||
else:
|
||||
#get the newest library
|
||||
# get the newest library
|
||||
candidates = map(lambda x: (os.lstat(x[0])[-2], x), candidates)
|
||||
return max(candidates, key=operator.itemgetter(0))[1][1:]
|
||||
res = max(candidates, key=operator.itemgetter(0))[1]
|
||||
print 'Taking ',res[0]
|
||||
|
||||
# XXX: if there are 1000 dll/so files containing 'assimp'
|
||||
# in their name, do we have all of them in our address
|
||||
# space now until gc kicks in?
|
||||
|
||||
# XXX: take version postfix of the .so on linux?
|
||||
return res[1:]
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue