File: rules

package info (click to toggle)
dolfin 2019.2.0~git20201207.b495043-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, sid
  • size: 30,988 kB
  • sloc: xml: 104,040; cpp: 102,020; python: 24,139; makefile: 300; javascript: 226; sh: 185
file content (362 lines) | stat: -rwxr-xr-x 19,930 bytes parent folder | download
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
#!/usr/bin/make -f

include /usr/share/dpkg/architecture.mk

DEB_SOURCE_PACKAGE := $(strip $(shell egrep '^Source: ' debian/control | cut -f 2 -d ':'))
DEB_VERSION := $(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ')
DEB_NOEPOCH_VERSION := $(shell echo $(DEB_VERSION) | cut -d: -f2-)
DEB_UPSTREAM_VERSION := $(shell echo $(DEB_NOEPOCH_VERSION) | sed 's/-[^-]*$$//')
DEB_STRIPPED_UPSTREAM_VERSION = $(shell echo $(DEB_UPSTREAM_VERSION) | sed -e 's/\+dfsg.*$$//p')

FENICS_RELEASE_VERSION=$(DEB_STRIPPED_UPSTREAM_VERSION)
FENICS_MAJOR_VERSION=$(shell echo $(FENICS_RELEASE_VERSION) | sed "s/^\([^.]*\)\..*$$/\1/")
FENICS_MINOR_VERSION=$(shell echo $(FENICS_RELEASE_VERSION) | sed "s/^\([^.]*\)\.\([^.]*\)\..*$$/\2/")
FENICS_VERSION=$(FENICS_MAJOR_VERSION).$(FENICS_MINOR_VERSION)
FENICS_NEXT_VERSION=$(FENICS_MAJOR_VERSION).$(shell echo $$(( $(FENICS_MINOR_VERSION) + 1 )) )

# dolfin depends on the pybind11 version it was built against,
# if pybind11.h will be used in C++ code fragments in python scripts.
# But pybind11 follows semantic versioning, so should have backwards compatibility
# with minor and patch version updates.
# Extract pybind11 version from pybind11-dev
PYBIND11_DEB_VERSION=$(shell dpkg -s pybind11-dev | awk '/Version:/ {print $$2}')
# extract the current pybind11 version X.Y.Z (drop epoch and debian package version)
PYBIND11_UPSTREAM_VERSION=$(shell echo $(PYBIND11_DEB_VERSION) | sed "s/^.[^:]*://; s/-[^-]*$$//")
PYBIND11_X_VERSION=$(shell echo $(PYBIND11_UPSTREAM_VERSION) | sed "s/^\([^.]*\).*/\1/")
PYBIND11_X_Y_VERSION=$(shell echo $(PYBIND11_UPSTREAM_VERSION) | sed "s/^\(.*\)\.\([^.]*\)$$/\1/")
PYBIND11_VERSION=$(PYBIND11_X_Y_VERSION)
PYBIND11_NEXT_VERSION=$(shell echo $$(( $(PYBIND11_X_VERSION) + 1 )) )

# Allow test programs that use OpenMPI to run
export OMPI_MCA_plm_rsh_agent=/bin/false
export OMPI_MCA_btl_base_warn_component_unused=0

include /usr/share/mpi-default-dev/debian_defaults
ENABLE_MPI=ON
ifeq ($(findstring $(DEB_BUILD_ARCH),$(OPENMPI_ARCHITECTURES)),)
MPIEXEC_PARAMS=
else
MPIEXEC_PARAMS=--oversubscribe
endif

DOLFIN_HOME = $(CURDIR)/$(DEB_SRCDIR)
USCAN_DESTDIR := $(CURDIR)
PY3VERS := $(shell py3versions --requested debian/control | tac -s' ')
PYVERS = $(PY3VERS)

BUILDDIR = obj-$(DEB_HOST_GNU_TYPE)
BUILDDIR_64 = obj-$(DEB_HOST_GNU_TYPE)-64
TESTDIR = build-tests
TESTDIR_64 = build-tests-64

NPROC := $(shell nproc)
PARALLEL = $(subst parallel=,,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
N_CPU    = $(or $(PARALLEL),$(NPROC),1)
# MPI tests are set up to run on 3 processes. Spread them leanly over the available processors (don't have more than 2 tests using one processor).
# e.g. run 1 MPI test at a time over 1-3 processors, or 2 tests at a time over 4-6 processors, or 3 tests over 7-9 processors, etc.
N_MPI := 3
N_MPI_TESTS = $(shell echo $$(( ($(N_CPU)+$(N_MPI)-1)/$(N_MPI) )) )

# some tests run slow (> 1000 sec) on all arches
ARCH_ALL_SKIP_SERIAL_TEST = demo_hyperelasticity_serial demo_cahn-hilliard_serial

# hyperelasticity fails (diverges) on all arches (pivot factors too large, not enough memory assigned)
# elastodynamics passes with dpkg-buildpackage but fails with pdebuild (on amd64). Unreliable, so skip.
ARCH_ALL_SKIP_MPI_TEST = demo_hyperelasticity_mpi demo_elastodynamics_mpi

# Some arches fail the same MPI tests
# e.g. cahn-hilliard, navier-stokes, elasticity, fails or exceeds allowed time
# So skip these tests on the failing arches
ARCH_SKIP_MPI_TEST_LIST = i386 mipsel ppc64el ia64
ARCH_SKIP_MPI_TEST = demo_cahn-hilliard_mpi demo_navier-stokes_mpi demo_elasticity_mpi

# skip more MPI tests for some specific arches
ifeq (arm64, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_MPI_TEST = demo_navier-stokes_mpi
else ifeq (mips, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_MPI_TEST = demo_cahn-hilliard_mpi demo_stokes-iterative_mpi demo_ale_mpi demo_poisson-disc_mpi
else ifeq (mipsel, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_MPI_TEST = demo_stokes-iterative_mpi demo_ale_mpi demo_poisson-disc_mpi
else ifeq (ppc64el, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_MPI_TEST = demo_poisson_mpi demo_singular-poisson_mpi demo_sym-dirichlet-bc_mpi
else ifeq (ia64, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_MPI_TEST = demo_bcs_mpi demo_biharmonic_mpi demo_built-in-meshes_mpi demo_eigenvalue_mpi
else ifeq (sparc64, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_MPI_TEST = demo_contact-vi-snes_mpi
else
  ARCH_SPECIFIC_SKIP_MPI_TEST =
endif

# m68k,mips,sparc64 need some help to pass serial tests
ifeq (m68k, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_SERIAL_TEST = demo_auto-adaptive-poisson_serial demo_elasticity_serial
else ifeq (mips, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_SERIAL_TEST = demo_cahn-hilliard_serial demo_hyperelasticity_serial
else ifeq (mipsel, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_SERIAL_TEST = demo_elastodynamics_serial demo_sym-dirichlet-bc_serial
else ifeq (sparc64, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_SERIAL_TEST = demo_contact-vi-snes_serial
else
  ARCH_SPECIFIC_SKIP_SERIAL_TEST =
endif


# skip slow tests (> 500-1000 sec to complete)
ifeq (armel, $(DEB_HOST_ARCH))
  ARCH_SKIP_SLOW_TEST = demo_stokes-iterative_serial demo_auto-adaptive-navier-stokes_serial demo_elastodynamics_serial demo_sym-dirichlet-bc_serial demo_hyperelasticity_serial demo_cahn-hilliard_serial
else ifeq (armhf, $(DEB_HOST_ARCH))
  ARCH_SKIP_SLOW_TEST = demo_elastodynamics_serial demo_sym-dirichlet-bc_serial demo_hyperelasticity_serial
else ifeq (mips, $(DEB_HOST_ARCH))
  ARCH_SKIP_SLOW_TEST = demo_eigenvalue_serial demo_navier-stokes_serial demo_auto-adaptive-poisson_serial demo_stokes-taylor-hood_serial demo_auto-adaptive-navier-stokes_serial demo_curl-curl_serial demo_elasticity_serial demo_stokes-iterative_serial demo_eval_serial demo_sym-dirichlet-bc_serial demo_elastodynamics_serial demo_eigenvalue_mpi demo_navier-stokes_mpi demo_curl-curl_mpi demo_elasticity_mpi demo_elastodynamics_mpi demo_sym-dirichlet-bc_mpi
else ifeq (mipsel, $(DEB_HOST_ARCH))
  ARCH_SKIP_SLOW_TEST = demo_cahn-hilliard_serial demo_hyperelasticity_serial
else ifeq (alpha, $(DEB_HOST_ARCH))
  ARCH_SKIP_SLOW_TEST = demo_elastodynamics_serial demo_sym-dirichlet-bc_serial demo_hyperelasticity_serial
else ifeq (hppa, $(DEB_HOST_ARCH))
  ARCH_SKIP_SLOW_TEST = demo_cahn-hilliard_serial demo_hyperelasticity_serial
else ifeq (m68k, $(DEB_HOST_ARCH))
  ARCH_SKIP_SLOW_TEST = demo_cahn-hilliard_serial demo_hyperelasticity_serial
else ifeq (riscv64, $(DEB_HOST_ARCH))
  ARCH_SKIP_SLOW_TEST = demo_elastodynamics_serial demo_sym-dirichlet-bc_serial demo_cahn-hilliard_serial demo_hyperelasticity_serial demo_cahn-hilliard_mpi demo_elastodynamics_mpi
else ifeq (sparc64, $(DEB_HOST_ARCH))
  ARCH_SKIP_SLOW_TEST = demo_cahn-hilliard_serial demo_hyperelasticity_serial demo_stokes-iterative_serial demo_cahn-hilliard_mpi demo_elastodynamics_mpi
else
  ARCH_SKIP_SLOW_TEST =
endif

empty :=
space := $(empty)$(empty)

ARCH32_LIST = armel armhf i386 mipsel powerpc x32

ARCH_SPECIFIC_SKIP_SERIAL_TEST_64 = $(ARCH_SPECIFIC_SKIP_SERIAL_TEST) demo_stokes-iterative_serial demo_curl-curl_serial
ARCH_SPECIFIC_SKIP_MPI_TEST_64 = $(ARCH_SPECIFIC_SKIP_MPI_TEST)

ifneq (,$(findstring $(space)$(DEB_HOST_ARCH)$(space), $(space)$(ARCH32_LIST)$(space)))
  # these 4 tests fail in 64-bit build tests on 32-bit arches
  ARCH_SPECIFIC_SKIP_SERIAL_TEST_64 += demo_mixed-poisson_serial demo_stokes-taylor-hood_serial demo_auto-adaptive-navier-stokes_serial demo_multimesh-stokes_serial
endif
ifeq (armel, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_SERIAL_TEST_64 += demo_contact-vi-snes_serial
else ifeq (armhf, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_SERIAL_TEST_64 += demo_contact-vi-snes_serial
else ifeq (mipsel, $(DEB_HOST_ARCH))
  ARCH_SPECIFIC_SKIP_SERIAL_TEST_64 += demo_contact-vi-snes_serial demo_sym-dirichlet-bc_serial
endif

# other arches fail or time out on too many tests, so skip all their MPI tests
ARCH_SKIP_ALL_MPI_TESTS_LIST=armel armhf i386 hppa m68k powerpc

# some arches just aren't keeping up at all, and fail non-MPI tests
ARCH_SKIP_ALL_TESTS_LIST = mips64el hurd-i386 m68k sh4

# extract PETSc version from petsc-dev
PETSC_DEB_VERSION=$(shell dpkg -s petsc-dev | awk '/Version:/ {print $2}')
# extract the current PETSc version
PETSC_UPSTREAM_VERSION=$(shell pkg-config --modversion PETSc)
# "Major" version is the first number in the upstream version (major.minor.release)
PETSC_MAJOR_VERSION=$(shell echo $(PETSC_UPSTREAM_VERSION) | sed "s/^\([^.]*\)\..*$$/\1/")
# "Minor" version is the second number in the upstream version (major.minor.release)
PETSC_MINOR_VERSION=$(shell echo $(PETSC_UPSTREAM_VERSION) | sed "s/^\([^.]*\)\.\([^.]*\)\..*$$/\2/")
PETSC_VERSION=$(PETSC_MAJOR_VERSION).$(PETSC_MINOR_VERSION)
PETSC_VERSION_NEXT=$(shell echo $(PETSC_MAJOR_VERSION).$$(($(PETSC_MINOR_VERSION)+1)))

SLEPC_UPSTREAM_VERSION=$(shell pkg-config --modversion SLEPc)
# SLEPc version must match PETSc
SLEPC_VERSION=$(PETSC_VERSION)
SLEPC_VERSION_NEXT=$(PETSC_VERSION_NEXT)

PETSC_DIR=/usr/lib/petscdir/petsc$(PETSC_VERSION)/$(DEB_HOST_MULTIARCH)-real
SLEPC_DIR=/usr/lib/slepcdir/slepc$(SLEPC_VERSION)/$(DEB_HOST_MULTIARCH)-real

PETSC64_DIR=/usr/lib/petscdir/petsc64-$(PETSC_VERSION)/$(DEB_HOST_MULTIARCH)-real
SLEPC64_DIR=/usr/lib/slepcdir/slepc64-$(SLEPC_VERSION)/$(DEB_HOST_MULTIARCH)-real


DEB_CXXFLAGS := $(shell dpkg-buildflags --get CXXFLAGS) $(shell dpkg-buildflags --get CPPFLAGS)

ifeq (mips64el, $(DEB_HOST_ARCH))
  DEB_CXXFLAGS += -flto-partition=none
endif

CMAKE_OPTS := \
	-D CMAKE_BUILD_TYPE:STRING=RelWithDebInfo \
	-D BUILD_SHARED_LIBS:BOOL=ON \
	-D CMAKE_SKIP_RPATH:BOOL=ON \
	-D CMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=OFF \
	-D DOLFIN_ENABLE_TRILINOS:BOOL=OFF \
	-D DOLFIN_ENABLE_HDF5:BOOL=ON \
	-D HDF5_C_COMPILER_EXECUTABLE:FILEPATH=/usr/bin/h5pcc \
	-D DOLFIN_ENABLE_PARMETIS:BOOL=OFF \
	-D DOLFIN_ENABLE_SCOTCH:BOOL=ON \
	-D DOLFIN_ENABLE_DOCS:BOOL=OFF \
	-D DOLFIN_ENABLE_MPI:BOOL=$(ENABLE_MPI) \
	-D MPIEXEC_PARAMS:STRING="$(MPIEXEC_PARAMS)" \
	-D CMAKE_CXX_FLAGS:STRING="-fpermissive" \
	-D DOLFIN_EXTRA_CXX_FLAGS:STRING="$(DEB_CXXFLAGS)" \
	$(DOLFIN_HOME)

%:
	dh $@ --buildsystem=cmake --with python3,sphinxdoc

override_dh_compress:
	dh_compress -X.py -X.cpp -X.h -X.pdf -X.ufl

override_dh_auto_clean:
	rm -rf $(INSTALLATION_BUILDDIR) $(TESTDIR)
	rm -rf $(INSTALLATION_BUILDDIR_64) $(TESTDIR_64)
	dh_auto_clean

override_dh_auto_configure:
	PETSC_DIR=$(PETSC_DIR) SLEPC_DIR=$(SLEPC_DIR) dh_auto_configure --builddir=$(BUILDDIR) -- $(CMAKE_OPTS)
	PETSC_DIR=$(PETSC64_DIR) SLEPC_DIR=$(SLEPC64_DIR) dh_auto_configure --builddir=$(BUILDDIR_64) -- $(CMAKE_OPTS) -DLIB_NAME_EXT="64"

override_dh_auto_build:
	PETSC_DIR=$(PETSC_DIR) SLEPC_DIR=$(SLEPC_DIR) dh_auto_build --builddir=$(BUILDDIR)
	PETSC_DIR=$(PETSC64_DIR) SLEPC_DIR=$(SLEPC64_DIR) dh_auto_build --builddir=$(BUILDDIR_64)

override_dh_auto_install-indep:
	dh_auto_install -i --builddir=$(BUILDDIR)
	(cd doc; doxygen)
	(cd python/doc; make html)
	dh_numpy3 -i

override_dh_auto_install-arch:
	dh_auto_install -a --builddir=$(BUILDDIR) --destdir=debian/tmp
	dh_auto_install -a --builddir=$(BUILDDIR_64) --destdir=debian/tmp64
	dh_numpy3 -A
	for v in $(PYVERS); do \
	    cd python; \
	    PETSC_DIR=$(PETSC_DIR) SLEPC_DIR=$(SLEPC_DIR) \
	    PATH=$(CURDIR)/debian/tmp/usr/bin:$$PATH \
	    CXXFLAGS="$(DEB_CXXFLAGS) -isystem $(CURDIR)/debian/tmp/usr/include" VERBOSE=1 \
	    $$v setup.py build --build-base=build install --root=$(CURDIR)/debian/tmp --install-layout=deb; \
	    PETSC_DIR=$(PETSC64_DIR) SLEPC_DIR=$(SLEPC64_DIR) \
	    PATH=$(CURDIR)/debian/tmp64/usr/bin:$$PATH \
	    CXXFLAGS="$(DEB_CXXFLAGS) -isystem $(CURDIR)/debian/tmp64/usr/include" VERBOSE=1 \
	    $$v setup.py build --build-base=build-64 install --root=$(CURDIR)/debian/tmp64 --install-layout=deb; \
	done;
	chrpath -d $(CURDIR)/debian/tmp/usr/lib/python*/dist-packages/dolfin/*.so
	chrpath -d $(CURDIR)/debian/tmp64/usr/lib/python*/dist-packages/dolfin/*.so
	sed -i "s/-D_FORTIFY_SOURCE=2//g" $(CURDIR)/debian/tmp/usr/lib/$(DEB_BUILD_MULTIARCH)/pkgconfig/dolfin.pc
	sed -i "s|-DNDEBUG||g" $(CURDIR)/debian/tmp/usr/lib/$(DEB_BUILD_MULTIARCH)/pkgconfig/dolfin.pc
	sed -i "s/-D_FORTIFY_SOURCE=2//g" $(CURDIR)/debian/tmp64/usr/lib/$(DEB_BUILD_MULTIARCH)/pkgconfig/dolfin64.pc
	sed -i "s|-DNDEBUG||g" $(CURDIR)/debian/tmp64/usr/lib/$(DEB_BUILD_MULTIARCH)/pkgconfig/dolfin64.pc

# make a separate copy of the build directory while testing, or else local flags (-I$(DOLFIN_HOME)) get written into dolfin.pc
INSTALLATION_BUILDDIR = installation-build
INSTALLATION_BUILDDIR_64 = installation-build-64
override_dh_auto_test-arch:
	case " $(ARCH_SKIP_ALL_TESTS_LIST) " in \
	  *\ $(DEB_HOST_ARCH)\ *) echo "ALL tests have been disabled on $(DEB_HOST_ARCH)";; \
	  *) set -e; \
	     cp -ra $(BUILDDIR) $(INSTALLATION_BUILDDIR); \
	     cd $(BUILDDIR); \
	     make -j$(N_CPU) unittests VERBOSE=1; \
	     make -j$(N_CPU) demos VERBOSE=1; \
	     case " $(ARCH_SKIP_MPI_TEST_LIST) " in \
	       *\ $(DEB_HOST_ARCH)\ *) IGNORE_MPI_TESTS="$(ARCH_ALL_SKIP_MPI_TEST) $(ARCH_SKIP_MPI_TEST) $(ARCH_SPECIFIC_SKIP_MPI_TEST)";; \
	       *) IGNORE_MPI_TESTS="$(ARCH_ALL_SKIP_MPI_TEST) $(ARCH_SPECIFIC_SKIP_MPI_TEST)";; \
	     esac; \
	     echo "set(CTEST_CUSTOM_TESTS_IGNORE $${IGNORE_MPI_TESTS} $(ARCH_ALL_SKIP_SERIAL_TEST) $(ARCH_SPECIFIC_SKIP_SERIAL_TEST) $(ARCH_SKIP_SLOW_TEST) )" >> CTestCustom.cmake; \
	     echo "Run C++ unit tests (serial)"; \
	     LD_LIBRARY_PATH=$(DOLFIN_HOME)/$(BUILDDIR)/dolfin:$${LD_LIBRARY_PATH} ctest --output-on-failure -R unittests; \
	     echo "Run C++ regressions tests (serial)"; \
	     LD_LIBRARY_PATH=$(DOLFIN_HOME)/$(BUILDDIR)/dolfin:$${LD_LIBRARY_PATH} ctest --output-on-failure -j$(N_CPU) -R demo -R serial; \
	     echo "Run C++ regression tests (MPI)"; \
	     case " $(ARCH_SKIP_ALL_MPI_TESTS_LIST) " in \
	       *\ $(DEB_HOST_ARCH)\ *) echo "MPI tests have been disabled on $(DEB_HOST_ARCH)";; \
	       *)  LD_LIBRARY_PATH=$(DOLFIN_HOME)/$(BUILDDIR)/dolfin:$${LD_LIBRARY_PATH} ctest --output-on-failure -j$(N_MPI_TESTS) -R demo -R mpi;; \
	     esac; \
	     cd ..; \
	     mv $(BUILDDIR) $(TESTDIR); \
	     mv $(INSTALLATION_BUILDDIR) $(BUILDDIR);; \
	esac
	case " $(ARCH_SKIP_ALL_TESTS_LIST) " in \
	  *\ $(DEB_HOST_ARCH)\ *) echo "ALL 64-bit tests have been disabled on $(DEB_HOST_ARCH)";; \
	  *) set -e; \
	     cp -ra $(BUILDDIR_64) $(INSTALLATION_BUILDDIR_64); \
	     cd $(BUILDDIR_64); \
	     make -j$(N_CPU) unittests VERBOSE=1; \
	     make -j$(N_CPU) demos VERBOSE=1; \
	     case " $(ARCH_SKIP_MPI_TEST_LIST) " in \
	       *\ $(DEB_HOST_ARCH)\ *) IGNORE_MPI_TESTS="$(ARCH_ALL_SKIP_MPI_TEST) $(ARCH_SKIP_MPI_TEST) $(ARCH_SPECIFIC_SKIP_MPI_TEST_64)";; \
	       *) IGNORE_MPI_TESTS="$(ARCH_ALL_SKIP_MPI_TEST) $(ARCH_SPECIFIC_SKIP_MPI_TEST)";; \
	     esac; \
	     echo "set(CTEST_CUSTOM_TESTS_IGNORE $${IGNORE_MPI_TESTS} $(ARCH_ALL_SKIP_SERIAL_TEST) $(ARCH_SPECIFIC_SKIP_SERIAL_TEST_64) $(ARCH_SKIP_SLOW_TEST) )" >> CTestCustom.cmake; \
	     echo "Run C++ 64-bit unit tests (serial)"; \
	     LD_LIBRARY_PATH=$(DOLFIN_HOME)/$(BUILDDIR_64)/dolfin:$${LD_LIBRARY_PATH} ctest --output-on-failure -R unittests; \
	     echo "Run C++ 64-bit regressions tests (serial)"; \
	     LD_LIBRARY_PATH=$(DOLFIN_HOME)/$(BUILDDIR_64)/dolfin:$${LD_LIBRARY_PATH} ctest --output-on-failure -j$(N_CPU) -R demo -R serial; \
	     echo "Run C++ 64-bit regression tests (MPI)"; \
	     case " $(ARCH_SKIP_ALL_MPI_TESTS_LIST) " in \
	       *\ $(DEB_HOST_ARCH)\ *) echo "MPI 64-bit tests have been disabled on $(DEB_HOST_ARCH)";; \
	       *)  LD_LIBRARY_PATH=$(DOLFIN_HOME)/$(BUILDDIR_64)/dolfin:$${LD_LIBRARY_PATH} ctest --output-on-failure -j$(N_MPI_TESTS) -R demo -R mpi || /bin/true;; \
	     esac; \
	     cd ..; \
	     mv $(BUILDDIR_64) $(TESTDIR_64); \
	     mv $(INSTALLATION_BUILDDIR_64) $(BUILDDIR_64);; \
	esac

override_dh_auto_test-indep:

override_dh_install-indep:
	cd python/demo; \
	python3 generate-demo-files.py
	dh_install -i
	sed "s/set(CMAKE_IMPORT_FILE_VERSION 1)/set(CMAKE_IMPORT_FILE_VERSION 1)\n\nif(PETSC_INT_SIZE EQUAL 8)\n  set(LIB_NAME_EXT \"64\")\nelse()\n  set(LIB_NAME_EXT \$${DOLFIN_LIB_NAME_EXT})\nendif()/; \
	  s/libdolfin.so/libdolfin\$${LIB_NAME_EXT}.so/g; s/$(DEB_HOST_MULTIARCH)/\$${CMAKE_LIBRARY_ARCHITECTURE}/g" \
	  -i debian/libdolfin-dev-common/usr/share/dolfin/cmake/DOLFINTargets-relwithdebinfo.cmake
	sed "s/$(DEB_HOST_MULTIARCH)/\$${CMAKE_LIBRARY_ARCHITECTURE}/g" \
	  -i debian/libdolfin-dev-common/usr/share/dolfin/cmake/DOLFINTargets.cmake

override_dh_python3-arch:
	dh_python3 -a
	dh_numpy3 -a
	mkdir -p debian/python3-dolfin-real/$(PETSC_DIR)/lib/
	mv debian/python3-dolfin-real/usr/lib/python3  debian/python3-dolfin-real/$(PETSC_DIR)/lib
	mkdir -p debian/python3-dolfin64-real/$(PETSC64_DIR)/lib/
	mv debian/python3-dolfin64-real/usr/lib/python3  debian/python3-dolfin64-real/$(PETSC64_DIR)/lib
	rm -rf debian/python3-dolfin64-real/$(PETSC64_DIR)/lib/dist-packages/dolfinx_utils
	rm -rf debian/python3-dolfin64-real/$(PETSC64_DIR)/lib/dist-packages/fenics*

override_dh_fixperms-indep:
	dh_fixperms -i
	chmod a-x debian/dolfin-doc/usr/share/dolfin/demo-python/*/*/*.py

override_dh_sphinxdoc-indep:
	dh_sphinxdoc -i
	grep "https://cdnjs.cloudflare.com/ajax/libs/mathjax/.*/latest.js" debian/dolfin-doc/usr/share/doc/dolfin-doc/* -r --files-with-matches | xargs sed "s|src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/.*/latest.js|src=\"file://usr/share/javascript/mathjax/unpacked/latest.js|g" -i

# set petsc:Depends to something like "libpetsc-real3.8-dev, libslepc-real3.8-dev, python-petsc4py (>= 3.8), python-petsc4py (<< 3.9), python-slepc4py (>= 3.8), python-slepc4py (<< 3.9)"
PETSC_DEV_DEPENDS="libpetsc-real$(PETSC_VERSION)-dev | libpetsc$(PETSC_UPSTREAM_VERSION)-dev, libslepc-real$(SLEPC_VERSION)-dev | libslepc$(SLEPC_UPSTREAM_VERSION)-dev"
PETSC64_DEV_DEPENDS="libpetsc64-real$(PETSC_VERSION)-dev | libpetsc64-$(PETSC_UPSTREAM_VERSION)-dev, libslepc64-real$(SLEPC_VERSION)-dev | libslepc64-$(SLEPC_UPSTREAM_VERSION)-dev"
# slepc4py version must match petsc4py (using the PETSc minor version, not the patch release)
PETSC4PY_DEPENDS_PY3=python3-petsc4py (>= $(PETSC_VERSION)), python3-petsc4py (<< $(PETSC_VERSION_NEXT)), python3-slepc4py (>= $(SLEPC_VERSION)), python3-slepc4py (<< $(SLEPC_VERSION_NEXT))
PETSC4PY_REAL_DEPENDS_PY3=python3-petsc4py-real (>= $(PETSC_VERSION)), python3-petsc4py-real (<< $(PETSC_VERSION_NEXT)), python3-slepc4py-real (>= $(SLEPC_VERSION)), python3-slepc4py-real (<< $(SLEPC_VERSION_NEXT))
PETSC4PY_64_REAL_DEPENDS_PY3=python3-petsc4py-64-real (>= $(PETSC_VERSION)), python3-petsc4py-64-real (<< $(PETSC_VERSION_NEXT)), python3-slepc4py-64-real (>= $(SLEPC_VERSION)), python3-slepc4py-64-real (<< $(SLEPC_VERSION_NEXT))
override_dh_gencontrol:
	echo "python3-petsc4py:Depends=$(PETSC4PY_DEPENDS_PY3)" >> debian/python3-dolfin.substvars
	echo "python3-petsc4py-real:Depends=$(PETSC4PY_REAL_DEPENDS_PY3)" >> debian/python3-dolfin-real.substvars
	echo "python3-petsc4py-64-real:Depends=$(PETSC4PY_64_REAL_DEPENDS_PY3)" >> debian/python3-dolfin64-real.substvars
	dh_gencontrol -- -Vpetsc:Depends=$(PETSC_DEV_DEPENDS)  -Vpetsc64:Depends=$(PETSC64_DEV_DEPENDS) \
	    -Vfenics:Upstream-Version=$(FENICS_VERSION) -Vfenics:Next-Upstream-Version=$(FENICS_NEXT_VERSION)~ \
	    -Vpybind11:Upstream-Version=$(PYBIND11_VERSION) -Vpybind11:Next-Upstream-Version=$(PYBIND11_NEXT_VERSION)

# dbgsym-migration was introduced for dolfin 2017.2 (don't update the version to a later version)
override_dh_strip:
	dh_strip --package=libdolfin$(FENICS_VERSION) -Xpython
	dh_strip --package=python3-dolfin-real -Xpython2
	dh_strip --package=libdolfin64-$(FENICS_VERSION) -Xpython
	dh_strip --package=python3-dolfin64-real

# python module so files are already stripped by setup.py (setuptools)
override_dh_dwz:
	dh_dwz -Xcpp.cpython

# https://stackoverflow.com/a/18793112/353337
override_dh_shlibdeps:
	dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info


.PHONY: override_dh_strip