Re: [PATCH] setup: add flag to build_ext to control building zstd

2016-11-18 Thread Augie Fackler
On Thu, Nov 17, 2016 at 08:14:23PM -0800, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc 
> # Date 1479442150 28800
> #  Thu Nov 17 20:09:10 2016 -0800
> # Node ID 0c36116df0e58677f78ff5ca19ed0e496fc12c11
> # Parent  41a8106789cae9716c39d8381fa5da1d3ea0d74b
> setup: add flag to build_ext to control building zstd

queued

>
> Downstream packagers will inevitably want to disable building the
> vendored python-zstandard Python package. Rather than force them
> to patch setup.py, let's give them a knob to use.
>
> distutils Command classes support defining custom options. It requires
> setting certain class attributes (yes, class attributes: instance
> attributes don't work because the class type is consulted before it
> is instantiated).
>
> We already have a custom child class of build_ext, so we set these
> class attributes, implement some scaffolding, and override
> build_extensions to filter the Extension instance for the zstd
> extension if the `--no-zstd` argument is specified.
>
> Example usage:
>
>   $ python setup.py build_ext --no-zstd
>
> diff --git a/setup.py b/setup.py
> --- a/setup.py
> +++ b/setup.py
> @@ -276,7 +276,30 @@ class hgdist(Distribution):
>  # too late for some cases
>  return not self.pure and Distribution.has_ext_modules(self)
>
> +# This is ugly as a one-liner. So use a variable.
> +buildextnegops = dict(getattr(build_ext, 'negative_options', {}))
> +buildextnegops['no-zstd'] = 'zstd'
> +
>  class hgbuildext(build_ext):
> +user_options = build_ext.user_options + [
> +('zstd', None, 'compile zstd bindings [default]'),
> +('no-zstd', None, 'do not compile zstd bindings'),
> +]
> +
> +boolean_options = build_ext.boolean_options + ['zstd']
> +negative_opt = buildextnegops
> +
> +def initialize_options(self):
> +self.zstd = True
> +return build_ext.initialize_options(self)
> +
> +def build_extensions(self):
> +# Filter out zstd if disabled via argument.
> +if not self.zstd:
> +self.extensions = [e for e in self.extensions
> +   if e.name != 'mercurial.zstd']
> +
> +return build_ext.build_extensions(self)
>
>  def build_extension(self, ext):
>  try:
> ___
> Mercurial-devel mailing list
> Mercurial-devel@mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


[PATCH] setup: add flag to build_ext to control building zstd

2016-11-17 Thread Gregory Szorc
# HG changeset patch
# User Gregory Szorc 
# Date 1479442150 28800
#  Thu Nov 17 20:09:10 2016 -0800
# Node ID 0c36116df0e58677f78ff5ca19ed0e496fc12c11
# Parent  41a8106789cae9716c39d8381fa5da1d3ea0d74b
setup: add flag to build_ext to control building zstd

Downstream packagers will inevitably want to disable building the
vendored python-zstandard Python package. Rather than force them
to patch setup.py, let's give them a knob to use.

distutils Command classes support defining custom options. It requires
setting certain class attributes (yes, class attributes: instance
attributes don't work because the class type is consulted before it
is instantiated).

We already have a custom child class of build_ext, so we set these
class attributes, implement some scaffolding, and override
build_extensions to filter the Extension instance for the zstd
extension if the `--no-zstd` argument is specified.

Example usage:

  $ python setup.py build_ext --no-zstd

diff --git a/setup.py b/setup.py
--- a/setup.py
+++ b/setup.py
@@ -276,7 +276,30 @@ class hgdist(Distribution):
 # too late for some cases
 return not self.pure and Distribution.has_ext_modules(self)
 
+# This is ugly as a one-liner. So use a variable.
+buildextnegops = dict(getattr(build_ext, 'negative_options', {}))
+buildextnegops['no-zstd'] = 'zstd'
+
 class hgbuildext(build_ext):
+user_options = build_ext.user_options + [
+('zstd', None, 'compile zstd bindings [default]'),
+('no-zstd', None, 'do not compile zstd bindings'),
+]
+
+boolean_options = build_ext.boolean_options + ['zstd']
+negative_opt = buildextnegops
+
+def initialize_options(self):
+self.zstd = True
+return build_ext.initialize_options(self)
+
+def build_extensions(self):
+# Filter out zstd if disabled via argument.
+if not self.zstd:
+self.extensions = [e for e in self.extensions
+   if e.name != 'mercurial.zstd']
+
+return build_ext.build_extensions(self)
 
 def build_extension(self, ext):
 try:
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel