Skip to content

Commit 8b53408

Browse files
committed
Fix out-of-tree build for swig
1 parent 8c7a77f commit 8b53408

File tree

5 files changed

+75
-37
lines changed

5 files changed

+75
-37
lines changed

ADOL-C/swig/Makefile.am

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212

1313
ACLOCAL_AMFLAGS = -I autoconf
1414

15-
EXTRA_DIST = swigprocess.py adolc-r.i adolc-python.i adubswigfuncs.h adolc_all_in.hpp matrixmemory.hpp pyedfclasses.hpp
15+
EXTRA_DIST = swigprocess.py adolc-r.i adolc-python.i adubswigfuncs.hpp adolc_all_in.hpp matrixmemory.hpp pyedfclasses.hpp
1616

1717
clean-local:
1818
-rm -rf python R *.cpp *.cxx *.o *.h include
1919

2020
if PYTHONFOUND
2121
if SPARSE
2222
install:
23-
CXX=${CXX} ${PYTHON} setup.py install --prefix=${prefix} --only-swig
23+
CXX=${CXX} ${PYTHON} ${srcdir}/setup.py build --only-swig --lib-prefix=${prefix} @python_srcbase@ install --prefix=${prefix}
2424
endif
2525
endif

ADOL-C/swig/setup.py

+47-18
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@
1111
##############################################################################
1212

1313
from __future__ import print_function
14+
import sys, os
15+
16+
sys.path = [ os.path.dirname(os.path.abspath(__file__)) ] + sys.path
17+
1418
from swigprocess import prepare_flat_header
1519
from numpy.distutils import misc_util as np_dist
1620
from distutils.core import setup, Extension
1721
from distutils.cmd import Command
1822
from distutils.command.build_ext import build_ext
1923
from distutils.command.build import build
2024
from distutils.command.install import install
21-
import os
2225
import subprocess
2326

2427
def compile_dynlib(prefix,colpackdir,boostdir):
@@ -88,14 +91,34 @@ def finalize_options(self):
8891
prefix = self.lib_prefix
8992
print('prefix = ', prefix)
9093
self.include_dirs.append(os.path.join(prefix,'include'))
91-
self.library_dirs.append(os.path.join(prefix,'lib64'))
92-
self.rpath.append(os.path.join(prefix,'lib64'))
93-
prepare_flat_header()
94+
import ctypes as c
95+
plen = c.sizeof(c.c_void_p(0))
96+
if plen == 8:
97+
self.library_dirs.append(os.path.join(prefix,'lib64'))
98+
self.rpath.append(os.path.join(prefix,'lib64'))
99+
else:
100+
self.library_dirs.append(os.path.join(prefix,'lib'))
101+
self.rpath.append(os.path.join(prefix,'lib'))
102+
buildobj = self.get_finalized_command('build')
103+
self.src = buildobj.src
104+
prepare_flat_header(self.src)
105+
self.swig_opts = ['-c++', '-I' + self.src]
106+
self.finalized = 1
94107

108+
def build_extension(self, ext):
109+
if self.src != '.':
110+
import shutil
111+
sources = ext.sources
112+
newSrc = []
113+
for s in iter(sources):
114+
shutil.copy(self.src + '/' + s, '.')
115+
ext.include_dirs.append(self.src)
116+
super(build_swigadolc,self).build_extension(ext)
95117

96118
class buildthis(build,object):
97119
command_name = 'build'
98120
user_options = build.user_options + [
121+
('src=', None, 'path of the source directory of swig module'),
99122
('lib-prefix=', None, 'prefix to install adolc library'),
100123
('colpack-dir=', None, 'directory in which colpack is installed'),
101124
('boost-dir=', None, 'directory in which boost is installed'),
@@ -111,11 +134,26 @@ def lib_doesnot_exist(self):
111134

112135
def initialize_options(self):
113136
super(buildthis,self).initialize_options()
137+
self.src = None
114138
self.lib_prefix = None
115139
self.colpack_dir = None
116140
self.boost_dir = None
117141
self.only_swig = None
118142

143+
def finalize_options(self):
144+
super(buildthis,self).finalize_options()
145+
if self.src is None:
146+
self.src = '.'
147+
if self.lib_prefix is None:
148+
self.lib_prefix = os.path.join(os.environ['HOME'],'adolc_base')
149+
if self.colpack_dir is None:
150+
self.colpack_dir = os.path.join(os.environ['HOME'],'adolc_base')
151+
if self.boost_dir is None:
152+
self.boost_dir = '/usr'
153+
if self.only_swig is None:
154+
self.only_swig = False
155+
self.finalized = 1
156+
119157
#sub_commands = [ ('build_lib', lib_doesnot_exist),
120158
# ('build_ext', None) ]
121159
sub_commands = [ ('build_lib', None),
@@ -137,22 +175,13 @@ def initialize_options(self):
137175
super(installthis,self).initialize_options()
138176

139177
def finalize_options(self):
178+
self.set_undefined_options('build',
179+
('lib_prefix','lib_prefix'),
180+
('colpack_dir', 'colpack_dir'),
181+
('boost_dir', 'boost_dir'),
182+
('only_swig', 'only_swig'))
140183
super(installthis,self).finalize_options()
141-
if self.lib_prefix is None:
142-
self.lib_prefix = os.path.join(os.environ['HOME'],'adolc_base')
143-
if self.colpack_dir is None:
144-
self.colpack_dir = os.path.join(os.environ['HOME'],'adolc_base')
145-
if self.boost_dir is None:
146-
self.boost_dir = '/usr'
147-
if self.only_swig is None:
148-
self.only_swig = False
149184
self.finalized = 1
150-
buildobj = self.distribution.get_command_obj('build')
151-
buildobj.set_undefined_options('install',
152-
('lib_prefix','lib_prefix'),
153-
('colpack_dir', 'colpack_dir'),
154-
('boost_dir', 'boost_dir'),
155-
('only_swig', 'only_swig'))
156185

157186
incdirs = np_dist.get_numpy_include_dirs()
158187
#python_ldflags = subprocess.check_output(['python-config','--ldflags'],universal_newlines=True)

ADOL-C/swig/swigprocess.py

+19-15
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
##
1111
##############################################################################
1212

13+
from __future__ import print_function
1314
import re
1415
import os.path
1516
import sys
@@ -191,22 +192,25 @@ def finalClean(headfile,outfiles):
191192
for f in glob.glob('*.o'):
192193
os.remove(f)
193194

194-
def prepare_flat_header():
195-
sys.path = [ os.getcwd() ] + sys.path
196-
p = os.getcwd() + '/../include/adolc'
197-
for (dp, dn, fn) in os.walk(p):
198-
ndp = re.sub(r'\.\./',r'',dp)
199-
for f in iter(fn):
200-
lines = readFile(dp + "/" + f)
201-
lines = comment_all_includes(lines)
202-
lines = uncomment_local_includes(lines)
203-
try:
204-
os.makedirs(ndp)
205-
except:
206-
pass
207-
writeOutput(lines, ndp + "/" + f)
195+
def prepare_flat_header(src_base='.'):
196+
pl = [ os.getcwd() + '/../include/adolc' ]
197+
print('src_base = ', src_base)
198+
if src_base != '.':
199+
pl = [ src_base + '/../include/adolc' ] + pl
200+
for p in iter(pl):
201+
for (dp, dn, fn) in os.walk(p):
202+
ndp = re.sub(r'^.*\.\./',r'',dp)
203+
for f in iter(fn):
204+
lines = readFile(dp + "/" + f)
205+
lines = comment_all_includes(lines)
206+
lines = uncomment_local_includes(lines)
207+
try:
208+
os.makedirs(ndp)
209+
except:
210+
pass
211+
writeOutput(lines, ndp + "/" + f)
208212

209-
invoke_cpp('adolc_all_in.hpp', 'adolc_all_pre.hpp')
213+
invoke_cpp(src_base + '/' + 'adolc_all_in.hpp', 'adolc_all_pre.hpp')
210214
lines = readFile('adolc_all_pre.hpp')
211215
lines = reinstate_nonlocal_include(lines)
212216
writeOutput(lines,'adolc_all.hpp')

Makefile.am

+1-2
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,12 @@ EXTRA_DIST = TODO BUGS LICENSE update_versions.sh \
2424
ADOL-C/doc/tapebasic.pdf ADOL-C/doc/tapebasic.eps \
2525
ADOL-C/doc/tap_point.pdf ADOL-C/doc/tap_point.eps \
2626
MSVisualStudio/v14/adolc.sln MSVisualStudio/v14/adolc.vcxproj \
27-
MSVisualStudio/v14/ColPack_Readme_VC++.txt \
2827
MSVisualStudio/v14/ColPack.vcxproj \
2928
MSVisualStudio/v14/sparse/config.h.in MSVisualStudio/v14/nosparse/config.h.in \
3029
MSVisualStudio/v14/x64/sparse/config.h.in MSVisualStudio/v14/x64/nosparse/config.h.in \
3130
MSVisualStudio/v14/sparse/config.h MSVisualStudio/v14/nosparse/config.h \
3231
MSVisualStudio/v14/x64/sparse/config.h MSVisualStudio/v14/x64/nosparse/config.h \
33-
MSVisualStudio/v14/Readme_VC++.txt \
32+
MSVisualStudio/v14/README_VC++.md \
3433
MSVisualStudio/v14/installer.sh \
3534
adolc.spec.in adolc.spec \
3635
update_versions.sh

configure.ac

+6
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,12 @@ fi
501501
AM_PATH_PYTHON([2.7],[python_found=yes],[python_found=no])
502502
AC_PATH_PROG(SWIG, swig, [no])
503503
AM_CONDITIONAL(PYTHONFOUND, [test x$python_found = xyes && test x$SWIG != xno])
504+
if test ${abs_top_srcdir} != ${abs_top_builddir} ; then
505+
python_srcbase='--src=${abs_srcdir}'
506+
else
507+
python_srcbase=''
508+
fi
509+
AC_SUBST(python_srcbase)
504510
###########################################################################
505511
# COIN_PATCH_LIBTOOL_CYGWIN #
506512
###########################################################################

0 commit comments

Comments
 (0)