Update version to 0.3.21
[platform/upstream/openblas.git] / c_check
1 #!/bin/sh
2
3 # Checking cross compile
4 hostos=`uname -s | sed -e 's/\-.*//'`
5 hostarch=`uname -m | sed -e 's/i.86/x86/'`
6 if [ "$hostos" = "AIX" ] || [ "$hostos" = "SunOS" ]; then
7     hostarch=`uname -p`
8 fi
9 case "$hostarch" in
10     amd64) hostarch=x86_64 ;;
11     arm*) [ "$hostarch" = "arm64" ] || hostarch='arm' ;;
12     aarch64) hostarch=arm64 ;;
13     powerpc*|ppc*) hostarch=power ;;
14     s390x) hostarch=zarch ;;
15 esac
16
17 makefile="$1"
18 config="$2"
19
20 compiler_name="$3"
21 shift 3
22 flags="$*"
23
24 # First, we need to know the target OS and compiler name
25 {
26     data=`$compiler_name $flags -E ctest.c`
27 } || {
28     printf '%s\n' "C Compiler ($compiler_name) is something wrong." >&2
29     exit 1
30 }
31
32 cross_suffix=""
33
34 if [ "`dirname $compiler_name`" != '.' ]; then
35     cross_suffix="$cross_suffix`dirname $compiler_name`/"
36 fi
37
38 bn=`basename $compiler_name`
39 case "$bn" in
40     *-*) cross_suffix="$cross_suffix${bn%-*}-"
41 esac
42
43 compiler=""
44 case "$data" in
45     *COMPILER_LSB*) compiler=LSB ;;
46     *COMPILER_CLANG*) compiler=CLANG ;;
47     *COMPILER_PGI*) compiler=PGI ;;
48     *COMPILER_PATHSCALE*) compiler=PATHSCALE ;;
49     *COMPILER_INTEL*) compiler=INTEL ;;
50     *COMPILER_OPEN64*) compiler=OPEN64 ;;
51     *COMPILER_SUN*) compiler=SUN ;;
52     *COMPILER_IBM*) compiler=IBM ;;
53     *COMPILER_DEC*) compiler=DEC ;;
54     *COMPILER_FUJITSU*) compiler=FUJITSU ;;
55 esac
56 if [ -z "$compiler" ]; then
57     compiler=GCC
58 fi
59
60 case "$data" in *OS_LINUX*) os=Linux ;; esac
61 case "$data" in *OS_FREEBSD*) os=FreeBSD ;; esac
62 case "$data" in *OS_NETBSD*) os=NetBSD ;; esac
63 case "$data" in *OS_OPENBSD*) os=OpenBSD ;; esac
64 case "$data" in *OS_DRAGONFLY*) os=DragonFly ;; esac
65 case "$data" in *OS_DARWIN*) os=Darwin ;; esac
66 case "$data" in *OS_SUNOS*) os=SunOS ;; esac
67 case "$data" in *OS_AIX*) os=AIX ;; esac
68 case "$data" in *OS_OSF*) os=osf ;; esac
69 case "$data" in *OS_WINNT*) os=WINNT ;; esac
70 case "$data" in *OS_CYGWIN_NT*) os=CYGWIN_NT ;; esac
71 case "$data" in *OS_INTERIX*) os=Interix ;; esac
72 case "$data" in *OS_ANDROID*) os=Android ;; esac
73 case "$data" in *OS_HAIKU*) os=Haiku ;; esac
74
75 case "$data" in
76     *ARCH_X86_64*) architecture=x86_64 ;;
77     *ARCH_X86*) architecture=x86 ;;
78     *ARCH_E2K*) architecture=e2k ;;
79     *ARCH_POWER*) architecture=power ;;
80     *ARCH_MIPS64*) architecture=mips64 ;;
81     *ARCH_MIPS*) architecture=mips ;;
82     *ARCH_ALPHA*) architecture=alpha ;;
83     *ARCH_SPARC*) architecture=sparc ;;
84     *ARCH_IA64*) architecture=ia64 ;;
85     *ARCH_ARM64*) architecture=arm64 ;;
86     *ARCH_ARM*) architecture=arm ;;
87     *ARCH_ZARCH*) architecture=zarch ;;
88     *ARCH_RISCV64*) architecture=riscv64 ;;
89     *ARCH_LOONGARCH64*) architecture=loongarch64 ;;
90 esac
91
92 defined=0
93
94 if [ "$os" = "AIX" ]; then
95     case "$BINARY" in
96         32) compiler_name="$compiler_name -maix32" ;;
97         64) compiler_name="$compiler_name -maix64" ;;
98     esac
99     defined=1
100 fi
101
102 case "$architecture" in
103     mips)
104         compiler_name="$compiler_name -mabi=32"
105         defined=1
106         ;;
107     mips64)
108         case "$BINARY" in
109             32) compiler_name="$compiler_name -mabi=n32" ;;
110             64) compiler_name="$compiler_name -mabi=64" ;;
111         esac
112         defined=1
113         ;;
114     arm|arm64) defined=1 ;;
115     zarch|e2k|alpha|ia64|riscv64|loonarch64)
116         defined=1
117         BINARY=64
118         ;;
119     x86)
120         [ "$os" != "Darwin" ] && [ "$os" != "SunOS" ] && {
121             defined=1
122             BINARY=32
123         }
124         ;;
125 esac
126
127 case "$compiler" in
128     PGI)
129         case "$BINARY" in
130             32) compiler_name="$compiler_name -tp p7" ;;
131             64) compiler_name="$compiler_name -tp p7-64" ;;
132         esac
133         openmp='-mp'
134         defined=1
135         ;;
136     IBM)
137         case "$BINARY" in
138             32) compiler_name="$compiler_name -q32" ;;
139             64) compiler_name="$compiler_name -q64" ;;
140         esac
141         openmp='-qsmp=omp'
142         defined=1
143         ;;
144     INTEL) openmp='-openmp' ;;
145     PATHSCALE|OPEN64) openmp='-mp' ;;
146     CLANG|GCC|LSB) openmp='-fopenmp' ;;
147     FUJITSU) openmp='-Kopenmp' ;;
148 esac
149
150 if [ "$defined" -eq 0 ]; then
151     case "$BINARY" in
152         32) compiler_name="$compiler_name -m32" ;;
153         64) compiler_name="$compiler_name -m64" ;;
154     esac
155 fi
156
157 # Do again
158 {
159     data="$($compiler_name $flags -E ctest.c)"
160 } || {
161     printf '%s\n' "C Compiler ($compiler_name) is something wrong." >&2
162     exit 1
163 }
164
165 have_msa=0
166 if [ "$architecture" = "mips" ] || [ "$architecture" = "mips64" ]; then
167     tmpd="$(mktemp -d)"
168     tmpf="$tmpd/a.c"
169     code='"addvi.b $w0, $w1, 1"'
170     msa_flags='-mmsa -mfp64 -mload-store-pairs'
171     printf "#include <msa.h>\n\n" >> "$tmpf"
172     printf "void main(void){ __asm__ volatile(%s); }\n" "$code" >> "$tmpf"
173
174     args="$msa_flags -o $tmpf.o $tmpf"
175     have_msa=1
176     {
177         $compiler_name $flags $args >/dev/null 2>&1
178     } || {
179         have_msa=0
180     }
181
182     rm -rf "$tmpd"
183 fi
184
185 case "$data" in
186     *ARCH_X86_64*) architecture=x86_64 ;;
187     *ARCH_X86*) architecture=x86 ;;
188     *ARCH_E2K*) architecture=e2k ;;
189     *ARCH_POWER*) architecture=power ;;
190     *ARCH_MIPS64*) architecture=mips64 ;;
191     *ARCH_MIPS*) architecture=mips ;;
192     *ARCH_ALPHA*) architecture=alpha ;;
193     *ARCH_SPARC*) architecture=sparc ;;
194     *ARCH_IA64*) architecture=ia64 ;;
195     *ARCH_ARM64*) architecture=arm64 ;;
196     *ARCH_ARM*) architecture=arm ;;
197     *ARCH_ZARCH*) architecture=zarch ;;
198     *ARCH_LOONGARCH64*) architecture=loongarch64 ;;
199 esac
200
201 binformat='bin32'
202 case "$data" in
203     *BINARY_64*) binformat='bin64' ;;
204 esac
205
206 no_avx512=0
207 if [ "$architecture" = "x86" ] || [ "$architecture" = "x86_64" ]; then
208     tmpd=`mktemp -d`
209     tmpf="$tmpd/a.c"
210     code='"vbroadcastss -4 * 4(%rsi), %zmm2"'
211     printf "#include <immintrin.h>\n\nint main(void){ __asm__ volatile(%s); }\n" "$code" >> "$tmpf"
212     if [ "$compiler" = "PGI" ]; then
213         args=" -tp skylake -c -o $tmpf.o $tmpf"
214     else
215         args=" -march=skylake-avx512 -c -o $tmpf.o $tmpf"
216     fi
217     no_avx512=0
218     {
219         $compiler_name $flags $args >/dev/null 2>&1
220     } || {
221         no_avx512=1
222     }
223
224     rm -rf "$tmpd"
225 fi
226
227 no_rv64gv=0
228 if [ "$architecture" = "riscv64" ]; then
229     tmpd=`mktemp -d`
230     tmpf="$tmpd/a.c"
231     code='"vsetvli    zero, zero, e8, m1\n"'
232     printf "int main(void){ __asm__ volatile(%s); }\n" "$code" >> "$tmpf"
233     args=" -march=rv64gv -c -o $tmpf.o $tmpf"
234     no_rv64gv=0
235     {
236         $compiler_name $flags $args >/dev/null 2>&1
237     } || {
238         no_rv64gv=1
239     }
240     rm -rf "$tmpd"
241 fi
242
243 c11_atomics=0
244 case "$data" in
245     *HAVE_C11*)
246         tmpd=`mktemp -d`
247         tmpf="$tmpd/a.c"
248         printf "#include <stdatomic.h>\nint main(void){}\n" >> "$tmpf"
249         args=" -c -o $tmpf.o $tmpf"
250         c11_atomics=1
251         {
252             $compiler_name $flags $args >/dev/null 2>&1
253         } || {
254             c11_atomics=0
255         }
256
257         rm -rf "$tmpd"
258         ;;
259 esac
260
261 oldgcc=0
262 no_avx2=0
263 if [ "$compiler" = "GCC" ]; then
264     case "$architecture" in x86|x86_64)
265         no_avx2=0
266         oldgcc=0
267         data=`$compiler_name -dumpversion`
268         case "$data" in *.*.*)
269             data="${data%.*}"
270         esac
271         if awk -v n1=$data -v n2=4.6 'BEGIN { exit !(n1 <= n2) }'; then
272             no_avx2=1
273             oldgcc=1
274         fi
275     esac
276 fi
277
278 data=`$compiler_name $flags -S ctest1.c && grep globl ctest1.s | head -n 1 && rm -f ctest1.s`
279
280 need_fu=''
281 if echo "$data" | grep 'globl[[:space:]][_\.]'; then
282     need_fu="${data##*globl[[:space:]]}"
283     need_fu="${need_fu%%[!_\.]*}"
284 fi
285
286 cross=0
287
288 if [ "$architecture" != "$hostarch" ]; then
289     cross=1
290     [ "$hostarch" = "x86_64" ] && [ "$architecture" = "x86" ] && cross=0
291     [ "$hostarch" = "mips64" ] && [ "$architecture" = "mips" ] && cross=0
292 fi
293
294 [ "$os" != "$hostos" ] && cross=1
295 [ "$os" = "Android" ] && [ "$hostos" = "Linux" ] && [ -n "$TERMUX_APP_PID" ] \
296     && cross=0
297
298 [ "$USE_OPENMP" != 1 ] && openmp=''
299
300 linker_L=""
301 linker_l=""
302 linker_a=""
303
304 link=`$compiler_name $flags -c ctest2.c -o ctest2.o 2>&1 && $compiler_name $flags $openmp -v ctest2.o -o ctest2 2>&1 && rm -f ctest2.o ctest2 ctest2.exe`
305
306 link=`echo "$link" | sed 's/\-Y[[:space:]]P\,/\-Y/g'`
307
308
309 flags=`echo $link | tr "'[[:space:]],\n" " "`
310
311 # Strip trailing quotes
312 old_flags="$flags"
313 flags=''
314
315
316 for flag in $old_flags; do
317     f=`echo "$flag" | tr '"' ' '`
318     flags="$flags $f"
319 done
320
321 for flag in $flags; do
322     case "$flag" in -L*)
323         case "$flag" in
324             -LIST:*|-LANG:*) ;;
325             *) linker_L="$linker_L $flag" ;;
326         esac
327     esac
328
329     case "$flag" in -Y*)
330         linker_L="$linker_L -Wl,$flag" ;;
331     esac
332
333     case "$flag" in --exclude-libs*)
334         linker_L="$linker_L -Wl,$flag"
335         flags=""
336         ;;
337     esac
338
339     case "$flag" in -l*)
340         case "$flag" in
341             *gfortranbegin*|*frtbegin*|*pathfstart*|*numa*|*crt[0-9]*|\
342                 *gcc*|*user32*|*kernel32*|*advapi32*|*shell32*|*omp*|\
343                 *[0-9]*) ;;
344             *) linker_l="$linker_l $flag" ;;
345         esac
346     esac
347
348     case "$flag" in *.a) linker_a="$linker_a $flag" ;; esac
349 done
350
351  [ "$makefile" = "-" ] && {
352     [ "$no_rv64gv" -eq 1 ] && printf "NO_RV64GV=1\n"
353     [ "$no_avx512" -eq 1 ] && printf "NO_AVX512=1\n"
354     [ "$no_avx2" -eq 1 ] && printf "NO_AVX2=1\n"
355     [ "$oldgcc" -eq 1 ] && printf "OLDGCC=1\n"
356     exit 0
357 }
358
359 :> "$makefile" || exit 1
360 :> "$config" || exit 1
361
362
363 # print $data, "\n";
364
365 {
366     printf "OSNAME=%s\n" "$os"
367     printf "ARCH=%s\n" "$architecture"
368     printf "C_COMPILER=%s\n" "$compiler"
369     [ $binformat != 'bin32' ] && printf "BINARY32=\n"
370     [ $binformat != 'bin64' ] && printf "BINARY64=\n"
371     [ "$binformat" = "bin32" ] && printf "BINARY32=1\n"
372     [ "$binformat" = "bin64" ] && printf "BINARY64=1\n"
373     [ -n "$need_fu" ] && printf 'FU=%s\n' "$need_fu"
374     [ "$cross" -ne 0 ] && [ -n "$cross_suffix" ] && \
375         printf "CROSS_SUFFIX=%s\n" "$cross_suffix"
376     [ "$cross" -ne 0 ] && printf "CROSS=1\n"
377     printf "CEXTRALIB=%s %s %s\n" "$linker_L" "$linker_l" "$linker_a"
378     [ "$have_msa" -eq 1 ] && {
379         printf "HAVE_MSA=1\n"
380         printf "MSA_FLAGS=%s\n" "$msa_flags"
381     }
382     [ "$no_rv64gv" -eq 1 ] && printf "NO_RV64GV=1\n"
383     [ "$no_avx512" -eq 1 ] && printf "NO_AVX512=1\n"
384     [ "$no_avx2" -eq 1 ] && printf "NO_AVX2=1\n"
385     [ "$oldgcc" -eq 1 ] && printf "OLDGCC=1\n"
386 } >> "$makefile"
387
388 os=`echo "$os" | tr '[[:lower:]]' '[[:upper:]]'/ `
389 architecture=`echo "$architecture" | tr '[[:lower:]]' '[[:upper:]]' `
390 compiler=`echo "$compiler" | tr '[[:lower:]]' '[[:upper:]]' `
391
392 {
393     printf "#define OS_%s\t1\n" "$os"
394     printf "#define ARCH_%s\t1\n" "$architecture"
395     printf "#define C_%s\t1\n" "$compiler"
396     [ "$binformat" = "bin32" ] && printf "#define __32BIT__\t1\n"
397     [ "$binformat" = "bin64" ] && printf "#define __64BIT__\t1\n"
398     [ -n "$need_fu" ] && printf "#define FUNDERSCORE\t%s\n" "$need_fu"
399     [ "$have_msa" -eq 1 ] && printf "#define HAVE_MSA\t1\n"
400     [ "$c11_atomics" -eq 1 ] && printf "#define HAVE_C11\t1\n"
401 } >> "$config"
402
403
404 if [ "$os" = "LINUX" ]; then
405
406 #    @pthread = split(/\s+/, `nm /lib/libpthread.so* | grep _pthread_create`);
407
408 #    if ($pthread[2] ne "") {
409 #       print CONFFILE "#define PTHREAD_CREATE_FUNC     $pthread[2]\n";
410 #    } else {
411         printf "#define PTHREAD_CREATE_FUNC     pthread_create\n" >> "$config"
412 #    }
413 else
414     printf "#define PTHREAD_CREATE_FUNC pthread_create\n" >> "$config"
415 fi