Home

Awesome

TL;DR

To build Sage binaries, just clone this repository and run

git clone https://github.com/sagemath/binary-pkg.git
cd binary-pkg
make bdist-sage-linux     # If you are on Linux
make bdist-sage-osx       # If you are on OSX
ls dist/                  # Built binaries will be in this directory

Edit sage.yaml if you want to build something else than the current Sage develop git branch.

Binary Packaging

This utility helps with creating binaries for distribution. Similar to conda, it builds the source tree in a long directory name which is then patched at install time. It is written for Sage (http://www.sagemath.org) but equally work for other software.

Usage

Building and packaging of an application is configured with a yaml file in the repository root. As an example, there is test.yaml and sage.yaml. To create a binary tarball for Sage, for example, all you have to do is run

make package-sage

This creates a tarball with an added relocate-once.py file that patches any hard-coded paths. If there are more than one packaging configurations (see below), then the first one is used by default. Use the PACKAGE variable to pick another one, for example

make package-sage PACKAGE="OSX DMG image"

In particular, see below for the different Mac packaging possibilities.

Configuration Syntax

Binary packaging information can be specified with a YAML configuration file. As a simplified example, let us look at the test application in the test.yaml file. It starts with the name:

name: PackagingTest

which will be the name of the root directory in the binary tarball. Our basic assumption is that your source code lives in a git repository, which we specify next:

repository: https://github.com/octol/minimal-gtest-autotools
branch: master

Then we have a (bash) build script to build the application

build: |
    autoreconf -vfi
    ./configure
    make

After the build is complete, we need to know the version. Typically this can be gotten via a command line switch of the application, though in this case we cheat. In any case, the output of this script is the version:

version: |
    echo 1.0

Finally, we define how to package the built source tree. There may be more than one way to package the application, each of which is distinguished by an internal name.

package:
  - name: Full binary tarball
    command: |
        tar cjf {dist}/test-{version}-{osname}-{arch}.tar.bz2 {path}
    files:
      - include: '**'
    rewrite_path:
      - exclude: '**/*.a'

The files section is a list of include/exclude directives, to be read from the bottom up. That is, later directives override earlier ones. The rewrite_path section defines a subset of the files that are to be ignored when rewriting hard-coded paths. In this example, all files are included but paths in static archives are not patched.

Auxiliary Make Targets

Any *.mk file in the root directory will be included in the Makefile for recurring build targets.

Mac Packaging Options

There are three options for packaging Mac. The default will simply create a .tar.gz file, which is usually not what one wants on Mac.

To create a Mac disk image file of the normal Sage command line distribution, use this package option:

make package-sage PACKAGE="OSX DMG image"

To create a Mac disk image file of the Mac app bundle with menu items and which automatically launches a notebook, use

make package-sage PACKAGE="OSX mac app"