nexmon – Rev 1

Subversion Repositories:
Rev:
#!/bin/sh
#
# aircrack-ng build config generation script by Len White <lwhite@nrw.ca>
#
# The purpose of this is to generate a file to be included by common.mak that defines
# compile time configuration, granting us more flexibility in tests and speeding build process
# by not running the tests every time we compile a single file.
#
# NOTES: * common.cfg is automatically regenerated on make clean
#        * common.cfg is NOT required to build aircrack, but is required for autoconfiguration of the new crypto cores.
#

CC=$1
IS_X86=0
IS_ARM=0
IS_CROSS=0
SIMDSIZE=0
SIMDFLAG=""

if [ ! $1 ]; then
        echo "Usage: $0 <compiler> [cfgpath]"
        exit 127
fi

if [ ! $2 ]; then
        CURDIR=$(pwd)
else
        CURDIR=$2
fi

CFGFILE="${CURDIR}/common.cfg"

clean_exit () {
        if [ -n "$tmpdir" ]; then
                if [ -d "${tmpdir}" ]; then
                        rm -rf "${tmpdir}"
                fi
        fi
}

if [ "$(uname -s)" = 'OpenBSD' ]; then
        OPENBSD=1
        trap clean_exit EXIT
else
        trap clean_exit SIGINT SIGKILL SIGQUIT SIGSEGV SIGPIPE SIGALRM SIGTERM EXIT
fi

# $1 flag $2 variable
test_compile_flag () {
        FLAGTEST=$(echo | $CC -fsyntax-only ${1} -xc -Werror - 2>/dev/null && echo Y)

        if [ "$FLAGTEST" = "Y" ] && [ $2 ]; then
                echo "${2}=${FLAGTEST}" >> $CFGFILE
        fi
}

test_header_file () {
        if [ -f "$1" ]; then
                echo "${2}=Y" >> $CFGFILE
        fi
}

cpuid_test () {
        tmpdir="$(mktemp -d -t acng.XXXX)"

cat >${tmpdir}/cpuidtest.c <<EOF
#include <cpuid.h>
#include <stdio.h>
int main() {
        unsigned eax = 0, ebx = 0, ecx = 0, edx = 0;
        unsigned int max_level = __get_cpuid_max(0, NULL);

        if (max_level >= 7) {
                __cpuid_count(7, 0, eax, ebx, ecx, edx);

                if (ebx & (1 << 5)) // AVX2
                        return 16;
        }

        __cpuid(1, eax, ebx, ecx, edx);

        if (ecx & (1 << 28)) // AVX1
                return 8;

        if (edx & (1 << 26)) // SSE2
                return 4;

        return 1;
}
EOF

        $($CC -o ${tmpdir}/cpuidtest ${tmpdir}/cpuidtest.c 2>/dev/null)

        if [ -x "${tmpdir}/cpuidtest" ]; then
                ${tmpdir}/cpuidtest

                SIMDSIZE=$?
        fi

        if [ $SIMDSIZE -gt 0 ]; then
                case $SIMDSIZE in
                        16)
                                SIMDTYPE="AVX2"
                        ;;
                        8)
                                SIMDTYPE="AVX"
                        ;;
                        4)
                                SIMDTYPE="SSE2"
                        ;;
                        1)
                                SIMDTYPE="MMX"
                        ;;
                esac
        fi
}

case "$CC" in
        mips-* | arm-*)
                IS_CROSS=1
                IS_X86=0
        ;;
        *);;
esac

UARCH=$(uname -m)

case "$UARCH" in
        x86_64 | amd64 | i*86*)
                IS_X86=1
        ;;
        *arm*)
                IS_ARM=1
        ;;
        *mips*)
                IS_CROSS=1
        ;;
        *)
        ;;
esac

if [ $IS_X86 = 1 ]; then
        cpuid_test

        if [ $SIMDSIZE -gt 0 ]; then
                if [ $SIMDSIZE = 16 ]; then
                        test_compile_flag -mavx2

                        if [ "$FLAGTEST" = "Y" ]; then
                                echo "AVX2FLAG=Y" > $CFGFILE
                        fi

                        echo "SIMDCORE=true" >> $CFGFILE
                elif [ $SIMDSIZE = 8 ]; then
                        test_compile_flag -mavx

                        if [ "$FLAGTEST" = "Y" ]; then
                                echo "AVX1FLAG=Y" > $CFGFILE
                        fi

                        echo "SIMDCORE=true" >> $CFGFILE
                elif [ $SIMDSIZE = 4 ]; then
                        test_compile_flag -msse2

                        if [ "$FLAGTEST" = "Y" ]; then
                                echo "SSEFLAG=Y" > $CFGFILE
                        fi
                fi
        fi

        if [ ! $OPENBSD ]; then
                test_compile_flag -masm=intel INTEL_ASM
        fi
elif [ $IS_ARM = 1 ]; then
        >$CFGFILE

        if [ -f "/proc/cpuinfo" ]; then
                NEON_FLAG=$(grep -c neon /proc/cpuinfo)

                if [ $NEON_FLAG -eq 1 ]; then
                        test_compile_flag -mfpu=neon HAS_NEON

                        if [ "$FLAGTEST" = "Y" ]; then
                                echo "SIMDCORE=true" >>$CFGFILE
                        else
                                IS_CROSS=1
                        fi
                else
                        IS_CROSS=1
                fi
        else
                IS_CROSS=1
        fi
fi

test_compile_flag -pthread PTHREAD

if [ $IS_X86 -eq 0 ]; then
        # If we're on non-x86 platform, we need to check for auxv for cpuid since it's broken on some debian vers
        test_header_file sys/auxv.h HAS_AUXV
fi

if [ $IS_CROSS -eq 1 ]; then
        echo "NEWSSE=false" >>$CFGFILE
fi

# If we fall thru all the tests and still haven't created a config, create an empty one.
if [ ! -f "$CFGFILE" ]; then
        echo >$CFGFILE
fi