How to make an OSX package
--------------------------

Note: This is being written from the OSX 10.6 perspective, and may therefore
      contain steps that are different for 10.5, although I don't recall any
      actual differences.


0. Philosophy

  Only Fredde tags releases.  We only make builds from tagged commits.  We
  only release builds that build cleanly without errors or warnings.  We only
  release builds that pass 100% of the unit tests.


1. Prerequisites

  You will need an Intel Mac, running OSX 10.5 or later.
  You will need to install the Developer Tools, which are found on your OSX DVD.
  You will need git installed, version 1.5 or later.  See http://git-scm.com
  You will need autotools installed.  See http://www.gnu.org/software/autoconf

2. Get the code

  2.1 Clone the task git repository.  It is important that this is a throwaway
    clone of the repository, because we will do (locally) destructive things
    to it.

    $ git clone git://tasktools.org/task.git ~/task-package.git
    ...
    $ cd ~/task-package.git

  2.2 Making sure you have the right version of the code.  This assumes you are
    building taskwarrior 1.9.2, but any version number is interchangeable.
    Check out the correct branch, and make sure it is sitting at the correct
    commit, via a tag.  Note that while 1.9.2 is a branch name, v1.9.2 is a tag
    name.

    $ git checkout 1.9.2
    $ git reset --hard v1.9.2

    If there is an error in this step, stop, capture the output, and report the
    errors.

3. Build taskwarrior

  3.1 First build the task binary.  Note the "-j 2" tells make to use both cores
    in your dual-core Intel CPU, which means faster compiles.  If you own a quad
    core Mac, use "-j 4".  If you own a single core Mac, just type "make".

    $ autoreconf -f
    $ ./configure
    ...

    If any errors are reported, stop, capture the output, and report the errors.
    
    $ make -j 2

    If there are any errors, or there are any warnings generated by the compiler
    stop, capture the output, and report the problem.  You'll need to watch as
    it builds.

4. Build the test suite

  4.1 The test suite exists to prove that we do not break taskwarrior features
    from one release to the next.  While this is not a perfect solution, it has
    saved us many times from releasing code that is inferior.

    The first step is to modify the test suite Makefile to remove the Lua line.
    This is because we do not yet have dynamic detection of the Lua library for
    the unit tests.

    $ cd ~/task-package.git/src/tests
    $ vi Makefile

    Any text editor will do, but look for this line (line 5):

      LFLAGS  = -L/usr/local/lib -llua

    and change it to:

      LFLAGS  = -L/usr/local/lib

    Now build the unit tests:

    $ make -j 2
    ...

  4.2 Run all the unit tests.

    $ ./run_all
    Skipping benchmarks
                                                                                
    Pass:     4241
    Fail:        0
    Skipped:     0
    Runtime:    86

    The output should look something like this, with 0 failed, and 0 skipped
    tests.  If there are any failures or skips, stop and mailed the log file,
    named 'all.log' to Paul & Fredde.

5. Assemble the parts

  5.1 There is a script that copies all the necessary files (binary, man pages
    etc) in the right place, ready for packaging.  Run this:

    $ cd ~/task-package.git/package-config/osx
    $ ./update

6. Adjust the package details

  6.1 Launch the package manager.

    $ open -a /Developer/Applications/Utilities/PackageManager.app   

  6.2 Close the 'Untitled' window that opens - we will be using a different
    file.  Note that PackageManager is still running - it just has no windows.

  6.3 Using the File -> Open menu, open the file

    ~/task-package.git/package-config/osx/task.pmdoc

    <figure 1>

    This is the file from the last time a package was created.  It needs some
    adjustments.  Start by clicking on the "Taskwarrior x.x.x Distribution" with
    a package icon in the top left part of the window.

  6.4 Click on the "Configuration" button/tab.

    - Change the "Title" to "Taskwarrior 1.9.2"
    - Change the "Description" to "Taskwarrior 1.9.2 install for Snow Leopard"

    <figure 2>

  6.5 Click on "Edit Interface..."

    There are 5 radio buttons on the left hand side - we will visit each and
    make changes.  Click on "Background", make sure it matches the figure.

    <figure 3>

    Click on "Introduction", make sure it matches the figure.

    <figure 4>

    Click on "Read Me", and on the right hand side, under "Read Me Panel", click
    on "File" and select the file:

      /Users/<your-account>/task-package.git/package-config/osx/README.txt

    <figure 5>

    Click on "License", and on the right hand side, under "License Panel", click
    on "File" and select the file:

      /Users/<your-account>/task-package.git/package-config/osx/COPYING.txt

    <figure 6>

    Click on "Finish Up", and make sure it matches the figure.

    <figure 7>

    Close the Interface Editor window (it saves automatically).

  6.6 Back in the "task.pmdoc" window, click on the "Requirements" tab/button,
    then click on the "+" button, and add a requirement rule as shown in the
    figure.  The minimum system should be 10.5.0 or 10.6.0, depending on which
    package is being built.

    <figure 8>

  6.7 Click on the "Actions" tab/button and make sure it matches the figure.

    <figure 9>

  6.8 Click on the triangle next to the "local" item in the "Contents" vertical
    bar on the left to expand and show a folder called "local", with the path
    "/usr/local", but click on the "local" next to the blue radio button, not
    the one next to the folder.  Then click on the "Configuration" tab/button.

    - Change the "Choice Name" to "local"
    - Leave the "Identifier" alone - it is automatic
    - Make sure "Selected" and "Enabled" are checked, but "Hidden" is not

    <figure 10>    

  6.9 Click on the "Requirements" tab/button and make sure it is all blank.

    <figure 11>

  6.10 Click on the blue folder on the left, which is labelled "local", and has
    a path of "/usr/local".  Click on the "Configuration" tab/button.

    - Change the "Install" to /Users/<your-account>/task-package.git/package-config/osx/local
    - Make sure the "Destination" is "/usr/local"
    - Make sure "Allow custom location" is checked
    - Make sure the "Package Identifier is "com.beckingham.task192.local.pkg"
    - Make sure the "Package Version" is 1.0.  If you needed to make a
      subsequent OSX package, *for the same version of task*, then this number
      would be increased to show OSX that this package supersedes the earlier
      one
    - Make sure "Restart Action" is "None"
    - Make sure "Require admin authentication" is checked
    - Make sure "Package Location" is "Self-Contained"

    <figure 12>

  6.11 Click on the "Contents" tab/button.

    - Click on all the triangles in the "local" folder to expand all directories
    - Make sure "Include root in package is not checked"
    - Click on the "Apply Recommendations" button

    Make sure it matches the figure.

    <figure 13>

  6.12 Click on the "Components" tab/button, make sure it is all blank.

  6.13 Click on the "Scripts" tab/button, make sure it is all blank.

7. Building the package

  7.1 Click on the "Build" hammer icon to build the package.

  Provide a filename of "task-1.9.1-sl.pkg" for Snow Leopard (10.6), or
  "task-1.9.2.pkg" for Leopard (10.5), and save it somewhere, for example the
  Desktop.

  All should succeed.  You can click on the "Return" button to end the build
  phase, and you can quit PackageManager, but make sure you save the changes
  you made, because you may need to go through the whole process again, if there
  is an emergency change, or the package is somehow corrupt.

  <figure 14>

8. Test the package

  8.1 Double-click on the package you just created, and install taskwarrior.
    You should see the README file in the UI, and the COPYING file on another
    page.  It should succeed.

  <figure 14>
  <figure 15>
  <figure 16>
  <figure 17>
  <figure 18>
  <figure 19>
  <figure 20>
  <figure 21>

  8.2 Run the following commands to test the installation

  $ /usr/local/bin/task version

  task 2.0.0 built for darwin
  Copyright (C) 2006 - 2012 P. Beckingham, F. Hernandez.

  Taskwarrior may be copied only under the terms of the GNU General Public
  License, which may be found in the taskwarrior source kit.

  Documentation for taskwarrior can be found using 'man task', 'man taskrc',
  'man task-tutorial', 'man task-color', 'man task-faq' or at
  http://taskwarrior.org

  $ man task
  ...
  ...
  task 2.0.0             2012-01-10                task 2.0.0

  The man page should list 2.0.0 as the version number, but the date will be
  different.

9. Email the package to Fredde.

---

