Merge pull request #3633 from martin-frbg/perl_fallback
[platform/upstream/openblas.git] / f_check
1 #!/bin/sh
2
3 split() {
4     set -f
5     old_ifs=$IFS
6     IFS=$2
7     set -- $1
8     printf '%s ' "$@"
9     IFS=$old_ifs
10     set +f
11 }
12
13 hostos="$(uname -s | sed 's/\-.*//')"
14
15 #
16 # 1. Not specified
17 #   1.1 Automatically detect, then check compiler
18 #   1.2 If no fortran compiler is detected, gfortran is default with NOFORTRAN definition
19 # 2. Specified
20 #   2.1 If path is correct, check compiler
21 #   2.2 If path is not correct, but still valid compiler name, force setting
22 #     2.2.2 Path is not correct, invalid compiler name, then gfortran is default with NOFORTRAN definition
23 #
24
25 makefile="$1"
26 config="$2"
27
28 nofortran=0
29
30 shift 2
31 compiler="$*"
32 compiler_bin="$1"
33
34 # f77 is too ambiguous
35 [ "$compiler" = "f77" ] && compiler=''
36
37 path=`split "$PATH" ':'`
38
39 if [ -z "$compiler" ]; then
40
41     lists="gfortran g95 frt fort openf90 openf95
42               sunf77 sunf90 sunf95
43               xlf95 xlf90 xlf
44               ppuf77 ppuf95 ppuf90 ppuxlf
45               pathf90 pathf95
46               pgf95 pgf90 pgf77 pgfortran nvfortran
47               flang egfortran
48               ifort nagfor"
49
50     for list in $lists; do
51         for p in $path; do
52             if [ -x "$p/$list" ]; then
53                 compiler=$list
54                 compiler_bin=$list
55                 break 2
56             fi
57         done
58     done
59 fi
60
61 if [ -z "$compiler" ]; then
62
63     nofortran=1
64     compiler=gfortran
65     vendor=GFORTRAN
66     bu="_"
67
68 else
69     {
70         data="$(command -v "$compiler_bin" >/dev/null 2>&1)"
71         vendor=""
72     } && {
73         data=`$compiler -O2 -S ftest.f > /dev/null 2>&1 && cat ftest.s && rm -f ftest.s`
74         if [ -z "$data" ]; then
75                 data=`$compiler -O2 -S ftest.f > /dev/null 2>&1 && cat ftest.c && rm -f ftest.c`
76         fi
77
78         case "$data" in *zhoge_*) bu=_ ;; esac
79
80         case "$data" in
81             *Fujitsu*)
82                 vendor=FUJITSU
83                 openmp='-Kopenmp'
84                 ;;
85             *GNU*|*GCC*)
86
87                 v="${data##*GCC: *\) }"
88                 v="${v%%\"*}"
89
90                 major="${v%%.*}"
91
92                 if [ "$major" -ge 4 ]; then
93                     vendor=GFORTRAN
94                     openmp='-fopenmp'
95                 else
96                     case "$compiler" in
97                         *flang*)
98                             vendor=FLANG
99                             openmp='-fopenmp'
100                             ;;
101                         *pgf*|*nvf*)
102                             vendor=PGI
103                             openmp='-mp'
104                             ;;
105                         *)
106                             vendor=G77
107                             openmp=''
108                             ;;
109                     esac
110                 fi
111                 ;;
112             *g95*)
113                 vendor=G95
114                 openmp=''
115                 ;;
116             *Intel*)
117                 vendor=INTEL
118                 openmp='-fopenmp'
119                 ;;
120             *'Sun Fortran'*)
121                 vendor=SUN
122                 openmp='-xopenmp=parallel'
123                 ;;
124             *PathScale*)
125                 vendor=PATHSCALE
126                 openmp='-openmp'
127                 ;;
128             *Open64*)
129                 vendor=OPEN64
130                 openmp='-mp'
131                 ;;
132             *PGF*|*NVF*)
133                 vendor=PGI
134                 openmp='-mp'
135                 ;;
136             *'IBM XL'*)
137                 vendor=IBM
138                 openmp='-openmp'
139                 ;;
140             *NAG*)
141                 vendor=NAG
142                 openmp='-openmp'
143                 ;;
144         esac
145
146         # for embedded underscore name, e.g. zho_ge, it may append 2 underscores.
147         data=`$compiler -O2 -S ftest3.f >/dev/null 2>&1 && cat ftest3.s && rm -f ftest3.s`
148
149         [ -z "$data" ] && {
150                 data=`$compiler -O2 -S ftest3.f >/dev/null 2>&1 && cat ftest3.c && rm -f ftest3.c`
151         }
152
153         case "$data" in *' zho_ge__'*) need2bu=1 ;; esac
154         case "$vendor" in *G95*) [ "$NO_LAPACKE" != 1 ] && need2bu='' ;; esac
155         }
156
157     if [ -z "$vendor" ]; then
158         case "$compiler" in
159             *g77*)
160                 vendor=G77
161                 bu=_
162                 openmp=''
163                 ;;
164             *g95*)
165                 vendor=G95
166                 bu=_
167                 openmp=''
168                 ;;
169             *gfortran*)
170                 vendor=GFORTRAN
171                 bu=_
172                 openmp='-fopenmp'
173                 ;;
174             *ifort*)
175                 vendor=INTEL
176                 bu=_
177                 openmp='-fopenmp'
178                 ;;
179             *pathf*)
180                 vendor=PATHSCALE
181                 bu=_
182                 openmp='-mp'
183                 ;;
184             *pgf*|*nvf*)
185                 vendor=PGI
186                 bu=_
187                 openmp='-mp'
188                 ;;
189             *ftn*)
190                 vendor=PGI
191                 bu=_
192                 openmp=-openmp
193                 ;;
194             *frt*)
195                 vendor=FUJITSU
196                 bu=_
197                 openmp='-openmp'
198                 ;;
199             *sunf77*|*sunf90*|*sunf95*)
200                 vendor=SUN
201                 bu=_
202                 openmp='-xopenmp=parallel'
203                 ;;
204             *ppuf*|*xlf*)
205                 vendor=IBM
206                 openmp='-openmp'
207                 ;;
208             *open64*)
209                 vendor=OPEN64
210                 openmp='-mp'
211                 ;;
212             *flang*)
213                 vendor=FLANG
214                 bu=_
215                 openmp='-fopenmp'
216                 ;;
217             *nagfor*)
218                 vendor=NAG
219                 bu=_
220                 openmp='-openmp'
221                 ;;
222         esac
223
224         if [ -z "$vendor" ]; then
225             nofortran=1
226             compiler="gfortran"
227             vendor=GFORTRAN
228             bu=_
229             openmp=''
230         fi
231     fi
232 fi
233
234 {
235     data=`command -v $compiler_bin >/dev/null 2>&1`
236 } && {
237
238     binary=$BINARY
239
240     [ "$USE_OPENMP" != 1 ] && openmp=''
241
242     case "$binary" in
243         32)
244             {
245                 link=`$compiler $openmp -m32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
246             } || {
247                 link=`$compiler $openmp -q32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
248             } || {
249                 # for AIX
250                 link=`$compiler $openmp -maix32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
251             } || {
252                 # for gfortran MIPS
253                 mips_data=`$compiler_bin -E -dM - < /dev/null`
254                 case "$mips_data" in
255                     *_MIPS_ISA_MIPS64*)
256                         link=`$compiler $openmp -mabi=n32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
257                         ;;
258                     *)
259                         link=`$compiler $openmp -mabi=32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
260                         ;;
261                 esac
262             } || {
263                 binary=''
264             }
265             ;;
266         64)
267             {
268                 link=`$compiler $openmp -m64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
269             } || {
270                 link=`$compiler $openmp -q64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
271             } || {
272                 # for AIX
273                 link=`$compiler $openmp -maix64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
274             } || {
275                 # for gfortran MIPS
276                 link=`$compiler $openmp -mabi=64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
277             } || {
278                 # for nagfor
279                 link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`
280             } || {
281                 binary=''
282             }
283             ;;
284     esac
285
286     if [ -z "$binary" ]; then
287         link=`$compiler $openmp -v ftest2.f 2>&1 && rm -f a.out a.exe`
288     fi
289 }
290
291 if [ "$vendor" = "NAG" ]; then
292     link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`
293 fi
294 linker_L=""
295 linker_l=""
296 linker_a=""
297
298 if [ -n "$link" ]; then
299
300     link=`echo "$link" | sed 's/\-Y[[:space:]]P\,/\-Y/g'`
301
302     link=`echo "$link" | sed 's/\-R[[:space:]]*/\-rpath\%/g'`
303
304     link=`echo "$link" | sed 's/\-rpath[[:space:]]+/\-rpath\%/g'`
305
306     link=`echo "$link" | sed 's/\-rpath-link[[:space:]]+/\-rpath-link\%/g'`
307
308     flags=`echo "$link" | tr ',\n' ' '`
309     # remove leading and trailing quotes from each flag.
310     #@flags = map {s/^['"]|['"]$//g; $_} @flags;
311
312     for flag in $flags; do
313         case "$flag" in -L*)
314             case "$flag" in
315                 -LIST:*|-LANG:*) ;;
316                 *) linker_L="$linker_L $flag" ;;
317             esac
318         esac
319
320         case "$flag" in -Y*)
321             [ "$hostos" = "SunOS" ] && continue
322             linker_L="$linker_L -Wl,$flag"
323             ;;
324         esac
325
326         case "$flag" in --exclude-libs*)
327             linker_L="$linker_L -Wl,$flag"
328             flag=""
329             ;;
330         esac
331
332         case "$flag" in -rpath%*)
333             flag=`echo "$flag" | sed 's/\%/\,/g'`
334             linker_L="$linker_L -Wl,$flag"
335         esac
336
337         case "$flag" in -rpath-link%*)
338             flag=`echo "$flag" | sed 's/\%/\,/g'`
339             linker_L="$linker_L -Wl,$flag"
340             ;;
341         esac
342
343         case "$flag" in *-lgomp*)
344             case "$CC" in *clang*)
345                 flag="-lomp"
346                 ;;
347             esac
348         esac
349
350         case "$flag" in -l*)
351             case "$flag" in
352                 *ibrary*|*gfortranbegin*|*flangmain*|*frtbegin*|*pathfstart*|\
353                     *crt[0-9]*|*gcc*|*user32*|*kernel32*|*advapi32*|*shell32*|\
354                     -l) ;;
355                 *omp*)
356                     case "$vendor" in
357                         *PGI*|*FUJITSU*) ;;
358                         *) linker_l="$linker_l $flag" ;;
359                     esac
360                     ;;
361                 *[0-9]*)
362                     if [ "$vendor" = "FUJITSU" ]; then
363                         case "$flag" in
364                             -lfj90*) linker_l="$linker_l $flag" ;;
365                             *) ;;
366                         esac
367                     fi
368                     ;;
369                 *) linker_l="$linker_l $flag" ;;
370             esac
371         esac
372
373         case "$flag" in *quickfit.o*)
374             [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
375         esac
376
377         case "$flag" in *safefit.o*)
378             [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
379         esac
380
381         case "$flag" in *thsafe.o*)
382             [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
383         esac
384
385         case "$flag" in *.a) linker_a="$linker_a $flag" ;; esac
386     done
387 fi
388
389 if [ "$vendor" = "FLANG" ]; then
390     linker_a="$linker_a -lflang"
391 fi
392
393 printf "F_COMPILER=%s\n" "$vendor"               >> "$makefile"
394 printf "FC=%s\n" "$compiler"                     >> "$makefile"
395 [ -n "$bu" ] && printf 'BU=%s\n' "$bu"           >> "$makefile"
396 [ "$nofortran" -eq 1 ] && printf 'NOFORTRAN=1\n' >> "$makefile"
397
398 [ -n "$bu" ] && printf '#define BUNDERSCORE\t%s\n' "$bu"    >> "$config"
399 [ -n "$bu" ] && printf '#define NEEDBUNDERSCORE\t1\n'       >> "$config"
400 [ -n "$need2bu" ] && printf "#define NEED2UNDERSCORES\t1\n" >> "$config"
401
402 [ -n "$need2bu" ] && printf "#define NEED2UNDERSCORES=1\n"  >> "$config"
403
404 if [ -n "$linker_l" ] || [ -n "$linker_a" ]; then
405     printf "FEXTRALIB=%s %s %s\n" "$linker_L" "$linker_l" "$linker_a" >> "$makefile"
406 fi
407