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
|
# -*- mode: makefile; coding: utf-8 -*-
# Copyright © 2003 Colin Walters <[email protected]>
# Copyright © 2006 Marc Dequènes (Duck) <[email protected]>
#
# Description: manage Python public modules build
# This class is designed to work with Python packages using the
# 'distutils' build system and comply to the new policy established
# during summer 2006. Use of the debhelper class to make use of the
# new dh_python is strongly advised. (This is still left as optional
# in line with CDBS' flexible behavior.)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2, or (at
# your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02111-1307 USA.
#
# This class provides rules for old and new Python policy. Leaving
# DEB_PYTHON_SYSTEM unset selects the old behavior. The pysupport and
# pycentral methods are available to comply with new policy. Don't forget
# to update your 'debian/control'. (Build-Depends are correctly generated
# if you are using the auto control generation feature.)
# Once all old-style packages are removed before etch, some of the old
# can be refactored or removed.
_cdbs_scripts_path ?= /usr/lib/cdbs
_cdbs_rules_path ?= /usr/share/cdbs/1/rules
_cdbs_class_path ?= /usr/share/cdbs/1/class
ifndef _cdbs_class_python_distutils
_cdbs_class_python_distutils = 1
include $(_cdbs_rules_path)/buildcore.mk$(_cdbs_makefile_suffix)
include $(_cdbs_class_path)/langcore.mk$(_cdbs_makefile_suffix)
# check python system
cdbs_use_xs_field := $(shell grep -q "^XS-Python-Version:" debian/control && echo yes)
cdbs_selected_pycompat := $(shell if [ -e debian/pycompat ]; then cat debian/pycompat; fi)
cdbs_pycompat = $(cdbs_selected_pycompat)
ifeq (pysupport, $(DEB_PYTHON_SYSTEM))
cdbs_python_support_path = usr/share/python-support/$(DEB_PYTHON_MODULE_PACKAGE)
ifeq (, $(cdbs_selected_pycompat))
cdbs_pycompat = 2
endif # use pycompat
# warning pysupport compatibility mode
ifneq (, $(cdbs_use_xs_field))
$(warning WARNING: Use of XS-Python-Version and XB-Python-Version fields in debian/control is deprecated with pysupport method; use debian/pyversions if you need to specify specific versions.)
endif # use XS field (compat)
else
ifeq (pycentral, $(DEB_PYTHON_SYSTEM))
ifeq (, $(cdbs_selected_pycompat))
cdbs_pycompat = 2
endif # use pycompat
else
ifneq (, $(DEB_PYTHON_SYSTEM))
$(error unsupported Python system: $(DEB_PYTHON_SYSTEM) (select either pysupport or pycentral))
else
ifneq (, $(cdbs_use_xs_field))
$(error package uses the new Python policy; DEB_PYTHON_SYSTEM must be set to "pysupport" or "pycentral")
endif
ifneq (, $(cdbs_selected_pycompat))
ifeq (yes, $(shell expr $(cdbs_selected_pycompat) \> 1 >/dev/null && echo yes))
$(error package uses the new Python policy; DEB_PYTHON_SYSTEM must be set to "pysupport" or "pycentral")
endif
endif # use pycompat
endif # unknown method
endif # pycentral
endif # pysupport
ifndef DEB_PYTHON_SYSTEM
DEB_PYTHON_COMPILE_VERSION =
DEB_PYTHON_VERSIONS = 2.1 2.2 2.3 2.4 2.5 2.6 2.7
else
# default package is the first one declared in 'debian/control'
# (override if necessary)
DEB_PYTHON_MODULE_PACKAGE = $(firstword $(filter-out %-doc %-dev %-common, $(DEB_PACKAGES)))
DEB_PYTHON_PRIVATE_MODULES_DIRS =
endif
# common variables
DEB_PYTHON_SETUP_CMD = setup.py
DEB_PYTHON_CLEAN_ARGS = -a
DEB_PYTHON_BUILD_ARGS = --build-base="$(CURDIR)/$(DEB_BUILDDIR)/build"
DEB_PYTHON_INSTALL_ARGS_ALL = --no-compile -O0 --prefix=/usr
ifndef DEB_PYTHON_SYSTEM
########################### old policy method ###########################
$(warning =======================================================)
$(warning Your package does not conform to the new Python policy.)
$(warning Please consider updating. Here is some documentation:)
$(warning http://wiki.debian.org/DebianPython/NewPolicy)
$(warning http://wiki.debian.org/DebianPythonFAQ)
$(warning =======================================================)
# make: *** No rule to make target `voodoo'. Stop.
DEB_PYTHON_REAL_LIB_PACKAGES = $(strip $(filter $(patsubst %,python%%,$(DEB_PYTHON_VERSIONS)),$(filter-out $(DEB_PYTHON_PACKAGES_EXCLUDE),$(DEB_ALL_PACKAGES))))
# If no versioned python library packages found, grab all simpler ones
ifeq (,$(DEB_PYTHON_REAL_LIB_PACKAGES))
DEB_PYTHON_SIMPLE_PACKAGES = $(strip $(filter python-%,$(filter-out $(DEB_PYTHON_PACKAGES_EXCLUDE),$(DEB_ALL_PACKAGES))))
endif
cdbs_python_ver = $(filter-out -%,$(subst -, -,$(patsubst python%,%,$(cdbs_curpkg))))
common-build-arch common-build-indep:: common-build-impl
common-build-impl::
cd $(DEB_SRCDIR) && PATH=/opt/trinity/bin:$(PATH) python$(DEB_PYTHON_COMPILE_VERSION) $(DEB_PYTHON_SETUP_CMD) build $(DEB_PYTHON_BUILD_ARGS)
# See if this package doesn't appear to need to be compiled by multiple
# Python versions.
ifeq (,$(DEB_PYTHON_REAL_LIB_PACKAGES))
common-install-arch common-install-indep:: common-install-impl
common-install-impl::
cd $(DEB_SRCDIR) && PATH=/opt/trinity/bin:$(PATH) python$(DEB_PYTHON_COMPILE_VERSION) $(DEB_PYTHON_SETUP_CMD) install --root=$(DEB_DESTDIR) $(DEB_PYTHON_INSTALL_ARGS_ALL) $(DEB_PYTHON_INSTALL_ARGS_$(cdbs_curpkg))
for ddir in $(DEB_DESTDIR)/usr/lib/python?.?/dist-packages; do \
sdir=$$(dirname $$ddir)/site-packages; \
mkdir -p $$sdir; \
tar -c -f - -C $$ddir . | tar -x -f - -C $$sdir; \
rm -rf $$ddir; \
done
else
$(patsubst %,install/%,$(DEB_PYTHON_REAL_LIB_PACKAGES)) :: install/% :
cd $(DEB_SRCDIR) && PATH=/opt/trinity/bin:$(PATH) python$(cdbs_python_ver) $(DEB_PYTHON_SETUP_CMD) install --root=$(CURDIR)/debian/$(cdbs_curpkg) $(DEB_PYTHON_INSTALL_ARGS_ALL) $(DEB_PYTHON_INSTALL_ARGS_$(cdbs_curpkg))
for ddir in $(CURDIR)/debian/$(cdbs_curpkg)/usr/lib/python?.?/dist-packages; do \
sdir=$$(dirname $$ddir)/site-packages; \
mkdir -p $$sdir; \
tar -c -f - -C $$ddir . | tar -x -f - -C $$sdir; \
rm -rf $$ddir; \
done
endif
$(patsubst %,install/%,$(DEB_PYTHON_SIMPLE_PACKAGES)) :: install/% :
cd $(DEB_SRCDIR) && PATH=/opt/trinity/bin:$(PATH) python $(DEB_PYTHON_SETUP_CMD) install --root=$(CURDIR)/debian/$(cdbs_curpkg) $(DEB_PYTHON_INSTALL_ARGS_ALL) $(DEB_PYTHON_INSTALL_ARGS_$(cdbs_curpkg))
ifeq (pysupport, $(DEB_PYTHON_SYSTEM))
for ddir in $(CURDIR)/debian/$(cdbs_curpkg)/usr/lib/python?.?/dist-packages; do \
sdir=$$(dirname $$ddir)/site-packages; \
mkdir -p $$sdir; \
tar -c -f - -C $$ddir . | tar -x -f - -C $$sdir; \
rm -rf $$ddir; \
done
endif
# This class can optionally utilize debhelper's "dh_python" command. Just
# be sure you include debhelper.mk before including this file.
ifdef _cdbs_rules_debhelper
DEB_DH_PYTHON_ARGS = $(addprefix -V ,$(DEB_PYTHON_COMPILE_VERSION)) $(DEB_DH_PYTHON_ARGS_ALL) $(DEB_DH_PYTHON_ARGS_$(cdbs_curpkg))
DH_PYTHON2 = $(if $(wildcard /usr/bin/dh_python2),dh_python2,dh_python)
$(patsubst %,binary-install/%,$(DEB_PACKAGES)) :: binary-install/%:
${DH_PYTHON2} -p$(cdbs_curpkg) $(DEB_DH_PYTHON_ARGS)
endif
# Ignore errors from this rule. In a tarball build, the file may not
# exist.
ifeq (,$(DEB_PYTHON_REAL_LIB_PACKAGES))
clean::
-python$(DEB_PYTHON_COMPILE_VERSION) $(DEB_PYTHON_SETUP_CMD) clean $(DEB_PYTHON_CLEAN_ARGS)
else
clean:: $(patsubst %,python-cleanbuilddir/%,$(DEB_PYTHON_REAL_LIB_PACKAGES))
$(patsubst %,python-cleanbuilddir/%,$(DEB_PYTHON_REAL_LIB_PACKAGES)) :: python-cleanbuilddir/% :
-python$(cdbs_python_ver) $(DEB_PYTHON_SETUP_CMD) clean $(DEB_PYTHON_CLEAN_ARGS)
endif
else
########################## new policy methods ###########################
# Calculate cdbs_python_build_versions
cdbs_python_module_arch := $(strip $(shell perl -e '$$/=""; $$_=(grep {/^Package: $(DEB_PYTHON_MODULE_PACKAGE)$$/m;} (<>))[0]; /^Architecture: (.*)$$/m && print $$1' debian/control))
cdbs_python_current_version := $(shell pyversions -vd)
ifeq (all, $(cdbs_python_module_arch))
# check if current is in build versions
ifneq ($(cdbs_python_current_version), $(filter $(cdbs_python_current_version), $(shell pyversions -vr)))
cdbs_python_compile_version := $(firstword $(strip $(sort $(shell pyversions -vr))))
cdbs_python_build_versions := $(cdbs_python_compile_version)
else
cdbs_python_build_versions := $(cdbs_python_current_version)
endif
else
cdbs_python_build_versions := $(shell pyversions -vr)
endif # archall
# check if build is possible
ifeq (, $(cdbs_python_build_versions))
ifeq (pysupport, $(DEB_PYTHON_SYSTEM))
$(error invalid setting in debian/pyversions)
else
$(error invalid setting for XS-Python-Version)
endif # system selected
endif # build versions empty
# Declare Build-Deps for packages using this file
CDBS_BUILD_DEPENDS := $(CDBS_BUILD_DEPENDS), debhelper (>= 5.0.37.2), cdbs (>= 0.4.43)
ifeq (all, $(cdbs_python_module_arch))
ifneq (, $(cdbs_python_compile_version))
CDBS_BUILD_DEPENDS := $(CDBS_BUILD_DEPENDS), python$(cdbs_python_compile_version)-dev, python (>= 2.3.5-11)
else
CDBS_BUILD_DEPENDS := $(CDBS_BUILD_DEPENDS), python-dev (>= 2.3.5-11)
endif
else
CDBS_BUILD_DEPENDS := $(CDBS_BUILD_DEPENDS), python-all-dev (>= 2.3.5-11)
endif
ifeq (pysupport, $(DEB_PYTHON_SYSTEM))
CDBS_BUILD_DEPENDS := $(CDBS_BUILD_DEPENDS), python-support (>= 0.3.2)
else
CDBS_BUILD_DEPENDS := $(CDBS_BUILD_DEPENDS), python-central (>= 0.6)
endif
cdbs_python_current_binary := $(shell pyversions -d)
cdbs_python_binary = $(if $(call cdbs_streq,$(cdbs_python_current_binary),$(1)),python,$(1))
# build stage
common-build-arch common-build-indep:: $(addprefix python-build-stamp-, $(cdbs_python_build_versions))
python-build-stamp-%:
ifeq (all, $(cdbs_python_module_arch))
cd $(DEB_SRCDIR) && PATH=/opt/trinity/bin:$(PATH) $(call cdbs_python_binary,python$(cdbs_python_compile_version)) $(DEB_PYTHON_SETUP_CMD) build $(DEB_PYTHON_BUILD_ARGS)
else
cd $(DEB_SRCDIR) && PATH=/opt/trinity/bin:$(PATH) $(call cdbs_python_binary,python$*) $(DEB_PYTHON_SETUP_CMD) build $(DEB_PYTHON_BUILD_ARGS)
endif # archall detection
touch $@
# install stage
ifeq (all, $(cdbs_python_module_arch))
common-install-arch common-install-indep:: python-install-py
python-install-py:
cd $(DEB_SRCDIR) && PATH=/opt/trinity/bin:$(PATH) $(call cdbs_python_binary,python$(cdbs_python_compile_version)) $(DEB_PYTHON_SETUP_CMD) install --root=$(DEB_DESTDIR) $(DEB_PYTHON_INSTALL_ARGS_ALL)
else
common-install-arch common-install-indep:: $(addprefix python-install-, $(cdbs_python_build_versions))
python-install-%:
cd $(DEB_SRCDIR) && PATH=/opt/trinity/bin:$(PATH) $(call cdbs_python_binary,python$*) $(DEB_PYTHON_SETUP_CMD) install --root=$(DEB_DESTDIR) $(DEB_PYTHON_INSTALL_ARGS_ALL)
endif # archall detection
# This class can optionally use debhelper's commands. Just
# be sure you include debhelper.mk before including this file.
ifdef _cdbs_rules_debhelper
DEB_DH_PYTHON_ARGS = $(DEB_DH_PYTHON_ARGS_ALL) $(DEB_DH_PYTHON_ARGS_$(cdbs_curpkg)) $(DEB_PYTHON_PRIVATE_MODULES_DIRS)
DH_PYTHON2 = $(if $(wildcard /usr/bin/dh_python2),dh_python2,dh_python)
$(patsubst %,binary-install/%,$(DEB_PACKAGES)) :: binary-install/%:
ifeq (pysupport, $(DEB_PYTHON_SYSTEM))
dh_pysupport -p$(cdbs_curpkg) $(DEB_PYTHON_PRIVATE_MODULES_DIRS)
else
dh_pycentral -p$(cdbs_curpkg)
endif
${DH_PYTHON2} -p$(cdbs_curpkg) $(DEB_DH_PYTHON_ARGS)
endif
# clean stage
clean:: $(addprefix python-clean-, $(cdbs_python_build_versions))
python-clean-%:
ifeq (all, $(cdbs_python_module_arch))
-cd $(DEB_SRCDIR) && $(call cdbs_python_binary,python$(cdbs_python_compile_version)) $(DEB_PYTHON_SETUP_CMD) clean $(DEB_PYTHON_CLEAN_ARGS)
else
-cd $(DEB_SRCDIR) && $(call cdbs_python_binary,python$*) $(DEB_PYTHON_SETUP_CMD) clean $(DEB_PYTHON_CLEAN_ARGS)
endif # archall detection
clean::
ifeq (, $(cdbs_selected_pycompat))
echo "$(cdbs_pycompat)" >debian/pycompat
endif # use pycompat
rm -f python-build-stamp-*
endif
########################## all policy methods ###########################
# Calling setup.py clean may create .pyc files, so we need a final cleanup
# pass here.
clean::
find . -name '*.pyc' -exec rm '{}' ';'
endif
|