{ "info": { "author": "Chris Coetzee", "author_email": "chriscz93@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Build Tools" ], "description": "fabricate\n=========\n\n|Build Status|\n\n**fabricate** is a build tool that finds dependencies automatically for\nany language. It's small and just works. No hidden stuff behind your\nback. It was inspired by Bill McCloskey's make replacement, memoize, but\nfabricate works on\n`Windows `__\nas well as Linux.\n\n`Get fabricate.py\nnow `__,\nlearn `how it\nworks `__, see\nhow to get `in-Python\nhelp `__, or discuss\nit on the `mailing\nlist `__.\n\nFeatures\n--------\n\n- Never have to list dependencies.\n- Never have to specify cleanup rules.\n- The tool is a single Python file.\n- It uses MD5 (not timestamps) to check inputs and outputs.\n- You can learn it all in about 10 minutes.\n- You can still read your build scripts 3 months later.\n- Now supports `parallel\n building `__\n\nShow me an example!\n-------------------\n\n.. code:: python\n\n from fabricate import *\n\n sources = ['program', 'util']\n\n def build():\n compile()\n link()\n\n def compile():\n for source in sources:\n run('gcc', '-c', source+'.c')\n\n def link():\n objects = [s+'.o' for s in sources]\n run('gcc', '-o', 'program', objects)\n\n def clean():\n autoclean()\n\n main()\n\nThis isn't the simplest build script you can make with fabricate (see\n`other\nexamples `__),\nbut it's surprisingly close to some of the more complex scripts we use\nin real life. Things to note:\n\n- It's an **ordinary Python file.** Use the clarity and power of\n Python.\n- **No implicit stuff** like CCFLAGS.\n- **Explicit is better:** you tell fabricate what commands to run, and\n it runs them -- but only if their inputs or outputs have changed.\n- Where you'd use targets in make, you just **use Python functions** --\n ``build()`` is the default.\n- You can **easily \"autoclean\"** any build outputs -- fabricate finds\n build outputs automatically, just like it finds dependencies.\n\nUsing fabricate options\n-----------------------\n\nThe best way to get started is to take one of the examples linked above\nand modify it to suit your project. But you're bound to want to use some\nof the options built into fabricate. To get a list of these:\n\n::\n\n from fabricate import *\n\n help(main)\n help(Builder)\n\nUsing fabricate as a script, a la memoize\n-----------------------------------------\n\nYou can also use fabricate.py as a script and enter commands directly on\nthe command line (see `command line\noptions `__).\nIn the following, each ``gcc`` command will only be run if its\ndependencies have changed:\n\n::\n\n fabricate.py gcc -c program.c\n fabricate.py gcc -c util.c\n fabricate.py gcc -o program program.o util.o\n\nWhy not use make?\n-----------------\n\nFor a start, fabricate won't say \"``*** missing separator``\" if you use\nspaces instead of tabs. And you'll never need to enter dependencies\nmanually, like this:\n\n::\n\n files.o : files.c defs.h buffer.h command.h\n cc -c files.c\n\nInstead, you just tell fabricate to ``run('cc', 'file.c')`` and it'll\nfigure out what that command's inputs and outputs are. Next time you\nbuild, the command will only get run if its inputs have changed, or if\nits outputs have been modified or aren't there.\n\nAnd you can use Python's readable string functions instead of producing\nwrite-only make rules, like this one from the make docs:\n\n::\n\n %.d : %.c\n @set -e; rm -f $@; $(CC) -M $(CPPFLAGS) $< > $@.$$$$; \\\n sed 's,\\($*\\)\\.o[ :]*,\\1.o $@ : ,g' < $@.$$$$ > $@; rm -f $@.$$$$\n\nWhat about SCons?\n-----------------\n\nSCons tempted us at first too. It's Python ... isn't it? But just before\nit sucks you in, you realise it's actually `quite\nhard `__ to do simple\nthings explicitly.\n\nPython says that *explicit is better than implicit* for a reason, and\nwith fabricate, we've made it so you tell it what you want. It won't do\nthings behind your back based on the `83 different\ntools `__ it may or\nmay not know about.\n\nCredits\n-------\n\nfabricate is inspired by `Bill McCloskey's\nmemoize `__, but\nfabricate works under Windows as well by using file access times instead\nof strace if strace is not available on your file system. Read more\nabout `how fabricate\nworks. `__\n\nfabricate was originally developed by the B Hoyts at `Brush\nTechnology `__ for in-house use, and we then\nreleased into the wild. It now has a small but dedicated user base and\nis actively being maintained and improved by Simon Alford, with help\nfrom other fabricate users.\n\nLicense\n-------\n\nLike memoize, fabricate is released under a `New BSD\nlicense `__.\nfabricate is Copyright (c) 2009 Brush Technology.\n\n.. |Build Status| image:: https://travis-ci.org/chriscz/fabricate.svg?branch=master\n :target: https://travis-ci.org/chriscz/fabricate", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/SimonAlfie/fabricate/", "keywords": "fabricate make python build", "license": "New BSD License", "maintainer": "", "maintainer_email": "", "name": "fabricate", "package_url": "https://pypi.org/project/fabricate/", "platform": "Operating System :: Microsoft :: Windows", "project_url": "https://pypi.org/project/fabricate/", "project_urls": { "Homepage": "https://github.com/SimonAlfie/fabricate/" }, "release_url": "https://pypi.org/project/fabricate/1.29.0/", "requires_dist": null, "requires_python": "", "summary": "The better build tool. Finds dependencies automatically for any language.", "version": "1.29.0" }, "last_serial": 2848911, "releases": { "(latest release)": [ { "comment_text": "", "digests": { "md5": "e02128a8fa42a94b950998cb9a463b46", "sha256": "3d52f0a4b42838949893b6d4f101efa419ca11ac042abc14fcda33624576467d" }, "downloads": -1, "filename": "fabricate-1.26.tar.gz", "has_sig": false, "md5_digest": "e02128a8fa42a94b950998cb9a463b46", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20337, "upload_time": "2014-05-14T14:51:38", "url": "https://files.pythonhosted.org/packages/13/5e/8bf8fc0f85cdef85cae6d19befc9a4301e4dbd2538ed24575e40e491f91f/fabricate-1.26.tar.gz" } ], "1.29.0": [ { "comment_text": "", "digests": { "md5": "3b502192a3c59ade5f6712e4b6f4287c", "sha256": "599c94243ae9ece0778989ed3f557f3769ac5b25618fb28ff3a00c700373cc2c" }, "downloads": -1, "filename": "fabricate-1.29.0.tar.gz", "has_sig": false, "md5_digest": "3b502192a3c59ade5f6712e4b6f4287c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26982, "upload_time": "2017-05-03T11:59:06", "url": "https://files.pythonhosted.org/packages/2d/8c/54300f46c6eed4494b29a32c8a1f1efa2f8f773c13cacaeda04e510b7c42/fabricate-1.29.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3b502192a3c59ade5f6712e4b6f4287c", "sha256": "599c94243ae9ece0778989ed3f557f3769ac5b25618fb28ff3a00c700373cc2c" }, "downloads": -1, "filename": "fabricate-1.29.0.tar.gz", "has_sig": false, "md5_digest": "3b502192a3c59ade5f6712e4b6f4287c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26982, "upload_time": "2017-05-03T11:59:06", "url": "https://files.pythonhosted.org/packages/2d/8c/54300f46c6eed4494b29a32c8a1f1efa2f8f773c13cacaeda04e510b7c42/fabricate-1.29.0.tar.gz" } ] }