\ No newline at end of file
diff --git a/alliance/src/attila/doc/attila/man_attila.html b/alliance/src/attila/doc/attila/man_attila.html
new file mode 100644
index 00000000..23ae1b37
--- /dev/null
+++ b/alliance/src/attila/doc/attila/man_attila.html
@@ -0,0 +1,1068 @@
+
+attila
attila automates the process of compiling
+ and installing one or more Alliance tools. The
+ tool can be installed either in the user's account (during the
+ devellopment stage) or in the Alliance system
+ wide tree (for instance /asim/alliance) when a
+ new version is made avalaible to all.
+
attila proceed with the following
+ steps :
+
Checks if the sources of tools are present in the
+ user's account. If not, check them out from the
+ Alliance CVS tree. Note that you must
+ have access to it.
+
In case of --asim
+ or --full installations,
+ attila will fork itself on one Linux
+ computer (currently bip) and on one Solaris
+ computer (beny). As to connect on thoses
+ computer it will uses rsh so you must setup
+ your ~/.rhosts to access them whithout
+ passwords. You also can uses ssh (but the
+ procedure to allow automatic login is more complicated).
+
Run configure in the build
+ directory (see below).
+
Install the tool in the local install directory (see below)
+ or in the system-wide Alliance directory
+ rooted under /asim/alliance.
+
+
After an --asim install
the build directory tree of the tool will be removed to
+ avoid messing with further local installations.
+
+
Directory Structure
attila relies on the following tree
+ structure : (all paths below are given relative to the user's
+ home directory)
+
~/alliance/src where the tools sources
+ are to be found.
+
~/alliance/Linux/build/$TOOL : the top
+ directory under which the tool will be compiled for Linux.
+ This is where the configure script will be run.
+
~/alliance/Linux/install : the top of
+ the install tree when the tool is compiled locally for Linux.
+ Under this directory you will found (at least) :
+ ./bin,
+ ./lib and ./include.
+
~/alliance/Solaris/build/$TOOL :
+ the tool's build directory for Solaris.
+
~/alliance/Solaris/install : top of the
+ local install tree for Solaris.
+
+
CVS checkout
If the sources of the requested tool(s) are not found under
+ ~/alliance/src/attila will
+ try to check them out. So, as says above, you must have access
+ rights to the Alliance CVS tree.
+
In addition to the tool(s) sources, it will also checks for
+ the minimal set of files needed for configure to
+ run. As for now :
+
autostuff
alliance.m4
motif.m4
Makefile.am
+
Guessing CVSROOT
The root of the CVS tree will be set according to the
+ following rules :
+
Uses the user's environment variable
+ CVSROOT if sets.
+
Uses the attila default value
+ sets in attila.conf (variable
+ ATTILA_CVSROOT).
+
+
Guessing ALLIANCE_TOP
The root of the Alliance installed distribution
+ tree will be set according to the following rules :
+
Uses the user's environment variable
+ ALLIANCE_TOP if sets.
+
Uses the attila default value
+ sets in attila itself (variable
+ ATTILA_ALLIANCE_TOP).
+
ALLIANCE_TOP
is set in attila itself because its value
+ is a prerequisite to load the configuration file
+ attila.conf which is in the directory
+ $ALLIANCE_TOP/etc/.
+
+
Arguments
attila accepts the followings arguments :
+
-h, --help :
+ print help.
+
-S, --ssh :
+ uses ssh instead of rsh to
+ connect to the remote computers (in case of
+ --asim or --full).
+
-U, --user :
+ perform a local installation.
+
-F, --full :
+ install for all avalaibles architectures (currently Linux and
+ Solaris).
+
-A, --asim :
+ install in the system-wide directory
+ (/asim/alliance).
+
--prefix=INSTALL_DIR :
+ override the default installation directory.
+
--builddir=BUILD_DIR :
+ override the default building directory.
+
--tool=name1 :
+ name of the tool to be installed.
+
+
Configuration file attila.conf
The configuration file is located in
+ $ALLIANCE_TOP/etc. This file is to be read by the
+ shshell. It sets up the
+ following variables :
+
LINUX_TARGET : the computer where to
+ compile for the Linux architecture (default bip).
+
LINUX_CC : the name or full path to
+ to the C compiler for Linux system
+ (default gcc3).
+
LINUX_CXX : the name or full path to
+ to the C++ compiler for Linux system
+ (default g++3).
+
SOLARIS_TARGET : the computer where to
+ compile for the Solaris architecture (default beny).
+
SOLARIS_CC : the name or full path to
+ to the C compiler for Solaris system
+ (default /usr/local/gcc-3.0.4/bin/g++3).
+
SOLARIS_CXX : the name or full path to
+ to the C++ compiler for Solaris system
+ (default /usr/local/gcc-3.0.4/bin/g++3).
+
ATTILA_CVSROOT : the root of the
+ Alliance CVS tree
+ (default /users/outil/alliance/cvsroot).
+
CVS_STARTUP_FILES : the minimal set of
+ files needed to run configure.
+
+
Examples
Compile & install nero tool on the local computer
+ (must be either a Linux or a Solaris one) :
+
$ attila --tool=nero
+
+
Compile & install nero tool for all architectures
+ (currently only Linux and Solaris are supported) :
+
$ attila --full --tool=nero
+
+
Compile & install nero tool in the system-wide
+ directory (a new version for everyone to use) :
+
$ attila --asim --tool=nero
+
+
Compile & install mbk the genlib
+ (the order is significant) in a row for a local install on the current
+ computer :
+
\ No newline at end of file
diff --git a/alliance/src/attila/doc/attila/ref_attila.html b/alliance/src/attila/doc/attila/ref_attila.html
new file mode 100644
index 00000000..68efbc7c
--- /dev/null
+++ b/alliance/src/attila/doc/attila/ref_attila.html
@@ -0,0 +1,161 @@
+
+Alliance - attila User's Manual
\ No newline at end of file
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/caution.gif b/alliance/src/attila/doc/attila/stylesheet-images/caution.gif
new file mode 100644
index 00000000..9cc2e155
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/caution.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/home.gif b/alliance/src/attila/doc/attila/stylesheet-images/home.gif
new file mode 100644
index 00000000..55e1d599
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/home.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/important.gif b/alliance/src/attila/doc/attila/stylesheet-images/important.gif
new file mode 100644
index 00000000..25e40c76
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/important.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/next.gif b/alliance/src/attila/doc/attila/stylesheet-images/next.gif
new file mode 100644
index 00000000..8c502e74
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/next.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/note.gif b/alliance/src/attila/doc/attila/stylesheet-images/note.gif
new file mode 100644
index 00000000..7322e8e4
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/note.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/prev.gif b/alliance/src/attila/doc/attila/stylesheet-images/prev.gif
new file mode 100644
index 00000000..0894d9ec
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/prev.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/tip.gif b/alliance/src/attila/doc/attila/stylesheet-images/tip.gif
new file mode 100644
index 00000000..f062955f
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/tip.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/toc-blank.gif b/alliance/src/attila/doc/attila/stylesheet-images/toc-blank.gif
new file mode 100644
index 00000000..6c65e3a1
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/toc-blank.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/toc-minus.gif b/alliance/src/attila/doc/attila/stylesheet-images/toc-minus.gif
new file mode 100644
index 00000000..40ebe61e
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/toc-minus.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/toc-plus.gif b/alliance/src/attila/doc/attila/stylesheet-images/toc-plus.gif
new file mode 100644
index 00000000..3e9e7d55
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/toc-plus.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/up.gif b/alliance/src/attila/doc/attila/stylesheet-images/up.gif
new file mode 100644
index 00000000..e899a272
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/up.gif differ
diff --git a/alliance/src/attila/doc/attila/stylesheet-images/warning.gif b/alliance/src/attila/doc/attila/stylesheet-images/warning.gif
new file mode 100644
index 00000000..a5870799
Binary files /dev/null and b/alliance/src/attila/doc/attila/stylesheet-images/warning.gif differ
diff --git a/alliance/src/attila/doc/builddoc.sh b/alliance/src/attila/doc/builddoc.sh
new file mode 100755
index 00000000..4d1cf63a
--- /dev/null
+++ b/alliance/src/attila/doc/builddoc.sh
@@ -0,0 +1,119 @@
+#!/bin/sh
+
+
+ LOG="builddoc.log"
+ TOOL="attila"
+ SGML_DOC="$TOOL.sgm"
+
+
+ detect_fail ()
+ {
+ echo "" >&2
+ echo "builddoc.sh ERROR:" >&2
+ echo "" >&2
+ echo " Cannot find \"$1\"." >&2
+ echo "" >&2
+ echo " Please check that DocBook is installed on your system." >&2
+ echo "" >&2
+
+ exit 1
+ }
+
+
+ detect ()
+ {
+ STR="`which $1 2> /dev/null`"
+
+ if [ -z "$STR" ]; then detect_fail "$1"; fi
+
+ echo "$STR"
+ }
+
+
+ DB2MAN=`detect docbook2man`
+ DB2PDF=`detect db2pdf`
+ DB2HTML=`detect db2html`
+
+
+ rm -f $LOG
+
+
+ echo ""
+ echo " o Building MAN pages..."
+ $DB2MAN $SGML_DOC > $LOG 2>&1
+ mv *.1 man1
+
+ echo " - Building Makefile.am for man1 subdir."
+ MAN_AM="Makefile.am-man"
+ echo "" > $MAN_AM
+ echo "" >> $MAN_AM
+ echo "man_MANS = \\" >> $MAN_AM
+ FILE_LIST=`(cd man1; find . -name \*.1 -exec echo {} \;)`
+ set $FILE_LIST
+ while [ $# -gt 0 ]; do
+ LINE=" $1"
+ if [ $# -gt 1 ]; then LINE="$LINE \\"; fi
+ echo "$LINE" >> $MAN_AM
+ shift
+ done
+ echo "" >> $MAN_AM
+ echo "EXTRA_DIST = \$(man_MANS)" >> $MAN_AM
+ mv $MAN_AM man1/Makefile.am
+
+
+ echo ""
+ echo " o Building HTML..."
+ if [ -d $TOOL ]; then
+ mv $TOOL/CVS ./CVS-$TOOL
+ mv $TOOL/stylesheet-images/CVS ./CVS-SS-$TOOL
+ fi
+
+ $DB2HTML $SGML_DOC >> $LOG 2>&1
+ if [ -d $TOOL.junk ]; then rm -r $TOOL.junk; fi
+
+ echo " - Building Makefile.am for html subdir."
+ DOC_AM="Makefile.am-doc"
+ echo "" > $DOC_AM
+ echo "" >> $DOC_AM
+ echo "pkghtmldir = \$(prefix)/doc/html/@PACKAGE@" >> $DOC_AM
+ echo "pkghtml_DATA = \\" >> $DOC_AM
+ FILE_LIST=`(cd $TOOL; find . -name \*.html -exec echo {} \;)`
+ set $FILE_LIST
+ while [ $# -gt 0 ]; do
+ LINE=" $1"
+ if [ $# -gt 1 ]; then LINE="$LINE \\"; fi
+ echo "$LINE" >> $DOC_AM
+ shift
+ done
+ echo "" >> $DOC_AM
+ echo "EXTRA_DIST = \$(pkghtml_DATA)" >> $DOC_AM
+ mv $DOC_AM $TOOL/Makefile.am
+
+ if [ -f ./CVS-$TOOL ]; then
+ mv ./CVS-$TOOL $TOOL/CVS
+ mv ./CVS-SS-$TOOL $TOOL/stylesheet-images/CVS
+ fi
+
+
+ echo ""
+ echo " o Building PDF..."
+ $DB2PDF $SGML_DOC >> $LOG 2>&1
+
+ echo " - Building Makefile.am for doc dir."
+ DOC_AM="Makefile.am"
+ echo "" > $DOC_AM
+ echo "SUBDIRS = $TOOL" >> $DOC_AM
+ echo "" >> $DOC_AM
+ echo "pdfdir = \$(prefix)/doc/pdf" >> $DOC_AM
+ echo "pdf_DATA = $TOOL.pdf" >> $DOC_AM
+ echo "" >> $DOC_AM
+ echo "EXTRA_DIST = \$(pdf_DATA) \\" >> $DOC_AM
+ FILE_LIST=`find . -name \*.sgm -exec echo {} \;`
+ set $FILE_LIST
+ while [ $# -gt 0 ]; do
+ LINE=" $1"
+ if [ $# -gt 1 ]; then LINE="$LINE \\"; fi
+ echo "$LINE" >> $DOC_AM
+ shift
+ done
+ echo "" >> $DOC_AM
diff --git a/alliance/src/attila/doc/man1/Makefile.am b/alliance/src/attila/doc/man1/Makefile.am
new file mode 100644
index 00000000..6739b32d
--- /dev/null
+++ b/alliance/src/attila/doc/man1/Makefile.am
@@ -0,0 +1,6 @@
+
+
+man_MANS = \
+ ./attila.1
+
+EXTRA_DIST = $(man_MANS)
diff --git a/alliance/src/attila/doc/man1/attila.1 b/alliance/src/attila/doc/man1/attila.1
new file mode 100644
index 00000000..3bb24a91
--- /dev/null
+++ b/alliance/src/attila/doc/man1/attila.1
@@ -0,0 +1,260 @@
+.\\" auto-generated by docbook2man-spec $Revision: 1.1 $
+.TH "ATTILA" "1" "29 September 2002" "ASIM/LIP6" "Alliance - attila User's Manual"
+.SH NAME
+attila \- A Tool Installer
+.SH SYNOPSIS
+.sp
+\fBattila\fR [ \fB-h\fR ] [ \fB-S\fR ] [ \fB-U\fR ] [ \fB-F\fR ] [ \fB-A\fR ]
+ [ \fB--help\fR ] [ \fB--ssh\fR ] [ \fB--user\fR ] [ \fB--asim\fR ]
+ [ \fB--prefix=\fIINSTALL_DIR\fB\fR ] [ \fB--builddir=\fIBUILD_DIR\fB\fR ]
+ \fB--tool=\fIname1\fB\fR [ \fB--tool=\fIname2\fB\fR\fI...\fR ]
+.SH "DESCRIPTION"
+.PP
+attila automates the process of compiling
+and installing one or more \fBAlliance\fR tools. The
+tool can be installed either in the user's account (during the
+devellopment stage) or in the \fBAlliance\fR system
+wide tree (for instance /asim/alliance) when a
+new version is made avalaible to all.
+.PP
+attila proceed with the following
+steps\ :
+.IP 1.
+Checks if the sources of tools are present in the
+user's account. If not, check them out from the
+\fBAlliance\fR CVS tree. Note that you must
+have access to it.
+.IP 2.
+In case of \fB--asim\fR
+or \fB--full\fR installations,
+attila will fork itself on one Linux
+computer (currently bip) and on one Solaris
+computer (beny). As to connect on thoses
+computer it will uses rsh so you must setup
+your ~/.rhosts to access them whithout
+passwords. You also can uses ssh (but the
+procedure to allow automatic login is more complicated).
+.IP 3.
+Run configure in the build
+directory (see below).
+.IP 4.
+Install the tool in the local install directory (see below)
+or in the system-wide \fBAlliance\fR directory
+rooted under /asim/alliance.
+.PP
+.sp
+.RS
+.B "After an --asim install:"
+the build directory tree of the tool will be removed to
+avoid messing with further local installations.
+.PP
+.RE
+.sp
+.SS "DIRECTORY STRUCTURE"
+.PP
+attila relies on the following tree
+structure\ : (all paths below are given relative to the user's
+home directory)
+.TP 0.2i
+\(bu
+~/alliance/src where the tools sources
+are to be found.
+.TP 0.2i
+\(bu
+~/alliance/Linux/build/$TOOL : the top
+directory under which the tool will be compiled for Linux.
+This is where the configure script will be run.
+.TP 0.2i
+\(bu
+~/alliance/Linux/install : the top of
+the install tree when the tool is compiled locally for Linux.
+Under this directory you will found (at least)\ :
+\&./bin,
+\&./lib and ./include.
+.TP 0.2i
+\(bu
+~/alliance/Solaris/build/$TOOL :
+the tool's build directory for Solaris.
+.TP 0.2i
+\(bu
+~/alliance/Solaris/install : top of the
+local install tree for Solaris.
+.PP
+.SS "CVS CHECKOUT"
+.PP
+If the sources of the requested tool(s) are not found under
+~/alliance/src/ attila will
+try to check them out. So, as says above, you must have access
+rights to the \fBAlliance\fR CVS tree.
+.PP
+In addition to the tool(s) sources, it will also checks for
+the minimal set of files needed for configure to
+run. As for now\ :
+.TP 0.2i
+\(bu
+autostuff
+.TP 0.2i
+\(bu
+alliance.m4
+.TP 0.2i
+\(bu
+motif.m4
+.TP 0.2i
+\(bu
+Makefile.am
+.PP
+.SS "GUESSING CVSROOT"
+.PP
+The root of the CVS tree will be set according to the
+following rules\ :
+.IP 1.
+Uses the user's environment variable
+CVSROOT if sets.
+.IP 2.
+Uses the attila default value
+sets in attila.conf (variable
+ATTILA_CVSROOT).
+.PP
+.SH "GUESSING ALLIANCE_TOP"
+.PP
+The root of the Alliance installed distribution
+tree will be set according to the following rules\ :
+.IP 1.
+Uses the user's environment variable
+ALLIANCE_TOP if sets.
+.IP 2.
+Uses the attila default value
+sets in attila itself (variable
+ATTILA_ALLIANCE_TOP).
+.sp
+.RS
+.B "ALLIANCE_TOP:"
+is set in attila itself because its value
+is a prerequisite to load the configuration file
+attila.conf which is in the directory
+$ALLIANCE_TOP/etc/.
+.RE
+.sp
+.PP
+.SH "ARGUMENTS"
+.PP
+attila accepts the followings arguments\ :
+.TP 0.2i
+\(bu
+\fB-h\fR, \fB--help\fR\ :
+print help.
+.TP 0.2i
+\(bu
+\fB-S\fR, \fB--ssh\fR\ :
+uses ssh instead of rsh to
+connect to the remote computers (in case of
+\fB--asim\fR or \fB--full\fR).
+.TP 0.2i
+\(bu
+\fB-U\fR, \fB--user\fR\ :
+perform a local installation.
+.TP 0.2i
+\(bu
+\fB-F\fR, \fB--full\fR\ :
+install for all avalaibles architectures (currently Linux and
+Solaris).
+.TP 0.2i
+\(bu
+\fB-A\fR, \fB--asim\fR\ :
+install in the system-wide directory
+(/asim/alliance).
+.TP 0.2i
+\(bu
+\fB--prefix=\fIINSTALL_DIR\fB\fR\ :
+override the default installation directory.
+.TP 0.2i
+\(bu
+\fB--builddir=\fIBUILD_DIR\fB\fR\ :
+override the default building directory.
+.TP 0.2i
+\(bu
+\fB--tool=\fIname1\fB\fR\ :
+name of the tool to be installed.
+.PP
+.SH "CONFIGURATION FILE ATTILA.CONF"
+.PP
+The configuration file is located in
+$ALLIANCE_TOP/etc. This file is to be read by the
+sh \fBshell\fR. It sets up the
+following variables\ :
+.TP 0.2i
+\(bu
+\fBLINUX_TARGET\fR : the computer where to
+compile for the Linux architecture (default bip).
+.TP 0.2i
+\(bu
+\fBLINUX_CC\fR : the name or full path to
+to the C compiler for Linux system
+(default gcc3).
+.TP 0.2i
+\(bu
+\fBLINUX_CXX\fR : the name or full path to
+to the C++ compiler for Linux system
+(default g++3).
+.TP 0.2i
+\(bu
+\fBSOLARIS_TARGET\fR : the computer where to
+compile for the Solaris architecture (default beny).
+.TP 0.2i
+\(bu
+\fBSOLARIS_CC\fR : the name or full path to
+to the C compiler for Solaris system
+(default /usr/local/gcc-3.0.4/bin/g++3).
+.TP 0.2i
+\(bu
+\fBSOLARIS_CXX\fR : the name or full path to
+to the C++ compiler for Solaris system
+(default /usr/local/gcc-3.0.4/bin/g++3).
+.TP 0.2i
+\(bu
+\fBATTILA_CVSROOT\fR : the root of the
+\fBAlliance\fR CVS tree
+(default /users/outil/alliance/cvsroot).
+.TP 0.2i
+\(bu
+\fBCVS_STARTUP_FILES\fR : the minimal set of
+files needed to run configure.
+.PP
+.SH "EXAMPLES"
+.PP
+Compile & install nero tool on the local computer
+(must be either a Linux or a Solaris one) :
+.sp
+.nf
+$ \fBattila --tool=nero\fR
+
+.sp
+.fi
+.PP
+Compile & install nero tool for all architectures
+(currently only Linux and Solaris are supported)\ :
+.sp
+.nf
+$ \fBattila --full --tool=nero\fR
+
+.sp
+.fi
+.PP
+Compile & install nero tool in the system-wide
+directory (a new version for everyone to use)\ :
+.sp
+.nf
+$ \fBattila --asim --tool=nero\fR
+
+.sp
+.fi
+.PP
+Compile & install mbk the genlib
+(the order is significant) in a row for a local install on the current
+computer\ :
+.sp
+.nf
+$ \fBattila --tool=mbk --tool=genlib\fR
+
+.sp
+.fi
diff --git a/alliance/src/attila/doc/man_attila.sgm b/alliance/src/attila/doc/man_attila.sgm
new file mode 100644
index 00000000..0bbdb63d
--- /dev/null
+++ b/alliance/src/attila/doc/man_attila.sgm
@@ -0,0 +1,364 @@
+
+
+
+
+
+
+ attila
+ 1
+ ASIM/LIP6
+
+
+
+ attila
+ A Tool Installer
+
+
+
+
+
+ attila
+ -h
+ -S
+ -U
+ -F
+ -A
+
+ --help
+ --ssh
+ --user
+ --asim
+
+ --prefix=INSTALL_DIR
+ --builddir=BUILD_DIR
+
+ --tool=name1
+ --tool=name2
+
+
+
+
+ Description
+
+ attila automates the process of compiling
+ and installing one or more Alliance tools. The
+ tool can be installed either in the user's account (during the
+ devellopment stage) or in the Alliance system
+ wide tree (for instance /asim/alliance) when a
+ new version is made avalaible to all.
+
+ attila proceed with the following
+ steps :
+
+
+ Checks if the sources of tools are present in the
+ user's account. If not, check them out from the
+ Alliance CVS tree. Note that you must
+ have access to it.
+
+
+
+ In case of --asim
+ or --full installations,
+ attila will fork itself on one Linux
+ computer (currently bip) and on one Solaris
+ computer (beny). As to connect on thoses
+ computer it will uses rsh so you must setup
+ your ~/.rhosts to access them whithout
+ passwords. You also can uses ssh (but the
+ procedure to allow automatic login is more complicated).
+
+
+
+ Run configure in the build
+ directory (see below).
+
+
+
+ Install the tool in the local install directory (see below)
+ or in the system-wide Alliance directory
+ rooted under /asim/alliance.
+
+
+
+
+ After an --asim install
+ the build directory tree of the tool will be removed to
+ avoid messing with further local installations.
+
+
+
+
+
+ Directory Structure
+
+ attila relies on the following tree
+ structure : (all paths below are given relative to the user's
+ home directory)
+
+
+ ~/alliance/src where the tools sources
+ are to be found.
+
+
+
+ ~/alliance/Linux/build/$TOOL : the top
+ directory under which the tool will be compiled for Linux.
+ This is where the configure script will be run.
+
+
+
+ ~/alliance/Linux/install : the top of
+ the install tree when the tool is compiled locally for Linux.
+ Under this directory you will found (at least) :
+ ./bin,
+ ./lib and ./include.
+
+
+
+ ~/alliance/Solaris/build/$TOOL :
+ the tool's build directory for Solaris.
+
+
+
+ ~/alliance/Solaris/install : top of the
+ local install tree for Solaris.
+
+
+
+
+
+
+
+
+ CVS checkout
+
+ If the sources of the requested tool(s) are not found under
+ ~/alliance/src/attila will
+ try to check them out. So, as says above, you must have access
+ rights to the Alliance CVS tree.
+
+ In addition to the tool(s) sources, it will also checks for
+ the minimal set of files needed for configure to
+ run. As for now :
+
+
+ autostuff
+
+
+ alliance.m4
+
+
+ motif.m4
+
+
+ Makefile.am
+
+
+
+
+
+
+
+ Guessing CVSROOT
+
+ The root of the CVS tree will be set according to the
+ following rules :
+
+
+ Uses the user's environment variable
+ CVSROOT if sets.
+
+
+
+ Uses the attila default value
+ sets in attila.conf (variable
+ ATTILA_CVSROOT).
+
+
+
+
+
+
+
+
+
+ Guessing ALLIANCE_TOP
+
+ The root of the Alliance installed distribution
+ tree will be set according to the following rules :
+
+
+ Uses the user's environment variable
+ ALLIANCE_TOP if sets.
+
+
+
+ Uses the attila default value
+ sets in attila itself (variable
+ ATTILA_ALLIANCE_TOP).
+
+
+ ALLIANCE_TOP
+ is set in attila itself because its value
+ is a prerequisite to load the configuration file
+ attila.conf which is in the directory
+ $ALLIANCE_TOP/etc/.
+
+
+
+
+
+
+
+
+
+ Arguments
+
+ attila accepts the followings arguments :
+
+
+ -h, --help :
+ print help.
+
+
+
+ -S, --ssh :
+ uses ssh instead of rsh to
+ connect to the remote computers (in case of
+ --asim or --full).
+
+
+
+ -U, --user :
+ perform a local installation.
+
+
+
+ -F, --full :
+ install for all avalaibles architectures (currently Linux and
+ Solaris).
+
+
+
+ -A, --asim :
+ install in the system-wide directory
+ (/asim/alliance).
+
+
+
+ --prefix=INSTALL_DIR :
+ override the default installation directory.
+
+
+
+ --builddir=BUILD_DIR :
+ override the default building directory.
+
+
+
+ --tool=name1 :
+ name of the tool to be installed.
+
+
+
+
+
+
+
+
+ Configuration file attila.conf
+
+ The configuration file is located in
+ $ALLIANCE_TOP/etc. This file is to be read by the
+ shshell. It sets up the
+ following variables :
+
+
+ LINUX_TARGET : the computer where to
+ compile for the Linux architecture (default bip).
+
+
+
+ LINUX_CC : the name or full path to
+ to the C compiler for Linux system
+ (default gcc3).
+
+
+
+ LINUX_CXX : the name or full path to
+ to the C++ compiler for Linux system
+ (default g++3).
+
+
+
+ SOLARIS_TARGET : the computer where to
+ compile for the Solaris architecture (default beny).
+
+
+
+ SOLARIS_CC : the name or full path to
+ to the C compiler for Solaris system
+ (default /usr/local/gcc-3.0.4/bin/g++3).
+
+
+
+ SOLARIS_CXX : the name or full path to
+ to the C++ compiler for Solaris system
+ (default /usr/local/gcc-3.0.4/bin/g++3).
+
+
+
+ ATTILA_CVSROOT : the root of the
+ Alliance CVS tree
+ (default /users/outil/alliance/cvsroot).
+
+
+
+ CVS_STARTUP_FILES : the minimal set of
+ files needed to run configure.
+
+
+
+
+
+
+
+
+
+ Examples
+
+
+ Compile & install nero tool on the local computer
+ (must be either a Linux or a Solaris one) :
+
+$ attila --tool=nero
+
+
+
+ Compile & install nero tool for all architectures
+ (currently only Linux and Solaris are supported) :
+
+$ attila --full --tool=nero
+
+
+
+ Compile & install nero tool in the system-wide
+ directory (a new version for everyone to use) :
+
+$ attila --asim --tool=nero
+
+
+
+ Compile & install mbk the genlib
+ (the order is significant) in a row for a local install on the current
+ computer :
+
+$ attila --tool=mbk --tool=genlib
+
+
+
+
+
+
+
diff --git a/alliance/src/attila/src/Makefile.am b/alliance/src/attila/src/Makefile.am
new file mode 100644
index 00000000..8d7cb491
--- /dev/null
+++ b/alliance/src/attila/src/Makefile.am
@@ -0,0 +1,10 @@
+AM_CFLAGS = @ALLIANCE_CFLAGS@
+
+bin_SCRIPTS = attila
+CLEANFILES = attila
+
+attila : ${srcdir}/attila.sh
+ ${SED} 's,__ALLIANCE_INSTALL_DIR__,$(prefix),' $< > $@
+ chmod a+x $@
+
+EXTRA_DIST = attila.sh
diff --git a/alliance/src/attila/src/attila.sh b/alliance/src/attila/src/attila.sh
new file mode 100755
index 00000000..f98268ef
--- /dev/null
+++ b/alliance/src/attila/src/attila.sh
@@ -0,0 +1,620 @@
+#!/bin/sh
+#
+# $Id: attila.sh,v 1.1 2002/09/29 17:55:54 jpc Exp $
+#
+# /------------------------------------------------------------------\
+# | |
+# | A l l i a n c e C A D S y s t e m |
+# | T o o l I n s t a l l e r |
+# | |
+# | Author : Jean-Paul CHAPUT |
+# | E-mail : alliance-support@asim.lip6.fr |
+# | ================================================================ |
+# | sh script : "./attila" |
+# | **************************************************************** |
+# | U p d a t e s |
+# | |
+# \------------------------------------------------------------------/
+#
+
+
+
+
+# /------------------------------------------------------------------\
+# | |
+# | Functions Definitions |
+# | |
+# \------------------------------------------------------------------/
+
+
+# --------------------------------------------------------------------
+# Function : `print_usage()'.
+
+ print_usage ()
+ {
+ echo ""
+ echo ""
+ echo "Usage : attila [-h] [-U] [-F] [-A] \\"
+ echo " [--help] [--user] [--full] [--asim] \\"
+ echo " [--prefix=] [--builddir=] \\"
+ echo " <--tool= [--tool= [...]]"
+ echo ""
+ echo "Options :"
+ echo " o [-h|--help] : Print this help."
+ echo " o [-U|--user] : Perform a \"USER\" compilation/installation."
+ echo " The tool(s) will be compiled then installed under the"
+ echo " directory given by the \"--prefix\" argument."
+ echo " o [-F|--full] : Compile/install the requested tool(s) for all"
+ echo " avalaibles architectures. Currently only Linux and Solaris"
+ echo " are supported."
+ echo " o [-A|--asim] : Install the tool(s) in the ASIM shared direc-"
+ echo " tory (aka \"\$ALLIANCE_TOP\"), this must be used to upgrade"
+ echo " a tool. This option implies \"--full\"."
+ echo " NOTE : it will erase any previous installed version of"
+ echo " the tool. The temporary build directory (--builddir) will"
+ echo " also be erased."
+ echo " o [--prefix=] : Override the default top directory"
+ echo " where the tool will be installed. By defaults tools are"
+ echo " installed under :"
+ echo " \"\$HOME/alliance/\$OS/install\"."
+ echo " o [--builddir=] : Override the default top directory"
+ echo " where the tool will be compiled. By defaults tools are"
+ echo " compiled under :"
+ echo " \"\$HOME/alliance/\$OS/build\"."
+ echo " o [--tool=] : The name of the tool to be processed, at"
+ echo " least one must be present."
+ echo ""
+ echo ""
+ }
+
+
+
+
+# --------------------------------------------------------------------
+# Function : `alc_banner()'.
+
+ alc_banner ()
+ {
+ echo ""
+ echo ""
+ echo " @ @ @@@@ "
+ echo " @ @ @ @@@ @@ "
+ echo " @@@ @@ @@ @ @@ "
+ echo " @@@ @@ @@ @@ @@@@ "
+ echo " @ @@ @@@@@@@@ @@@@@@@@ @@@@ @@ @@ @ "
+ echo " @ @@ @@ @@ @@ @@ @@ @@ "
+ echo " @ @@ @@ @@ @@ @@ @@@@@ "
+ echo " @@@@@@@ @@ @@ @@ @@ @@ @@ "
+ echo " @ @@ @@ @@ @@ @@ @@ @@ "
+ echo " @ @@ @@ @ @@ @ @@ @@ @@ @@@ "
+ echo " @@@@ @@@@ @@@@ @@@@ @@@@@@ @@@@@@ @@@@ @@"
+ echo ""
+ echo " A Tool for Install Alliance tools"
+ echo ""
+ echo " Alliance CAD System 5.0, attila 0.1"
+ echo " Copyright (c) 2002-2002, ASIM/LIP6/UPMC"
+ echo " E-mail support: alliance-support@asim.lip6.fr"
+ echo ""
+ echo ""
+ }
+
+
+
+# --------------------------------------------------------------------
+# Function : `find_self()'.
+#
+# Usage : find_self
+#
+# Return the absolute path of the binary, and if in case of self
+# install switch to the binary in "attila/src" (attila.sh).
+
+ find_self ()
+ {
+ PROG="$1"
+ TOOL="$2"
+
+ shift 2
+
+ # In case of self install, switch to the CVS script.
+ if [ "$TOOL" = "attila" ]; then
+ if [ "`basename $PROG`" != "attila.sh" ]; then
+ SELF="$HOME/alliance/src/attila/src/attila.sh"
+
+ if [ ! -x "$SELF" ]; then
+ echo "attila: Self install problem, cannot find source file :"
+ echo " \"$SELF\""
+ exit 1
+ else
+ echo " o Self installing, switching to :"
+ echo " $SELF"
+ exec -a "$SELF" "$SELF" $*
+ fi
+ fi
+ fi
+
+ # Installing a normal tool, normalise our path.
+ # Needed in case of recursive call on other computer (ASIM install).
+ CALL_DIR=`echo "$PROG" | sed 's,/[^/]*$,,'`
+ REAL_DIR=`(cd $CALL_DIR; pwd)`
+
+ SELF="$REAL_DIR/`basename $PROG`"
+ }
+
+
+
+# --------------------------------------------------------------------
+# Function : `guess_os()'.
+
+ guess_os ()
+ {
+ case "`uname -sr`" in
+ Linux*) echo "Linux";;
+ SunOS\ 5*) echo "Solaris";;
+ *) echo "`uname -sr`";;
+ esac
+ }
+
+
+
+
+# --------------------------------------------------------------------
+# Function : `guess_gcc()'.
+
+ guess_gcc ()
+ {
+ case "$1" in
+ "Linux") if which gcc3 > /dev/null 2>&1; then
+ CXX=g++3
+ CC=gcc3
+ fi
+ ;;
+ "Solaris") if [ -x /usr/local/gcc-3.0.4/bin/gcc ]; then
+ CXX=/usr/local/gcc-3.0.4/bin/g++
+ CC=/usr/local/gcc-3.0.4/bin/gcc
+ fi
+ ;;
+ esac
+ }
+
+
+
+# --------------------------------------------------------------------
+# Function : `load_conf()'.
+#
+# The two ways to find ALLIANCE_TOP :
+#
+# 1. - In case of self install, blindly trust the user supplied
+# ALLIANCE_TOP (user must supply it).
+#
+# 2. - Normal case (attila is installing any other tool) : try to
+# find ALLIANCE_TOP in the user environment. If not set, use
+# the attila install time default ATTILA_ALLIANCE_TOP.
+
+ load_conf ()
+ {
+ echo " o Loading configuration file."
+
+ if [ "$ATTILA_ALLIANCE_TOP" = "__ALLIANCE_INSTALL_DIR__" ]; then
+ if [ -z "$ALLIANCE_TOP" ]; then
+ echo "attila: \$ALLIANCE_TOP is not set. Please set it up by executing"
+ echo " in the current shell process \"alc_env.sh\" or \"acl_env.csh\"."
+ echo " (thoses scripts can be found under the /etc directory of"
+ echo " your Alliance installation)."
+
+ exit 1
+ fi
+
+ echo " - Skipped during self install."
+ else
+ if [ -z "$ALLIANCE_TOP" ]; then
+ ALLIANCE_TOP="$ATTILA_ALLIANCE_TOP"
+ fi
+
+ if [ ! -f "$ALLIANCE_TOP/etc/attila.conf" ]; then
+ echo "attila: \"$ALLIANCE_TOP/etc/attila.conf\" doesn't exist !"
+ echo " Please check \$ALLIANCE_TOP."
+
+ exit 1
+ fi
+ fi
+
+ if [ ! -d "$ALLIANCE_TOP/bin" ]; then
+ echo "attila: \"$ALLIANCE_TOP/bin\" doesn't exist !"
+ echo " Please check \$ALLIANCE_TOP."
+
+ exit 1
+ fi
+ }
+
+
+
+
+# --------------------------------------------------------------------
+# Function : `get_string()'.
+
+ get_string()
+ {
+ string=`echo $1 | cut -d '=' -f 2`
+
+ echo $string
+ }
+
+
+
+
+# --------------------------------------------------------------------
+# Function : `norm_dir()'.
+
+ norm_dir()
+ {
+ DIR="$2"
+
+ if [ -z "$DIR" ]; then
+ case "$1" in
+ "SRC") DIR="$HOME/alliance/src";;
+ "INSTALL") DIR="$HOME/alliance/$ALLIANCE_OS/install";;
+ *) DIR="$HOME/alliance/$ALLIANCE_OS/build" ;;
+ esac
+ fi
+
+ HEAD=`echo $DIR | cut -b 1`
+
+ if [ "$HEAD" != "/" ]; then
+ echo "$HOME/$DIR"
+ return
+ fi
+
+ echo "$DIR"
+ }
+
+
+
+
+# --------------------------------------------------------------------
+# Function : `make_dir()'.
+
+ make_dir()
+ {
+ mkdir -p $1
+ if [ $? -ne 0 ]; then exit 1; fi
+ }
+
+
+
+
+# --------------------------------------------------------------------
+# Function : `cvs_check()'.
+
+ cvs_check ()
+ {
+ echo " o Checking CVSROOT."
+
+ # Check the CVROOT variable.
+ if [ -z "$CVSROOT" ]; then
+ echo " - CVROOT is not set. Using defaut $ATTILA_CVSROOT."
+ CVSROOT="$ATTILA_CVSROOT"; export CVSROOT
+ else
+ echo " - Trusting user supplied \$CVSROOT ($CVSROOT)."
+ fi
+
+
+ # Check out minimal set of files if needed.
+ for file in $CVS_STARTUP_FILES; do
+ if [ ! -f $HOME/alliance/src/$file ]; then
+ cvs co alliance/src/$file
+ fi
+ done
+
+
+ # Checks for tools sources.
+ echo " o Checking tools sources."
+ for TOOL in $TOOLS; do
+ echo " - $HOME/alliance/src/$TOOL."
+
+ if [ ! -d $HOME/alliance/src/$TOOL ]; then
+ echo " > The tool directory $TOOL doesn't exist."
+ echo -n " > Do you want to check it out from the CVS tree ? [y]/n "
+
+ LOOP="y"
+ while [ "$LOOP" = "y" ]; do
+ read ANSWER
+ case "$ANSWER" in
+ "y"|"") ANSWER="y"; LOOP="n";;
+ "n") LOOP="n";;
+ *) echo -n " > ";;
+ esac
+ done
+
+ case "$ANSWER" in
+ "y") cvs co alliance/src/$TOOL;;
+ "n") exit 1;;
+ esac
+ fi
+ done
+
+ echo ""
+ }
+
+
+
+# --------------------------------------------------------------------
+# Function : `compile_tool()'.
+
+ compile_tool ()
+ {
+
+ # ----------------------------------------------------------------
+ # Check environment.
+
+ echo " o Compilation environment."
+
+ ALLIANCE_OS=`guess_os`
+ case "$ALLIANCE_OS" in
+ "Linux") MAKE="make";;
+ "Solaris") MAKE="gmake";;
+ *) echo "attila: \"$ALLIANCE_OS\" is not supported, only Linux & Solaris"
+ echo " are."
+
+ exit 1
+ esac
+ export MAKE
+
+ echo " - OS := $ALLIANCE_OS"
+ echo " - MAKE := $MAKE"
+
+ guess_gcc $ALLIANCE_OS
+ echo " - CC := $CC"
+ echo " - CXX := $CXX"
+
+
+ SRC_DIR=`norm_dir SRC "$SRC_DIR"`
+ BUILD_DIR=`norm_dir BUILD "$BUILD_DIR"`
+ INSTALL_DIR=`norm_dir INSTALL "$INSTALL_DIR"`
+
+
+ echo " o Loading Alliance environment."
+ if [ -f "$ALLIANCE_TOP/etc/alc_env.sh" ]; then
+ echo " - Using \"$ALLIANCE_TOP/etc/alc_env.sh\"."
+ . $ALLIANCE_TOP/etc/alc_env.sh
+ else
+ echo " - No \"$ALLIANCE_TOP/etc/alc_env.sh\" found, trusting user environment."
+ fi
+ echo ""
+
+
+ if [ "$ASIM" = "y" ]; then INSTALL_DIR="$ALLIANCE_TOP"; fi
+
+ echo " - SRC_DIR := $SRC_DIR"
+ echo " - BUILD_DIR := $BUILD_DIR"
+ echo " - INSTALL_DIR := $INSTALL_DIR"
+ echo ""
+
+
+
+
+ # ------------------------------------------------------------------
+ # Do the work.
+
+
+ cd $HOME/alliance/src
+ if [ ! -f $TOOL/Makefile.in ]; then
+ ./autostuff $TOOL
+ fi
+
+ if [ "$ASIM" = "y" ]; then
+ echo " o For ASIM install, removing $BUILD_DIR"
+ for TOOL in $TOOLS; do
+ echo " - $BUILD_DIR/$TOOL."
+ rm -rf $BUILD_DIR/$TOOL
+ done
+ fi
+
+ if [ ! -d $BUILD_DIR ]; then
+ echo " o Creating build directory $BUILD_DIR"
+ make_dir $BUILD_DIR
+ fi
+
+ if [ "$ASIM" != "y" ]; then
+ if [ ! -d $INSTALL_DIR ]; then
+ echo " o Creating local install directory $INSTALL_DIR"
+ make_dir $INSTALL_DIR
+ fi
+ fi
+
+ echo " o Building & installing requested tools."
+ for TOOL in $TOOLS; do
+ cd $BUILD_DIR
+ if [ ! -d $TOOL ]; then
+ echo " - Creating $TOOL directory."
+ make_dir $TOOL
+ fi
+ cd $TOOL
+
+ $SRC_DIR/$TOOL/configure --prefix=$INSTALL_DIR
+ $MAKE prefix=$INSTALL_DIR install
+
+ cd ..
+ if [ "$ASIM" = "y" ]; then
+ echo " o After an ASIM install, removing $BUILD_DIR"
+ echo " - $BUILD_DIR/$TOOL"
+ rm -rf $BUILD_DIR/$TOOL
+ fi
+ done
+ }
+
+
+
+
+# /------------------------------------------------------------------\
+# | |
+# | Main Part of the Shell Script |
+# | |
+# \------------------------------------------------------------------/
+
+
+ ATTILA_ALLIANCE_TOP="__ALLIANCE_INSTALL_DIR__"
+
+
+# --------------------------------------------------------------------
+# Variables sets in "attila.conf".
+
+
+ CVS_STARTUP_FILES=""
+
+ LINUX_TARGET="bip"
+ LINUX_CC="gcc3"
+ LINUX_CXX="g++3"
+
+ SOLARIS_TARGET="beny"
+ SOLARIS_CC="/usr/local/gcc-3.0.4/bin/gcc3"
+ SOLARIS_CXX="/usr/local/gcc-3.0.4/bin/g++3"
+
+
+# --------------------------------------------------------------------
+# Internal variables.
+
+
+ CC=gcc
+ CXX=g++
+ export CC CXX
+
+ RSH="rsh"
+
+ SRC_DIR="alliance/src"
+ BUILD_DIR=""
+ INSTALL_DIR=""
+
+
+
+ TOOLS=""
+
+ ASIM="n"
+ FULL="n"
+ AUTO="n"
+ SELF="$0"
+
+
+
+
+# --------------------------------------------------------------------
+# Process the command line.
+
+
+# Print the banner.
+ alc_banner
+
+
+ if [ $# -eq 0 ]; then
+ print_usage
+ exit 0
+ fi
+
+
+ COMMAND_LINE=""
+
+ while [ $# -gt 0 ]; do
+ case $1 in
+ # Long arguments.
+ --help) print_help;
+ exit 0;;
+ --ssh) RSH="ssh";;
+ --user) ASIM="n";;
+ --full) FULL="y";;
+ --asim) ASIM="y"; FULL="y";;
+ --asim-noloop) ASIM="y";;
+ --prefix=*) INSTALL_DIR=`get_string $1`
+ if [ $? -ne 0 ]; then
+ echo -n "attila: Bad directory in argument \"$1\"."
+ print_usage
+ exit 1
+ fi;;
+ --builddir=*) BUILD_DIR=`get_string $1`
+ if [ $? -ne 0 ]; then
+ echo -n "attila: Bad directory in argument \"$1\"."
+ print_usage
+ exit 1
+ fi;;
+ --tool=*) TOOL=`get_string $1`
+ if [ "$TOOL" = "attila" ]; then AUTO="attila"; fi
+
+ TOOLS="$TOOLS $TOOL"
+ if [ $? -ne 0 ]; then
+ echo -n "attila: Bad tool name in argument \"$1\"."
+ print_usage
+ exit 1
+ fi;;
+
+ # Short arguments.
+ -*) SHORTS="$1"; NB=2; CH=`echo $SHORTS | cut -c$NB`
+
+ while [ "$CH" != "" ]; do
+ case $CH in
+ h) print_usage; exit 0;;
+ S) RSH="ssh";;
+ U) ASIM="n";;
+ F) FULL="y";;
+ A) ASIM="n"; FULL="y";;
+
+ *) echo "attila:error: Invalid option \`$CH'."
+ print_usage; exit 1;;
+ esac
+
+ NB=`expr $NB + 1`
+ CH=`echo $SHORTS | cut -c$NB`
+ done;;
+ esac
+
+ COMMAND_LINE="$COMMAND_LINE $1"
+
+ shift
+ done
+
+
+ if [ -z "$TOOLS" ]; then
+ echo "attila:error: At least one \"--tool=\" argument is required."
+ print_usage; exit 1
+ fi
+
+
+ if [ ! -z "$INSTALL_DIR" ]; then
+ INSTALL_DIR=`echo $INSTALL_DIR | sed "s,^$HOME/,,"`
+ fi
+
+ if [ ! -z "$BUILD_DIR" ]; then
+ BUILD_DIR=`echo $BUILD_DIR | sed "s,^$HOME/,,"`
+ fi
+
+
+# --------------------------------------------------------------------
+# Do the work.
+
+ find_self "$0" "$AUTO" $COMMAND_LINE
+
+ load_conf
+
+ cvs_check
+
+if [ "$FULL" = "y" ]; then
+ # Recursive call.
+ ARGS=""
+ if [ ! -z "$INSTALL_DIR" ]; then ARGS="$ARGS --prefix=$INSTALL_DIR"; fi
+ if [ ! -z "$BUILD_DIR" ]; then ARGS="$ARGS --builddir=$BUILD_DIR" ; fi
+ if [ "$ASIM" = "y" ]; then
+ ARGS="$ARGS --asim-noloop"
+ else
+ ARGS="$ARGS --user"
+ fi
+
+ for TOOL in $TOOLS; do
+ ARGS="$ARGS --tool=$TOOL"
+ done
+
+ ENVIRONMENT=""
+ ENVIRONMENT="$ENVIRONMENT ALLIANCE_TOP=$ALLIANCE_TOP; export ALLIANCE_TOP;"
+
+ $RSH $LINUX_TARGET "$ENVIRONMENT $SELF $ARGS"
+ $RSH $SOLARIS_TARGET ". /etc/profile; $ENVIRONMENT $SELF $ARGS"
+ else
+ # Out of recursion...
+ compile_tool
+ fi