aboutsummaryrefslogtreecommitdiff
path: root/configure
blob: a2dfa8837bea57d48aaccc81d94ab5608ed19e0b (plain)
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/bin/bash
# mg2d configure script
# partially inspired by/based on the FFmpeg configure script

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

bootstrap() {
    local source_dir

    [ -e configure ] && die "Cannot build from the source dir, create a separate build directory"

    source_dir=$(realpath $(dirname "$0"))
    [ -d "$source_dir" ] || die "Cannot locate source directory"

    [ -h src ] || ln -s "$source_dir" src

    [ -h Makefile ] || ln -s "$source_dir/Makefile"

    echo $source_dir
}

toupper() {
    echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
}

is_in() {
    value=$1
    shift
    for var in $*; do
        [ $var = $value ] && return 0
    done
    return 1
}

probe_arch() {
    arch=$(cc -dumpmachine | sed 's/-.*//')
}

check_mpi() {
    pkg-config --exists mpi || return 1
    mpi_cflags=$(pkg-config --cflags mpi)
    mpi_libs=$(pkg-config --libs mpi)
}

check_nasm() {
    if ! command -v nasm &> /dev/null; then
        echo "nasm not found, assembly code will not be built"
        return 1
    fi
}

check_component() {
    name=$1
    shift
    eval "check_$name" $@ && eval "have_$name=yes"
}

source_dir=$(bootstrap)


CMDLINE_SET="
    cc
"

cc=cc

for arg; do
    name="${arg%%=*}"
    name="${name#--}"
    name=$(echo "$name" | sed 's/-/_/g')

    val="${arg#*=}"

	if is_in $name $CMDLINE_SET; then
        eval $name='$val'
        continue
	fi

    die "Unknown commandline argument: $name $val"
done

probe_arch

COMPONENTS_REQUIRED="
    mpi
"

COMPONENTS_OPTIONAL="
    nasm
"

COMPONENTS="
    $COMPONENTS_REQUIRED
    $COMPONENTS_OPTIONAL
"

for c in $COMPONENTS_REQUIRED; do
    check_component $c || die "Required component $c not found"
done

for c in $COMPONENTS_OPTIONAL; do
    check_component $c
done

cat > config.mak <<EOF
SOURCE_DIR = $source_dir
CC = $cc
CFLAGS_DEP = $mpi_cflags
LDFLAGS_DEP = $mpi_libs
EOF

cat > config.h <<EOF
#ifndef MG2D_CONFIG_H
#define MG2D_CONFIG_H

EOF

cat > config.asm << EOF
EOF

case "$arch" in
    x86_64)
        echo "ARCH_X86_64 = 1" >> config.mak
        echo "#define ARCH_X86_64 1" >> config.h
        echo "%define ARCH_X86_64 1" >> config.asm
        ;;
    *)
        echo "ARCH_X86_64 = 0" >> config.mak
        echo "#define ARCH_X86_64 0" >> config.h
        echo "%define ARCH_X86_64 0" >> config.asm
        ;;
esac

for c in $COMPONENTS; do
    C=$(toupper $c)
    have_ref=have_$c

    if [ -n "${!have_ref}" ]; then
        val_mak=yes
        val_c=1
    else
        val_mak=no
        val_c=0
    fi

    echo "HAVE_$C = $val_mak" >> config.mak
    echo "#define HAVE_$C $val_c" >> config.h

done

echo "#endif // MG2D_CONFIG_H" >> config.h