-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlibpath.py
150 lines (118 loc) · 4.58 KB
/
libpath.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
"""
libpath
=======
Common path resolution for library and header files.
For instance, in Windows, the environment variable ``INCLUDE``, if exists,
is used to retrieve directories for header inclusion.
In Unix systems, ``/usr/local/lib`` is often used to store libraries.
In Windows, a library named ``z`` might exist under the name of ``libz``.
This module is a helper for handling those issues.
Example
-------
>>> import platform
>>> from os.path import join
>>> from libpath import Windows, Unix
>>>
>>> if platform.system() == 'Windows':
... s = Windows()
... f = s.get_programfiles()
... s.add_library_dir(join(f, 'zstd', 'lib'))
... s.add_include_dir(join(f, 'zstd', 'include'))
... libs = [s.find_libname('zstd')]
... else:
... s = Unix()
... libs = ['zstd']
>>>
>>> include_dirs = s.get_include_dirs()
>>> library_dirs = s.get_library_dirs()
"""
import os
import struct
from os.path import exists, join
from sysconfig import get_config_var
__version__ = "0.0.1"
def bits_arch():
"""Determines the number of bits of the Python process.
Return ``32`` or ``64``.
"""
return struct.calcsize("P") * 8
class System(object):
def __init__(self):
self._library_dirs = []
self._include_dirs = []
def add_library_dir(self, d):
self._library_dirs.append(d)
def add_include_dir(self, d):
self._include_dirs.append(d)
class Windows(System):
def get_programfiles(self):
if bits_arch() == 32:
return self.get_32bits_programfiles()
return self.get_64bits_programfiles()
def get_64bits_programfiles(self):
n = "PROGRAMW6432"
if n not in os.environ:
raise RuntimeError("{} variable is not defined.".format(n))
f = os.environ[n]
if not exists(f):
raise RuntimeError("Could not find {}.".format(f))
return f
def get_32bits_programfiles(self):
n = "PROGRAMFILES"
if n not in os.environ:
raise RuntimeError("{} variable is not defined.".format(n))
f = os.environ[n]
if not exists(f):
raise RuntimeError("Could not find {}.".format(f))
return f
def get_include_dirs(self):
dirs = [join(get_config_var("prefix"), "include")]
names = ["INCLUDE", "LIBRARY_INC"]
vals = [os.environ[n] for n in names if n in os.environ]
dirs += [d for v in vals for d in v.split(";")]
dirs = [d for d in dirs if len(d) > 0 and exists(d)]
return self._include_dirs + dirs
def get_library_dirs(self):
dirs = [join(get_config_var("prefix"), "lib")]
names = ["LIBRARY_LIB"]
vals = [os.environ[n] for n in names if n in os.environ]
dirs += [d for v in vals for d in v.split(";")]
dirs = [d for d in dirs if len(d) > 0 and exists(d)]
return self._library_dirs + dirs
def find_libname(self, name):
"""Try to infer the correct library name."""
names = ["{}.lib", "lib{}.lib", "{}lib.lib"]
names = [n.format(name) for n in names]
dirs = self.get_library_dirs()
for d in dirs:
for n in names:
if exists(join(d, n)):
return n[:-4]
msg = "Could not find the {} library.".format(name)
raise ValueError(msg)
def __str__(self):
msg = "Arch: {}bits\n".format(bits_arch())
if bits_arch() == 32:
msg += "ProgramFiles: {}\n".format(self.get_32bits_programfiles())
if bits_arch() == 64:
msg += "ProgramFiles32: {}\n".format(self.get_32bits_programfiles())
msg += "ProgramFiles64: {}\n".format(self.get_64bits_programfiles())
msg += "Include dirs: {}\n".format(self.get_include_dirs())
msg += "Library dirs: {}\n".format(self.get_library_dirs())
return msg
class Unix(System):
def get_include_dirs(self):
dirs = [join(get_config_var("prefix"), "include")]
dirs += ["/usr/include", "/usr/local/include"]
dirs = [d for d in dirs if len(d) > 0 and exists(d)]
return self._include_dirs + dirs
def get_library_dirs(self):
dirs = [join(get_config_var("prefix"), "lib")]
dirs += ["/usr/lib", "/usr/local/lib"]
dirs = [d for d in dirs if len(d) > 0 and exists(d)]
return self._library_dirs + dirs
def __str__(self):
msg = "Arch: {}bits\n".format(bits_arch())
msg += "Include dirs: {}\n".format(self.get_include_dirs())
msg += "Library dirs: {}\n".format(self.get_library_dirs())
return msg