Skip to content

Commit 278abdd

Browse files
committed
Fix-up setup support code
Signed-off-by: Matthew Ballance <matt.ballance@gmail.com>
1 parent e8c12eb commit 278abdd

File tree

8 files changed

+457
-17
lines changed

8 files changed

+457
-17
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ packages/
66
.eggs/
77

88
__pycache__/
9-
9+
rundir/

src/ivpm/setup/build_ext.py

+61-5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import shutil
2525
import subprocess
2626
import sys
27+
from distutils.file_util import copy_file
2728
from setuptools.command.build_ext import build_ext as _build_ext
2829

2930
class BuildExt(_build_ext):
@@ -44,23 +45,78 @@ def build_extensions(self):
4445
super().build_extensions()
4546

4647
def build_extension(self, ext):
48+
from ivpm.setup.ivpm_data import get_hooks, Phase_BuildPre, Phase_BuildPost, expand_libvars, get_ivpm_ext_name_m
4749
proj_dir = os.getcwd()
4850
print("build_extension: %s" % str(ext))
4951
include_dirs = getattr(ext, 'include_dirs', [])
5052
# include_dirs.append("foobar")
5153
# include_dirs.append(os.path.join(proj_dir, 'src', 'include'))
5254
setattr(ext, 'include_dirs', include_dirs)
5355

54-
return super().build_extension(ext)
56+
ret = super().build_extension(ext)
57+
58+
build_py = self.get_finalized_command("build_py")
59+
ext_name_m = get_ivpm_ext_name_m()
60+
61+
for ext in self.extensions:
62+
print("Ext: %s" % str(ext))
63+
fullname = self.get_ext_fullname(ext.name)
64+
filename = self.get_ext_filename(fullname)
65+
66+
print("fullname=%s filename=%s" % (fullname, filename), flush=True)
67+
68+
modpath = fullname.split(".")
69+
70+
if fullname in ext_name_m.keys():
71+
# replace last path element
72+
mapped_filename = expand_libvars(ext_name_m[fullname])
73+
dest_filename = os.path.join(self.build_lib, "/".join(modpath[:-1]), mapped_filename)
74+
else:
75+
dest_filename = os.path.join(self.build_lib, filename)
76+
src_filename = os.path.join(self.build_lib, filename)
77+
78+
print("dest_filename: %s src_filename: %s" % (dest_filename, src_filename))
79+
if src_filename != dest_filename:
80+
os.rename(src_filename, dest_filename)
81+
82+
return ret
5583

5684
def copy_extensions_to_source(self):
57-
import ivpm.setup.setup as ivpms
58-
from ivpm.setup.setup import get_hooks, Phase_BuildPre, Phase_BuildPost
85+
from ivpm.setup.ivpm_data import get_hooks, Phase_BuildPre, Phase_BuildPost, expand_libvars, get_ivpm_ext_name_m
5986
""" Like the base class method, but copy libs into proper directory in develop. """
6087
print("copy_extensions_to_source")
6188
for hook in get_hooks(Phase_BuildPre):
6289
hook(self)
63-
super().copy_extensions_to_source()
90+
91+
build_py = self.get_finalized_command("build_py")
92+
ext_name_m = get_ivpm_ext_name_m()
93+
for ext in self.extensions:
94+
fullname = self.get_ext_fullname(ext.name)
95+
filename = self.get_ext_filename(fullname)
96+
97+
print("fullname=%s filename=%s" % (fullname, filename), flush=True)
98+
99+
modpath = fullname.split(".")
100+
package = ".".join(modpath[:-1])
101+
package_dir = build_py.get_package_dir(package)
102+
103+
if fullname in ext_name_m.keys():
104+
# replace last path element
105+
mapped_filename = expand_libvars(ext_name_m[fullname])
106+
dest_filename = os.path.join(package_dir, mapped_filename)
107+
src_filename = os.path.join(self.build_lib, "/".join(modpath[:-1]), mapped_filename)
108+
else:
109+
dest_filename = os.path.join(package_dir, os.path.basename(filename))
110+
src_filename = os.path.join(self.build_lib, filename)
111+
112+
os.makedirs(os.path.dirname(dest_filename), exist_ok=True)
113+
114+
copy_file(
115+
src_filename,
116+
dest_filename,
117+
verbose=self.verbose,
118+
dry_run=self.dry_run
119+
)
64120

65121
# Appy any post-copy hooks
66122
for hook in get_hooks(Phase_BuildPost):
@@ -183,7 +239,7 @@ def build_cmake(self, proj_dir):
183239
build_cmd[cmake_build_tool](self, build_dir, env)
184240
install_cmd[cmake_build_tool](self, build_dir, env)
185241

186-
from ivpm.setup.setup import get_ivpm_extdep_data
242+
from ivpm.setup.ivpm_data import get_ivpm_extdep_data
187243
for src,dst in get_ivpm_extdep_data():
188244
shutil.copyfile(src, dst)
189245

src/ivpm/setup/ivpm_data.py

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import os
2+
import platform
3+
4+
Phase_SetupPre = "setup.pre"
5+
Phase_SetupPost = "setup.post"
6+
Phase_BuildPre = "build.pre"
7+
Phase_BuildPost = "build.post"
8+
9+
_ivpm_extra_data = {}
10+
_ivpm_extdep_data = []
11+
_ivpm_hooks = {}
12+
_ivpm_ext_name_m = {}
13+
_package_dir = {}
14+
15+
def get_hooks(kind : str):
16+
global _ivpm_hooks
17+
if kind in _ivpm_hooks.keys():
18+
return _ivpm_hooks[kind]
19+
else:
20+
return []
21+
22+
def get_ivpm_extra_data():
23+
global _ivpm_extra_data
24+
return _ivpm_extra_data
25+
26+
def get_ivpm_extdep_data():
27+
global _ivpm_extdep_data
28+
return _ivpm_extdep_data
29+
30+
def get_ivpm_ext_name_m():
31+
global _ivpm_ext_name_m
32+
return _ivpm_ext_name_m
33+
34+
def get_package_dir():
35+
return _package_dir
36+
37+
38+
39+
def expand(subst_m, path):
40+
elems = path.split("/")
41+
42+
# Perform path meta-variable substitution
43+
for i,e in enumerate(elems):
44+
found = True
45+
while found:
46+
found = False
47+
for k in subst_m.keys():
48+
if e.find(k) != -1:
49+
found = True
50+
e = e.replace(k, subst_m[k])
51+
elems[i] = e
52+
return "/".join(elems)
53+
54+
def expand_libvars(src):
55+
libpref = "lib"
56+
dllext = ".so"
57+
if platform.system() == "Windows":
58+
libpref = ""
59+
dllext = ".dll"
60+
elif platform.system() == "Darwin":
61+
libpref = "lib"
62+
dllext = ".dylib"
63+
64+
subst_m = {
65+
"{libdir}" : "lib64" if os.path.isdir(os.path.join("build", "lib64")) else "lib",
66+
"{libpref}" : libpref,
67+
"{dllpref}" : libpref,
68+
"{dllext}" : dllext
69+
}
70+
71+
return expand(subst_m, src)

0 commit comments

Comments
 (0)