#!/bin/ksh # # Usage: create_odbglue [dbname(s)] # # Creates glue-file "_odb_glue.c" and compiles it, if # environment variable "ODB_CC" has been defined # # Author: Sami Saarinen, ECMWF, 13-Feb-2004 # 11-Apr-2006 : No more known/predefined databases # # set -eu if [[ $# -lt 1 ]] ; then echo "Usage: create_odbglue [dbname(s)]" >&2 exit 1 fi odbglue=_odb_glue.c cat > $odbglue << 'EOF' #include #include extern void codb_procdata_(int *myproc, int *nproc, int *pid, int *it, int *inumt); extern void ODB_add2funclist(const char *dbname, void (*func)(), int funcno); #define Static_Init(db) \ if (strncmp(dbname, #db, dbname_len) == 0) { \ extern void db##_static_init(); \ ODB_add2funclist(#db, db##_static_init, 0); \ } \ else { /* fprintf(stderr,"***Warning: Not initializing '%s'\n",#db); */ } void codb_set_entrypoint_(const char *dbname /* Hidden arguments */ , int dbname_len) { int myproc = 0; codb_procdata_(&myproc, NULL, NULL, NULL, NULL); if (myproc == 1) { fprintf(stderr, "codb_set_entrypoint_(dbname='%*s', dbname_len=%d)\n", dbname_len, dbname, dbname_len); } EOF #known_dbs="CCMA ECMA ECMASCR PREODB" known_dbs="" newarg="$known_dbs " for arg in $* do db=$(basename $arg | perl -pe 's/\s+//g; s/\..*$//; s/[_-]//g; tr/a-z/A-Z/') newarg="$newarg$db " done # Ensure uniqueness (strictly speaking not a requirement, but cleaner) newarg=$(echo "$newarg" | perl -pe 's/(\S+)\s*/$1\n/g' | sort -u) # Lets rock'n'roll now ... for db in $newarg do echo " Static_Init($db);" >> $odbglue done cat >> $odbglue << 'EOF' } EOF #ls -l $odbglue export ODB_CC=${ODB_CC:=""} rc=0 if [[ "$ODB_CC" != "" ]] ; then echo "$ODB_CC -c $odbglue" >&2 $ODB_CC -c $odbglue >&2 || rc=$? fi exit $rc