Index

This page is targeted at those who have access to the FreeSurfer source code, and wish to build this source code on their own Unix platform (whether it be an NMR Martinos Center platform, which has all required libraries, or on some arbitrary Unix platform, where the dependent libraries must be installed prior to building FreeSurfer).

1. Git Clone

Users can download FreeSurfer source code via the git repo:

## Get source code files (206 MB)
$> git clone file:///space/freesurfer/repo/freesurfer

1.1. Getting the Data Files

The FreeSurfer repository contains a large number data files, distributed via the git-annex software, which are not included with a default git clone of the repo. Users who only want the repository for the purposes of compiling binaries and/or inspecting source code, the git clone command from above is all you need to do. Users at the Center who want to run build time checks, or perform a full local installation, or just want all the contents of the repository, will need to run the following command:

Put git-annex in your PATH:

(bash)
$> export PATH=/usr/pubsw/packages/git-annex/current/bin:$PATH

(csh)
$> setenv PATH /usr/pubsw/packages/git-annex/current/bin:$PATH

Get the data files:

## Get only the data files required for build time checks (1.9 GB)
$> git annex get --metadata fstags=makecheck .

## Get only the data files required for local installation (4.3 GB)
$> git annex get --metadata fstags=makeinstall .

## Just give me everything! Not Recommended (6.8 GB)
$> git annex get .

1.2. Remote git Access

Outside of the Martinos Center, users can download FreeSurfer source code via the read-only git repo:

$> git clone https://surfer.nmr.mgh.harvard.edu/pub/dist/freesurfer/repo/freesurfer.git

More information about building FreeSurfer outside the Martinos Center can be found here: http://surfer.nmr.mgh.harvard.edu/fswiki/freesurfer_linux_developers_page

2. Configuring

It is necessary to run a pre-configure script, to create the platform specific tools required by configure (execute in the freesurfer directory created by git clone). This script runs a set of commands (aclocal, libtoolize, automake v1.9.6, autoconf v2.59) that creates the platform specific files for configure and puts them in the 'dev/config' directory.

$> ./setup_configure

Now you need to configure your building parameters for your machine by running the configure script. Users at the Martinos Center should for the most part fine with the default settings, but the configure script does accept many options for pointing to specific libraries and other build specific parameters. One exception is if a user want to perform a local installation of the FreeSurfer, he/she should use the --prefix flag. Type ./configure --help for a full list of options. For example:

$> ./configure

## Specify an installation location
$> ./configure --prefix=~/work/freesurfer

## See all possible options
$> ./configure --help

FreeSurfer builds against the following set of open-sourced libraries, which are installed under the /usr/pubsw/packages directory on all NMR computers:

All these packages will be found by default by the ./configure script. But there are options to specify where certain packages exists if a user wishes to build against a different version of one of the open-source libraries. For example:

## Specify a specific version of qt
$> ./configure --with-qt=/usr/pubsw/packages/qt/4.8.5

For users outside the Martinos Center, a package of all these compiled open-source libraries are available on the distribution site. See the "Library Dependencies" section of the the developers guide for instructions on how to obtain this bundle and build against it:

https://surfer.nmr.mgh.harvard.edu/fswiki/freesurfer_linux_developers_page#LibraryDependencies

3. Building

You can now run 'make' to build the FreeSurfer source tree:

$> make -j 4

Handy hint: the -j 4 option to make tells it to run four simultaneous make processes, which, if building on a multi-processor machine, can speed-up the build.

You could compile individual programs or all of them at once. To compile all of them, just run 'make' from dev/. Binaries will automatically be placed in their individual subdirectories. If you want to compile just one binary at a time, if you are developing an app for example, than cd to the directory of the program you want and use 'make' to compile it:

$> cd mri_info
$> make

This creates mri_info in the mri_info/ directory. However, be aware the many program depends on the existence of libraries having already been build like libutils. Therefore users will need to build a few of the library directories first (e.g. utils, fsgdf, xml2, etc).

4. Adding a new binary to the tree

Assuming that you have a source file MYPROG.c that compiles into MYPROG and want to add it to the FreeSurfer tree:

1) Make the directory in dev and copy the source file there. Name the directory MYPROG and the source file MYPROG.c.

mkdir dev/MYPROG
cp MYPROG.c dev/MYPROG

2) Modify dev/configure.in to add MYPROG/Makefile to the list of files in the definition of AC_OUTPUT (these are in roughly alphabetical order).

## configure.in ##

AC_OUTPUT(
... <list of files> ...
MYPROG/Makefile
... <list of files> ...
)

3) Modify dev/Makefile.am to add MYPROG to the MRISUBDIRS or MRISSUBDIRS definition. (You can also alternatively add it to the end of any of the *SUBDIRS categories.)

## Makefile.am ##

MRISUBDIRS= \
... <list of files> ...
MYPROG \
... <list of files> ...

4) Copy dev/dummy/Makefile.am into MYPROG/ and customize it, replacing 'dummy' with 'MYPROG'. Be sure to change:

bin_PROGRAMS = MYPROG

and also delete the notes that are there.

5. Installing

To install all binaries and support files into your private FreeSurfer, use 'make install' from the toplevel dev/ directory, like this:

cd dev
make install

This will make a directory called freesurfer/ in the directory specified by the --prefix option to configure, above. Note that if you do not specify this location, it will try to install to /usr/local, which you probably don't have permission to do. Even if you do, i.e. you are installing on a laptop, it's generally better to specify a prefix of /usr/local/freesurfer to keep everything in the same place.

Note that you can also run 'make release'. 'make install' makes and installs the NMR internal version of FreeSurfer, while 'make release' makes the public version which omits some stuff.

The first time you run 'make install', it will take a while to copy all the big data files to the new installation. Subsequent 'make installs' will only copy the changed files.

If you only want to install a single binary, run 'make install' from a subdirectory. For example, running 'make install' from the scuba/ directory will copy the scuba binary and its support script files to the proper locations. Running 'make install' from scripts/ will copy all the necessary scripts to the right location.

6. Using CVS

When you want to commit your changes, use the cvs commit command. However, you must first check to see if the file(s) in the archive have changed since the last time you checked them out. To do so, run the cvs update command on the files you have changed. The -P option will purge (remove) files that have been removed from the CVS and the -d option will add any new directories that have been added since your last update (unsure why this isnt the default behavior).

cvs update -d -P

If any have changed, you will see the letter U followed by the file name.

U myFile.c

This means somebody else committed a newer version of the file, and your copy was just updated.

If you and somebody else have made changes on the same file that conflict each other, you will see the letter C along with a message about the conflicts.

C myFile.c

If the message states the conflicts have been resolved, you don't have to worry: cvs has merged the differences properly. If it says it couldn't merge the differences, you need to open the file in question, search for the string >>>, and merge the differences yourself.

Once the up to date check has been performed, you can commit your changes. If you are in a directory and want to commit all the files in that directory that you have changed, just use:

cvs commit

This will commit changes in the current directory and any subdirectories. If you want to commit only certain files, use:

cvs commit <filename>

Or you can only commit the code in the current directory with the -l switch:

cvs commit -l

Each time, an editor will open and ask you to enter a log message. To bypass this, use the -m option and enter your log message on the command line:

cvs commit -m "some descriptive changelog comment" <filename>

A synonym for commit is ci, so you can just:

cvs ci -m "fixed stuff" <filename>

Periodically, you should update your working copy to be in sync with the archive. CVS will look at all your files and see if the ones in the archive are different. If so, it will update your copy. CVS will not delete local modifications you have made. To do this update:

cvs update -d -P

The -d switch adds any new directories and is not strictly necessary, but is a good habit, because if you don't use it you will update existing files but will now add new directories. The -P option purges directories of files that have been removed in the past.

Similarly, you can update an entire directory or a single file. To commit all the code in the current directory (code that has not been changed will not be commited):

cvs ci -m "fixed many things"

To restore an edited version to the version in the archive, either delete the file and cvs update, and the archive version will be copied to the local work area, or use the -C option to cvs update to replace your copy with one from the archive.

To add a new file to the archive, use the add command and then commit the file:

cvs add <filename>
cvs commit -m "added the file" <filename>

To remove a file, remove in cvs and locally (with the -f flag), and commit:

cvs remove -f <filename>
cvs commit -m "removed the file" <filename>

That covers most of the CVS commands you'll have to to use.

For more info on CVS, check out www.cvshome.org or the CVS man pages.

Summary:

check in a file

cvs commit

get newest versions. merges newer versions than the ones you had with your working versions.

cvs update -A

add a new file:

cvs add file; cvs commit file

remove a file (but keep in older revisions):

rm file; cvs remove file; cvs commit file

rename a file:

mv old new; cvs remove old; cvs add new; cvs commit old new

See also: CVS Branch and Tag Primer and CVS Keywords

See also: DevelopersGuide/CVSTips

7. Troubleshooting autoconf issues

Here's a list of common problems and solutions for autotools problems.

8. Martinos Center issues

see Martinos Center issues page

Note: On this page, there are also instructions on how commit messages can be sent to an additional person for documentation purposes, etc.

9. Coding Guide

This page deals specifically with coding issues.

CodingGuide

10. Docs and Testing

NewProgramDocAndTest

11. Developing for a Mac

Info can be found here.