source: NEMO/trunk/cfgs/makenemo @ 9598

Last change on this file since 9598 was 9598, checked in by nicolasmartin, 2 years ago

Reorganisation plan for NEMO repository: changes to make compilation succeed with new structure
Juste one issue left with AGRIF_NORDIC with AGRIF preprocessing
Standardisation of routines header with version 4.0 and year 2018
Fix for some broken symlinks

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 11.7 KB
Line 
1#!/bin/bash
2#set -x
3set -o posix
4#set -u
5#set -e
6#+
7#
8# ===============
9# makenemo
10# ===============
11#
12# --------------------------
13# Compile NEMO
14# --------------------------
15#
16# SYNOPSIS
17# ========
18#
19# ::
20#
21#  $ makenemo
22#
23#
24# DESCRIPTION
25# ===========
26#
27#
28# This script aims :
29#
30# - to choose MYCONFIG
31# - to choose compiler options
32# - to create the CONFIG/MYCONFIG/WORK directory
33# - to compile this configuration
34#
35#  Variables used :
36#
37#  From user input
38#
39# - NEW_CONF    : configuration to be created
40# - REF_CONF    : reference configuration to build the new one from
41# - CMP_NAM     : compiler name
42# - NBR_PRC     : number of processes used to compile
43# - USP_CONF    : unsupported (external) configuration to build the new one from
44# - NEM_SUBDIR  : NEMO subdirectory used (specified)
45#
46#  Locally defined :
47#
48# - TAB         : NEMO subdirectory used (read)
49# - MAIN_DIR    : self explaining
50# - CONFIG_DIR  :   "    "    "
51# - MODELES_DIR :   "    "    "
52# - TOOLS_DIR   :   "    "    "
53# - NEMO_DIR    :   "    "    "
54# - REMOTE_CTL  : URL link to a remote resource list for an external configuration
55#                 which is not part of the reference suite
56# - LOCAL_REF   : Nearest reference configuration to an external configuration
57#                 which is not part of the reference suite
58#                 (used to populate work directories if remote access is not available)
59#
60# EXAMPLES
61# ========
62#
63# ::
64#
65#  $ ./makenemo -m ifort_osx - j3 -n ORCA2_LIM3_PISCES
66#
67#
68# TODO
69# ====
70#
71# option debug
72#
73#
74# EVOLUTIONS
75# ==========
76#
77# $Id$
78#
79#
80#
81#   * creation
82#
83#-
84
85#-
86#- Initialization of the options ---
87x_d="";
88x_h="";
89x_n="";
90x_r="";
91x_u="";
92x_a="";
93x_m="";
94x_t="";
95x_c="";
96x_j=1;
97x_e="none";
98x_s=src;
99x_v=1;
100
101#- Local variables ---
102b_n=$(basename ${0})
103OPTIND=1
104MAIN_DIR=$(cd $(dirname "$0"); pwd)
105MAIN_DIR=${MAIN_DIR%/SETTE*}
106MAIN_DIR=${MAIN_DIR%/tools*}
107MAIN_DIR=${MAIN_DIR%/cfgs*}
108export MAIN_DIR
109#
110export CONFIG_DIR=${MAIN_DIR}/cfgs
111export TOOLS_DIR=${MAIN_DIR}/tools
112export COMPIL_DIR=${MAIN_DIR}/mk
113export NEMO_DIR=${MAIN_DIR}/${x_s}
114export AGRIFUSE=10
115declare -a TAB
116declare -a REMOTE_CTL
117declare -a LOCAL_REF
118list_key=0
119chk_key=1
120#-
121#- FCM and functions location ---
122export PATH=${MAIN_DIR}/ext/FCM/bin:$PATH
123
124#-
125#- Choice of the options ---
126while getopts :hd:n:r:u:a:m:j:e:s:v:t:k: V
127do
128    case $V in
129   (h) x_h=${OPTARG};
130        echo "Usage   : "${b_n} \
131       " [-h] [-n name] [-m arch] [-d "dir1 dir2"] [-r conf] [-u conf] [-s Path] [-e Path] [-j No] [-v No] [-k 0/1]";
132   echo " -h           : help";
133   echo " -h institute : specific help for consortium members";
134   echo " -n name      : config name, [-n help] to list existing configurations";
135   echo " -m arch      : choose compiler, [-m help] to list existing compilers";
136   echo " -d dir       : choose NEMO sub-directories";
137   echo " -r conf      : choose reference configuration";
138   echo " -u conf      : choose an unsupported (external) configuration";
139        echo " -s Path      : choose alternative location for NEMO main directory";
140        echo " -e Path      : choose alternative location for MY_SRC directory";
141        echo " -j No        : number of processes used to compile (0=nocompilation)";
142        echo " -v No        : set verbosity level for compilation [0-3]";
143        echo " -k 0/1       : used cpp keys check (default = 1 -> check activated)";
144   echo " -t dir       : temporary directory for compilation"
145   echo " -a dir       : alternative sub-directory for configurations (below CONFIG)"
146   echo "";
147   echo "Example to install a new configuration MY_CONFIG";
148   echo "with OCE and ICE ";
149   echo "makenemo -n MY_CONFIG -d \"OCE ICE\"";
150   echo "";
151   echo "Available configurations :"; cat ${CONFIG_DIR}/cfg.txt;
152   echo "";
153        echo "Available unsupported (external) configurations :";
154              if [ -f ${CONFIG_DIR}/uspcfg.txt ] ; then cat ${CONFIG_DIR}/uspcfg.txt; fi;
155   echo "";
156   echo "Example to install an unsupoorted configuration MY_USP";
157   echo "makenemo -n MY_USP -u MY_USP" ;
158   echo "";
159   echo "Example to remove bad configuration ";
160   echo "./makenemo -n MY_CONFIG clean_config";
161   echo "";
162   echo "Example to clean ";
163   echo "./makenemo clean";
164   echo "";
165   echo "Example to list the available keys of a CONFIG ";
166   echo "./makenemo list_key";
167   echo "";
168   echo "Example to add and remove keys";
169   echo "./makenemo add_key \"key_iomput key_mpp_mpi\" del_key \"key_agrif\" ";
170   echo "";
171   echo "Example to add and remove keys for a new configuration, and do not compile";
172   echo "./makenemo -n MY_CONFIG -j0 add_key \"key_iomput key_mpp_mpi\" del_key \"key_agrif\" ";
173   echo "";
174   . ${COMPIL_DIR}/Flist_archfile.sh ${x_h}  ;
175   echo "";
176   echo "Default : previous configuration and compiler";
177   exit 0;;
178   (d)  x_d=${OPTARG};;
179   (n)  x_n=${OPTARG};;
180   (r)  x_r=${OPTARG};;
181   (u)  x_u=${OPTARG};;
182   (a)  x_a=${OPTARG};;
183   (m)  x_m=${OPTARG};;
184   (j)  x_j=${OPTARG};;
185   (t)  x_t=${OPTARG};;
186   (e)  x_e=${OPTARG};;
187   (s)  x_s=${OPTARG};;
188   (v)  x_v=${OPTARG};;
189   (k)  chk_key=${OPTARG};;
190   (:)  echo ${b_n}" : -"${OPTARG}" option : missing value" 1>&2;
191   exit 2;;
192   (\?) echo ${b_n}" : -"${OPTARG}" option : not supported" 1>&2;
193   exit 2;;
194    esac
195done
196shift $(($OPTIND-1));
197
198while [ ${#1} -gt 0 ]   # Get clean, clean_config options
199do
200    case "$1" in
201   clean)
202       x_c="--$1"
203       ;;
204   clean_config)
205       . ${COMPIL_DIR}/Fclean_config.sh
206       exit
207       ;;
208   add_key)
209            # Checking if argument has anything other than whitespace
210            [[ ! "$2" =~ ^\ +$ ]] && { list_add_key=$2; export ${list_add_key}; }
211       shift
212       ;;
213   del_key)
214            # Checking if argument has anything other than whitespace
215            [[ ! "$2" =~ ^\ +$ ]] && { list_del_key=$2; export ${list_del_key}; }
216       shift
217       ;;
218   list_key)
219       list_key=1
220       ;;
221   *)
222       echo " \"$1\" BAD OPTION"
223       exit 2
224       ;;
225
226    esac
227    shift
228done
229
230
231#-
232#- Go to NEMOGCM/cfgs directory ---
233cd ${CONFIG_DIR}
234
235#-
236#- Initialisation from input ---
237export ALT_DIR=${x_a}
238if [ ! -z $ALT_DIR ]; then
239 if [ -d ${CONFIG_DIR}/${ALT_DIR} ]; then
240   export CONFIG_DIR=${CONFIG_DIR}/${ALT_DIR}
241#-
242#- Go to named subdirectory of the NEMOGCM/cfgs directory ---
243   cd ${CONFIG_DIR}
244 fi
245fi
246export NEW_CONF=${x_n}
247NBR_PRC=${x_j}
248CMP_NAM=${x_m}
249NEM_SUBDIR=${x_d}
250REF_CONF=${x_r}
251USP_CONF=${x_u}
252NEMO_TDIR=${x_t}
253export NEMO_TDIR=${NEMO_TDIR:-$CONFIG_DIR}
254export NEMO_DIR=${MAIN_DIR}/${x_s}
255
256#- Check if the tool or the compiler exist or list it
257if [ "${NEW_CONF}" == help ] ; then
258    echo "Available configurations :"
259    cat ${CONFIG_DIR}/cfg.txt
260    echo
261    echo "Available unsupported (external) configurations :" 
262    if [ -f ${CONFIG_DIR}/uspcfg.txt ] ; then cat ${CONFIG_DIR}/uspcfg.txt; fi;
263    exit
264fi
265[ "${CMP_NAM}" ==  help ] && . ${COMPIL_DIR}/Flist_archfile.sh all && exit
266
267#-
268#- Choose a default configuration if needed ---
269#- ORCA2_LIM3_PISCES or last one used ---
270. ${COMPIL_DIR}/Fcheck_config.sh cfg.txt ${NEW_CONF} || exit
271
272if [ ${#NEW_CONF} -eq 0 ] ; then
273    if [ ${#NEM_SUBDIR} -eq 0 ] && [ ${#REF_CONF} -eq 0 ] && [ ${#USP_CONF} -eq 0 ] ; then
274   echo "You are installing a new default (ORCA2_LIM3_PISCES) configuration"
275   ind=0
276   . ${COMPIL_DIR}/Fread_dir.sh OCE  YES
277   . ${COMPIL_DIR}/Fread_dir.sh ICE  NO
278   . ${COMPIL_DIR}/Fread_dir.sh TOP  NO
279   . ${COMPIL_DIR}/Fread_dir.sh NST  YES
280   . ${COMPIL_DIR}/Fread_dir.sh OFF  NO
281   . ${COMPIL_DIR}/Fread_dir.sh SAO  NO
282   . ${COMPIL_DIR}/Fread_dir.sh SAS  NO
283   REF_CONF=ORCA2_LIM3_PISCES
284    elif [ ${#NEM_SUBDIR} -gt 0 ] && [ ${#REF_CONF} -eq 0 ] && [ ${#USP_CONF} -eq 0 ] ; then
285   echo "You are installing a new configuration based on ORCA2_LIM3_PISCES"
286   TAB=( ${NEM_SUBDIR} )
287   REF_CONF=ORCA2_LIM3_PISCES
288    elif [ ${#NEM_SUBDIR} -eq 0 ] && [ ${#REF_CONF} -gt 0 ]; then
289   echo "You are installing a new configuration based on ${REF_CONF}"
290   . ${COMPIL_DIR}/Fcopy_dir.sh ${REF_CONF}
291    elif [ ${#NEM_SUBDIR} -gt 0 ] && [ ${#REF_CONF} -gt 0 ]; then
292        echo "You are installing an hydrid configuration based on ${REF_CONF} with components ${NEM_SUBDIR}"
293        . ${COMPIL_DIR}/Fcopy_dir.sh ${REF_CONF}
294        TAB=( ${NEM_SUBDIR} )
295    elif [ ${#NEM_SUBDIR} -eq 0 ] && [ ${#USP_CONF} -gt 0 ]; then
296   echo "You are  installing a new configuration based on the unsupported (external) ${USP_CONF}"
297   . ${COMPIL_DIR}/Fcopy_extdir.sh ${USP_CONF} 
298        #echo "TTT " ${TAB}
299        #echo "RRR " ${REMOTE_CTL}
300        #echo "LLL " ${LOCAL_REF}
301    fi
302    NEW_CONF=${x_n}
303
304    if [ ${#USP_CONF} -gt 0 ]; then
305      . ${COMPIL_DIR}/Fmake_extconfig.sh ${NEW_CONF} ${LOCAL_REF}
306      . ${COMPIL_DIR}/Ffetch_extdir.sh ${NEW_CONF} ${REMOTE_CTL} 
307    else
308      . ${COMPIL_DIR}/Fmake_config.sh ${NEW_CONF} ${REF_CONF}
309    fi
310else
311    sed -e "/${NEW_CONF} /d"  ${CONFIG_DIR}/cfg.txt >  ${COMPIL_DIR}/cfg.tmp
312    \m${COMPIL_DIR}/cfg.tmp  ${CONFIG_DIR}/cfg.txt
313fi
314
315#-
316#- Save new configuration and directories names ---
317echo ${NEW_CONF} ${TAB[*]} >> ${CONFIG_DIR}/cfg.txt
318
319#-
320#- Create the WORK ---
321#- Clean links and librairies ---
322#- Creating the good links, at first on OCE ---
323. ${COMPIL_DIR}/Fmake_WORK.sh ${x_e} ${NEW_CONF} ${TAB[*]} || exit 3
324
325. ${COMPIL_DIR}/Fmake_bld.sh ${CONFIG_DIR} ${NEW_CONF}  ${NEMO_TDIR} || exit 3
326
327# build the complete list of the cpp keys of this configuration
328if [ $chk_key -eq 1 ] ; then
329    for i in $( grep "^ *#.* key_" ${NEW_CONF}/WORK/* ) 
330    do
331   echo $i | grep key_ | sed -e "s/=.*//"
332    done | sort -d | uniq > ${COMPIL_DIR}/full_key_list.txt
333    if [ $list_key -eq 1 ]; then
334   cat ${COMPIL_DIR}/full_key_list.txt
335   exit 0
336    fi
337fi
338
339#- At this stage new configuration has been added, we add or remove keys
340[ ! -z "${list_add_key}" ] && { . ${COMPIL_DIR}/Fadd_keys.sh ${NEW_CONF} add_key ${list_add_key}; }
341[ ! -z "${list_del_key}" ] && { . ${COMPIL_DIR}/Fdel_keys.sh ${NEW_CONF} del_key ${list_del_key}; }
342
343#- check that all keys are really existing...
344if [ $chk_key -eq 1 ] ; then
345    for kk in $( cat ${NEW_CONF}/cpp_${NEW_CONF}.fcm )
346    do
347   if [ "$( echo $kk | cut -c 1-4 )" == "key_" ]; then
348       kk=${kk/=*/}
349       nb=$( grep -c $kk ${COMPIL_DIR}/full_key_list.txt )
350       if [ $nb -eq 0 ]; then
351      echo
352      echo "E R R O R : key "$kk" is not found in ${NEW_CONF}/WORK routines..."
353      echo "we stop..."
354      echo
355      exit 1
356       fi
357   fi
358    done
359fi
360
361#- At this stage cpp keys have been updated. we can check the arch file
362#- When used for the first time, choose a compiler ---
363. ${COMPIL_DIR}/Fcheck_archfile.sh arch_nemo.fcm cpp.fcm ${CMP_NAM} || exit 3
364
365#- At this stage the configuration has beeen chosen
366#- We coose the default light file
367export USEBLD=bldxag.cfg
368
369#- We look after agrif
370grep key_agrif ${COMPIL_DIR}/cpp.fcm && export AGRIFUSE=1 && export USEBLD=${USEBLD/xag/}
371. ${COMPIL_DIR}/Fprep_agrif.sh ${NEW_CONF} ${NEMO_TDIR} || exit 3
372
373#-
374#_ END OF CONFIGURATION PHASE
375#_
376
377#-
378#- Compile ---
379
380if [ "${NBR_PRC}" -gt 0 ]; then
381    cd ${NEMO_TDIR}/${NEW_CONF} || cd -
382
383#if AGRIF we do a first preprocessing
384    if [ ${#x_c} -eq 0 ]; then
385       if [ "$AGRIFUSE" == 1 ]; then
386          fcm build --ignore-lock  -j 1 ${COMPIL_DIR}/bld_preproagr.cfg ||{ cd - ; exit 1 ;}
387          echo ""
388          echo "---------------------------------"
389          echo "CONV preprocessing successfull !!"
390          echo "---------------------------------"
391          echo ""
392       fi
393    fi
394    fcm build ${x_c} --ignore-lock -v ${x_v} -j ${NBR_PRC} ${COMPIL_DIR}/$USEBLD ||{ cd - ; exit 1 ;}
395    [ -f ${NEMO_TDIR}/${NEW_CONF}/BLD/bin/nemo.exe ] && ln -sf ${NEMO_TDIR}/${NEW_CONF}/BLD/bin/nemo.exe  ${CONFIG_DIR}/${NEW_CONF}/EXP00/nemo
396
397#add remove for clean option
398    if  [ ${#x_c} -ne 0 ]; then
399        rm -rf ${NEMO_TDIR}/${NEW_CONF}/NEMOFILES
400        rm -rf ${NEMO_TDIR}/${NEW_CONF}/WORK
401        rm -rf ${NEMO_TDIR}/${NEW_CONF}/BLD
402        rm -rf ${NEMO_TDIR}/${NEW_CONF}/EXP00/nemo
403        rm -f ${COMPIL_DIR}/*history ${COMPIL_DIR}/*fcm ${COMPIL_DIR}/*txt
404        echo "cleaning ${NEW_CONF} WORK, BLD"
405    fi
406
407fi
408
409#- Come back to original directory ---
410cd -
411
412#-
413#- Unset variables
414${COMPIL_DIR}/Fclean_var.sh
415
416
Note: See TracBrowser for help on using the repository browser.