summaryrefslogtreecommitdiff
path: root/tools/osxbuild/build.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/osxbuild/build.py')
-rw-r--r--tools/osxbuild/build.py102
1 files changed, 102 insertions, 0 deletions
diff --git a/tools/osxbuild/build.py b/tools/osxbuild/build.py
new file mode 100644
index 000000000..fd94084d4
--- /dev/null
+++ b/tools/osxbuild/build.py
@@ -0,0 +1,102 @@
+"""Python script to build the OSX universal binaries.
+
+This is a simple script, most of the heavy lifting is done in bdist_mpkg.
+
+Requires a svn version of numpy is installed, svn is used to revert
+file changes made to the docs for the end-user install. Installer is
+built using sudo so file permissions are correct when installed on
+user system. Script will prompt for sudo pwd.
+
+"""
+
+import os
+import shutil
+import subprocess
+from getpass import getuser
+
+SRC_DIR = '../../'
+
+USER_README = 'docs/README.txt'
+DEV_README = SRC_DIR + 'README.txt'
+
+BUILD_DIR = 'build'
+DIST_DIR = 'dist'
+
+def remove_dirs():
+ print 'Removing old build and distribution directories...'
+ print """The distribution is built as root, so the files have the correct
+ permissions when installed by the user. Chown them to user for removal."""
+ if os.path.exists(BUILD_DIR):
+ cmd = 'sudo chown -R %s %s' % (getuser(), BUILD_DIR)
+ shellcmd(cmd)
+ shutil.rmtree(BUILD_DIR)
+ if os.path.exists(DIST_DIR):
+ cmd = 'sudo chown -R %s %s' % (getuser(), DIST_DIR)
+ shellcmd(cmd)
+ shutil.rmtree(DIST_DIR)
+
+def build_dist():
+ print 'Building distribution... (using sudo)'
+ cmd = 'sudo python setupegg.py bdist_mpkg'
+ shellcmd(cmd)
+
+def build_dmg():
+ print 'Building disk image...'
+ # Since we removed the dist directory at the start of the script,
+ # our pkg should be the only file there.
+ pkg = os.listdir(DIST_DIR)[0]
+ fn, ext = os.path.splitext(pkg)
+ dmg = fn + '.dmg'
+ srcfolder = os.path.join(DIST_DIR, pkg)
+ dstfolder = os.path.join(DIST_DIR, dmg)
+ # build disk image
+ cmd = 'sudo hdiutil create -srcfolder %s %s' % (srcfolder, dstfolder)
+ shellcmd(cmd)
+
+def copy_readme():
+ """Copy a user README with info regarding the website, instead of
+ the developer README which tells one how to build the source.
+ """
+ print 'Copy user README.txt for installer.'
+ shutil.copy(USER_README, DEV_README)
+
+def revert_readme():
+ """Revert the developer README."""
+ print 'Reverting README.txt...'
+ cmd = 'svn revert %s' % DEV_README
+ shellcmd(cmd)
+
+def shellcmd(cmd, verbose=True):
+ """Call a shell command."""
+ if verbose:
+ print cmd
+ try:
+ subprocess.check_call(cmd, shell=True)
+ except subprocess.CalledProcessError, err:
+ msg = """
+ Error while executing a shell command.
+ %s
+ """ % str(err)
+ raise Exception(msg)
+
+def build():
+ # update end-user documentation
+ copy_readme()
+ shellcmd("svn stat %s"%DEV_README)
+
+ # change to source directory
+ cwd = os.getcwd()
+ os.chdir(SRC_DIR)
+
+ # build distribution
+ remove_dirs()
+ build_dist()
+ build_dmg()
+
+ # change back to original directory
+ os.chdir(cwd)
+ # restore developer documentation
+ revert_readme()
+
+if __name__ == '__main__':
+ build()