123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- #!/bin/bash
- #set -x
- set -o posix
- #set -u
- #set -e
- #+
- #
- # ===============
- # makenemo
- # ===============
- #
- # --------------------------
- # Compile NEMO
- # --------------------------
- #
- # SYNOPSIS
- # ========
- #
- # ::
- #
- # $ makenemo
- #
- #
- # DESCRIPTION
- # ===========
- #
- #
- # This script aims :
- #
- # - to choose MYCONFIG
- # - to choose compiler options
- # - to create the CONFIG/MYCONFIG/WORK directory
- # - to compile this configuration
- #
- # Variables used :
- #
- # From user input
- #
- # - NEW_CONF : configuration to be created
- # - REF_CONF : reference configuration to build the new one from
- # - CMP_NAM : compiler name
- # - NBR_PRC : number of processes used to compile
- # - USP_CONF : unsupported (external) configuration to build the new one from
- # - NEM_SUBDIR : NEMO subdirectory used (specified)
- #
- # Locally defined :
- #
- # - TAB : NEMO subdirectory used (read)
- # - MAIN_DIR : self explaining
- # - CONFIG_DIR : " " "
- # - MODELES_DIR : " " "
- # - TOOLS_DIR : " " "
- # - NEMO_DIR : " " "
- # - REMOTE_CTL : URL link to a remote resource list for an external configuration
- # which is not part of the reference suite
- # - LOCAL_REF : Nearest reference configuration to an external configuration
- # which is not part of the reference suite
- # (used to populate work directories if remote access is not available)
- #
- # EXAMPLES
- # ========
- #
- # ::
- #
- # $ ./makenemo -m ifort_osx - j3 -n ORCA2_LIM
- #
- #
- # TODO
- # ====
- #
- # option debug
- #
- #
- # EVOLUTIONS
- # ==========
- #
- # $Id: makenemo 4990 2014-12-15 16:42:49Z timgraham $
- #
- #
- #
- # * creation
- #
- #-
- #-
- #- Initialization of the options ---
- x_d="";
- x_h="";
- x_n="";
- x_r="";
- x_u="";
- x_m="";
- x_t="";
- x_c="";
- x_j=1;
- x_e="none";
- x_s=NEMO;
- x_v=1;
- #- Local variables ---
- b_n=$(basename ${0})
- OPTIND=1
- MAIN_DIR=$(cd $(dirname "$0"); pwd)
- MAIN_DIR=${MAIN_DIR%/SETTE*}
- MAIN_DIR=${MAIN_DIR%/TOOLS*}
- MAIN_DIR=${MAIN_DIR%/CONFIG*}
- export MAIN_DIR
- #
- export CONFIG_DIR=${MAIN_DIR}/CONFIG
- export TOOLS_DIR=${MAIN_DIR}/TOOLS
- export COMPIL_DIR=${MAIN_DIR}/TOOLS/COMPILE
- export NEMO_DIR=${MAIN_DIR}/${x_s}
- export AGRIFUSE=10
- declare -a TAB
- declare -a REMOTE_CTL
- declare -a LOCAL_REF
- list_key=0
- chk_key=1
- #-
- #- FCM and functions location ---
- export PATH=${MAIN_DIR}/EXTERNAL/fcm/bin:$PATH
- #-
- #- Choice of the options ---
- while getopts :hd:n:r:u:m:j:e:s:v:t:k: V
- do
- case $V in
- (h) x_h=${OPTARG};
- echo "Usage : "${b_n} \
- " [-h] [-n name] [-m arch] [-d "dir1 dir2"] [-r conf] [-u conf] [-s Path] [-e Path] [-j No] [-v No] [-k 0/1]";
- echo " -h : help";
- echo " -h institute : specific help for consortium members";
- echo " -n name : config name, [-n help] to list existing configurations";
- echo " -m arch : choose compiler, [-m help] to list existing compilers";
- echo " -d dir : choose NEMO sub-directories";
- echo " -r conf : choose reference configuration";
- echo " -u conf : choose an unsupported (external) configuration";
- echo " -s Path : choose alternative location for NEMO main directory";
- echo " -e Path : choose alternative location for MY_SRC directory";
- echo " -j No : number of processes used to compile (0=nocompilation)";
- echo " -v No : set verbosity level for compilation [0-3]";
- echo " -k 0/1 : used cpp keys check (default = 1 -> check activated)";
- echo " -t dir : temporary directory for compilation"
- echo "";
- echo "Example to install a new configuration MY_CONFIG";
- echo "with OPA_SRC and LIM_SRC_2 ";
- echo "makenemo -n MY_CONFIG -d \"OPA_SRC LIM_SRC_2\"";
- echo "";
- echo "Available configurations :"; cat ${CONFIG_DIR}/cfg.txt;
- echo "";
- echo "Available unsupported (external) configurations :"; cat ${CONFIG_DIR}/uspcfg.txt;
- echo "";
- echo "Example to remove bad configuration ";
- echo "./makenemo -n MY_CONFIG clean_config";
- echo "";
- echo "Example to clean ";
- echo "./makenemo clean";
- echo "";
- echo "Example to list the available keys of a CONFIG ";
- echo "./makenemo list_key";
- echo "";
- echo "Example to add and remove keys";
- echo "./makenemo add_key \"key_iomput key_mpp_mpi\" del_key \"key_agrif\" ";
- echo "";
- echo "Example to add and remove keys for a new configuration, and do not compile";
- echo "./makenemo -n MY_CONFIG -j0 add_key \"key_iomput key_mpp_mpi\" del_key \"key_agrif\" ";
- echo "";
- . ${COMPIL_DIR}/Flist_archfile.sh ${x_h} ;
- echo "";
- echo "Default : previous configuration and compiler";
- exit 0;;
- (d) x_d=${OPTARG};;
- (n) x_n=${OPTARG};;
- (r) x_r=${OPTARG};;
- (u) x_u=${OPTARG};;
- (m) x_m=${OPTARG};;
- (j) x_j=${OPTARG};;
- (t) x_t=${OPTARG};;
- (e) x_e=${OPTARG};;
- (s) x_s=${OPTARG};;
- (v) x_v=${OPTARG};;
- (k) chk_key=${OPTARG};;
- (:) echo ${b_n}" : -"${OPTARG}" option : missing value" 1>&2;
- exit 2;;
- (\?) echo ${b_n}" : -"${OPTARG}" option : not supported" 1>&2;
- exit 2;;
- esac
- done
- shift $(($OPTIND-1));
- while [ ${#1} -gt 0 ] # Get clean, clean_config options
- do
- case "$1" in
- clean)
- x_c="--$1"
- ;;
- clean_config)
- . ${COMPIL_DIR}/Fclean_config.sh
- exit
- ;;
- add_key)
- # Checking if argument has anything other than whitespace
- [[ ! "$2" =~ ^\ +$ ]] && { list_add_key=$2; export ${list_add_key}; }
- shift
- ;;
- del_key)
- # Checking if argument has anything other than whitespace
- [[ ! "$2" =~ ^\ +$ ]] && { list_del_key=$2; export ${list_del_key}; }
- shift
- ;;
- list_key)
- list_key=1
- ;;
- *)
- echo " \"$1\" BAD OPTION"
- exit
- ;;
- esac
- shift
- done
- #-
- #- Go to NEMOGCM/config directory ---
- cd ${CONFIG_DIR}
- #-
- #- Initialisation from input ---
- export NEW_CONF=${x_n}
- NBR_PRC=${x_j}
- CMP_NAM=${x_m}
- NEM_SUBDIR=${x_d}
- REF_CONF=${x_r}
- USP_CONF=${x_u}
- NEMO_TDIR=${x_t:-$NEMO_TDIR}
- export NEMO_TDIR=${NEMO_TDIR:-$CONFIG_DIR}
- export NEMO_DIR=${MAIN_DIR}/${x_s}
- #- Check if the tool or the compiler exist or list it
- if [ "${NEW_CONF}" == help ] ; then
- echo "Available configurations :"
- cat ${CONFIG_DIR}/cfg.txt
- echo
- echo "Available unsupported (external) configurations :"
- cat ${CONFIG_DIR}/uspcfg.txt
- exit
- fi
- [ "${CMP_NAM}" == help ] && . ${COMPIL_DIR}/Flist_archfile.sh all && exit
- #-
- #- Choose a default configuration if needed ---
- #- ORCA2_LIM or last one used ---
- . ${COMPIL_DIR}/Fcheck_config.sh cfg.txt ${NEW_CONF} || exit
- if [ ${#NEW_CONF} -eq 0 ] ; then
- if [ ${#NEM_SUBDIR} -eq 0 ] && [ ${#REF_CONF} -eq 0 ] && [ ${#USP_CONF} -eq 0 ] ; then
- echo "You are installing a new default (ORCA2_LIM) configuration"
- ind=0
- . ${COMPIL_DIR}/Fread_dir.sh OPA_SRC YES
- . ${COMPIL_DIR}/Fread_dir.sh LIM_SRC_2 YES
- . ${COMPIL_DIR}/Fread_dir.sh LIM_SRC_3 NO
- . ${COMPIL_DIR}/Fread_dir.sh TOP_SRC NO
- . ${COMPIL_DIR}/Fread_dir.sh NST_SRC YES
- . ${COMPIL_DIR}/Fread_dir.sh OFF_SRC NO
- . ${COMPIL_DIR}/Fread_dir.sh OOO_SRC NO
- . ${COMPIL_DIR}/Fread_dir.sh SAS_SRC NO
- REF_CONF=ORCA2_LIM
- elif [ ${#NEM_SUBDIR} -gt 0 ] && [ ${#REF_CONF} -eq 0 ] && [ ${#USP_CONF} -eq 0 ] ; then
- echo "You are installing a new configuration based on ORCA2_LIM"
- TAB=( ${NEM_SUBDIR} )
- REF_CONF=ORCA2_LIM
- elif [ ${#NEM_SUBDIR} -eq 0 ] && [ ${#REF_CONF} -gt 0 ]; then
- echo "You are installing a new configuration based on ${REF_CONF}"
- . ${COMPIL_DIR}/Fcopy_dir.sh ${REF_CONF}
- elif [ ${#NEM_SUBDIR} -eq 0 ] && [ ${#USP_CONF} -gt 0 ]; then
- echo "You are installing a new configuration based on the unsupported (external) ${USP_CONF}"
- . ${COMPIL_DIR}/Fcopy_extdir.sh ${USP_CONF}
- #echo "TTT " ${TAB}
- #echo "RRR " ${REMOTE_CTL}
- #echo "LLL " ${LOCAL_REF}
- fi
- NEW_CONF=${x_n}
- if [ ${#USP_CONF} -gt 0 ]; then
- . ${COMPIL_DIR}/Fmake_extconfig.sh ${NEW_CONF} ${LOCAL_REF}
- . ${COMPIL_DIR}/Ffetch_extdir.sh ${NEW_CONF} ${REMOTE_CTL}
- else
- . ${COMPIL_DIR}/Fmake_config.sh ${NEW_CONF} ${REF_CONF}
- fi
- else
- sed -e "/${NEW_CONF} /d" ${CONFIG_DIR}/cfg.txt > ${COMPIL_DIR}/cfg.tmp
- \mv ${COMPIL_DIR}/cfg.tmp ${CONFIG_DIR}/cfg.txt
- fi
- #-
- #- Save new configuration and directories names ---
- echo ${NEW_CONF} ${TAB[*]} >> ${CONFIG_DIR}/cfg.txt
- #-
- #- Create the WORK ---
- #- Clean links and librairies ---
- #- Creating the good links, at first on OPA_SRC ---
- . ${COMPIL_DIR}/Fmake_WORK.sh ${x_e} ${NEW_CONF} ${TAB[*]} || exit
- . ${COMPIL_DIR}/Fmake_bld.sh ${CONFIG_DIR} ${NEW_CONF} ${NEMO_TDIR} || exit
- # build the complete list of the cpp keys of this configuration
- if [ $chk_key -eq 1 ] ; then
- for i in $( grep "^ *#.* key_" ${NEW_CONF}/WORK/* )
- do
- echo $i | grep key_ | sed -e "s/=.*//"
- done | sort -d | uniq > ${COMPIL_DIR}/full_key_list.txt
- if [ $list_key -eq 1 ]; then
- cat ${COMPIL_DIR}/full_key_list.txt
- exit 0
- fi
- fi
- #- At this stage new configuration has been added, we add or remove keys
- [ ! -z "${list_add_key}" ] && { . ${COMPIL_DIR}/Fadd_keys.sh ${NEW_CONF} add_key ${list_add_key}; }
- [ ! -z "${list_del_key}" ] && { . ${COMPIL_DIR}/Fdel_keys.sh ${NEW_CONF} del_key ${list_del_key}; }
- #- check that all keys are really existing...
- if [ $chk_key -eq 1 ] ; then
- for kk in $( cat ${NEW_CONF}/cpp_${NEW_CONF}.fcm )
- do
- if [ "$( echo $kk | cut -c 1-4 )" == "key_" ]; then
- kk=${kk/=*/}
- nb=$( grep -c $kk ${COMPIL_DIR}/full_key_list.txt )
- if [ $nb -eq 0 ]; then
- echo
- echo "E R R O R : key "$kk" is not found in ${NEW_CONF}/WORK routines..."
- echo "we stop..."
- echo
- exit 1
- fi
- fi
- done
- fi
- #- At this stage cpp keys have been updated. we can check the arch file
- #- When used for the first time, choose a compiler ---
- . ${COMPIL_DIR}/Fcheck_archfile.sh arch_nemo.fcm cpp.fcm ${CMP_NAM} || exit
- #- At this stage the configuration has beeen chosen
- #- We coose the default light file
- export USEBLD=bldxag.cfg
- #- We look after agrif
- grep key_agrif ${COMPIL_DIR}/cpp.fcm && export AGRIFUSE=1 && export USEBLD=${USEBLD/xag/}
- . ${COMPIL_DIR}/Fprep_agrif.sh ${NEW_CONF} ${NEMO_TDIR} || exit
- #-
- #_ END OF CONFIGURATION PHASE
- #_
- #-
- #- Compile ---
- if [ "${NBR_PRC}" -gt 0 ]; then
- cd ${NEMO_TDIR}/${NEW_CONF} || cd -
- #if AGRIF we do a first preprocessing
- if [ ${#x_c} -eq 0 ]; then
- if [ "$AGRIFUSE" == 1 ]; then
- fcm build --ignore-lock -j 1 ${COMPIL_DIR}/bld_preproagr.cfg ||{ cd - ; exit ;}
- echo ""
- echo "---------------------------------"
- echo "CONV preprocessing successfull !!"
- echo "---------------------------------"
- echo ""
- fi
- fi
- fcm build ${x_c} --ignore-lock -v ${x_v} -j ${NBR_PRC} ${COMPIL_DIR}/$USEBLD || cd -
- [ -f ${NEMO_TDIR}/${NEW_CONF}/BLD/bin/nemo.exe ] && ln -sf ${NEMO_TDIR}/${NEW_CONF}/BLD/bin/nemo.exe ${CONFIG_DIR}/${NEW_CONF}/EXP00/opa
- #add remove for clean option
- if [ ${#x_c} -ne 0 ]; then
- rm -rf ${NEMO_TDIR}/${NEW_CONF}/OPAFILES
- rm -rf ${NEMO_TDIR}/${NEW_CONF}/WORK
- rm -rf ${NEMO_TDIR}/${NEW_CONF}/BLD
- rm -rf ${NEMO_TDIR}/${NEW_CONF}/EXP00/opa
- rm -f ${COMPIL_DIR}/*history ${COMPIL_DIR}/*fcm ${COMPIL_DIR}/*txt
- echo "cleaning ${NEW_CONF} WORK, BLD"
- fi
- fi
- #- Come back to original directory ---
- cd -
- #-
- #- Unset variables
- ${COMPIL_DIR}/Fclean_var.sh
|