<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>
<channel>
	<title>Comments on: My Experience Writing a Build System</title>
	<atom:link href="http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/</link>
	<description></description>
	<pubDate>Tue, 06 Jan 2009 13:28:45 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: dehande</title>
		<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/comment-page-1/#comment-20990</link>
		<dc:creator>dehande</dc:creator>
		<pubDate>Thu, 10 Jul 2008 13:06:28 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/#comment-20990</guid>
		<description>So you detect changes and remake things only as necessary. For compilation this might make sense, because you edit code and recompile a lot and it’s tedious to wait.

The pure dependency based is the reason why make is much better tool than say ant, nant, etc…

It’s great when properly written makefile completes in</description>
		<content:encoded><![CDATA[<p>So you detect changes and remake things only as necessary. For compilation this might make sense, because you edit code and recompile a lot and it’s tedious to wait.</p>

<p>The pure dependency based is the reason why make is much better tool than say ant, nant, etc…</p>

<p>It’s great when properly written makefile completes in</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Max Ischenko</title>
		<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/comment-page-1/#comment-20560</link>
		<dc:creator>Max Ischenko</dc:creator>
		<pubDate>Tue, 08 Jul 2008 07:24:45 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/#comment-20560</guid>
		<description>Thanks for sharing this.

I've had the same problem - building a tool to deploy [developers.org.ua](http://www.developers.org.ua) site (uses Pylons, Django, Wordpress, Openads and lots of other smaller libs).

Thus your reflections with fassember/zc.buildout were helpful to "diff against".

I use Tempita to write deployment-specific files, such as paste .ini or apache vhost files. Configuration data stored in YAML format; there is a common.yaml which holds shared config info plus a .yaml file per each deployment, which contain deployment-specific options like database creds.

Each build/deployment is "self-contained", that is, all files are put under a specific dir. The system env is configured (with symlinks or direct configuration) to use corresponding bits from the deployment. E.g. crond looks for its script under DROOT/environ/cron.* dirs.

My main "issue" with it - since it's built by me (in-house) it means I have to maintain it. ;)
Therefore I'd like to migrate/use some existing tool if/when it is available. Some [capistrano for python](http://maxischenko.in.ua/blog/entries/118/capistrano-for-python/) or whatever it would be.</description>
		<content:encoded><![CDATA[<p>Thanks for sharing this.</p>

<p>I&#8217;ve had the same problem - building a tool to deploy <a href="http://www.developers.org.ua">developers.org.ua</a> site (uses Pylons, Django, Wordpress, Openads and lots of other smaller libs).</p>

<p>Thus your reflections with fassember/zc.buildout were helpful to &#8220;diff against&#8221;.</p>

<p>I use Tempita to write deployment-specific files, such as paste .ini or apache vhost files. Configuration data stored in YAML format; there is a common.yaml which holds shared config info plus a .yaml file per each deployment, which contain deployment-specific options like database creds.</p>

<p>Each build/deployment is &#8220;self-contained&#8221;, that is, all files are put under a specific dir. The system env is configured (with symlinks or direct configuration) to use corresponding bits from the deployment. E.g. crond looks for its script under DROOT/environ/cron.* dirs.</p>

<p>My main &#8220;issue&#8221; with it - since it&#8217;s built by me (in-house) it means I have to maintain it. ;)
Therefore I&#8217;d like to migrate/use some existing tool if/when it is available. Some <a href="http://maxischenko.in.ua/blog/entries/118/capistrano-for-python/">capistrano for python</a> or whatever it would be.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Kevin Dangoor</title>
		<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/comment-page-1/#comment-18777</link>
		<dc:creator>Kevin Dangoor</dc:creator>
		<pubDate>Mon, 23 Jun 2008 03:27:14 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/#comment-18777</guid>
		<description>Hi Ian,

Thanks for writing up all of your thoughts about build tools (and for mentioning Paver).  I should note that Paver uses a modified path.py that supports "dry-run". It could easily be extended further to support prompting, which is something I just hadn't thought of.

I've been considering zc.buildout integration as my next step for Paver, but I'm going to think about minitage and the process you've created around virtualenv, because I have noticed some of the same annoyances with zc.buildout that you have. One thing that made buildout integration appealing to me is that there are so many recipes that people have written for a variety of things. However, I think that many of these recipes exist simply because that's the only way to write code for a buildout, which is buildout's most annoying trait, imho. (I believe someone has written a recipe that lets you put some code in your buildout config file, but eww...)

By the way, so far I have not at all regretted my decision for Paver's configuration and task definition to be entirely in Python. For Python programmers, there's very little that is unclear about what will happen. (The trickiest things at present are those areas around distutils integration.)

Paver supports lazy evaluation of configuration items via callables (lambdas, generally). This has worked fine for my needs thus far.

On the whole, I'm quite happy to see all of this activity around build tools, because it has been a source of annoyance (obviously for many).

Kevin</description>
		<content:encoded><![CDATA[<p>Hi Ian,</p>

<p>Thanks for writing up all of your thoughts about build tools (and for mentioning Paver).  I should note that Paver uses a modified path.py that supports &#8220;dry-run&#8221;. It could easily be extended further to support prompting, which is something I just hadn&#8217;t thought of.</p>

<p>I&#8217;ve been considering zc.buildout integration as my next step for Paver, but I&#8217;m going to think about minitage and the process you&#8217;ve created around virtualenv, because I have noticed some of the same annoyances with zc.buildout that you have. One thing that made buildout integration appealing to me is that there are so many recipes that people have written for a variety of things. However, I think that many of these recipes exist simply because that&#8217;s the only way to write code for a buildout, which is buildout&#8217;s most annoying trait, imho. (I believe someone has written a recipe that lets you put some code in your buildout config file, but eww&#8230;)</p>

<p>By the way, so far I have not at all regretted my decision for Paver&#8217;s configuration and task definition to be entirely in Python. For Python programmers, there&#8217;s very little that is unclear about what will happen. (The trickiest things at present are those areas around distutils integration.)</p>

<p>Paver supports lazy evaluation of configuration items via callables (lambdas, generally). This has worked fine for my needs thus far.</p>

<p>On the whole, I&#8217;m quite happy to see all of this activity around build tools, because it has been a source of annoyance (obviously for many).</p>

<p>Kevin</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: kiorky</title>
		<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/comment-page-1/#comment-18678</link>
		<dc:creator>kiorky</dc:creator>
		<pubDate>Sat, 21 Jun 2008 09:16:25 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/#comment-18678</guid>
		<description>I'm pretty glad you noticed minitage as i don't have even released it
officially yet.

The zc.buildout rebuilding's habit is one of the main things that make me made minitage.
I'm happy with zc.buildout but rebuilding everything is simply not acceptable.
So i just do it in an atomic way now. It builds one thing, at one place, that's
all. So we can afford to rebuild something entirely as just that will be
rebuilt.

Although minitage is working at the moment, it can be rough to be used by a
classical user.

Why?

 - Because the documentation is not really all up to date to the new version.

 - Because it is made by a geek :p

 - Because this is inspired by complicated tools (Gentoo's portage, or other ports
  systems.)

What can that brings to you ?

- Minitage lives on top of virtualenv, virtualenv will set its prefix.

- More than just installing python libraries, it installs also system software pieces like postgresql or even python. Its final goal is to deploy a project from start to end in a re-usable manner.

- Free from zc.recipe.egg. I didn't like too the approach of that recipe.
  Offline mode / local indexes were very problematic with it. So i implemented
  a recipe for minitage that borrowed code from zc.recipe.egg at the difference
  that it ll search in the cache before looking online for dependencies. That
  means if you have putted the egg inside the cache prior from this buildout
  execution, there will be no Online access at all, no index check.

- SVN (and others scms, ftp or http urls) checkouts can be up to you too with that recipe.
 See this buildout template: http://tinyurl.com/5c93lq
 You can have it with paster and minitage.paste (minitage.geodjango template)
 It uses custom GeoDjango egg that is not on pypi, and svn checkout to get
 the sources to build :)

- An enhanced CMMI build recipe wich integrates well with minitage for
  building "compiled" dependencies and interlink with other stuff installed
  into minitage.

More than an abstraction, minitage is in spirit a meta package manager. It does
nothing by itself and relies on 'install methods'. At this time, only buildout
is available but it is as simply as to make recipes to implement install
methods. Its only goal is to maintain dependencies to schedule the build
process order and the install layout : http://www.minitage.org/doc/rst/spec.html#the-installation-layout.

For the log verbosity, minitage is pretty loud :p .

NA: The documentation moved to http://www.minitage.org/doc/rst/, you seemed to
use a pretty old link.</description>
		<content:encoded><![CDATA[<p>I&#8217;m pretty glad you noticed minitage as i don&#8217;t have even released it
officially yet.</p>

<p>The zc.buildout rebuilding&#8217;s habit is one of the main things that make me made minitage.
I&#8217;m happy with zc.buildout but rebuilding everything is simply not acceptable.
So i just do it in an atomic way now. It builds one thing, at one place, that&#8217;s
all. So we can afford to rebuild something entirely as just that will be
rebuilt.</p>

<p>Although minitage is working at the moment, it can be rough to be used by a
classical user.</p>

<p>Why?</p>

<ul>
<li><p>Because the documentation is not really all up to date to the new version.</p></li>
<li><p>Because it is made by a geek :p</p></li>
<li><p>Because this is inspired by complicated tools (Gentoo&#8217;s portage, or other ports
systems.)</p></li>
</ul>

<p>What can that brings to you ?</p>

<ul>
<li><p>Minitage lives on top of virtualenv, virtualenv will set its prefix.</p></li>
<li><p>More than just installing python libraries, it installs also system software pieces like postgresql or even python. Its final goal is to deploy a project from start to end in a re-usable manner.</p></li>
<li><p>Free from zc.recipe.egg. I didn&#8217;t like too the approach of that recipe.
Offline mode / local indexes were very problematic with it. So i implemented
a recipe for minitage that borrowed code from zc.recipe.egg at the difference
that it ll search in the cache before looking online for dependencies. That
means if you have putted the egg inside the cache prior from this buildout
execution, there will be no Online access at all, no index check.</p></li>
<li><p>SVN (and others scms, ftp or http urls) checkouts can be up to you too with that recipe.
See this buildout template: <a href="http://tinyurl.com/5c93lq" rel="nofollow">http://tinyurl.com/5c93lq</a>
You can have it with paster and minitage.paste (minitage.geodjango template)
It uses custom GeoDjango egg that is not on pypi, and svn checkout to get
the sources to build :)</p></li>
<li><p>An enhanced CMMI build recipe wich integrates well with minitage for
building &#8220;compiled&#8221; dependencies and interlink with other stuff installed
into minitage.</p></li>
</ul>

<p>More than an abstraction, minitage is in spirit a meta package manager. It does
nothing by itself and relies on &#8216;install methods&#8217;. At this time, only buildout
is available but it is as simply as to make recipes to implement install
methods. Its only goal is to maintain dependencies to schedule the build
process order and the install layout : <a href="http://www.minitage.org/doc/rst/spec.html#the-installation-layout" rel="nofollow">http://www.minitage.org/doc/rst/spec.html#the-installation-layout</a>.</p>

<p>For the log verbosity, minitage is pretty loud :p .</p>

<p>NA: The documentation moved to <a href="http://www.minitage.org/doc/rst/" rel="nofollow">http://www.minitage.org/doc/rst/</a>, you seemed to
use a pretty old link.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ian Bicking</title>
		<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/comment-page-1/#comment-18659</link>
		<dc:creator>Ian Bicking</dc:creator>
		<pubDate>Fri, 20 Jun 2008 17:24:44 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/#comment-18659</guid>
		<description>We don't have a dependency system because we run all steps on every build.  Any skipped steps are done on a case-by-case basis with careful checks specific to the step we are skipping.  I really can't imagine anything a dependency system could accomplish.  If *you* can imagine something, then you are probably thinking of a different kind of tool than ours, one that serves a different purpose and is used for different tasks.</description>
		<content:encoded><![CDATA[<p>We don&#8217;t have a dependency system because we run all steps on every build.  Any skipped steps are done on a case-by-case basis with careful checks specific to the step we are skipping.  I really can&#8217;t imagine anything a dependency system could accomplish.  If <em>you</em> can imagine something, then you are probably thinking of a different kind of tool than ours, one that serves a different purpose and is used for different tasks.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: website design</title>
		<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/comment-page-1/#comment-18656</link>
		<dc:creator>website design</dc:creator>
		<pubDate>Fri, 20 Jun 2008 17:10:02 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/#comment-18656</guid>
		<description>&gt; The metaphor for the new build system was much simpler: do a list of things, top to bottom. There’s no effort into detecting changes in the build, or changes in the settings, or anything else. 

While this approach is obviously working for them, I can't help but think it could cause problems in the future. You've essentially linearized your dependency graph, and while the current linearization is presumably correct, any change to the way the system works could render it incorrect, silently or with a big bang. Explicitly encoding your dependencies can be hard, but in my experience it results in a much less fragile, much more easily understandable system. I've even used [graphviz](http://www.graphviz.org/) to visualize dependency graphs, which can make clumsy architecture easier to spot.</description>
		<content:encoded><![CDATA[<blockquote>
  <p>The metaphor for the new build system was much simpler: do a list of things, top to bottom. There’s no effort into detecting changes in the build, or changes in the settings, or anything else. </p>
</blockquote>

<p>While this approach is obviously working for them, I can&#8217;t help but think it could cause problems in the future. You&#8217;ve essentially linearized your dependency graph, and while the current linearization is presumably correct, any change to the way the system works could render it incorrect, silently or with a big bang. Explicitly encoding your dependencies can be hard, but in my experience it results in a much less fragile, much more easily understandable system. I&#8217;ve even used <a href="http://www.graphviz.org/">graphviz</a> to visualize dependency graphs, which can make clumsy architecture easier to spot.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ian Bicking</title>
		<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/comment-page-1/#comment-18655</link>
		<dc:creator>Ian Bicking</dc:creator>
		<pubDate>Fri, 20 Jun 2008 16:31:34 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/#comment-18655</guid>
		<description>Not to say that we wouldn't want the build to run faster... but to make it run faster we'd do work the package installation which is where a lot of the time goes, i.e., changes to easy_install, caching download dependencies, maybe using PyPI XMLRPC, or things like that.</description>
		<content:encoded><![CDATA[<p>Not to say that we wouldn&#8217;t want the build to run faster&#8230; but to make it run faster we&#8217;d do work the package installation which is where a lot of the time goes, i.e., changes to easy_install, caching download dependencies, maybe using PyPI XMLRPC, or things like that.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: slinkp</title>
		<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/comment-page-1/#comment-18654</link>
		<dc:creator>slinkp</dc:creator>
		<pubDate>Fri, 20 Jun 2008 16:30:52 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/#comment-18654</guid>
		<description>Ian, regarding your idea of pushing support for relative paths into upstream dependencies: That sounds like a nice beautiful simple world, but I just don't see how that's an achievable goal in practice. We might get patches accepted by some upstream projects, assuming we have the time and smarts to do so; that has some inherent value, but as long as there's one holdout that we really need, we're stuffed.</description>
		<content:encoded><![CDATA[<p>Ian, regarding your idea of pushing support for relative paths into upstream dependencies: That sounds like a nice beautiful simple world, but I just don&#8217;t see how that&#8217;s an achievable goal in practice. We might get patches accepted by some upstream projects, assuming we have the time and smarts to do so; that has some inherent value, but as long as there&#8217;s one holdout that we really need, we&#8217;re stuffed.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: slinkp</title>
		<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/comment-page-1/#comment-18651</link>
		<dc:creator>slinkp</dc:creator>
		<pubDate>Fri, 20 Jun 2008 16:29:24 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/#comment-18651</guid>
		<description>Note to "X X": You're assuming efficiency is a big problem for our use cases. It's been a total non-issue. 

EDIT: partly this is because, as Ian noted, most of our stuff isn't compiled.  For instance, a build from scratch of our most complex product (opencore) takes less than ten minutes on old hardware, the bulk of which is download time.  Rebuilds take less than a minute; largely this is because we delegate to tools that already handle dependency checking (easy-install, make, etc).

For the few things we install from big tarballs (like Zope), we just manually added a check for an up-to-date tarball. This takes a few lines of code, whereas in Make it'd "just work".  But there are relatively few cases where we care, so this hasn't been much burden.
</description>
		<content:encoded><![CDATA[<p>Note to &#8220;X X&#8221;: You&#8217;re assuming efficiency is a big problem for our use cases. It&#8217;s been a total non-issue. </p>

<p>EDIT: partly this is because, as Ian noted, most of our stuff isn&#8217;t compiled.  For instance, a build from scratch of our most complex product (opencore) takes less than ten minutes on old hardware, the bulk of which is download time.  Rebuilds take less than a minute; largely this is because we delegate to tools that already handle dependency checking (easy-install, make, etc).</p>

<p>For the few things we install from big tarballs (like Zope), we just manually added a check for an up-to-date tarball. This takes a few lines of code, whereas in Make it&#8217;d &#8220;just work&#8221;.  But there are relatively few cases where we care, so this hasn&#8217;t been much burden.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ian Bicking</title>
		<link>http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/comment-page-1/#comment-18650</link>
		<dc:creator>Ian Bicking</dc:creator>
		<pubDate>Fri, 20 Jun 2008 16:25:40 +0000</pubDate>
		<guid isPermaLink="false">http://blog.ianbicking.org/2008/06/19/my-experience-writing-a-build-system/#comment-18650</guid>
		<description>Yes, perhaps one of the reasons people are picking up on file dependencies is that I started right in without describing what we're doing.  There's a lot of different "build tools" that do radically different things.  Finding the overlap between Paver and Fabric would be hard.

*This* build tool is for deploying our stack, for production, testing, and development.  It doesn't do anything special for remote deployments (unlike Capistrano).  It isn't focused on compiling because nearly everything we have runs from source (as a result we'd save *no* time figuring out file dependencies).</description>
		<content:encoded><![CDATA[<p>Yes, perhaps one of the reasons people are picking up on file dependencies is that I started right in without describing what we&#8217;re doing.  There&#8217;s a lot of different &#8220;build tools&#8221; that do radically different things.  Finding the overlap between Paver and Fabric would be hard.</p>

<p><em>This</em> build tool is for deploying our stack, for production, testing, and development.  It doesn&#8217;t do anything special for remote deployments (unlike Capistrano).  It isn&#8217;t focused on compiling because nearly everything we have runs from source (as a result we&#8217;d save <em>no</em> time figuring out file dependencies).</p>
]]></content:encoded>
	</item>
</channel>
</rss>
