aboutsummaryrefslogtreecommitdiffhomepage
path: root/configure
blob: 54199fc4154911791d0fa7665de84f8dfc7da861 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/bin/sh

die() {
    echo "$0: Error: $@" >&2
    exit 1
}

prihelp() {
    host="[$(cc -dumpmachine)]"
    : ${host:=""}
    cat << EOF
Usage: $0 [options]
Options:
  --help                    Print this help mesage
  --host=target-triple      $host
  --cc=cc                   C compiler [cc]
  --prefix=PREFIX           Installation path [/usr/local]
  --sysroot=/path           System root [/usr]
  --includedir="/a/b",...   System include dirs
EOF
}

sysroot=/usr
prefix=/usr/local
host=

for arg ; do
	case "$arg" in
	--host=*) host=${arg#*=} ;;
    --sysroot=*) sysroot=${arg#*=} ;;
    --includedir=*) host_include_dirs=${arg#*=} ;;
	CC=*) CC=${arg#*=} ;;
	--cc=*) CC=${arg#*=} ;;
	CFLAGS=*) CFLAGS=${arg#*=} ;;
	--cflags=*) CFLAGS=${arg#*=} ;;
    --prefix=*) prefix=$(sh -c "echo ${arg#*=}") ;;
    --help) prihelp ; exit ;;
	*) die "$0: unknown option '$arg'"
	esac
done

: ${CC:=cc}
: ${host:=$($CC -dumpmachine)}
test -n "$host" || die "cannot determine host"

host_arch=
host_os=
host_abi=
host_predefs=

echo "host: $host"
case "$host" in
x86_64-*) host_arch=x86_64 ;;
amd64-*) host_arch=x86_64 ;;
aarch64-*) host_arch=aarch64 ;;
arm64-*) host_arch=aarch64 ;;
*) host_arch=unk ;;
esac

case "$host" in
*-linux-*)
    host_os=linux ;;
*-openbsd*)
    host_os=openbsd
    host_predefs='
    "_ANSI_LIBRARY", /* works around __only_inline functions in libc headers */
    '
    ;;
*) host_os=unknown ;;
esac

case "$host" in
*-gnu) host_abi=gnu ;;
*-musl) host_abi=musl ;;
*) host_abi=none ;;
esac

tryincldir() {
    if stat "$1"/ >/dev/null 2>/dev/null; then
        host_include_dirs="$host_include_dirs\"$1\","
    fi
}

if ! test -n "$host_include_dirs"; then
    # try to query host toolchain first
    if hostccdirs=$($CC -E -v -xc /dev/null 2>&1 | sed -n '/#include <...> search starts here:/,/End of search list./{
    s/^[[:space:]]*//
    /^\/.*/p
}') && test -n "$hostccdirs"; then
        echo "Using $CC's system include paths:"
        for d in $hostccdirs; do
            dir=$(realpath "$d")
            case "$dir" in
                #exclude internal compiler headers, we have our own
                */gcc/*) ;; */clang/*) ;;
                *) echo "    $dir"
                   tryincldir "$dir" ;;
            esac
        done
    else
        echo "Falling back to generic system include paths"
        tryincldir "$sysroot/local/include/$host"
        tryincldir "$sysroot/local/include"
        tryincldir "$sysroot/include/$host"
        tryincldir "$sysroot/include"
    fi
fi

set -e

echo using arch: "$host_arch"
echo using os: "$host_os"
echo using abi: "$host_abi"
echo host include paths: "$host_include_dirs"

echo "/** GENERATED WITH $0 $@ **/
#define HOST_TRIPLE \"$host\"
#define HOST_ARCH   IS$host_arch
#define HOST_OS     OS$host_os
#define HOST_ABI    ABI$host_abi
#define HOST_INCLUDE_DIRS $host_include_dirs
#define HOST_CC \"$CC\"
static const char *const host_predefs[] = {$host_predefs 0
};
"  > src/hostconfig.h

echo "# GENERATED WITH $0 $@
PREFIX = $prefix
CC     = $CC
CFLAGS = ${CFLAGS:--Wall -std=c11 -pedantic}" > config.mk

echo config written to src/hostconfig.h, config.mk