Welcome to the 1.4.0 release of Apache Etch.

= What is Etch? =

Etch is a cross-platform, language- and transport-independent framework for
building and consuming network services. The Etch toolset includes a network
service description language, a compiler, and binding libraries for a variety
of programming languages. Etch is also transport-independent, allowing for a
variety of different transports to used based on need and circumstance. The
goal of Etch is to make it simple to define small, focused services that can
be easily accessed, combined, and deployed in a similar manner. With Etch,
service development and consumption becomes no more difficult than library
development and consumption.

= Online Help =

The jumping off point for Etch information and help is here:

  http://etch.apache.org

= Binary Distribution =

The top-level structure of the install image is:

  ChangeLog.txt
  DISCLAIMER.txt
  LICENSE.txt
  LICENSE_THIRD_PARTY.txt
  NOTICE.txt
  NOTICE_THIRD_PARTY.txt
  README.txt
  RELEASE_NOTES.txt
  bin/
  examples/
  lib/
  binding-c/
  binding-csharp/
  binding-java/
  uninst.exe (for windows use only)

Please take a moment to review the RELEASE_NOTES.txt, ChangeLog.txt and
LICENSE.txt files.

The Windows installer (apache-etch-1.4.0-setup.exe) has created a 
user environment variable (ETCH_HOME) which points to the Etch installation
directory. If you installed Etch using either

  apache-etch-1.4.0-windows-x86-bin.zip

or

  apache-etch-1.4.0-linux-x86-bin.tgz

you will want to create this environment variable yourself:

windows:
  set ETCH_HOME=C:\Program Files (x86)\Apache Software Foundation\apache-etch-1.4.0

*nix:
  export ETCH_HOME=/path/to/apache-etch-1.4.0

The bin directory has also been put on your path by the Windows installer. If
you are using the archives, you will need to do this yourself:

windows:
  PATH %PATH%;%ETCH_HOME%\bin

*nix:
  export PATH="$PATH:$ETCH_HOME/bin"

The bin/ directory contains a Windows bat script and a unix shell script.

You will also need to have a java runtime installed (later versions of sun jre
or jdk 1.5 or any version of 1.6 or later). A JAVA_HOME environment variable
should point to the installation directory of the java runtime. If you are going
to compile java source you will need the jdk.

After the installer has been run and the environment setup, at a windows
command line or shell prompt, you should be able to run the etch compiler and
see some basic output:

windows:
  C:\>etch -v
  Etch version is Apache Etch 1.4.0 (some build info)

unix:
  bash-3.2$ etch -v
  Etch version is Apache Etch 1.4.0 (some build info)

The lib directory contains the various jar files for the compiler and the Apache Velocity dependency jar:

  apache-etch-java-compiler-1.4.0.jar
  apache-etch-java-compiler-1.4.0-src.jar
  ...

The top level folders binding-c, binding-java and binding-csharp contain the language specific 
runtime libraries:

= Binding for Java =

binding-java is organized as follows:

  apache-etch-java-runtime-1.4.0-src.zip
  lib/
    apache-etch-java-runtime-1.4.0.jar

The generated java source from the etch compiler needs apache-etch-java-runtime-1.4.0.jar.
There is source code to go with it in apache-etch-java-runtime-1.4.0-src.zip.

= Binding for C# =

binding-csharp is organized as follows:

  apache-etch-csharp-runtime-1.4.0-src.zip
  lib/
    ApacheEtchCsharp.dll
    ApacheEtchCsharp.pdb

The generated c# source from the etch compiler needs ApacheEtchCsharp.dll
The C# (.NET 2.0 and later) ApacheEtchCsharp.dll should be added to any C# projects.
There is source code to go with it in apache-etch-csharp-runtime-1.4.0-src.zip.

= Binding for C =

binding-c is organized as follows:

  bin/
    apr-1-config		(on linux)
    apriconv			(on linux)
  include/
    [etch-*].h			(on win32)
    apr-1			(on linux)
  lib/
    etch.lib			(on win32)
    etch.pdb			(on win32)
    libetch.a			(on linux)
  extern/
    apr/
      bin/
        libapr-1.dll		(on win32)
        libapr-1.pdb		(on win32)
        libapriconv-1.dll	(on win32)
        libapriconv-1.pdb	(on win32)
      iconv/
        [iconv*]-stuff
      include/
        [apr-*].h
      lib/
        libapr-1.lib		(on win32)
	libapriconv-1.lib	(on win32)
	libapr-1.so		(on linux)
	libapriconv-1.so	(on linux)
  apache-etch-c-runtime-1.4.0-src.zip

Generated C source depends on the dlls/so/a/h files mentioned above. The best choice to 
build generated code using the c binding is cmake. You can use the examples/helloworld 
example as a reference. The C binding has external dependencies to the Apache Portable 
Runtime (APR). We ship dll/so/h for the apr in the extern folder. There is source code 
to go with it in apache-etch-c-runtime-1.4.0-src.zip

= Ant Plugin =

There is an ant plugin which you can use with ant 1.7.0 or later to invoke the
compiler as a task. It is documented on the wiki referenced above. You can also see examples 
of its usage in the build.xml files in the examples folder

= Maven =

If you are using maven, then you might want to install the Etch artifacts into
your local maven repository. There is a Windows bat script to do this in the
maven directory:

  etch-maven-install.bat

You need to have maven on your path when you run this script. The file
etch-java-runtime-1.4.0.jar will be installed into your local repository with
group "etch.etch", artifact id "etch-java-runtime", and version "1.4.0". You
may then reference Etch from your maven projects.

= Python and XML Bindings =

The source distribution includes code to support XML and python bindings, but
these bindings are not yet complete, and there is no build products associated
with those. They are mainly there to 1) capture the code contribution from
cisco systems, and 2) inspire any fence sitters, ah, helpers to jump in and
contribute.

= Examples =

Examples have been provided in the examples/ subdirectory. Start with the HelloWorld
example, it contains code for all three language bindings. There is a readme
file in each example's directory which explains how to build and run it.

= Tests =

Unit tests can be had by checking out the source code from the subversion
repository and performing a complete build:

  http://svn.apache.org/repos/asf/etch/releases/release-1.4.0

= Help =

For help, see the wiki or send email to user@etch.apache.org. See
RELEASE_NOTES.txt for specific information for this release.
