#!/bin/sh # # aircrack-ng build config generation script by Len White # # 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 [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 < #include 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