                         ------------------
                         Websh, Version 3.6
                         ------------------

            Copyright 1996-2001, Netcetera AG, Switzerland
	    Copyright 2001-2005, Apache Software Foundation.

                         All rights reserved.

      This software is distributed under the terms of the Apache
              Software License, available as "LICENSE".

                      Websh is available from

                    http://tcl.apache.org/websh/

Contents
--------

    1. Introduction
    2. Documentation
    3. Compiling and installing Websh (Unix)
    4. mod_websh: Websh as Apache Module (Unix)
    5. Compiling and installing Websh and mod_websh (Windows XP)
    6. Support


1. Introduction
---------------

Websh is a rapid development environment for building powerful and
reliable web applications. It is a standard Tcl extension and is
released as Open Source Software. Websh is versatile and handles
everything from HTML generation to data-base driven one-to-one page
customization. At Netcetera, we have been using it for years for
virtually all our customer projects, which typically are E-commerce
shops or electronic banking applications.

Websh was originally developed by Netcetera AG, Switzerland and was
contributed to the Apache Software Foundation in 2001.

Find more information about

- Apache:                      http://www.apache.org/
- Websh:                       http://tcl.apache.org/websh/
- Netcetera AG, Switzerland:   http://netcetera.ch/
- Tcl:                         http://tcl.tk/


2. Documentation
----------------

Documentation is available at

        http://tcl.apache.org/websh/


3. Compiling and installing Websh (Unix)
----------------------------------------

Please note that we use some GNU make extensions, so make sure that 
you try to compile Websh using a GNU version of make (or gmake) when
compiling under UNIX.

Websh is a pure Tcl extension, Tk is not required. You need
Tcl8.3 or newer to compile and install Websh 3.6.

typically:

  cd unix
  autoconf
  ./configure
  make
  make test
  make apachetest
  make install

Make will create three targets: websh3.6.<patch>, which is the standalone 
Websh application (dynamically linked to Tcl and libwebsh3.6.<patch>.so)
and libwebsh3.6.<patch>.so, which is a TEA (Tcl Extension Architecture)
compliant shared object that can be dynamically loaded from within Tcl
using [load libwebsh3.6.<patch>.so]. Both provide the Tcl package
websh. The third target is  mod_websh3.6.<patch>.so (also dynamically
linked to Tcl and libwebsh3.6.<patch>.so), which is the Websh Apache
module.

If you have several versions of Tcl and Apache installed on your system,
you might want to specify which one should be used for Websh, e.g.

  ./configure --with-tcl=/usr/local/tcl8.4.19 \
      --with-httpdinclude=/usr/local/httpd-2.0.63/include

Note that to compile mod_websh for Apache 2, the corresponding Tcl
library must be compiled using threads and threads should be enabled
for Websh:

  ./configure --enable-threads

By default, Websh is installed to /usr/local
To change this location, provide the --prefix option to configure:

  ./configure --prefix=/opt


4. mod_websh: Websh as Apache Module
------------------------------------

Websh applications can both run in CGI mode and in mod_websh, the
module for Apache 1.3 to Apache 2.2. In order to build mod_websh,
you have to use the following configure option:

  --with-httpdinclude=/path/to/apache/header/files

For Apache 2, you need to enable threads additionally:

  --enable-threads

After this,

  make mod_websh.so

will compile and build mod_websh. Note that mod_websh3.6.<patch>.so will
also be compiled by default when 'make all' is invoked.

In order to use mod_websh in your Apache web server, please refer
to the file doc/mod_websh/README

A sample setup to serve SSI-type HTML with Websh-snipplets and CGI-type
scripts is found in doc/mod_websh and will be installed with the 
'make install' command.


5. Compiling and installing Websh and mod_websh (Windows XP)
------------------------------------------------------------

Websh currently provides a Makefile for Microsoft Visual Studio 6.0 nmake.

Please refer to the file src/win/README for details.


6. Support
----------

For support please try the following mailing list on tcl.apache.org:

  websh-user@tcl.apache.org

You may subscribe by sending mail to websh-user-subscribe@tcl.apache.org.

If you would like to contribute to websh, please subscribe to:

  websh-dev@tcl.apache.org

by sending mail to websh-dev-subscribe@tcl.apache.org.

In addition, Netcetera is committed to provide additional support for Websh.

You can reach us at

  support@websh.com

and

  info@websh.com


== Thank you for your interest in Websh ==

@(#) $Id$
