55import functools
66import glob
77import os
8- import sys
9- import traceback
108
119from .cuda_paths import IS_WIN32 , get_cuda_paths
12- from .find_nvidia_lib_dirs import find_nvidia_lib_dirs
10+ from .sys_path_find_sub_dirs import sys_path_find_sub_dirs
1311
1412
15- def _find_using_nvidia_lib_dirs (so_basename , error_messages , attachments ):
16- so_wild = so_basename + "*"
17- for lib_dir in find_nvidia_lib_dirs ():
13+ def _no_such_file_in_sub_dirs (sub_dirs , file_wild , error_messages , attachments ):
14+ error_messages .append (f"No such file: { file_wild } " )
15+ for sub_dir in sys_path_find_sub_dirs (sub_dirs ):
16+ attachments .append (f' listdir("{ sub_dir } "):' )
17+ for node in sorted (os .listdir (sub_dir )):
18+ attachments .append (f" { node } " )
19+
20+
21+ def _find_so_using_nvidia_lib_dirs (libbasename , so_basename , error_messages , attachments ):
22+ if libbasename == "nvvm" : # noqa: SIM108
23+ nvidia_sub_dirs = ("nvidia" , "*" , "nvvm" , "lib64" )
24+ else :
25+ nvidia_sub_dirs = ("nvidia" , "*" , "lib" )
26+ file_wild = so_basename + "*"
27+ for lib_dir in sys_path_find_sub_dirs (nvidia_sub_dirs ):
1828 # First look for an exact match
1929 so_name = os .path .join (lib_dir , so_basename )
2030 if os .path .isfile (so_name ):
2131 return so_name
2232 # Look for a versioned library
2333 # Using sort here mainly to make the result deterministic.
24- for node in sorted (glob .glob (os .path .join (lib_dir , so_wild ))):
34+ for node in sorted (glob .glob (os .path .join (lib_dir , file_wild ))):
2535 so_name = os .path .join (lib_dir , node )
2636 if os .path .isfile (so_name ):
2737 return so_name
28- error_messages .append (f"No such file: { so_wild } " )
29- for lib_dir in find_nvidia_lib_dirs ():
30- attachments .append (f" listdir({ repr (lib_dir )} ):" )
31- for node in sorted (os .listdir (lib_dir )):
32- attachments .append (f" { node } " )
38+ _no_such_file_in_sub_dirs (nvidia_sub_dirs , file_wild , error_messages , attachments )
39+ return None
40+
41+
42+ def _find_dll_using_nvidia_bin_dirs (libbasename , error_messages , attachments ):
43+ if libbasename == "nvvm" : # noqa: SIM108
44+ nvidia_sub_dirs = ("nvidia" , "*" , "nvvm" , "bin" )
45+ else :
46+ nvidia_sub_dirs = ("nvidia" , "*" , "bin" )
47+ file_wild = libbasename + "*.dll"
48+ for bin_dir in sys_path_find_sub_dirs (nvidia_sub_dirs ):
49+ for node in sorted (glob .glob (os .path .join (bin_dir , file_wild ))):
50+ dll_name = os .path .join (bin_dir , node )
51+ if os .path .isfile (dll_name ):
52+ return dll_name
53+ _no_such_file_in_sub_dirs (nvidia_sub_dirs , file_wild , error_messages , attachments )
3354 return None
3455
3556
@@ -44,11 +65,11 @@ def _get_cuda_paths_info(key, error_messages):
4465 return env_path_tuple .info
4566
4667
47- def _find_using_cudalib_dir (so_basename , error_messages , attachments ):
48- lib_dir = _get_cuda_paths_info ("cudalib_dir" , error_messages )
49- if lib_dir is None :
68+ def _find_so_using_cudalib_dir (so_basename , error_messages , attachments ):
69+ cudalib_dir = _get_cuda_paths_info ("cudalib_dir" , error_messages )
70+ if cudalib_dir is None :
5071 return None
51- primary_so_dir = lib_dir + "/"
72+ primary_so_dir = cudalib_dir + "/"
5273 candidate_so_dirs = [primary_so_dir ]
5374 libs = ["/lib/" , "/lib64/" ]
5475 for _ in range (2 ):
@@ -63,7 +84,7 @@ def _find_using_cudalib_dir(so_basename, error_messages, attachments):
6384 return so_name
6485 error_messages .append (f"No such file: { so_name } " )
6586 for so_dirname in candidate_so_dirs :
66- attachments .append (f" listdir({ repr ( so_dirname ) } ):" )
87+ attachments .append (f' listdir(" { so_dirname } "):' )
6788 if not os .path .isdir (so_dirname ):
6889 attachments .append (" DIRECTORY DOES NOT EXIST" )
6990 else :
@@ -72,47 +93,46 @@ def _find_using_cudalib_dir(so_basename, error_messages, attachments):
7293 return None
7394
7495
75- def _inspect_environment (libbasename , handle ):
76- if IS_WIN32 :
77- import win32api
78-
79- dll_path = win32api .GetModuleFileName (handle )
80- print (f"LOOOK { libbasename = } Loaded DLL path:" , dll_path )
81- error_messages = []
82- lib_dir = _get_cuda_paths_info ("cudalib_dir" , error_messages )
83- if lib_dir is None :
84- print (f"LOOOK { libbasename = } { error_messages = } " )
85- elif not os .path .isdir (lib_dir ):
86- print (f"LOOOK { libbasename = } not isdir({ lib_dir = } )" )
87- else :
88- print (f"LOOOK { libbasename = } cudalib_dir { lib_dir = } " )
89- for node in sorted (os .listdir (lib_dir )):
90- print (f"LOOOK { node } " )
91- for lib_dir in find_nvidia_lib_dirs ():
92- print (f"LOOOK { libbasename = } NVIDIA { lib_dir = } " )
93- for node in sorted (os .listdir (lib_dir )):
94- print (f"LOOOK { node } " )
96+ def _find_dll_using_cudalib_dir (libbasename , error_messages , attachments ):
97+ cudalib_dir = _get_cuda_paths_info ("cudalib_dir" , error_messages )
98+ if cudalib_dir is None :
99+ return None
100+ file_wild = libbasename + "*.dll"
101+ for node in sorted (glob .glob (os .path .join (cudalib_dir , file_wild ))):
102+ dll_name = os .path .join (cudalib_dir , node )
103+ if os .path .isfile (dll_name ):
104+ return dll_name
105+ error_messages .append (f"No such file: { file_wild } " )
106+ attachments .append (f' listdir("{ cudalib_dir } "):' )
107+ for node in sorted (os .listdir (cudalib_dir )):
108+ attachments .append (f" { node } " )
109+ return None
95110
96111
97112@functools .cache
98- def find_nvidia_dynamic_library (libbasename , handle = None ):
99- if handle is not None :
100- try :
101- _inspect_environment (libbasename , handle )
102- except Exception as e :
103- print ("LOOOK EXCEPTION:" )
104- traceback .print_exception (type (e ), e , e .__traceback__ , file = sys .stdout )
105- if IS_WIN32 :
106- return
107- so_basename = f"lib{ libbasename } .so"
113+ def find_nvidia_dynamic_library (libbasename ):
108114 error_messages = []
109115 attachments = []
110- so_name = _find_using_nvidia_lib_dirs (so_basename , error_messages , attachments )
116+
117+ if IS_WIN32 :
118+ dll_name = _find_dll_using_nvidia_bin_dirs (libbasename , error_messages , attachments )
119+ if dll_name is None :
120+ if libbasename == "nvvm" :
121+ dll_name = _get_cuda_paths_info ("nvvm" , error_messages )
122+ else :
123+ dll_name = _find_dll_using_cudalib_dir (libbasename , error_messages , attachments )
124+ if dll_name is None :
125+ attachments = "\n " .join (attachments )
126+ raise RuntimeError (f"Failure finding { libbasename } *.dll: { ', ' .join (error_messages )} \n { attachments } " )
127+ return dll_name
128+
129+ so_basename = f"lib{ libbasename } .so"
130+ so_name = _find_so_using_nvidia_lib_dirs (libbasename , so_basename , error_messages , attachments )
111131 if so_name is None :
112132 if libbasename == "nvvm" :
113133 so_name = _get_cuda_paths_info ("nvvm" , error_messages )
114134 else :
115- so_name = _find_using_cudalib_dir (so_basename , error_messages , attachments )
135+ so_name = _find_so_using_cudalib_dir (so_basename , error_messages , attachments )
116136 if so_name is None :
117137 attachments = "\n " .join (attachments )
118138 raise RuntimeError (f"Failure finding { so_basename } : { ', ' .join (error_messages )} \n { attachments } " )
0 commit comments