riscv64: Add RISC-V target
[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 ifx ftn crayftn"
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             *Cray*)
86                 vendor=CRAY
87                 openmp='-fopenmp'
88                 ;;
89             *GNU*|*GCC*)
90
91                 v="${data#*GCC: *\) }"
92                 v="${v%%\"*}"
93
94                 major="${v%%.*}"
95
96                 if [ "$major" -ge 4 ]; then
97                     vendor=GFORTRAN
98                     openmp='-fopenmp'
99                 else
100                     case "$compiler" in
101                         *flang*)
102                             vendor=FLANG
103                             openmp='-fopenmp'
104                             ;;
105                         *ifx*)
106                             vendor=INTEL
107                             openmp='-fopenmp'
108                             ;;
109                         *pgf*|*nvf*)
110                             vendor=PGI
111                             openmp='-mp'
112                             ;;
113                         *)
114                             vendor=G77
115                             openmp=''
116                             ;;
117                     esac
118                 fi
119                 ;;
120             *g95*)
121                 vendor=G95
122                 openmp=''
123                 ;;
124             *Intel*)
125                 vendor=INTEL
126                 openmp='-fopenmp'
127                 ;;
128             *'Sun Fortran'*)
129                 vendor=SUN
130                 openmp='-xopenmp=parallel'
131                 ;;
132             *PathScale*)
133                 vendor=PATHSCALE
134                 openmp='-openmp'
135                 ;;
136             *Open64*)
137                 vendor=OPEN64
138                 openmp='-mp'
139                 ;;
140             *PGF*|*NVF*)
141                 vendor=PGI
142                 openmp='-mp'
143                 ;;
144             *'IBM XL'*)
145                 vendor=IBM
146                 openmp='-openmp'
147                 ;;
148             *NAG*)
149                 vendor=NAG
150                 openmp='-openmp'
151                 ;;
152         esac
153
154         # for embedded underscore name, e.g. zho_ge, it may append 2 underscores.
155         data=`$compiler -O2 -S ftest3.f >/dev/null 2>&1 && cat ftest3.s && rm -f ftest3.s`
156
157         [ -z "$data" ] && {
158                 data=`$compiler -O2 -S ftest3.f >/dev/null 2>&1 && cat ftest3.c && rm -f ftest3.c`
159         }
160
161         case "$data" in *' zho_ge__'*) need2bu=1 ;; esac
162         case "$vendor" in *G95*) [ "$NO_LAPACKE" != 1 ] && need2bu='' ;; esac
163         }
164
165     if [ -z "$vendor" ]; then
166         case "$compiler" in
167             *g77*)
168                 vendor=G77
169                 bu=_
170                 openmp=''
171                 ;;
172             *g95*)
173                 vendor=G95
174                 bu=_
175                 openmp=''
176                 ;;
177             *gfortran*)
178                 vendor=GFORTRAN
179                 bu=_
180                 openmp='-fopenmp'
181                 ;;
182             *ifort*|*ifx*)
183                 vendor=INTEL
184                 bu=_
185                 openmp='-fopenmp'
186                 ;;
187             *pathf*)
188                 vendor=PATHSCALE
189                 bu=_
190                 openmp='-mp'
191                 ;;
192             *pgf*|*nvf*)
193                 vendor=PGI
194                 bu=_
195                 openmp='-mp'
196                 ;;
197             *ftn*)
198                 vendor=PGI
199                 bu=_
200                 openmp=-openmp
201                 ;;
202             *frt*)
203                 vendor=FUJITSU
204                 bu=_
205                 openmp='-openmp'
206                 ;;
207             *sunf77*|*sunf90*|*sunf95*)
208                 vendor=SUN
209                 bu=_
210                 openmp='-xopenmp=parallel'
211                 ;;
212             *ppuf*|*xlf*)
213                 vendor=IBM
214                 openmp='-openmp'
215                 ;;
216             *open64*)
217                 vendor=OPEN64
218                 openmp='-mp'
219                 ;;
220             *flang*)
221                 vendor=FLANG
222                 bu=_
223                 openmp='-fopenmp'
224                 ;;
225             *nagfor*)
226                 vendor=NAG
227                 bu=_
228                 openmp='-openmp'
229                 ;;
230         esac
231
232         if [ -z "$vendor" ]; then
233             nofortran=1
234             compiler="gfortran"
235             vendor=GFORTRAN
236             bu=_
237             openmp=''
238         fi
239     fi
240 fi
241
242 {
243     data=`command -v $compiler_bin >/dev/null 2>&1`
244 } && {
245
246     binary=$BINARY
247
248     [ "$USE_OPENMP" != 1 ] && openmp=''
249
250     case "$binary" in
251         32)
252             {
253                 link=`$compiler $openmp -m32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
254             } || {
255                 link=`$compiler $openmp -q32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
256             } || {
257                 # for AIX
258                 link=`$compiler $openmp -maix32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
259             } || {
260                 # for gfortran MIPS
261                 mips_data=`$compiler_bin -E -dM - < /dev/null`
262                 case "$mips_data" in
263                     *_MIPS_ISA_MIPS64*)
264                         link=`$compiler $openmp -mabi=n32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
265                         ;;
266                     *)
267                         link=`$compiler $openmp -mabi=32 -v ftest2.f 2>&1 && rm -f a.out a.exe`
268                         ;;
269                 esac
270             } || {
271                 binary=''
272             }
273             ;;
274         64)
275             {
276                 link=`$compiler $openmp -m64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
277             } || {
278                 link=`$compiler $openmp -q64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
279             } || {
280                 # for AIX
281                 link=`$compiler $openmp -maix64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
282             } || {
283                 # for gfortran MIPS
284                 link=`$compiler $openmp -mabi=64 -v ftest2.f 2>&1 && rm -f a.out a.exe`
285             } || {
286                 # for nagfor
287                 link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`
288             } || {
289                 binary=''
290             }
291             ;;
292     esac
293
294     if [ -z "$binary" ]; then
295         link=`$compiler $openmp -v ftest2.f 2>&1 && rm -f a.out a.exe`
296     fi
297 }
298
299 if [ "$vendor" = "NAG" ]; then
300     link=`$compiler $openmp -dryrun ftest2.f 2>&1 && rm -f a.out a.exe`
301 fi
302 if [ "$vendor" = "CRAY" ]; then
303     link=`$compiler $openmp -hnopattern ftest2.f 2>&1 && rm -f a.out a.exe`
304 fi
305 linker_L=""
306 linker_l=""
307 linker_a=""
308
309 if [ -n "$link" ]; then
310
311     link=`echo "$link" | sed 's/\-Y[[:space:]]P\,/\-Y/g'`
312
313     link=`echo "$link" | sed 's/\-R[[:space:]]*/\-rpath\%/g'`
314
315     link=`echo "$link" | sed 's/\-rpath[[:space:]]+/\-rpath\%/g'`
316
317     link=`echo "$link" | sed 's/\-rpath-link[[:space:]]+/\-rpath-link\%/g'`
318
319     flags=`echo "$link" | tr "',\n" " "`
320     # remove leading and trailing quotes from each flag.
321     #@flags = map {s/^['"]|['"]$//g; $_} @flags;
322
323     for flag in $flags; do
324         case "$flag" in -L*)
325             case "$flag" in
326                 -LIST:*|-LANG:*) ;;
327                 *) linker_L="$linker_L $flag" ;;
328             esac
329         esac
330
331         case "$flag" in -Y*)
332             [ "$hostos" = "SunOS" ] && continue
333             linker_L="$linker_L -Wl,$flag"
334             ;;
335         esac
336
337         case "$flag" in --exclude-libs*)
338             linker_L="$linker_L -Wl,$flag"
339             flag=""
340             ;;
341         esac
342
343         case "$flag" in -rpath%*)
344             flag=`echo "$flag" | sed 's/\%/\,/g'`
345             linker_L="$linker_L -Wl,$flag"
346         esac
347
348         case "$flag" in -rpath-link%*)
349             flag=`echo "$flag" | sed 's/\%/\,/g'`
350             linker_L="$linker_L -Wl,$flag"
351             ;;
352         esac
353
354         case "$flag" in *-lgomp*)
355             case "$CC" in *clang*)
356                 flag="-lomp"
357                 ;;
358             esac
359         esac
360
361         case "$flag" in -l*)
362             case "$flag" in
363                 *ibrary*|*gfortranbegin*|*flangmain*|*frtbegin*|*pathfstart*|\
364                     *crt[0-9]*|*gcc*|*user32*|*kernel32*|*advapi32*|*shell32*|\
365                     -l) ;;
366                 *omp*)
367                     case "$vendor" in
368                         *PGI*|*FUJITSU*) ;;
369                         *) linker_l="$linker_l $flag" ;;
370                     esac
371                     ;;
372                 *[0-9]*)
373                     if [ "$vendor" = "FUJITSU" ]; then
374                         case "$flag" in
375                             -lfj90*) linker_l="$linker_l $flag" ;;
376                             *) ;;
377                         esac
378                     fi
379                     ;;
380                 *) linker_l="$linker_l $flag" ;;
381             esac
382         esac
383
384         case "$flag" in *quickfit.o*)
385             [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
386         esac
387
388         case "$flag" in *safefit.o*)
389             [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
390         esac
391
392         case "$flag" in *thsafe.o*)
393             [ "$vendor" = "NAG" ] && linker_l="$linker_l $flag" ;;
394         esac
395
396         case "$flag" in *.a) linker_a="$linker_a $flag" ;; esac
397     done
398 fi
399
400 if [ "$vendor" = "FLANG" ]; then
401     linker_a="$linker_a -lflang"
402 fi
403
404 printf "F_COMPILER=%s\n" "$vendor"               >> "$makefile"
405 printf "FC=%s\n" "$compiler"                     >> "$makefile"
406 [ -n "$bu" ] && printf 'BU=%s\n' "$bu"           >> "$makefile"
407 [ "$nofortran" -eq 1 ] && printf 'NOFORTRAN=1\n' >> "$makefile"
408
409 [ -n "$bu" ] && printf '#define BUNDERSCORE\t%s\n' "$bu"    >> "$config"
410 [ -n "$bu" ] && printf '#define NEEDBUNDERSCORE\t1\n'       >> "$config"
411 [ -n "$need2bu" ] && printf "#define NEED2UNDERSCORES\t1\n" >> "$config"
412
413 [ -n "$need2bu" ] && printf "#define NEED2UNDERSCORES=1\n"  >> "$config"
414
415 if [ -n "$linker_l" ] || [ -n "$linker_a" ]; then
416     printf "FEXTRALIB=%s %s %s\n" "$linker_L" "$linker_l" "$linker_a" >> "$makefile"
417 fi
418