{
"info": {
"author": "Benjamin Staffin",
"author_email": "benley@gmail.com",
"bugtrack_url": null,
"classifiers": [],
"description": "Butcher\n=======\n\n**OBSOLETE**: you don't want to use this. Use `Bazel `_\ninstead.\n\nThis was a project I worked on in 2013 at Cloudscaling_. The goal was to have a\nbuild system for projects spanning multiple source repositories, with a rule\nlanguage and operational semantics similar to `Bazel's BUILD files`_ and an\nemphasis on correctness and repeatability. Bazel was not yet released to the\npublic at that time, and I was not aware of any other build systems that were\nneatly integrated with a version control system, or which directly addressed\ncross-project source dependencies, so I started afresh.\n\nButcher makes various assumptions that make it impractical to use as-is:\n\n- Assumes that all your sources are in git repositories\n- Assumes all your git repositories share the same base url, unless you map\n them all to URLs with ``--map_repo``\n- Assumes that all the projects you want to build have butcher-style\n BUILD files in their source repo\n\nI was a relatively inexperienced programmer back then, so Butcher is also rife\nwith design decisions that I would make very differently now, were I to start a\nproject like this again. Nevertheless, I did learn a lot from this project, and\nButcher was quite useful as an internal build tool at Cloudscaling_ for our\nvarious projects.\n\nButcher target addresses are very much like Bazel's `target labels`_ with an\nadditional syntax for specifying a git ref in a remote repository:\n\n::\n\n //repo_name[git_ref]/dir/in/project:target\n\nIf the ``[git_ref]`` part of an address is omitted, butcher will use the\nvalue specified with ``--default_ref`` on the commandline. By default\nthat is ``HEAD``, which usually implies ``master`` in a remote git\nrepository.\n\nTo associate any ``//repo_name`` with an actual git repository URL, use\nanother commandline flag: ``--map_repo=:``.\n\nBazel has a much better and more thorough design for working with remote\nproject repositories; compare to the bazel docs about `working with external\ndependencies`_ for more information.\n\nThere are a few types of build rules implemented in Butcher. Most of these have\nreasonably good documentation as docstrings in their implementation classes,\nand it should be fairly obvious how one might implement additional rule types\nafter looking through a few of the existing rules.\n\n- genrule_ runs arbitrary shell commands as a build step that produces the\n stated outputs. This includes a Makefile-like sublanguage for cmdline\n expansion when defining targets (`see the source for details\n `_)\n\n- gendeb_ packages the output of other rules into Debian packages. This\n assumes that you have fpm_ installed locally, which is not ideal.\n\n- filegroup_ collects files (sources, or outputs of other rules)\n and gives them a collective name, which can then be used as an input to\n other rules.\n\n- pkgfilegroup_ is similar to filegroup, but it adds metadata that is\n specifically useful as inputs to rules like gendeb, and a map for setting\n file ownership and permissions of the files in the eventual output package.\n\n- pkg_symlink_ appears to be unfinished, but it should be a way of putting a\n symlink in a gendeb package.\n\n- virtual_ targets can be used to group a bunch of other targets together as a\n single buildable address.\n\n.. _genrule: https://github.com/benley/butcher/blob/master/butcher/targets/genrule.py#L177\n.. _gendeb: https://github.com/benley/butcher/blob/master/butcher/targets/gendeb.py#L222\n.. _fpm: https://github.com/jordansissel/fpm\n.. _filegroup: https://github.com/benley/butcher/blob/master/butcher/targets/filegroup.py#L15\n.. _pkgfilegroup: https://github.com/benley/butcher/blob/master/butcher/targets/pkgfilegroup.py#L38\n.. _pkg_symlink: https://github.com/benley/butcher/blob/master/butcher/targets/pkg_symlink.py#L10\n.. _virtual: https://github.com/benley/butcher/blob/master/butcher/targets/virtual.py#L18\n\nButcher's original project README follows below:\n\n--------------\n\nButcher is a software build system in the spirit of Pants_, Buck_, and Blaze_.\n\nLike other similar tools, Butcher encourages the creation of small reusable\nmodules and focuses on improving efficiency and speed of build processes. What\nsets Butcher apart is its integration with distributed git repositories rather\nthan relying on large unified codebases.\n\nButcher uses a build cache to speed up incremental builds and avoid repeated\nwork. The cache stores objects based on a combined checksum (referred to in the\ncode and documentation as a *metahash*) of all the inputs used to produce them,\nand dedupes objects by each file's own checksum. This system makes extensive\nuse of hardlinks, so it is beneficial for Butcher to have its various working\ndirectories (cache, git clients, build area) on the same filesystem.\n\nLimitations\n-----------\n\nGeneral\n~~~~~~~\n\n- Builds are currently sequential, not parallel.\n- Builds use the same build area until 'butcher clean' is run, which\n can potentially mask or introduce bugs.\n\nCache\n~~~~~\n\n- Caching is keyed by metahash, but retrieval is done per-file.\n- The cache does not keep checksums of individual files for\n verification. It should.\n- Cache is local-only, not networked at all.\n\nUpcoming features\n-----------------\n\n- Everything\n\n.. _Bazel's BUILD files: https://www.bazel.io/versions/master/docs/build-ref.html\n.. _Cloudscaling: https://cloudscaling.com/\n.. _target labels: https://www.bazel.io/versions/master/docs/build-ref.html#labels\n.. _working with external dependencies: https://www.bazel.io/versions/master/docs/external.html\n.. _Pants: http://pantsbuild.github.io/\n.. _Buck: http://facebook.github.io/buck/\n.. _Blaze: http://google-engtools.blogspot.com/2011/08/build-in-cloud-how-build-system-works.html",
"description_content_type": null,
"docs_url": null,
"download_url": null,
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/benley/butcher",
"keywords": null,
"license": "Apache-2",
"maintainer": null,
"maintainer_email": null,
"name": "butcher",
"package_url": "https://pypi.org/project/butcher/",
"platform": "UNKNOWN",
"project_url": "https://pypi.org/project/butcher/",
"project_urls": {
"Homepage": "https://github.com/benley/butcher"
},
"release_url": "https://pypi.org/project/butcher/0.2.13/",
"requires_dist": null,
"requires_python": null,
"summary": "General-purpose build system for projects spanning multiple git repos",
"version": "0.2.13"
},
"last_serial": 2376729,
"releases": {
"0.2.13": [
{
"comment_text": "",
"digests": {
"md5": "3eaea442dc81f862b8529b8e3c8b2820",
"sha256": "5a4c3507b920aec462f73bb906252b840d812c744cc3daf95869c42e704e0386"
},
"downloads": -1,
"filename": "butcher-0.2.13-py2-none-any.whl",
"has_sig": false,
"md5_digest": "3eaea442dc81f862b8529b8e3c8b2820",
"packagetype": "bdist_wheel",
"python_version": "py2",
"requires_python": null,
"size": 43581,
"upload_time": "2016-10-02T03:28:30",
"url": "https://files.pythonhosted.org/packages/df/76/ab99e94b6cce437676f436175ea87669ff3afee17da13ace1e35568e788e/butcher-0.2.13-py2-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "4ceee18bfb3d105ed86b8cb29e5dacdf",
"sha256": "d919702644d32130d0e6e881883ff391aa89aed19ca339bf2044afcc5c36f9f7"
},
"downloads": -1,
"filename": "butcher-0.2.13-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "4ceee18bfb3d105ed86b8cb29e5dacdf",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 43585,
"upload_time": "2016-10-03T00:50:45",
"url": "https://files.pythonhosted.org/packages/49/0f/cecd66b6dcbde2587d75e6572f4849745050279b12327e74a43c8249f364/butcher-0.2.13-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "c46bb945432f89c7c76138f4ed05c4a8",
"sha256": "e86169d7e0b26044f6da3bf55c43e2eac81e70708219bb6e36d209c6da0b439f"
},
"downloads": -1,
"filename": "butcher-0.2.13.tar.gz",
"has_sig": false,
"md5_digest": "c46bb945432f89c7c76138f4ed05c4a8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 38199,
"upload_time": "2016-10-02T03:27:53",
"url": "https://files.pythonhosted.org/packages/56/32/2c7b0868e3e06a105c7509260df76d326ed70a114ca6a67f0dfce1e03b08/butcher-0.2.13.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "3eaea442dc81f862b8529b8e3c8b2820",
"sha256": "5a4c3507b920aec462f73bb906252b840d812c744cc3daf95869c42e704e0386"
},
"downloads": -1,
"filename": "butcher-0.2.13-py2-none-any.whl",
"has_sig": false,
"md5_digest": "3eaea442dc81f862b8529b8e3c8b2820",
"packagetype": "bdist_wheel",
"python_version": "py2",
"requires_python": null,
"size": 43581,
"upload_time": "2016-10-02T03:28:30",
"url": "https://files.pythonhosted.org/packages/df/76/ab99e94b6cce437676f436175ea87669ff3afee17da13ace1e35568e788e/butcher-0.2.13-py2-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "4ceee18bfb3d105ed86b8cb29e5dacdf",
"sha256": "d919702644d32130d0e6e881883ff391aa89aed19ca339bf2044afcc5c36f9f7"
},
"downloads": -1,
"filename": "butcher-0.2.13-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "4ceee18bfb3d105ed86b8cb29e5dacdf",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 43585,
"upload_time": "2016-10-03T00:50:45",
"url": "https://files.pythonhosted.org/packages/49/0f/cecd66b6dcbde2587d75e6572f4849745050279b12327e74a43c8249f364/butcher-0.2.13-py2.py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "c46bb945432f89c7c76138f4ed05c4a8",
"sha256": "e86169d7e0b26044f6da3bf55c43e2eac81e70708219bb6e36d209c6da0b439f"
},
"downloads": -1,
"filename": "butcher-0.2.13.tar.gz",
"has_sig": false,
"md5_digest": "c46bb945432f89c7c76138f4ed05c4a8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 38199,
"upload_time": "2016-10-02T03:27:53",
"url": "https://files.pythonhosted.org/packages/56/32/2c7b0868e3e06a105c7509260df76d326ed70a114ca6a67f0dfce1e03b08/butcher-0.2.13.tar.gz"
}
]
}