New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
makenemo in utils/build – NEMO

source: utils/build/makenemo @ 9668

Last change on this file since 9668 was 9668, checked in by nicolasmartin, 6 years ago

Reorganisation plan for NEMO repository: fix to prevent side effects in developping ref. cfgs
With this modification, makenemo will solely create copies of the configurations included in
./cfgs and ./tests and listed in their respective txt files (all versioned)
Finally the developer will have to validate explicitely the files to be pushed to the repository by
replacing the versioned ones.
It will take a little longer but it could avoid to commit unwanted modifications.

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 11.2 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# - RMT_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_SI3_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=''; x_h=''; x_n=''; x_r='';
88x_u=''; x_a=''; x_m=''; x_t='';
89x_c='';
90x_j='1'; x_e='none'; x_s='src'; x_v='1'
91
92##- Local variables ---
93b_n=$(basename ${0})
94OPTIND='1'
95MAIN_DIR=$(cd $(dirname "$0"); pwd)
96MAIN_DIR=${MAIN_DIR%/sette*}
97MAIN_DIR=${MAIN_DIR%/tools*}
98MAIN_DIR=${MAIN_DIR%/cfgs*}
99export MAIN_DIR
100#
101export CONFIG_DIR=${MAIN_DIR}/cfgs
102export TOOLS_DIR=${MAIN_DIR}/tools
103export COMPIL_DIR=${MAIN_DIR}/mk
104export NEMO_DIR=${MAIN_DIR}/${x_s}
105export AGRIFUSE='10'
106list_key='0'; chk_key='1'
107list_add_key=''; list_del_key='';
108conf_file='ref_cfgs.txt'
109#-
110#- FCM and functions location ---
111export PATH=${MAIN_DIR}/ext/FCM/bin:$PATH
112
113#-
114#- Choice of the options ---
115while getopts :hd:n:r:u:a:m:j:e:s:v:t:k: option; do
116
117   case $option in
118      ('h') cat <<EOF
119Usage:
120------
121./makenemo -[adru] ... -m ... [-h] [-[dejntv] ...] [{list_key,clean,clean_config}] [{add_key,del_key} ...]
122
123The previous build is reused by default if no given options
124
125Mandatory: 'all' to list available arguments by option
126   -a   Demonstration case            (./tests)
127   -m   Computing architecture        (./arch)
128   -r   Reference configuration       (./cfgs)
129   -u   Scripted remote configuration (./tests/rmt_cfgs.txt)
130
131Optional:
132   -d   Set of new sub-components (space separated list from ./src directory)
133   -e   Path for alternative patch  location (default: 'MY_SRC' in configuration folder)
134   -j   Number of processes to compile (0: no build)
135   -n   Name for new configuration
136   -s   Path for alternative source location (default: 'src' root directory)
137   -t   Path for alternative build  location (default: 'BLD' in configuration folder)
138   -v   Level of verbosity ([0-3])
139
140Examples:
141   ¤ Configuration build
142        Creation       : ./makenemo -[adru] ... -m ... [...]
143        Duplication    : ./makenemo -r      ... -n ... [...]
144   ¤ Configuration management
145        List CPP keys  : ./makenemo [...] list_key
146        Add-Remove keys: ./makenemo [...] add_key '...' del_key '...'
147        Fresh start    : ./makenemo [...] clean
148        Erasure        : ./makenemo [...] clean_config
149
150EOF
151            exit 0       ;;
152      ('d') x_d=${OPTARG};; ('n') x_n=${OPTARG};; ('r') x_r=${OPTARG};; ('u') x_u=${OPTARG};;
153      ('a') x_a=${OPTARG};; ('m') x_m=${OPTARG};; ('j') x_j=${OPTARG};; ('t') x_t=${OPTARG};;
154      ('e') x_e=${OPTARG};; ('s') x_s=${OPTARG};; ('v') x_v=${OPTARG}                      ;;
155      ('k') chk_key=${OPTARG}                                                              ;;
156      (':') echo ${b_n}" : -"${OPTARG}" option : missing value" 1>&2;   exit 2             ;;
157      ('?') echo ${b_n}" : -"${OPTARG}" option : not supported" 1>&2;   exit 2             ;;
158   esac
159
160done
161
162shift $(($OPTIND-1));
163
164## Get clean, clean_config options
165while [ ${#1} -gt 0 ]; do
166
167   case "$1" in
168      'clean'       ) x_c="--$1"                                     ;;
169      'clean_config') . ${COMPIL_DIR}/Fclean_config.sh; exit         ;;
170      ## Checking if argument has anything other than whitespace
171      'add_key'     ) [[ ! "$2" =~ ^\ +$ ]] && list_add_key=$2; shift;;
172      'del_key'     ) [[ ! "$2" =~ ^\ +$ ]] && list_del_key=$2; shift;;
173      'list_key'    ) list_key='1'                                   ;;
174      '*'           ) echo " \"$1\" BAD OPTION"; exit 2              ;;
175   esac
176
177   shift
178done
179
180
181export NEW_CONF=${x_n}
182NBR_PRC=${x_j}
183CMP_NAM=${x_m}
184NEM_SUBDIR=${x_d}
185REF_CONF=${x_r}
186DEMO_CONF=${x_a}
187RMT_CONF=${x_u}
188TML_CONF=${REF_CONF}
189export NEMO_DIR=${MAIN_DIR}/${x_s}
190
191[ "${CMP_NAM}" ==  'all' ] && . ${COMPIL_DIR}/Flist_archfile.sh all && exit
192
193
194## No ref. cfg, demo case, nor remote cfg selected
195if [[ -z "${REF_CONF}" && -z "${DEMO_CONF}" && -z "${RMT_CONF}" ]]; then
196   conf_file='work_cfgs.txt'
197
198      ## Reuse last configuration compiled if any (existing 'work_cfgs.txt')
199      if [[ $( find ./cfgs ./tests -name work_cfgs.txt ) ]]; then
200         CONFIG_DIR=${MAIN_DIR}/$( ls -rt */work_cfgs.txt | awk -F/ 'END{ print $1}' )
201         TML_CONF=$( tail -1 ${CONFIG_DIR}/${conf_file} | awk '{ print $1 }' )
202      else
203         ## No ${REF_CONF}, ${DEMO_CONF}, ${RMT_CONF} nor ${NEM_SUBDIR} and 1st compilation => exit
204         echo -e "\033[0;33m\nNo previous compilation found!"
205         echo -e "\033[0;31m\nAt least a reference configuration ('-r'), a demonstration case ('-a'), "
206         echo -e "a remote configuration ('-u') or a set of NEMO sub-components ('-d') "
207         echo -e "has to be choose!!!\033[0m"
208         ${COMPIL_DIR}/Flist_cfgs.sh
209         exit 2
210      fi
211
212## At least one config has been requested
213else
214
215   ## Argument 'all': list all available configurations
216   if [[ "${REF_CONF}" == 'all' || "${DEMO_CONF}" == 'all' || "${RMT_CONF}" == 'all' ]]; then
217      ${COMPIL_DIR}/Flist_cfgs.sh
218      exit 2
219   elif [[ -n "${REF_CONF}" && -n "${DEMO_CONF}" ]]; then
220      echo -e "\033[0;31m\nYou have to choose whether you work with:"
221      echo -e "  - Supported reference configurations in ./cfgs  ('-r') or"
222      echo -e "  - Unsupported demonstration cases    in ./tests ('-a')\033[0m\n"
223      exit 2
224   fi
225
226   ## Remote cfg
227   if   [ -n "${RMT_CONF}" ]; then
228      conf_file='rmt_cfgs.txt' ; CONFIG_DIR=${MAIN_DIR}/tests;
229
230      ## Little tricky this one
231      for word in $( grep ${RMT_CONF} ${CONFIG_DIR}/${conf_file} ); do
232         words[${#words[@]}]=$word
233      done
234
235      TML_CONF=${words[2]}; NEM_SUBDIR=${words[4]}; URL=${words[6]}
236
237   ## Demo case
238   elif [ -n "${DEMO_CONF}" ]; then
239      conf_file='demo_cfgs.txt'; CONFIG_DIR=${MAIN_DIR}/tests; TML_CONF=${DEMO_CONF}
240   fi
241
242fi
243
244## Test if ref. cfg or demo case does exist
245if [[ ! $( grep "${TML_CONF} " ${CONFIG_DIR}/*_cfgs.txt ) ]]; then
246   echo -e "\033[0;31m\nThe reference configuration ('-r'), demonstration case ('-a') or "
247   echo -e "remote configuration ('-u') selected is not available!!!"
248   echo -e "Check if you use the good option and the available items in txt files\033[0m"
249   ${COMPIL_DIR}/Flist_cfgs.sh
250   exit 2
251
252## Update sub-comps if needed
253elif [ -z "${NEM_SUBDIR}" ]; then
254   ## First check working cfgs file
255   
256   if [ -f ${CONFIG_DIR}/work_cfgs.txt ]; then
257      NEM_SUBDIR=$(    grep "${TML_CONF} " ${CONFIG_DIR}/work_cfgs.txt | awk '{$1 = ""; print $0}' )
258   fi
259
260   ## Then versioned cfg files
261   if [ -z "${NEM_SUBDIR}" ]; then
262      NEM_SUBDIR=$( grep "${TML_CONF} " ${CONFIG_DIR}/${conf_file}  | awk '{$1 = ""; print $0}' )
263   fi
264
265fi
266
267[ -z "${NEW_CONF}" || "${TML_CONF}" == "${NEW_CONF}" ] && NEW_CONF=${TML_CONF}'_WK'
268export NEMO_TDIR=${x_t:-$CONFIG_DIR}
269
270## Save new configuration with sub-components set in work_cfgs.txt
271[ -f ${CONFIG_DIR}/work_cfgs.txt ] && sed -i "/${NEW_CONF} /d" ${CONFIG_DIR}/work_cfgs.txt
272echo ${NEW_CONF} "${NEM_SUBDIR}" \
273   >> ${CONFIG_DIR}/work_cfgs.txt
274
275cd ${CONFIG_DIR}
276
277printf "\nYou are installing a new configuration %s from %s " ${NEW_CONF} ${TML_CONF}
278printf  "with sub-components: %s\n"  "${NEM_SUBDIR}"
279
280## Build a copy of a tmp cfg
281[ ! -d ${NEW_CONF} ] && ${COMPIL_DIR}/Fmake_config.sh ${NEW_CONF} ${TML_CONF}
282
283## Get online script file for remote cfg
284[ -n "${RMT_CONF}" ] && ${COMPIL_DIR}/Ffetch_extdir.sh ${NEW_CONF} $URL
285
286#- Create the WORK ---
287#- Clean links and librairies ---
288#- Creating the good links, at first on OCE ---
289. ${COMPIL_DIR}/Fmake_WORK.sh ${x_e} ${NEW_CONF} ${NEM_SUBDIR} || exit 3
290
291. ${COMPIL_DIR}/Fmake_bld.sh ${CONFIG_DIR} ${NEW_CONF} ${NEMO_TDIR} || exit 3
292
293# build the complete list of the cpp keys of this configuration
294if [ ${chk_key} -eq 1 ] ; then
295
296   for i in $( grep "^ *#.* key_" ${NEW_CONF}/WORK/* ); do
297      echo $i | grep key_ | sed -e "s/=.*//"
298   done \
299   | sort -d | uniq > ${COMPIL_DIR}/full_key_list.txt
300
301   [ ${list_key} -eq 1 ] && cat ${COMPIL_DIR}/full_key_list.txt && exit 0
302
303fi
304
305#- At this stage new configuration has been added, we add or remove keys
306[ ! -z "${list_add_key}" ] && { . ${COMPIL_DIR}/Fadd_keys.sh ${NEW_CONF} add_key ${list_add_key}; }
307[ ! -z "${list_del_key}" ] && { . ${COMPIL_DIR}/Fdel_keys.sh ${NEW_CONF} del_key ${list_del_key}; }
308
309#- check that all keys are really existing...
310if [ $chk_key -eq 1 ] ; then
311
312   for kk in $( cat ${NEW_CONF}/cpp_${NEW_CONF}.fcm ); do
313
314      if [ "$( echo $kk | cut -c 1-4 )" == "key_" ]; then
315         kk=${kk/=*/}
316
317         if [ ! $( grep $kk ${COMPIL_DIR}/full_key_list.txt ) ]; then
318            echo
319            echo "E R R O R : key "$kk" is not found in ${NEW_CONF}/WORK routines..."
320            echo "we stop..."
321            echo
322            exit 1
323         fi
324
325      fi
326
327   done
328
329fi
330
331#- At this stage cpp keys have been updated. we can check the arch file
332#- When used for the first time, choose a compiler ---
333. ${COMPIL_DIR}/Fcheck_archfile.sh arch_nemo.fcm cpp.fcm ${CMP_NAM} || exit 3
334
335#- At this stage the configuration has beeen chosen
336#- We coose the default light file
337export USEBLD=bldxag.cfg
338
339#- We look after agrif
340grep key_agrif ${COMPIL_DIR}/cpp.fcm && export AGRIFUSE=1 && export USEBLD=${USEBLD/xag/}
341. ${COMPIL_DIR}/Fprep_agrif.sh ${NEW_CONF} ${NEMO_TDIR} || exit 3
342
343#-
344#_ END OF CONFIGURATION PHASE
345#_
346
347#-
348#- Compile ---
349
350if [ "${NBR_PRC}" -gt 0 ]; then
351   cd ${NEMO_TDIR}/${NEW_CONF} || cd -
352
353   ## if AGRIF we do a first preprocessing
354   if [[ ${#x_c} -eq 0 && "$AGRIFUSE" -eq 1 ]]; then
355      fcm build --ignore-lock -j 1 ${COMPIL_DIR}/bld_preproagr.cfg ||{ cd - ; exit 1 ;}
356      echo ''
357      echo "---------------------------------"
358      echo "CONV preprocessing successfull !!"
359      echo "---------------------------------"
360      echo ''
361   fi
362
363   fcm build ${x_c} --ignore-lock -v ${x_v} -j ${NBR_PRC} ${COMPIL_DIR}/$USEBLD ||{ cd - ; exit 1 ;}
364
365   if [ -f ${NEMO_TDIR}/${NEW_CONF}/BLD/bin/nemo.exe ]; then
366      ln -sf ${NEMO_TDIR}/${NEW_CONF}/BLD/bin/nemo.exe  ${CONFIG_DIR}/${NEW_CONF}/EXP00/nemo
367   fi
368
369   ## add remove for clean option
370   if [ ${#x_c} -ne 0 ]; then
371      rm -rf ${NEMO_TDIR}/${NEW_CONF}/NEMOFILES
372      rm -rf ${NEMO_TDIR}/${NEW_CONF}/WORK
373      rm -rf ${NEMO_TDIR}/${NEW_CONF}/BLD
374      rm -rf ${NEMO_TDIR}/${NEW_CONF}/EXP00/nemo
375      rm -f ${COMPIL_DIR}/*history ${COMPIL_DIR}/*fcm ${COMPIL_DIR}/*txt
376      echo "cleaning ${NEW_CONF} WORK, BLD"
377   fi
378
379fi
380
381#- Come back to original directory ---
382cd -
383
384#-
385#- Unset variables
386${COMPIL_DIR}/Fclean_var.sh
Note: See TracBrowser for help on using the repository browser.