* Don't commit directly, instead make a pull request on GitHub.


Building from git
-----------------

To build from git, or without relying on the generated files in a source
release, automake, autoconf, libtool, pkg-config and git must be installed.

(Note, the exact packages needed for certain distros may be found in
.travis.yml and appveyor.yml.)

Run

./bootstrap && ./configure --enable-relocatable

to set up and configure the source tree; optional configure arguments can be
supplied as normal.

See INSTALL (which is created by bootstrap) for instructions from this point
on.


Working in libenchant
---------------------

   When writing libenchant our priorities are

	1) Portable
	2) Maintainable & Documented
	3) Modular and well designed

    When you submit code for inclusion in libenchant, please keep those
things in mind.  While performance is important please note that
well-designed algorithms and data structures are fertile areas for
development; obfuscated code to make a loop 3% faster is not.  Specifically,
this means:

	- Clarity of design and function are paramount
	- Make sure your code does not generate warnings
	- Please follow the formatting style


Formatting style
----------------

   The formatting style of libenchant is a mix of various styles.  Please
familiarise yourself with the GNU coding standards (shipped with most
GNU/Linux systems as the standards.info file), then read the Linux
kernel coding standards and ignore Linus's jokes.  Then look at the
Gtk+ header files to get acquainted with how to write nice header files
that are almost self documenting.

   Emacs users should use the supplied .dir-locals.el.

   Remember: Use tabs for indentation: that will keep your
code honest as you will be forced to split your routines into more
modular chunks (as detailed by Linus). 
   
   On top of that, please:

	- Follow the Gtk+ cleanliness conventions for function
	  prototypes.

	- Follow the Gtk+ namespace convention for function names:
	  module_submodule_operation

	- Every entry point to a public routine should use the
	  g_return_if_fail and g_return_val_if_fail macros to verify
	  that the parameters passed are valid.

	- Under no circumstances use magic variables.  Use typedef
	  enum { ... } type; to create enumerations.  Do not use
	  integers to hold enumeration values: the compiler can help
	  catch various errors.

	- Use g_warning to mark spots that need to be reviewed or are
	  not finished.

	- Do not submit code that is just a temporary workaround for a
	  full fledged feature.  We do not want to maintain limited
	  features.  It is better to submit an implementation designed
	  to be expanded and enhanced, even if it is not completely
	  finished.

	- Follow the libenchant commenting style, which is not the Gtk
	  style;
		/* ie. use this for
		 * multi-line comments
		 */

   All of this is to ensure the libenchant code will be kept within
reasonable margins of maintainability for the future: Remember, in two years
you will probably be far too busy to maintain your own contributions, and they
might become a burden to the program maintainers.

   libenchant is intended to be a foundation for a various document-centric
projects.

   Cleaning code in libenchant is more important than trying not to break
existing code.  Code clean-ups are always welcome.


API documentation
-----------------

To generate API documentation, simply run

doxygen

and see doxygen/html/index.html in a web browser.


Making a release
----------------

To make a release, you'll need woger:

https://github.com/rrthomas/woger

and github-release, suitably configured:

https://github.com/aktau/github-release

Having tested and pushed all the changes, update the version number in
configure.ac and write the NEWS entry and push those too.

Then execute:

make release
