user [email protected]
usertags 1086122 python3.15
tags 1086122 patch
thanks
Hi!
While rebuilding the python related packages against the Python 3.15rc2
version I ran into this FTBFS [1].
The package has been failing to build and accumulating problems for a
few years now. I've managed to get it back to buildng, by applying the
following changes:
- Use setuptools
- Upstream commit d1523ba82517bbb0a4fc39064fd5f62a72f48ff5
"compatibility with Cython 3.1"
- Add patch to deal with python 3.14's removal of
PyObject_AsReadBuffer()/PyObject_AsWriteBuffer()
- Add patch to deal with pygobject-types.h split
- Add patch to deal with the NAL_UNIT_CODED_SLICE_TLA_R rename
- Add upstream patch ccfbf4ea1f "#4216 minimal patch for re-enabling
decoder and swscale with ffmpeg v7"
- Drop ffmpeg encoder
I've applied these fixes in the sandbox [2] to verify that it builds
successfully, these should be applied in Debian to get the package back
to a healthy state.
Happy hacking,
[1]: https://debusine.debian.net/debian/r-python-python3.15/artifact/4587894/
[2]: https://debusine.debian.net/debian/r-python-python3.15/
--
"Can you imagine what I would do if I could do all I can?" -- Sun Tzu
Saludos /\/\ /\ >< `/
diff -Nru xpra-3.1.5+dfsg1/debian/changelog xpra-3.1.5+dfsg1/debian/changelog
--- xpra-3.1.5+dfsg1/debian/changelog 2023-09-15 13:15:05.000000000 +0200
+++ xpra-3.1.5+dfsg1/debian/changelog 2026-09-10 17:28:44.000000000 +0200
@@ -1,3 +1,19 @@
+xpra (3.1.5+dfsg1-0.3) UNRELEASED; urgency=medium
+
+ * Non-maintainer upload.
+ * Add patch to use setuptools shim as a replacement for distutils
+ * Add setuptools as a build dependency
+ * Backport upstream patch d1523ba compatibility with Cython 3.1
+ * Add patch to deal with python 3.14's removal of
+ PyObject_AsReadBuffer()/PyObject_AsWriteBuffer()
+ * Add patch to deal with pygobject-types.h split
+ * Add patch to deal with the NAL_UNIT_CODED_SLICE_TLA_R rename
+ * Add upstream patch ccfbf4ea1f "#4216 minimal patch for re-enabling
+ decoder and swscale with ffmpeg v7"
+ * Drop ffmpeg encoder
+
+ -- Maximiliano Curia <[email protected]> Thu, 10 Sep 2026 17:28:44 +0200
+
xpra (3.1.5+dfsg1-0.2) unstable; urgency=medium
* Non-maintainer upload.
diff -Nru xpra-3.1.5+dfsg1/debian/control xpra-3.1.5+dfsg1/debian/control
--- xpra-3.1.5+dfsg1/debian/control 2023-09-15 13:15:05.000000000 +0200
+++ xpra-3.1.5+dfsg1/debian/control 2026-09-10 17:28:44.000000000 +0200
@@ -26,6 +26,7 @@
,libxrandr-dev
,libxtst-dev
,python3-all-dev
+ ,python3-setuptools
,python3-cairo-dev
,python-gi-dev
## Build-time detection of path to Xorg or xvfb binary
diff -Nru xpra-3.1.5+dfsg1/debian/patches/cython-3.1-compat.patch
xpra-3.1.5+dfsg1/debian/patches/cython-3.1-compat.patch
--- xpra-3.1.5+dfsg1/debian/patches/cython-3.1-compat.patch 1970-01-01
01:00:00.000000000 +0100
+++ xpra-3.1.5+dfsg1/debian/patches/cython-3.1-compat.patch 2026-09-10
17:28:44.000000000 +0200
@@ -0,0 +1,131 @@
+Description: compatibility with Cython 3.1
+Author: Antoine Martin <[email protected]>
+Origin: upstream,
https://github.com/Xpra-org/xpra/commit/d1523ba82517bbb0a4fc39064fd5f62a72f48ff5
+Forwarded: not-needed
+Index: b/xpra/codecs/v4l2/pusher.pyx
+===================================================================
+--- a/xpra/codecs/v4l2/pusher.pyx
++++ b/xpra/codecs/v4l2/pusher.pyx
+@@ -364,7 +364,7 @@ cdef class Pusher:
+ cdef parse_pixel_format(self, v4l2_format *vid_format):
+ if vid_format.fmt.pix.pixelformat==0:
+ return ""
+- return "".join([chr((vid_format.fmt.pix.pixelformat//(2**(8*x))) %
256) for x in range(4)])
++ return "".join(chr((vid_format.fmt.pix.pixelformat >> (8*x)) % 256)
for x in range(4))
+
+ cdef show_vid_format(self, v4l2_format *vid_format):
+ log("vid_format.type = %i", vid_format.type)
+Index: b/xpra/net/bencode/cython_bencode.pyx
+===================================================================
+--- a/xpra/net/bencode/cython_bencode.pyx
++++ b/xpra/net/bencode/cython_bencode.pyx
+@@ -24,7 +24,7 @@ def b(x):
+ return codecs.latin_1_encode(x)[0]
+ import sys
+ if sys.version_info[0]==2:
+- LongType = long
++ LongType = int
+ else:
+ LongType = int
+ unicode = str
+@@ -50,7 +50,7 @@ cdef decode_int(const unsigned char *x,
+ try:
+ n = int(x[f:unewf])
+ except (OverflowError, ValueError):
+- n = long(x[f:unewf])
++ n = int(x[f:unewf])
+ if x[f] == b'-':
+ if x[f + 1] == b'0':
+ raise ValueError("-0 is not a valid number")
+@@ -182,7 +182,7 @@ cdef int encode(object v, r) except -1:
+ elif t==dict:
+ return encode_dict(v, r)
+ elif t==bool:
+- return encode_int(long(v), r)
++ return encode_int(int(v), r)
+ elif v==None:
+ raise ValueError("found None value!")
+ else:
+Index: b/xpra/net/rencodeplus/rencodeplus.pyx
+===================================================================
+--- a/xpra/net/rencodeplus/rencodeplus.pyx
++++ b/xpra/net/rencodeplus/rencodeplus.pyx
+@@ -37,7 +37,7 @@ __version__ = ("Cython", 1, 0, 8)
+ inttypes = (int, )
+ strtypes = (str, )
+ if sys.version_info[0]==2:
+- inttypes = (int, long)
++ inttypes = (int, )
+ strtypes = (str, unicode)
+
+ cdef extern from "Python.h":
+Index: b/xpra/x11/bindings/core_bindings.pyx
+===================================================================
+--- a/xpra/x11/bindings/core_bindings.pyx
++++ b/xpra/x11/bindings/core_bindings.pyx
+@@ -107,7 +107,7 @@ cdef class X11CoreBindingsInstance:
+ integer (assumed to already be an X atom)."""
+ self.context_check()
+ cdef char* string
+- if isinstance(str_or_int, (int, long)):
++ if isinstance(str_or_int, int):
+ return <Atom> str_or_int
+ bstr = strtobytes(str_or_int)
+ string = bstr
+Index: b/xpra/x11/bindings/keyboard_bindings.pyx
+===================================================================
+--- a/xpra/x11/bindings/keyboard_bindings.pyx
++++ b/xpra/x11/bindings/keyboard_bindings.pyx
+@@ -690,7 +690,7 @@ cdef class X11KeyboardBindingsInstance(X
+ for ks in keysyms_strs:
+ if ks in (None, ""):
+ keysym = NoSymbol
+- elif type(ks) in [long, int]:
++ elif type(ks) is int:
+ keysym = ks
+ else:
+ keysym = self._parse_keysym(ks)
+@@ -1052,7 +1052,7 @@ cdef class X11KeyboardBindingsInstance(X
+ integer (assumed to already be an X atom)."""
+ self.context_check()
+ cdef char* string
+- if isinstance(str_or_int, (int, long)):
++ if isinstance(str_or_int, int):
+ return <Atom> str_or_int
+ bstr = strtobytes(str_or_int)
+ string = bstr
+Index: b/xpra/x11/bindings/randr_bindings.pyx
+===================================================================
+--- a/xpra/x11/bindings/randr_bindings.pyx
++++ b/xpra/x11/bindings/randr_bindings.pyx
+@@ -427,7 +427,7 @@ cdef class RandRBindingsInstance(X11Core
+ h, h+yFront, h+yFront+ySync, yTotal)
+ new_mode.width = w
+ new_mode.height = h
+- new_mode.dotClock = long(clock)
++ new_mode.dotClock = int(clock)
+ new_mode.hSyncStart = int(w+xFront)
+ new_mode.hSyncEnd = int(w+xFront+xSync)
+ new_mode.hTotal = int(xTotal)
+Index: b/xpra/x11/gtk3/gdk_bindings.pyx
+===================================================================
+--- a/xpra/x11/gtk3/gdk_bindings.pyx
++++ b/xpra/x11/gtk3/gdk_bindings.pyx
+@@ -519,7 +519,7 @@ def get_xatom(str_or_xatom):
+ return gdk_x11_get_xatom_by_name(b)
+
+ cdef GdkAtom get_gdkatom(display_source, xatom):
+- if long(xatom) > long(2) ** 32:
++ if int(xatom) > int(2) ** 32:
+ raise Exception("weirdly huge purported xatom: %s" % xatom)
+ if xatom==0:
+ return GDK_NONE
+@@ -1207,7 +1207,7 @@ cdef parse_xevent(GdkXEvent * e_gdk) wit
+ pyev.focus = e.xcrossing.focus
+ elif etype == ClientMessage:
+ pyev.window = _gw(d, e.xany.window)
+- if long(e.xclient.message_type) > (long(2) ** 32):
++ if int(e.xclient.message_type) > (int(2) ** 32):
+ log.warn("Xlib claims that this ClientEvent's 32-bit "
+ + "message_type is %s. "
+ + "Note that this is >2^32. "
diff -Nru xpra-3.1.5+dfsg1/debian/patches/py315-avcodec-free-context.patch
xpra-3.1.5+dfsg1/debian/patches/py315-avcodec-free-context.patch
--- xpra-3.1.5+dfsg1/debian/patches/py315-avcodec-free-context.patch
1970-01-01 01:00:00.000000000 +0100
+++ xpra-3.1.5+dfsg1/debian/patches/py315-avcodec-free-context.patch
2026-09-10 17:28:44.000000000 +0200
@@ -0,0 +1,35 @@
+Description: #4216 minimal patch for re-enabling decoder and swscale with
ffmpeg v7
+Author: Antoine Martin <[email protected]>
+Origin: upstream,
https://github.com/Xpra-org/xpra/commit/ccfbf4ea1fe6363206ab937107b220681cf2ad79
+Bug: https://github.com/Xpra-org/xpra/issues/4216
+Applied-Upstream: v3.1.9
+Index: b/xpra/codecs/dec_avcodec2/decoder.pyx
+===================================================================
+--- a/xpra/codecs/dec_avcodec2/decoder.pyx
++++ b/xpra/codecs/dec_avcodec2/decoder.pyx
+@@ -90,10 +90,10 @@ cdef extern from "libavcodec/avcodec.h":
+ #init and free:
+ const AVCodec *avcodec_find_decoder(AVCodecID id)
+ AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
++ void avcodec_free_context(AVCodecContext **context)
+ int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec,
AVDictionary **options)
+ AVFrame* av_frame_alloc()
+ void av_frame_free(AVFrame **frame)
+- int avcodec_close(AVCodecContext *avctx)
+
+ #actual decoding:
+ AVPacket *av_packet_alloc() nogil
+@@ -417,12 +417,7 @@ cdef class Decoder:
+ img.clone_pixel_data()
+ log("clean_decoder() freeing AVCodecContext: %#x", <uintptr_t>
self.codec_ctx)
+ if self.codec_ctx!=NULL:
+- r = avcodec_close(self.codec_ctx)
+- if r!=0:
+- log.error("Error: failed to close decoder context %#x:",
<uintptr_t> self.codec_ctx)
+- log.error(" %s", av_error_str(r))
+- av_free(self.codec_ctx)
+- self.codec_ctx = NULL
++ avcodec_free_context(&self.codec_ctx)
+ log("clean_decoder() done")
+
+ def __repr__(self): #@DuplicatedSignature
diff -Nru xpra-3.1.5+dfsg1/debian/patches/py315-buffer-protocol.patch
xpra-3.1.5+dfsg1/debian/patches/py315-buffer-protocol.patch
--- xpra-3.1.5+dfsg1/debian/patches/py315-buffer-protocol.patch 1970-01-01
01:00:00.000000000 +0100
+++ xpra-3.1.5+dfsg1/debian/patches/py315-buffer-protocol.patch 2026-09-10
17:28:44.000000000 +0200
@@ -0,0 +1,88 @@
+Author: Maximiliano Curia <[email protected]>
+Description: fix build with Python 3.14+ (old buffer API removal)
+ PyObject_AsReadBuffer()/PyObject_AsWriteBuffer() were removed from the
+ Python C API in 3.14. Replace their use with the modern buffer protocol
+ (PyObject_GetBuffer()/PyBuffer_Release()).
+Forwarded: no
+Index: b/xpra/buffers/buffers.c
+===================================================================
+--- a/xpra/buffers/buffers.c
++++ b/xpra/buffers/buffers.c
+@@ -32,6 +32,7 @@ PyObject *_memory_as_pybuffer(void *ptr,
+
+ int _object_as_buffer(PyObject *obj, const void ** buffer, Py_ssize_t *
buffer_len) {
+ Py_buffer *rpybuf;
++ Py_buffer view;
+ if (PyMemoryView_Check(obj)) {
+ rpybuf = PyMemoryView_GET_BUFFER(obj);
+ if (rpybuf->buf==NULL)
+@@ -40,11 +41,19 @@ int _object_as_buffer(PyObject *obj, con
+ *buffer_len = rpybuf->len;
+ return 0;
+ }
+- return PyObject_AsReadBuffer(obj, buffer, buffer_len);
++ // the old buffer API (PyObject_AsReadBuffer) was removed in Python 3.14,
++ // use the new buffer protocol instead:
++ if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE))
++ return -1;
++ buffer[0] = view.buf;
++ *buffer_len = view.len;
++ PyBuffer_Release(&view);
++ return 0;
+ }
+
+ int _object_as_write_buffer(PyObject *obj, void ** buffer, Py_ssize_t *
buffer_len) {
+ Py_buffer *wpybuf;
++ Py_buffer view;
+ if (PyMemoryView_Check(obj)) {
+ wpybuf = PyMemoryView_GET_BUFFER(obj);
+ if (wpybuf->buf==NULL)
+@@ -53,5 +62,12 @@ int _object_as_write_buffer(PyObject *ob
+ *buffer_len = wpybuf->len;
+ return 0;
+ }
+- return PyObject_AsWriteBuffer(obj, buffer, buffer_len);
++ // the old buffer API (PyObject_AsWriteBuffer) was removed in Python 3.14,
++ // use the new buffer protocol instead:
++ if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE))
++ return -1;
++ buffer[0] = view.buf;
++ *buffer_len = view.len;
++ PyBuffer_Release(&view);
++ return 0;
+ }
+Index: b/xpra/gtk_common/gtk3/gdk_atoms.pyx
+===================================================================
+--- a/xpra/gtk_common/gtk3/gdk_atoms.pyx
++++ b/xpra/gtk_common/gtk3/gdk_atoms.pyx
+@@ -16,7 +16,9 @@ from libc.stdint cimport uintptr_t #pyl
+
+
+ cdef extern from "Python.h":
+- int PyObject_AsReadBuffer(object obj, void ** buffer, Py_ssize_t *
buffer_len) except -1
++ int PyObject_GetBuffer(object obj, Py_buffer *view, int flags) except -1
++ void PyBuffer_Release(Py_buffer *view)
++ int PyBUF_SIMPLE
+
+ cdef extern from "gtk-3.0/gdk/gdk.h":
+ ctypedef void* GdkAtom
+@@ -36,7 +38,10 @@ def gdk_atom_objects_from_gdk_atom_array
+ cdef gchar* name
+ cdef Py_ssize_t array_len_bytes = 0
+ cdef uintptr_t gdk_atom_value = 0
+- assert PyObject_AsReadBuffer(atom_string, <const void**> &array,
&array_len_bytes)==0
++ cdef Py_buffer py_buf
++ assert PyObject_GetBuffer(atom_string, &py_buf, PyBUF_SIMPLE)==0
++ array = <const GdkAtom*> py_buf.buf
++ array_len_bytes = py_buf.len
+ cdef unsigned int array_len = array_len_bytes // sizeof(GdkAtom)
+ objects = []
+ cdef unsigned int i
+@@ -51,6 +56,7 @@ def gdk_atom_objects_from_gdk_atom_array
+ str_name = bytestostr(name)
+ gdk_atom = Gdk.Atom.intern(str_name, False)
+ objects.append(gdk_atom)
++ PyBuffer_Release(&py_buf)
+ return objects
+
+ def gdk_atom_array_from_atoms(atoms):
diff -Nru
xpra-3.1.5+dfsg1/debian/patches/py315-gdk-bindings-pygobject-include.patch
xpra-3.1.5+dfsg1/debian/patches/py315-gdk-bindings-pygobject-include.patch
--- xpra-3.1.5+dfsg1/debian/patches/py315-gdk-bindings-pygobject-include.patch
1970-01-01 01:00:00.000000000 +0100
+++ xpra-3.1.5+dfsg1/debian/patches/py315-gdk-bindings-pygobject-include.patch
2026-09-10 17:28:44.000000000 +0200
@@ -0,0 +1,16 @@
+Author: Maximiliano Curia <[email protected]>
+Description: fix FTBFS against current pygobject (pygobject-types.h split)
+Forwarded: no
+Index: b/setup.py
+===================================================================
+--- a/setup.py
++++ b/setup.py
+@@ -1919,7 +1919,7 @@ if gtk_x11_ENABLED:
+ ))
+ cython_add(Extension("xpra.x11.gtk3.gdk_bindings",
+ ["xpra/x11/gtk3/gdk_bindings.pyx",
"xpra/x11/gtk3/gdk_x11_macros.c"],
+- **pkgconfig("gdk-3.0", "xdamage")
++ **pkgconfig("gdk-3.0", "xdamage", "pygobject-3.0")
+ ))
+
+ else:
diff -Nru xpra-3.1.5+dfsg1/debian/patches/py315-setuptools-shim.patch
xpra-3.1.5+dfsg1/debian/patches/py315-setuptools-shim.patch
--- xpra-3.1.5+dfsg1/debian/patches/py315-setuptools-shim.patch 1970-01-01
01:00:00.000000000 +0100
+++ xpra-3.1.5+dfsg1/debian/patches/py315-setuptools-shim.patch 2026-09-10
17:28:44.000000000 +0200
@@ -0,0 +1,17 @@
+Author: Maximiliano Curia <[email protected]>
+Description: fix build with Python 3.12+ (distutils removal)
+Forwarded: no
+Index: b/setup.py
+===================================================================
+--- a/setup.py
++++ b/setup.py
+@@ -15,6 +15,9 @@ import glob
+ import shutil
+ import os.path
+
++# distutils was removed from the stdlib in Python 3.12+;
++# importing setuptools first makes it provide a compatible shim:
++import setuptools
+ from distutils.core import setup
+ from distutils.extension import Extension
+ from distutils.command.build import build
diff -Nru xpra-3.1.5+dfsg1/debian/patches/py315-x265-tsa-r.patch
xpra-3.1.5+dfsg1/debian/patches/py315-x265-tsa-r.patch
--- xpra-3.1.5+dfsg1/debian/patches/py315-x265-tsa-r.patch 1970-01-01
01:00:00.000000000 +0100
+++ xpra-3.1.5+dfsg1/debian/patches/py315-x265-tsa-r.patch 2026-09-10
17:28:44.000000000 +0200
@@ -0,0 +1,25 @@
+Author: Maximiliano Curia <[email protected]>
+Description: fix build against current libx265 (NAL_UNIT_CODED_SLICE_TLA_R
renamed)
+Forwarded: no
+Index: b/xpra/codecs/enc_x265/encoder.pyx
+===================================================================
+--- a/xpra/codecs/enc_x265/encoder.pyx
++++ b/xpra/codecs/enc_x265/encoder.pyx
+@@ -36,7 +36,7 @@ cdef extern from "x265.h":
+ int NAL_UNIT_CODED_SLICE_TRAIL_N
+ int NAL_UNIT_CODED_SLICE_TRAIL_R
+ int NAL_UNIT_CODED_SLICE_TSA_N
+- int NAL_UNIT_CODED_SLICE_TLA_R
++ int NAL_UNIT_CODED_SLICE_TSA_R
+ int NAL_UNIT_CODED_SLICE_STSA_N
+ int NAL_UNIT_CODED_SLICE_STSA_R
+ int NAL_UNIT_CODED_SLICE_RADL_N
+@@ -234,7 +234,7 @@ NAL_TYPES = {
+ NAL_UNIT_CODED_SLICE_TRAIL_N : "CODED_SLICE_TRAIL_N",
+ NAL_UNIT_CODED_SLICE_TRAIL_R : "CODED_SLICE_TRAIL_R",
+ NAL_UNIT_CODED_SLICE_TSA_N : "CODED_SLICE_TSA_N",
+- NAL_UNIT_CODED_SLICE_TLA_R : "CODED_SLICE_TLA_R",
++ NAL_UNIT_CODED_SLICE_TSA_R : "CODED_SLICE_TSA_R",
+ NAL_UNIT_CODED_SLICE_STSA_N : "CODED_SLICE_STSA_N",
+ NAL_UNIT_CODED_SLICE_STSA_R : "CODED_SLICE_STSA_R",
+ NAL_UNIT_CODED_SLICE_RADL_N : "CODED_SLICE_RADL_N",
diff -Nru xpra-3.1.5+dfsg1/debian/patches/quality-levels.patch
xpra-3.1.5+dfsg1/debian/patches/quality-levels.patch
--- xpra-3.1.5+dfsg1/debian/patches/quality-levels.patch 2023-09-15
13:15:05.000000000 +0200
+++ xpra-3.1.5+dfsg1/debian/patches/quality-levels.patch 2026-09-10
17:28:44.000000000 +0200
@@ -3,10 +3,11 @@
Author: Dmitry Smirnov <[email protected]>
Description: add more quality levels to menu; show quality percentage.
---- a/xpra/client/gtk_base/gtk_tray_menu_base.py
-+++ b/xpra/client/gtk_base/gtk_tray_menu_base.py
-@@ -63,18 +63,21 @@
- BANDWIDTH_MENU_OPTIONS = get_bandwidth_menu_options()
+Index: xpra/xpra/client/gtk_base/gtk_tray_menu_base.py
+===================================================================
+--- xpra.orig/xpra/client/gtk_base/gtk_tray_menu_base.py
++++ xpra/xpra/client/gtk_base/gtk_tray_menu_base.py
+@@ -71,16 +71,19 @@ BANDWIDTH_MENU_OPTIONS = get_bandwidth_m
LOSSLESS = "Lossless"
QUALITY_OPTIONS_COMMON = {
@@ -31,4 +32,3 @@
QUALITY_OPTIONS[100] = LOSSLESS
- SPEED_OPTIONS_COMMON = {
diff -Nru xpra-3.1.5+dfsg1/debian/patches/series
xpra-3.1.5+dfsg1/debian/patches/series
--- xpra-3.1.5+dfsg1/debian/patches/series 2023-09-15 13:15:05.000000000
+0200
+++ xpra-3.1.5+dfsg1/debian/patches/series 2026-09-10 17:28:44.000000000
+0200
@@ -2,6 +2,7 @@
## Fixes
Xorg-path.patch
build-hurd.patch
+py315-setuptools-shim.patch
## Misc.
buildinfo.patch
@@ -14,3 +15,8 @@
reproducible-build.patch
get-server_capabilities-with-str-key.patch
+cython-3.1-compat.patch
+py315-buffer-protocol.patch
+py315-gdk-bindings-pygobject-include.patch
+py315-x265-tsa-r.patch
+py315-avcodec-free-context.patch
diff -Nru xpra-3.1.5+dfsg1/debian/rules xpra-3.1.5+dfsg1/debian/rules
--- xpra-3.1.5+dfsg1/debian/rules 2023-09-15 13:15:05.000000000 +0200
+++ xpra-3.1.5+dfsg1/debian/rules 2026-09-10 17:28:44.000000000 +0200
@@ -10,7 +10,7 @@
ifneq (,$(filter i386,$(DEB_HOST_ARCH)))
EXTRA_BUILDOPTS := --without-csc_swscale --without-enc_ffmpeg
--without-dec_avcodec2
endif
-BUILDOPTS= --with-verbose --with-Xdummy --without-Xdummy_wrapper --with-html5
--without-minify --without-html5_gzip $(EXTRA_BUILDOPTS)
+BUILDOPTS= --with-verbose --with-Xdummy --without-Xdummy_wrapper --with-html5
--without-minify --without-html5_gzip --without-enc_ffmpeg $(EXTRA_BUILDOPTS)
export PYBUILD_CONFIG_ARGS=$(BUILDOPTS)
export PYBUILD_BUILD_ARGS=$(BUILDOPTS)