diff --git a/tools/build_release b/tools/build_release
index e74dfa3..a9e2a1c 100755
--- a/tools/build_release
+++ b/tools/build_release
@@ -23,10 +23,10 @@ for d in ['build', 'dist', pjoin('docs', 'build'), pjoin('docs', 'dist'),
         remove_tree(d)
 
 # Build source and binary distros
-sh('./setup.py sdist --formats=gztar,zip')
+sh(sdists)
 
 # Build eggs
-sh('python ./setupegg.py bdist_egg')
+sh(eggs)
 
 # Run windows builds
 map(sh, win_builds)
diff --git a/tools/release b/tools/release
index 8744b0d..59a7e1a 100755
--- a/tools/release
+++ b/tools/release
@@ -49,9 +49,8 @@ cd(ipdir)
 sh('./setup.py register')
 
 # Upload all files
-sh('./setup.py sdist --formats=gztar,zip upload')
-for wb in win_builds:
-    sh(wb + ' upload')
+for cmd in [sdists, eggs] + win_builds:
+    sh(cmd + ' upload')
 cd(distdir)
 print( 'Uploading distribution files...')
 
diff --git a/tools/toollib.py b/tools/toollib.py
index c803836..b4e70cf 100644
--- a/tools/toollib.py
+++ b/tools/toollib.py
@@ -19,7 +19,13 @@ archive_user = 'ipython@archive.ipython.org'
 archive_dir = 'archive.ipython.org'
 archive = '%s:%s' % (archive_user, archive_dir)
 
-# Commands for Windows builds.
+# Build commands
+# Source dists
+sdists = './setup.py sdist --formats=gztar,zip'
+# Eggs
+eggs = './setupegg.py bdist_egg'
+
+# Windows builds.
 # We do them separately, so that the extra Windows scripts don't get pulled
 # into Unix builds (setup.py has code which checks for bdist_wininst).  Note
 # that the install scripts args are added to the main distutils call in