## This is a template for settings which are useful to be
## overridden in a developer specific property files.
## Copy this to build-local.properties, uncomment and change
## properties which should be overridden.
## The file buil-local.properties is not stored in the code
## repository and ignored for file adds.

## ===================================================================
## 1. Path settings

## All Jars from the optional lib directory are added used for
## compilation and JUnit tests. Put your jars for additional
## dependencies and tools here.
# optional.lib.dir = /home/bart/java/lib

## Checkstyle home directory. This is meant to be the top level of the
## checkstyle binary distribution.
# checkstyle.home.dir = /home/bart/stuff/checkstyle-4.0-beta6

## ===================================================================
## 2. Switches for common tasks

## Javac switches
# javac.debug = on
# javac.optimize = off
# javac.deprecation = on
# javac.source = 1.4
# javac.target = 1.4
# javac.fork = on

## JUnit task switches
# junit.fork = on

## Packages to produce javadoc.
## Add packages for FOP extensions if necessary.
# javadoc.packages = org.apache.fop.*,fopextension.*

## ===================================================================
## 3. FOP specific properties

## Specify an alternate file that contains a list of disabled layout
## engine tests.
# layoutengine.disabled = test/layoutengine/disabled-testcases.txt

## Specify an alternate directory to scan for user supplied
## hyphenation pattern files and Unicode data files.
# user.hyph.dir = /home/bart/offo
# unidata.dir = /usr/share/doc/Unicode/UNIDATA
