1 |
#! /usr/bin/env bash |
2 |
|
3 |
# $Header: $ |
4 |
# $Name: $ |
5 |
|
6 |
mkfile='Makefile' |
7 |
if [ $# -ge 1 ] ; then |
8 |
if test $1 = '-h' ; then |
9 |
echo "Usage: `basename $0` MAKEFILE (default: 'Makefile') ; [-h] print this" |
10 |
exit 9 |
11 |
fi |
12 |
mkfile=$1 |
13 |
fi |
14 |
|
15 |
if test ! -f $mkfile ; then |
16 |
echo "`basename $0` error: missing file '$mkfile'" |
17 |
exit 8 |
18 |
fi |
19 |
|
20 |
cmdline=`grep '^# .*genmake2 ' $mkfile | sed 's/^# *//'` |
21 |
echo " get Command-Line from file '$mkfile' :" |
22 |
echo $cmdline |
23 |
|
24 |
printf "=== Parse Options ===\n" |
25 |
CMDLINE= |
26 |
MODS= |
27 |
flg=0 |
28 |
MPI=0 |
29 |
prev= |
30 |
dbq=0 ; sgq=0 ; keep= |
31 |
# put newline between word in cmdline: |
32 |
# CMDLINE=`echo $cmdline | awk '{ for(i=1;i<=NF;i++) print $i}'` |
33 |
#echo "CMDLINE='$CMDLINE'" |
34 |
for xx in $cmdline |
35 |
do |
36 |
arg=`echo $xx` |
37 |
# glue multiple words argument (unbalanced starting & ending double quote) |
38 |
n1=`echo $xx | grep -c '^"'` |
39 |
n2=`echo $xx | grep -c '"$'` |
40 |
if [ $n1 -eq 1 -a $n2 -eq 0 ] ; then |
41 |
dbq=1; keep=$xx |
42 |
continue |
43 |
fi |
44 |
if [ $n1 -eq 0 -a $dbq -eq 1 ] ; then |
45 |
if [ $n2 -eq 1 ] ; then |
46 |
n1=$dbq ; dbq=0 |
47 |
xx="$keep $xx" |
48 |
else |
49 |
keep="$keep $xx" |
50 |
continue |
51 |
fi |
52 |
fi |
53 |
# remove starting & ending double quote |
54 |
if [ $n1 -eq 1 -a $n2 -eq 1 ] ; then |
55 |
arg=`echo $xx | sed 's/^"//' | sed 's/"$//'` |
56 |
fi |
57 |
# glue multiple words argument (unbalanced starting & ending single quote) |
58 |
n1=`echo $xx | grep -c "^'"` |
59 |
n2=`echo $xx | grep -c "'$"` |
60 |
if [ $n1 -eq 1 -a $n2 -eq 0 ] ; then |
61 |
sgq=1; keep=$xx |
62 |
continue |
63 |
fi |
64 |
if [ $n1 -eq 0 -a $sgq -eq 1 ] ; then |
65 |
if [ $n2 -eq 1 ] ; then |
66 |
n1=$sgq ; sgq=0 |
67 |
xx="$keep $xx" |
68 |
else |
69 |
keep="$keep $xx" |
70 |
continue |
71 |
fi |
72 |
fi |
73 |
# remove starting & ending single quote |
74 |
if [ $n1 -eq 1 -a $n2 -eq 1 ] ; then |
75 |
arg=`echo $xx | sed "s/^'//" | sed "s/'$//"` |
76 |
fi |
77 |
# process "arg" |
78 |
opt=`expr "x$arg" : 'x[^=]*=\(.*\)'` |
79 |
# echo "xx='$xx' ; arg='$arg' ; opt='$opt'" |
80 |
# sav "arg" to CMDLINE <- not actually used |
81 |
#eqs=`echo $arg | grep -c '='` |
82 |
#if [ $eqs -gt 0 ] ; then |
83 |
# pfx=`echo $arg | sed 's/=.*$/=/'` |
84 |
# nw=`echo $opt | wc -w` |
85 |
# if test $nw = '1' ; then |
86 |
# CMDLINE="$CMDLINE $pfx$opt" |
87 |
# else |
88 |
# CMDLINE="$CMDLINE $pfx'$opt'" |
89 |
# fi |
90 |
#else |
91 |
nw=`echo $arg | wc -w` |
92 |
if test $nw = '1' ; then |
93 |
CMDLINE="$CMDLINE $arg" |
94 |
else |
95 |
CMDLINE="$CMDLINE '$arg'" |
96 |
fi |
97 |
#fi |
98 |
if test -n "$prev" -a $flg = '1' ; then |
99 |
eval "$prev=\$arg" |
100 |
prev= |
101 |
continue |
102 |
fi |
103 |
case $arg in |
104 |
-mpi | --mpi | -mpi=* | --mpi=* ) |
105 |
MPI=`expr $MPI + 1` ;; |
106 |
-mods | --mods | -mo | --mo ) |
107 |
prev=MODS |
108 |
flg=`expr $flg + 1` ;; |
109 |
-mods=* | --mods=* | -mo=* | --mo=* ) |
110 |
MODS=$opt |
111 |
flg=`expr $flg + 1` ;; |
112 |
*) ;; |
113 |
esac |
114 |
done |
115 |
|
116 |
printf "=== \n" |
117 |
echo " Set MPI='$MPI' ; MODS='$MODS'" |
118 |
#echo "flg='$flg'" |
119 |
|
120 |
if [ $flg -lt 1 ] ; then |
121 |
echo "`basename $0` error: no '-mods' found" |
122 |
exit 4 |
123 |
fi |
124 |
if [ $flg -gt 1 ] ; then |
125 |
echo "`basename $0` error: found multiple '-mods' ($flg)" |
126 |
exit 3 |
127 |
fi |
128 |
if [ $MPI -gt 1 ] ; then |
129 |
echo "`basename $0` error: found multiple '-mpi' ($MPI)" |
130 |
exit 2 |
131 |
fi |
132 |
|
133 |
#---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
134 |
|
135 |
printf "=== Link / Unlink *_mpi files from 'MODS' dirs ===\n" |
136 |
printf " MODS dir: " |
137 |
MPI_LNKF= |
138 |
for d in $MODS ; do |
139 |
if test ! -d $d ; then |
140 |
echo |
141 |
echo "Error: MODS directory \"$d\" not found!" |
142 |
exit 1 |
143 |
else |
144 |
printf "$d " |
145 |
#SOURCEDIRS="$SOURCEDIRS $d" |
146 |
#INCLUDEDIRS="$INCLUDEDIRS $d" |
147 |
#------------------------------------------------------- |
148 |
# Put special links so that MPI specific files are used |
149 |
MPI_FILES=`(cd $d ; find . -name "*_mpi" -print)` |
150 |
for i in $MPI_FILES ; do |
151 |
ii=`echo $i | sed 's:^\./::'` |
152 |
name=`echo $ii | sed 's:_mpi::' ` |
153 |
if test $MPI = 0 ; then |
154 |
# NO: We undo an _mpi symbolically linked file |
155 |
if test -L $name ; then |
156 |
cmp $name "$d/$ii" > /dev/null 2>&1 |
157 |
RETVAL=$? |
158 |
if test "x$RETVAL" = x0 ; then |
159 |
printf "Un-linking $name ; " |
160 |
rm -f $name |
161 |
fi |
162 |
fi |
163 |
else |
164 |
# YES: We symbolically link this file (with conditions if already there) |
165 |
src="$d/$ii" |
166 |
if test $name = "SIZE.h" -a -f SIZE.h.mpi ; then src="SIZE.h.mpi" ; fi |
167 |
if test -L $name ; then |
168 |
cmp $src $name > /dev/null 2>&1 |
169 |
RETVAL=$? |
170 |
yy=0 ; |
171 |
for xx in $MPI_LNKF ; do if test $xx = $name ; then yy=1 ; fi ; done |
172 |
if test "x$RETVAL" != x0 -a $yy = 0 ; then |
173 |
# remove sym-link if different and has not just been linked |
174 |
printf "Un-link + " |
175 |
rm -f $name |
176 |
fi |
177 |
if test "x$RETVAL" = x0 ; then |
178 |
# if identical, keep sym-link and keep record of it |
179 |
MPI_LNKF="$MPI_LNKF $name" |
180 |
fi |
181 |
fi |
182 |
if ! test -f $name ; then |
183 |
# make sym-link and keep record of it |
184 |
printf "Linking $src to $name ; " |
185 |
ln -sf $src $name |
186 |
MPI_LNKF="$MPI_LNKF $name" |
187 |
fi |
188 |
fi |
189 |
done |
190 |
#------------------------------------------------------- |
191 |
fi |
192 |
done |
193 |
echo |
194 |
echo "MPI_LNKF='$MPI_LNKF'" |
195 |
|
196 |
#---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
197 |
printf "=== Generate new Makefile ===\n" |
198 |
#echo $CMDLINE |
199 |
#eval $CMDLINE |
200 |
echo $cmdline |
201 |
eval $cmdline |