.. ========================================================================== = = File: developer.rst = Date: 11-Aug-2009 = Author: Hugh Secker-Walker = Description: Documentation for installing the project for development work = = This file is part of Onyx http://onyxtools.sourceforge.net = = Copyright 2009 The Johns Hopkins University = = Licensed under the Apache License, Version 2.0 (the "License"). = You may not use this file except in compliance with the License. = You may obtain a copy of the License at = http://www.apache.org/licenses/LICENSE-2.0 = = Unless required by applicable law or agreed to in writing, software = distributed under the License is distributed on an "AS IS" BASIS, = WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or = implied. See the License for the specific language governing = permissions and limitations under the License. = ========================================================================== ====================== Developer Installation ====================== These instructions are for users users of Onyx who want to work with and modify the source code of the project. This file is the top-level readme for Onyx. It gives quick instructions about how to retrieve a copy of the project, and it points to other documentation within the project. These instructions should get you going on either the HLTCOE HPCC machines, on a Mac, or on Linux. .. note:: some of the instructions below are out of date. Preparing to install the project ================================ The project uses the Bazaar version control system. The Bazaar version control is often called bazaar or bzr and is also sometimes referred to as bazaar-ng (for next generation). See: http://bazaar-vcs.org/ You will need to install bazaar before you can retrieve the HLTCOE project. Installing Bazaar on HPCC ------------------------- The HPCC machines have Bazaar already installed in /usr/local/bin. Try "which bzr" and verify that you get "/usr/local/bin/bzr". Then you can move on to "Installing the project" below. Installing Bazaar on Mac ------------------------ On the Mac platform we recommend using the command-line program 'port' to retrieve and build OpenSource projects used by HLTCOE. To prepare your system for :command:`port`, you need to install `Apple's Xcode SDK `_. Xcode is both an application and an SDK toolchain. It contains GCC tools which are needed by the :command:`port` command when it builds packages. Once you have Xcode installed, then install the `MacPorts package `_. This installs tools under the /opt/local directory. It may also fiddle your path, e.g. in :file:`~/.profile`. MacPorts has command-line tools that let you manage the installation of numerous OpenSource projects. The main tool is :command:`port`:: $ port help port [-bcdfiknopqRstuvx] [-D portdir] [-F cmdfile] action [privopts] [actionflags] [[portname|pseudo-portname|port-url] [@version] [+-variant]... [option=value]...]... Supported commands ------------------ activate, archive, build, cat, cd, checksum, clean, compact, configure, contents, deactivate, dependents, deps, destroot, dir, distcheck, distfiles, dmg, dpkg, echo, ed, edit, exit, extract, fetch, file, gohome, help, info, install, installed, lint, list, livecheck, load, location, mdmg, mirror, mpkg, outdated, patch, pkg, platform, provides, quit, rpm, search, selfupdate, srpm, submit, sync, test, trace, unarchive, uncompact, uninstall, unload, upgrade, url, usage, variants, version, work ... [ for many lines ] For more information -------------------- See man pages: port(1), macports.conf(5), portfile(7), portgroup(7), porthier(7), portstyle(7). Use :command:`port` to install Bazaar version control. Beware of a potential confusion: the unrelated GNU Arch project is called bazaar in the MacPorts databases; be sure to get bzr. In order to use :command:`port` you must be root, e.g. via :command:`sudo`. Using the following you will be prompted for the administrative password, then :command:`port` will get to work:: $ sudo port install bzr Note that :command:`port` manages package dependencies and will have to download and build several other packages before it finishes. To see more about what it's doing you can try verbose mode or even debug mode:: $ sudo port -v install bzr $ sudo port -d install bzr When :command:`port` has finished its work, you should be able to run bzr in a (new) shell. E.g.:: $ bzr Bazaar -- a free distributed version-control tool http://bazaar-vcs.org/ Basic commands: bzr init makes this directory a versioned branch bzr branch make a copy of another branch bzr add make files or directories versioned bzr ignore ignore a file or pattern bzr mv move or rename a versioned file bzr status summarize changes in working copy bzr diff show detailed diffs bzr merge pull in changes from another branch bzr commit save some or all changes bzr log show history of changes bzr check validate storage bzr help init more help on e.g. init command bzr help commands list all commands bzr help topics list all help topics Installing the project ====================== The project is accessed from a repository on an HLTCOE server. Access to the server -------------------- At present you need an account on the HLTCOE network in order to retrieve a copy of the project. You must also be a member the **bzruser** group. The IT folks can set you up with an account. When accessing the server, it's a huge convenience to use the :command:`ssh` RSA authentication keys so that you don't have to type your password each time you access the repository. See the :command:`ssh-keygen` man page. On your local machine use :command:`ssh-keygen` to generate the :file:`~/.ssh/id_rsa` and :file:`~/.ssh/id_rsa.pub` files. The following examples show this process, where ** should be replaced with your user name. Be sure to use an empty passphrase, otherwise you will be prompted for the passphrase each time you try to access the server. :: $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home//.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home//.ssh/id_rsa. Your public key has been saved in /home//.ssh/id_rsa.pub. The key fingerprint is: b6:a8:2a:a9:c7:5e:bb:a6:ad:08:03:73:e8:ed:2d:17 @hltcoe.hodain.net The key's randomart image is: +--[ RSA 2048]----+ | | | . | |+ . E | |ooo +. . | |.. +.o S | |. ..o. o . | |+.. . . . | |oooo.o .+ | |oo+++ | +-----------------+ Then, append the contents of the local :file:`~/.ssh/id_rsa.pub` to the server file :file:`~/.ssh/authorized_keys`:: $ ssh @external.hltcoe.jhu.edu 'cat >> ~/.ssh/authorized_keys' < .ssh/id_rsa.pub @external.hltcoe.jhu.edu's password: Then verify that you can access the account and run a command using :command:`ssh`, e.g.:: $ ssh @external.hltcoe.jhu.edu hostname gpsrv5 Creating your local branch -------------------------- Once you are set up to access the server, you can create a local branch of the project. This will prompt you for a password (on the HPCC machines you may get prompted twice; this is OK) and then retrieve the project files, putting them into the directory my_onyx_code. Note that You would use the following command with your user name in the ** slot. This step may take a while to finish without giving any indication that anything is happening:: $ bzr branch bzr://onyxtools.bzr.sourceforge.net/bzrroot/onyxtools/onyx/ my_onyx_code This will have installed a local :term:`branch` of the project in the :file:`my_onyx_code` directory. The URL :file:`bzr://onyxtools.bzr.sourceforge.net/bzrroot/onyxtools/onyx/` refers to what is called the :term:`parent` repository. It's the version of the project (and all its history) from which the local branch is created. The local branch consists of a :term:`working tree` and a :term:`repository`. The working tree is all of the files and data of the project, it's what you see if you browse around in :file:`my_onyx_code`. This is where you look at code and modify files, etc. A repository is where :command:`bzr` does all its recordkeeping. The local repository is found under :file:`my_onyx_code/.bzr`. .. note:: Do not change anything in the repository; it is the :command:`bzr` database. .. _working-with-your-local-branch: Working with your local branch ============================== The project has several commands that use bzr tools to manage you local branch and the parent repository. These commands live in the :file:`op` directory. They are typically executed from the top-level directory of the project. This convention makes it easy to work with several different installations of the project. To get a summary of what's new in the repository since you last synchronized with the repository. The :command:`snew` command shows you the differences between the repository's change file, which is :file:`changes.txt`. If you are up to date you will get a short message to that effect:: $ op/snew Local revision is 461, which is current for parent: bzr://onyxtools.bzr.sourceforge.net/bzrroot/onyxtools/onyx/ You are up to date! If you are out of date you will get a more verbose message:: $ op/snew Diffing ./changes.txt with parent version at bzr://onyxtools.bzr.sourceforge.net/bzrroot/onyxtools/onyx/ === modified file 'changes.txt' *** local changes.txt 2009-07-22 16:20:32 +0000 --- parent changes.txt 2009-08-11 18:46:20 +0000 *************** *** 15 **** --- 16,112 ---- + Commit at 2009-08-11 14:46:19 -0400 by <@> from + Message: Additions to top-level documentation + Last revno: 460 Last revision id: + Last revision date: 2009-08-11 13:26:33 -0400 + + modified: + doc/sphinx/SConscript + doc/sphinx/index.rst + doc/sphinx/toplevelorg.rst + added: + doc/sphinx/developer.rst + doc/sphinx/devo + doc/sphinx/user.rst + templates/restructured.rst + Updates to the documentation top-level structure. There is also a less-informative lower-level command that shows you bzr's view of what is different between your branch and its parent repository. You use :command:`missing` to see what :command:`merge` or :command:`pull` would retrieve from the parent repository in order to bring your local branch up to date with the parent repository:: $ op/missing Using saved parent location: bzr://onyxtools.bzr.sourceforge.net/bzrroot/onyxtools/onyx/ You are missing 1 revision(s): ------------------------------------------------------------ revno: 461 committer: <@> branch nick: timestamp: Tue 2009-08-11 14:46:20 -0400 message: Additions to top-level documentation When you are out of date, and you want to update, use the :command:`pull` command to retrieve updated versions of files from the server:: $ op/pull Using saved parent location: bzr://onyxtools.bzr.sourceforge.net/bzrroot/onyxtools/onyx/ +N doc/sphinx/developer.rst +N doc/sphinx/devo +N doc/sphinx/user.rst +N templates/restructured.rst M changes.txt M doc/sphinx/SConscript M doc/sphinx/index.rst M doc/sphinx/toplevelorg.rst All changes applied successfully. Now on revision 461. You can also use :command:`op/merge`, which is like the pull command, but is used when there are change conflicts that need to be merged, and which may require your intervention to resolve. Making changes -------------- To make changes to the project you just modify the files in question. In order to add a new file or directory to the project, use the :command:`bzr add` command. To see how :command:`bzr` views the status of the project, use the :command:`status` command:: $ op/status added: LICENSE.txt NOTICE.txt modified: doc/presentations/logo-samples.ppt py/onyx/__init__.py unknown: LICENSE.BSD.txt usage-example.txt doc/work/ This is a complex example: * some files that have been **added** to the project, but have not yet been checked in * some project files have been **modified** * some files and directories are **unknown** as far as :command:`bzr` is concerned Checking-in your changes ------------------------ Once you have a coherent set of changes that are tested and documented, and the build succeeds, then you are ready to check-in. We use a small set of commands that we layer on top of Bazaar. The purpose of these commands is to automatically update the project file :file:`changes.txt` which lives in the top-level of the project. Take a look at that file to see a prose history (most recent first) record of changes to the project. If you have made changes to files in the project which you are ready to commit, here's the procedure you should follow. Begin by doing:: $ op/prep modified: doc/presentations/logo-samples.ppt py/onyx/__init__.py added: LICENSE.txt NOTICE.txt ===== Additional bzr output - FYI only ===== unknown: LICENSE.BSD.txt usage-example.txt doc/work Renamed /Users/hugh/onyx/onyx_doc/comments.txt to /Users/hugh/onyx/onyx_doc/comments.bak Wrote new template file: /Users/hugh/onyx/onyx_doc/comments.txt Wrote new checkin file: /Users/hugh/onyx/onyx_doc/ckin_files.py Now edit comments.txt then run ckin to complete your commit You may also edit ckin_files.py if you wish to exclude some modified files from this check-in. This will fill out the file :file:`comments.txt` in the top level of your project with a template showing which files you've changed, added, removed, etc, based on the output of :command:`op/status`. Now edit :file:`comments.txt`, adding text describing what you've done. Descriptions generally run from a one or two sentences to a few paragraphs, but occasionally longer entries are appropriate. See the project :file:`changes.txt` for examples of the descriptive prose style you should add to :file:`comments.txt`. When you are done editing your descriptions of the work you've done to the project it's a very good idea to run SCons one more time, just in case you've inadvertently changed something. If you have not changed anything this step doesn't take long:: $ op/scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... scons: building associated BuildDir targets: build scons: `.' is up to date. scons: done building targets. Now you are ready to check in:: $ op/ckin '' where ** is a short message for the bzr log. This command will automatically insert the contents of :file:`comments.txt` at the top of :file:`changes.txt`, and then it will commit the changes from your working tree to your local repository. This latter step is done via :command:`bzr`'s :command:`commit` machinery. At this point, your local branch should have no status:: $ op/status When it's time to propogate your commited changes to the parent repository, so that everyone else can retrieve them, do:: $ bzr push This updates the server's branch so that it is a mirror of your local branch. Once you've done this, when other developers of the project do :command:`op/snew`, they will see you description of your changes, and they'll do :command:`op/pull`, or :command:`op/merge` to propogate those changes into their local branch. Documentation in the project ============================ Top-level directories in the project often have a readme. Here are some of them: * ./bin/README.txt * ./cpp/matrix/README.txt * ./py/README.txt important pointers for building and extending * ./README.txt * ./scons/scons-README * ./templates/README.txt templates with boilerplate for various kinds of files The directory ./readme has some documentation that doesn't seem to belong anywhere else, e.g. how to set up a Mac for the project. Preparing to build the project ============================== In order to build and use the project, you will need some third-party tools. Here's a list of what's known to be needed. | Python 2.5 | Python packages: | numpy | scipy | | C++ compilation tools Preparing to build on HPCC -------------------------- Everything you need to build on the HPCC machines is already installed and should be on your path. Preparing to build on the Mac ----------------------------- The Xcode toolchain is required. See: http://developer.apple.com/tools/xcode/ Python is retrieved, built, and installed via :command:`port`. The list of available packages is huge (over 4000) so be selective when searching. E.g. there over 85 Python 2.5 related sub-packages:: $ port search py25 | wc 89 Here is a recommended set of Python tools:: $ sudo port -v install python25 py25-ipython py25-numpy This will build and test numerous components and it takes a while to run (go get lunch). Build Environment ================= We are trying to keep the number of environment variables you must set to a minimum. You should put the 'py' directory of the project on your :envvar:`PYTHONPATH`. E.g. if you've installed the project in :file:`~/my_onyx_code`, then you would have the following in your :file:`./profile` or equivalent:: # Setting the path for python and MacPorts export PYTHONPATH=~/my_onyx_code/py Setting up the build environment on HPCC ---------------------------------------- You shouldn't need to set any other environment variables on the HPCC. Setting up the build environment on Mac --------------------------------------- You should verify that the :command:`port` bin directories are on your :envvar:`PATH`. You should have the following in your :file:`./profile` or equivalent:: # Setting the path for MacPorts export PATH=/opt/local/bin:/opt/local/sbin:$PATH Building the project ==================== Onyx is a build-based platform. That is, before using the tools you have to build and test them. The building is handled by the SCons software construction tool. A version of this tool is included in the project so you do not have to install it. The build and test process is unified. That is, when SCons is activated it only builds and tests those parts of the project that are out of date. Scons documentation is online. The `SCons Tutorial `_ is useful as a starting point, but not as a reference. The `SCons Man Page `_ is a very useful reference once you have learned the basic ideas. If all is well in your project, you should be able to run SCons at the top level and it will go and build and test everything. By default it stops as soon as it encounters an error. A successful build looks like this:: > op/scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... scons: building associated BuildDir targets: build g++ -o build/cpp/liveaudio/DCAudioFileRecorder.o -c build/cpp/liveaudio/DCAudioFileRecorder.cpp g++ -o build/cpp/liveaudio/audio.o -c build/cpp/liveaudio/audio.cpp ar rc build/cpp/liveaudio/libaudio.a build/cpp/liveaudio/audio.o build/cpp/liveaudio/DCAudioFileRecorder.o ranlib build/cpp/liveaudio/libaudio.a ... [ for many lines ] python -O -m onyx.onyx_py_compile build/templates/__init__.py python -m onyx.onyx_py_compile build/templates/module.py python build/templates/module.pyc > build/templates/module.log-doctest verify_log_doctest( build/templates/module.log-doctest > build/templates/module.log-doctestverify ) python -O -m onyx.onyx_py_compile build/templates/module.py summarize(["doctest_summary"], []) cat doctest_summary managed_modules 36 tested_modules 0 tested_statements 0 num_ok 0 num_bad 0 scons: done building targets. .. note:: If the build is successful the SCons output will finish with the line ``scons: done building targets.`` If the build failed then the SCons output will end with something like ``scons: building terminated because of errors.`` or ``scons: done building targets (errors occurred during build).`` If there is no work to be done when you run SCons you will get the following:: $ op/scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... scons: building associated BuildDir targets: build scons: `.' is up to date. scons: done building targets. Usually, when you've modified code, some subset of the code will get rebuilt and retested. As you can see from the log, SCons is configured so that all the output of the build process goes into the :file:`build/` subdirectory in the project. Within this subdirectory there will be a platform-specific subdirectory, e.g. :file:`build/darwin-posix-i386-32bit-le/`. The output of the build process goes into this platform-specific subdirectory. This allows you to build from multiple platforms that share the same local branch. To remove everything that gets built by SCons use the :command:`-c` command-line option:: $ op/scons -c When there is a problem during the build SCons stops immediately. If you'd like SCons to continue despite errors, use the :command:`-k` command-line option:: $ op/scons -k SCons is threadsafe. If you have multiple cores on your machine you can get a significant speedup of the build by telling SCons how many jobs it can run simultaneously. Empirically, we've observed that specifying 1.5 to 2 times as many cores as you have gives the fastest builds. E.g. on a 2-core system:: $ op/scons -j 4 Note that the outputs of multiple simultaneously running jobs will be interleaved. To stress the build process, you can tell SCons to randomly select the order in which it will run jobs (while still respecting the underlying dependencies of the build):: $ op/scons -j 4 --random TTD: * Overview * Notes specific to desktop Linux * Nice hand-holding walk through * Demos - scripts/Malach/social-network/sigproc/live-demo/training/decoding/sandbox/eventdet