1 |
#! /usr/bin/env bash |
2 |
# |
3 |
# Cheap shell script for building makefile |
4 |
# Has various missing features |
5 |
# o can't cope with source files that have duplicate names but that |
6 |
# are in different libraries |
7 |
# o doesn't have any explicit concept of ordering |
8 |
# o needs to deal with .F, .F90 and .c suffixes |
9 |
# |
10 |
# Debug settings |
11 |
# set -uvx |
12 |
# |
13 |
if test -f makemake.header ; then |
14 |
cat makemake.header |
15 |
fi |
16 |
|
17 |
F90_SUFF=F90 |
18 |
OBJ_SUFF='o' |
19 |
MOD_SUFF='mod' |
20 |
F90C=gfortran |
21 |
F90C=ifort |
22 |
F90C_ARGS='-O0 -c -CB -g -o' |
23 |
F90C_ARGS='-O0 -c -g -o' |
24 |
LINK=gfortran |
25 |
LINK=ifort |
26 |
EXE=a.out |
27 |
# |
28 |
dlist='../src ../pkg' |
29 |
command=`which $0` |
30 |
tdir=.`echo ${command} | sed -e 's/\/.*\///g' | sed -e 's/\..*$//g'`.$$ |
31 |
echo "# Searching directories "${dlist} |
32 |
echo "# Using temporary directory "${tdir} |
33 |
|
34 |
echo ifndef F90C |
35 |
echo F90C=${F90C} |
36 |
echo endif |
37 |
|
38 |
echo F90C_ARGS=${F90C_ARGS} |
39 |
echo OBJ_SUFF=${OBJ_SUFF} |
40 |
echo MOD_SUFF=${MOD_SUFF} |
41 |
|
42 |
echo ifndef F90C |
43 |
echo LINK=${LINK} |
44 |
echo endif |
45 |
|
46 |
echo ifndef EXE |
47 |
echo EXE=${EXE} |
48 |
echo endif |
49 |
|
50 |
mkdir ${tdir} |
51 |
|
52 |
# Set the includes |
53 |
echo IDIR='\' |
54 |
for d in ${dlist} ; do |
55 |
dl=`find $d -follow -type d -not -regex '.*\.svn.*' -not -regex '.*\CVS*'` |
56 |
for di in ${dl} ; do |
57 |
echo '-I'${di}' \' |
58 |
done |
59 |
done |
60 |
echo '$(EXTRA_IDIR)' |
61 |
|
62 |
# Executable links all the .o from ${dlist} except libs which are built |
63 |
# from each ../pkg subdirectory |
64 |
ol='' |
65 |
ll='' |
66 |
lo='' |
67 |
for d in ${dlist} ; do |
68 |
if test "${d##*/}" = "pkg" ; then |
69 |
# All these are treated as separate library sources |
70 |
dl=`find $d -follow -type d -not -regex '.*\.svn.*' -not -regex '.*\CVS*'` |
71 |
for dd in ${dl} ; do |
72 |
if test "${dd##*/}" != "pkg" ; then |
73 |
echo '## Library name = 'lib${dd##*/}.a |
74 |
lfl=`find ${dd} -follow -maxdepth 1 -type f -not -regex '.*\.svn.*' -not -regex '.*\CVS*'` |
75 |
echo '## Library files = '${lfl##*/} |
76 |
ll=${ll}' 'lib${dd##*/}.a |
77 |
lo=${lo}' '-l${dd##*/} |
78 |
fi |
79 |
done |
80 |
else |
81 |
# All others are .o |
82 |
fl=`find $d -follow -name '*.'${F90_SUFF} -not -regex '.*\.svn.*' -not -regex '.*\CVS*'` |
83 |
for f in ${fl} ; do |
84 |
fn=${f##*/} |
85 |
of=${fn%.*}.${OBJ_SUFF} |
86 |
ol=${ol}' '${of} |
87 |
done |
88 |
fi |
89 |
done |
90 |
|
91 |
# Write objlist |
92 |
echo 'OBJLIST=\' |
93 |
for o in ${ol} ; do |
94 |
echo ${o}' \' |
95 |
done |
96 |
echo ' ' |
97 |
|
98 |
# Write library list |
99 |
echo 'LIBLIST=\' |
100 |
for l in ${ll} ; do |
101 |
echo ${l}' \' |
102 |
done |
103 |
echo '$(EXTRA_LIB_LIST)' |
104 |
echo ' ' |
105 |
|
106 |
# Write liball.a library list |
107 |
echo 'LIBLIST_ALL=\' |
108 |
for l in ${ll} ; do |
109 |
echo ${l}' \' |
110 |
done |
111 |
echo ' ' |
112 |
|
113 |
# Write library option |
114 |
# write it twice because gnu linker doesn't search backwards and we don't know the |
115 |
# right order (I think this is what ar and ranlib are for!) |
116 |
# Add liball.a to fix issues with intel compiler on columbia (2007-09-16) (ifort 9.1.039). |
117 |
echo 'LIBOPT=\' |
118 |
for l in ${lo} ; do |
119 |
echo ${l}' \' |
120 |
done |
121 |
for l in ${lo} ; do |
122 |
echo ${l}' \' |
123 |
done |
124 |
echo '-lall ' |
125 |
echo ' ' |
126 |
|
127 |
|
128 |
# Set rule for executable |
129 |
echo '$(EXE): $(OBJLIST) $(LIBLIST) liball.a' |
130 |
echo -e \\t'$(LINK) -L. -o $(EXE) $(OBJLIST) $(LIBOPT) $(EXTRA_LOPT)' |
131 |
|
132 |
# Set rule for liball.a |
133 |
echo ' ' |
134 |
echo 'liball.a: $(LIBLIST_ALL)' |
135 |
echo ' \rm -fr tmp' |
136 |
echo ' \rm -f liball.a' |
137 |
echo ' mkdir tmp' |
138 |
echo ' cp $(LIBLIST_ALL) tmp' |
139 |
echo ' cd tmp; ls -1 *.a | sed "s/^.*/ar x &/" > foo' |
140 |
echo ' cd tmp; source foo' |
141 |
echo ' cd tmp; ar rc liball.a *.o; cp liball.a ..' |
142 |
|
143 |
|
144 |
# Set rule for libraries |
145 |
ol='' |
146 |
ll='' |
147 |
for d in ${dlist} ; do |
148 |
if test "${d##*/}" = "pkg" ; then |
149 |
# All these are treated as separate library sources |
150 |
dl=`find $d -follow -type d -not -regex '.*\.svn.*' -not -regex '.*\CVS*'` |
151 |
for dd in ${dl} ; do |
152 |
if test "${dd##*/}" != "pkg" ; then |
153 |
lfl=`find ${dd} -follow -maxdepth 1 -type f -not -regex '.*/\.[a-zA-Z].*' -not -regex '.*\CVS*'` |
154 |
# lfl=`find -L ${dd} -maxdepth 1 -type f -not -regex '.*\.svn.*'` |
155 |
fo='' |
156 |
for ff in ${lfl}; do |
157 |
f=${ff##*/} |
158 |
fo=${fo}' '${f%%.${F90_SUFF}}.${OBJ_SUFF} |
159 |
done |
160 |
echo lib${dd##*/}.a:' '${fo} |
161 |
echo -e \\t'@touch 'lib${dd##*/}.a |
162 |
echo -e \\t'@rm 'lib${dd##*/}.a |
163 |
echo -e \\t'$(AR) -rus' lib${dd##*/}.a ${fo} |
164 |
fi |
165 |
echo ' ' |
166 |
done |
167 |
fi |
168 |
done |
169 |
|
170 |
# Set rule for individual object and module files |
171 |
for d in ${dlist} ; do |
172 |
fl=`find $d -follow -name '*.'${F90_SUFF} -not -regex '.*\.svn.*' -not -regex '.*\CVS*'` |
173 |
for f in ${fl} ; do |
174 |
fonly=${f##*/} |
175 |
base=${fonly%.*} |
176 |
echo ${base}.${OBJ_SUFF}: $f |
177 |
echo -e \\t'$(F90C) $(IDIR) $(F90C_ARGS) $@ $<' |
178 |
echo ${base}.${MOD_SUFF}: $f |
179 |
echo -e \\t'$(F90C) $(IDIR) $(F90C_ARGS) '${base}.${OBJ_SUFF}' $<' |
180 |
done |
181 |
done |
182 |
|
183 |
# Add dependency rules for source that includes another module via a USE |
184 |
# statement |
185 |
for d in ${dlist} ; do |
186 |
fl=`find $d -follow -name '*.'${F90_SUFF} -not -regex '.*\.svn.*' -not -regex '.*\CVS*'` |
187 |
for f in ${fl} ; do |
188 |
fonly=${f##*/} |
189 |
base=${fonly%.*} |
190 |
mlist=`grep -i '^ *use *' ${f} | awk '{print $2}'` |
191 |
for m in ${mlist} ; do |
192 |
# echo ${base}.'$(OBJ_SUFF)': $m.'$(OBJ_SUFF)' |
193 |
if test -f makemake.externals; then |
194 |
chkext=`grep -i '^'$m' *$' makemake.externals ` |
195 |
extyn=$? |
196 |
fi |
197 |
if test "$extyn" != "0" ; then |
198 |
echo ${base}.'$(OBJ_SUFF)': $m.'$(MOD_SUFF)' |
199 |
echo ${base}.'$(MOD_SUFF)': $m.'$(MOD_SUFF)' |
200 |
fi |
201 |
done |
202 |
done |
203 |
done |
204 |
|
205 |
\rm -fr ${tdir} |