Salome HOME
Maintenance - Salome 3 porting - add tools to create c++ component and to build
[tools/hxx2salome.git] / scripts / SA_build
diff --git a/scripts/SA_build b/scripts/SA_build
new file mode 100755 (executable)
index 0000000..5c1328a
--- /dev/null
@@ -0,0 +1,346 @@
+#!/bin/bash
+#
+# Utility for building Salome Modules
+#
+# default directory containing sources. Look-up is performed first localy, then in this directory if present.
+SRC_ROOT_DIR=
+# default directory where you want to put build & install directories. alternative for -i option
+INSTALL_ROOT_DIR=
+# default building environment file. alternative to --environ= option
+ENVIRON_FILE=
+# Utilitaire de compilation Salome
+#
+
+usage()
+{
+    echo
+    echo Name : SA_build  -  build Salome modules
+    echo
+    echo "Description : Small utility that automate Salome components building."
+    echo "               -> call build_configure in source directories"
+    echo "               -> create build and install directories"
+    echo "               -> call configure, make, make install from build directories"
+    echo "               -> update environment file (only sh syntax is supported)"
+    echo
+    echo Usage :
+    echo
+    echo "  SA_build   [modulename(s)]  sourcename(s)  [ options ]"
+    echo
+    echo "     sourcename(s) are component's source directories and should end up by convention with _SRC"
+    echo "     modulename(s) are module directories that contain source directories"
+    echo
+    echo "    -> A look-up is done to find component's source directories - then building is done"
+    echo "        - modulenames are searched localy, then in SRC_ROOT_DIR"
+    echo "        - sourcename(s) are searched in modulename(s), or localy if no module name is specified"
+    echo "        - if no sourcename is entered, search for modulename_SRC"
+    echo
+    echo "Options :"
+    echo
+    echo "  --disable-debug : compilation without debug traces"
+    echo "  --batch         : compilation is done in batch mode - no prompting"
+    echo "  --environ=path  : set environment file to path (should be absolute)"
+    echo "  --install=path  : set install directory where module building is done (should be absolute)"
+    echo "  --compile-only -c  : no building - just compile by calling make && make install"
+    echo "  --local -l      : look for source directories localy - build and install localy"
+    echo "  --sources=src1,src2,...  : for specifying source directories that don't end up with _SRC"
+    echo 
+    echo
+    echo "Examples :"
+    echo
+    echo "  SA_build  KERNEL"
+    echo "    -> compilation of KERNEL/KERNEL_SRC"
+    echo "       build is done in KERNEL/KERNEL_BUILD"
+    echo "       install is done in KERNEL/KERNEL_INSTALL"
+    echo "       environment should be set up correctly before (option --environ not used)"
+    echo
+    echo "  SA_build  MED_SRC --install=/export/home/SALOME"
+    echo "    -> compilation of MED_SRC  (no module name was specified)"
+    echo "       build is done in /export/home/SALOME/MED_BUILD"
+    echo "       install is done in /export/home/SALOME/MED_INSTALL"
+    echo 
+    echo "  SA_build  --batch --disable-debug --environ=my_env_products.sh V_3_0_2 KERNEL_SRC GUI_SRC GEOM_SRC MED_SRC MESH_SRC VISU_SRC SUPERV_SRC"
+    echo "    -> compilation without prompting (--batch option) of KERNEL_SRC, GUI_SRC, GEOM_SRC, MED_SRC, MESH_SRC, VISU_SRC and SUPERV_SRC"
+    echo "       all sources are searched in V_3_0_2 directory "
+    echo "       environment is setup using my_env_products.sh file"
+    echo "       configure is done with --disable-debug option"
+    echo 
+    exit 1
+}
+
+ask_confirmation()
+{
+       echo
+       echo $1
+       echo
+       read answer
+       case $answer in
+          y* | Y* | o* | O* )   ;;
+          *) exit 1
+       esac
+}
+
+check_dir()
+{
+   if [ -d $1 ]
+   then
+      rm -rf $1/*
+      echo "remove $1 content"
+   else
+      mkdir -p $1
+      echo "create $1"
+   fi
+}
+
+set_environ()
+{
+   if [ -f $1 ]
+   then
+       ENVIRON_FILE=$1
+   else
+       echo -e "\n\nError : environment file $1 NOT FOUND\n"
+       exit
+   fi
+}
+
+compile()
+{
+    clear
+    echo "----------------- Compile ---------------------"
+    make 
+    if [ $? -eq 0 ]
+    then
+       # compilation succeeded : we make install
+       echo
+       echo "----------------- Install ---------------------"
+       make install
+    else
+        exit 1
+    fi
+}
+
+get_source_dir()
+{
+    COMPILE_DIR=
+    SOURCE_DIRS=
+    if [ -d ${LOCAL_DIR}/${module} ]
+    then
+       COMPILE_DIR=${LOCAL_DIR}/${module}
+    elif [ -d ${SRC_ROOT_DIR}/${module} ]
+    then
+           COMPILE_DIR=${SRC_ROOT_DIR}/${module}
+    else
+       echo Sorry : ${module} not found!
+       usage
+    fi
+    
+    if [ -d ${COMPILE_DIR}/${module}_SRC ]
+    then
+        SOURCE_DIRS=${COMPILE_DIR}/${module}_SRC
+    fi
+
+    for src in $LISTE_SRC
+    do
+        if [ -d ${COMPILE_DIR}/${src} ]
+       then
+          SOURCE_DIRS="$SOURCE_DIRS ${COMPILE_DIR}/${src}"
+        fi
+    done
+
+}
+
+build_source_dir()
+{
+   isrc=0 # compteur
+   for SOURCE_DIR in ${SOURCE_DIRS}
+   do
+       (( isrc += 1 ))
+       echo -e "\n${isrc})  Compilation dans $SOURCE_DIR \n"
+       src=`basename $SOURCE_DIR`
+       SOURCE_NAME=${src%_SRC}
+       echo " -> Repertoire Source  = ${SOURCE_DIR}"
+       echo " -> Component name     = ${SOURCE_NAME}"
+       echo " -> Repertoire Build   = ${INSTALL_ROOT_DIR}/${module}/${SOURCE_NAME}_BUILD"
+       echo " -> Repertoire Install = ${INSTALL_ROOT_DIR}/${module}/${SOURCE_NAME}_INSTALL"
+       echo
+       echo
+       echo
+       if [ $COMPILE_ONLY -eq 1 ]
+       then
+          if [ $BATCH_MODE -eq 0 ]
+          then
+              ask_confirmation "Compile ?"
+           fi
+          cd ${INSTALL_ROOT_DIR}/${module}/${SOURCE_NAME}_BUILD
+          compile
+       else
+
+          if [ $BATCH_MODE -eq 0 ]
+          then
+              ask_confirmation "build configure and configure ?"
+          fi
+       #
+          cd ${SOURCE_DIR}
+          echo
+          echo "----------------- Build configure ---------------------"
+          ./build_configure
+          echo
+          echo "----------------- Configure ---------------------"
+          echo
+          # crée ou vide les répertoires
+          check_dir ${INSTALL_ROOT_DIR}/${module}/${SOURCE_NAME}_BUILD
+          check_dir ${INSTALL_ROOT_DIR}/${module}/${SOURCE_NAME}_INSTALL
+          cd ${INSTALL_ROOT_DIR}/${module}/${SOURCE_NAME}_BUILD
+          ${SOURCE_DIR}/configure ${OPTIONS_CONFIGURE} --prefix=${INSTALL_ROOT_DIR}/${module}/${SOURCE_NAME}_INSTALL | tee ${TMP_FILE}
+          echo
+          echo "retour configure : $?"
+          echo
+          if [ $BATCH_MODE -eq 0 ]
+          then
+              ask_confirmation "Compile ?"
+          fi
+          export `echo ${SOURCE_NAME}`_ROOT_DIR=${INSTALL_ROOT_DIR}/${module}/${SOURCE_NAME}_INSTALL
+          compile
+          cd $LOCAL_DIR
+          if [ $ENVIRON_FILE ]  &&  [ -f $ENVIRON_FILE ]
+          then
+               #  Mise à jour du script d'environnement
+              if [ $BATCH_MODE -eq 1 ]
+              then
+                  update_environ ${SOURCE_NAME}_ROOT_DIR ${INSTALL_ROOT_DIR}/${module}/${SOURCE_NAME}_INSTALL ${SOURCE_NAME}_SRC_DIR ${SOURCE_DIR}
+              else
+                  echo "Voulez vous mettre mettre à jour le script d'environnement  ${ENVIRON_FILE} ?"
+                  echo " (ajouter la variable ${SOURCE_NAME}_ROOT_DIR - une copie de l'ancien script est faite dans un .old)"
+                  echo
+                  read answer
+                  case $answer in
+                    y* | Y* | o* | O* )  update_environ ${SOURCE_NAME}_ROOT_DIR ${INSTALL_ROOT_DIR}/${module}/${SOURCE_NAME}_INSTALL ${SOURCE_NAME}_SRC_DIR ${SOURCE_DIR} ;;
+                    *) exit 1
+                  esac
+              fi
+           fi
+       fi
+   done    
+}
+
+
+# update environment scrip : add or replace ROOT_DIR and SRC_DIR variable for component
+update_environ()
+{
+    cp ${ENVIRON_FILE} ${ENVIRON_FILE}.old
+    grep " $1" ${ENVIRON_FILE}.old
+    if [ $? -eq 0 ]
+    then
+       # if variable is already set, we replace old setting by new one
+       cat ${ENVIRON_FILE}.old | awk -v var_root_dir=$1 -v path=$2 -v src_root_dir=$3 -v src_dir=$4 '
+           $1=="export" && $2 ~ var_root_dir {print "#"$0; $0="export "var_root_dir "=" path}
+           $1=="export" && $2 ~ src_root_dir {print "#"$0; $0="export "src_root_dir "=" src_dir}
+          { print $0}'  > ${ENVIRON_FILE}
+    else
+       echo -e "##\n#------ ${SOURCE_NAME}-Src ------\nexport $3=$4" >> ${ENVIRON_FILE}
+       echo -e "##\n#------ ${SOURCE_NAME}-Bin ------\nexport $1=$2" >> ${ENVIRON_FILE}
+    fi
+}
+
+###########  Programme Principal #############
+
+# parse arguments
+
+LISTE_SRC=""
+OPTIONS_CONFIGURE=""
+LISTE_MODULE=""
+BATCH_MODE=0
+COMPILE_ONLY=0
+
+if [ $# -eq 0 ]
+then
+    echo
+    echo "Pas d'arguments!"
+    usage
+fi
+
+for arg in $*
+do
+    case $arg in
+
+      --disable-debug  )   OPTIONS_CONFIGURE="${OPTIONS_CONFIGURE} --disable-debug"   ;;
+
+      --batch)             BATCH_MODE=1   ;;
+      
+      --environ=*)         set_environ ${arg#--environ=}   ;;
+
+      --install=*)         INSTALL_ROOT_DIR=${arg#--install=}   ;;
+      
+      --sources=*)         LISTE_SRC="${LISTE_SRC} ${arg#--sources=}"   ;;
+      
+      --local | -l )       SRC_ROOT_DIR=$PWD ; INSTALL_ROOT_DIR=$PWD ;;
+
+      --compile-only | -c ) COMPILE_ONLY=1 ;;
+
+      *_SRC  )             LISTE_SRC="${LISTE_SRC} ${arg}" ;;
+
+      *)                   LISTE_MODULE="${LISTE_MODULE} ${arg}" ;;
+
+    esac
+done
+
+LISTE_SRC=`echo ${LISTE_SRC} | sed "s/,/ /g"`  # replaces ',' by blanks
+
+if [ ! $INSTALL_ROOT_DIR ]
+then
+    echo Local installation
+    INSTALL_ROOT_DIR=$PWD
+fi
+
+clear
+echo
+echo "                  ------------------------------------"
+echo "                  | Utilitaire de Compilation Salome |"
+echo "                  ------------------------------------"
+echo
+echo
+echo "Liste des modules à parcourir : $LISTE_MODULE"
+echo "Liste repertoire à compiler   : $LISTE_SRC"
+echo "Options configure             : $OPTIONS_CONFIGURE"
+echo "Environment File              : $ENVIRON_FILE"
+echo
+
+if [ $ENVIRON_FILE ]  && [ -f $ENVIRON_FILE ]
+then
+    # force option for compilation - then source environment
+    cat ${ENVIRON_FILE} | sed "s/ENV_FOR_LAUNCH=1/ENV_FOR_LAUNCH=0/g" > ${ENVIRON_FILE}.tmp
+    source ${ENVIRON_FILE}.tmp
+    rm ${ENVIRON_FILE}.tmp
+    echo source Environment File with ENV_FOR_LAUNCH=0
+else
+    echo Warning : Environment File Not Found!
+fi
+
+LOCAL_DIR=`pwd`
+if [ "$LISTE_MODULE" == "" ]
+then
+    # no module specified -> lookup for sources localy
+    echo lookup for sources localy
+    SOURCE_DIRS=
+    for src in $LISTE_SRC
+    do
+        if [ -d ${LOCAL_DIR}/${src} ]
+       then
+          SOURCE_DIRS="$SOURCE_DIRS ${LOCAL_DIR}/${src}"
+        elif [ -d ${SRC_ROOT_DIR}/${src} ]
+       then
+          SOURCE_DIRS="$SOURCE_DIRS ${LOCAL_DIR}/${src}"
+        fi
+    done
+    build_source_dir
+else
+    for module in $LISTE_MODULE
+    do
+       echo "----------------- Compilation dans $module ----------------"
+       echo
+       echo
+       get_source_dir
+       build_source_dir
+       echo
+    done
+fi
+