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
10 amd64) hostarch=x86_64 ;;
11 arm*) [ "$hostarch" = "arm64" ] || hostarch='arm' ;;
12 aarch64) hostarch=arm64 ;;
13 powerpc*|ppc*) hostarch=power ;;
14 s390x) hostarch=zarch ;;
24 # First, we need to know the target OS and compiler name
26 data=`$compiler_name $flags -E ctest.c`
28 printf '%s\n' "C Compiler ($compiler_name) is something wrong." >&2
34 if [ "`dirname $compiler_name`" != '.' ]; then
35 cross_suffix="$cross_suffix`dirname $compiler_name`/"
38 bn=`basename $compiler_name`
40 *-*) cross_suffix="$cross_suffix${bn%-*}-"
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 ;;
56 if [ -z "$compiler" ]; then
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
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 ;;
94 if [ "$os" = "AIX" ]; then
96 32) compiler_name="$compiler_name -maix32" ;;
97 64) compiler_name="$compiler_name -maix64" ;;
102 case "$architecture" in
104 compiler_name="$compiler_name -mabi=32"
109 32) compiler_name="$compiler_name -mabi=n32" ;;
110 64) compiler_name="$compiler_name -mabi=64" ;;
114 arm|arm64) defined=1 ;;
115 zarch|e2k|alpha|ia64|riscv64|loonarch64)
120 [ "$os" != "Darwin" ] && [ "$os" != "SunOS" ] && {
130 32) compiler_name="$compiler_name -tp p7" ;;
131 64) compiler_name="$compiler_name -tp p7-64" ;;
138 32) compiler_name="$compiler_name -q32" ;;
139 64) compiler_name="$compiler_name -q64" ;;
144 INTEL) openmp='-openmp' ;;
145 PATHSCALE|OPEN64) openmp='-mp' ;;
146 CLANG|GCC|LSB) openmp='-fopenmp' ;;
147 FUJITSU) openmp='-Kopenmp' ;;
150 if [ "$defined" -eq 0 ]; then
152 32) compiler_name="$compiler_name -m32" ;;
153 64) compiler_name="$compiler_name -m64" ;;
159 data="$($compiler_name $flags -E ctest.c)"
161 printf '%s\n' "C Compiler ($compiler_name) is something wrong." >&2
166 if [ "$architecture" = "mips" ] || [ "$architecture" = "mips64" ]; then
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"
174 args="$msa_flags -o $tmpf.o $tmpf"
177 $compiler_name $flags $args >/dev/null 2>&1
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 ;;
203 *BINARY_64*) binformat='bin64' ;;
207 if [ "$architecture" = "x86" ] || [ "$architecture" = "x86_64" ]; then
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"
215 args=" -march=skylake-avx512 -c -o $tmpf.o $tmpf"
219 $compiler_name $flags $args >/dev/null 2>&1
228 if [ "$architecture" = "riscv64" ]; then
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"
236 $compiler_name $flags $args >/dev/null 2>&1
248 printf "#include <stdatomic.h>\nint main(void){}\n" >> "$tmpf"
249 args=" -c -o $tmpf.o $tmpf"
252 $compiler_name $flags $args >/dev/null 2>&1
263 if [ "$compiler" = "GCC" ]; then
264 case "$architecture" in x86|x86_64)
267 data=`$compiler_name -dumpversion`
268 case "$data" in *.*.*)
271 if awk -v n1=$data -v n2=4.6 'BEGIN { exit !(n1 <= n2) }'; then
278 data=`$compiler_name $flags -S ctest1.c && grep globl ctest1.s | head -n 1 && rm -f ctest1.s`
281 if echo "$data" | grep 'globl[[:space:]][_\.]'; then
282 need_fu="${data##*globl[[:space:]]}"
283 need_fu="${need_fu%%[!_\.]*}"
288 if [ "$architecture" != "$hostarch" ]; then
290 [ "$hostarch" = "x86_64" ] && [ "$architecture" = "x86" ] && cross=0
291 [ "$hostarch" = "mips64" ] && [ "$architecture" = "mips" ] && cross=0
294 [ "$os" != "$hostos" ] && cross=1
295 [ "$os" = "Android" ] && [ "$hostos" = "Linux" ] && [ -n "$TERMUX_APP_PID" ] \
298 [ "$USE_OPENMP" != 1 ] && openmp=''
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`
306 link=`echo "$link" | sed 's/\-Y[[:space:]]P\,/\-Y/g'`
309 flags=`echo $link | tr "'[[:space:]],\n" " "`
311 # Strip trailing quotes
316 for flag in $old_flags; do
317 f=`echo "$flag" | tr '"' ' '`
321 for flag in $flags; do
325 *) linker_L="$linker_L $flag" ;;
330 linker_L="$linker_L -Wl,$flag" ;;
333 case "$flag" in --exclude-libs*)
334 linker_L="$linker_L -Wl,$flag"
341 *gfortranbegin*|*frtbegin*|*pathfstart*|*numa*|*crt[0-9]*|\
342 *gcc*|*user32*|*kernel32*|*advapi32*|*shell32*|*omp*|\
344 *) linker_l="$linker_l $flag" ;;
348 case "$flag" in *.a) linker_a="$linker_a $flag" ;; esac
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"
359 :> "$makefile" || exit 1
360 :> "$config" || exit 1
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"
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"
388 os=`echo "$os" | tr '[[:lower:]]' '[[:upper:]]'/ `
389 architecture=`echo "$architecture" | tr '[[:lower:]]' '[[:upper:]]' `
390 compiler=`echo "$compiler" | tr '[[:lower:]]' '[[:upper:]]' `
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"
404 if [ "$os" = "LINUX" ]; then
406 # @pthread = split(/\s+/, `nm /lib/libpthread.so* | grep _pthread_create`);
408 # if ($pthread[2] ne "") {
409 # print CONFFILE "#define PTHREAD_CREATE_FUNC $pthread[2]\n";
411 printf "#define PTHREAD_CREATE_FUNC pthread_create\n" >> "$config"
414 printf "#define PTHREAD_CREATE_FUNC pthread_create\n" >> "$config"