
# Copyright (C) Igor Sysoev
# Copyright (C) Nginx, Inc.


LINK="\$(CC)"

MAIN_LINK=
MODULE_LINK="-shared"

ngx_include_opt="-I "
ngx_compile_opt="-c"
ngx_pic_opt="-fPIC"
ngx_objout="-o "
ngx_binout="-o "
ngx_objext="o"
ngx_binext=
ngx_modext=".so"

ngx_long_start=
ngx_long_end=

ngx_regex_dirsep="\/"
ngx_dirsep='/'

ngx_regex_cont=' \\\
	'
ngx_cont=' \
	'
ngx_tab=' \
		'
ngx_spacer=

ngx_long_regex_cont=$ngx_regex_cont
ngx_long_cont=$ngx_cont

CC_TEST_FLAGS="$CFLAGS $NGX_CC_OPT"

. $NGX_AUTO/cc/name

if test -n "$CFLAGS"; then

    case $NGX_CC_NAME in

        ccc)
            # Compaq C V6.5-207

            ngx_include_opt="-I"
        ;;

        sunc)

            MAIN_LINK=
            MODULE_LINK="-G"

            case "$NGX_MACHINE" in

                i86pc)
                    NGX_AUX=" src/os/unix/ngx_sunpro_x86.il"
                ;;

                sun4u | sun4v)
                    NGX_AUX=" src/os/unix/ngx_sunpro_sparc64.il"
                ;;

            esac

            case $CPU in

                amd64)
                    NGX_AUX=" src/os/unix/ngx_sunpro_amd64.il"
                ;;

            esac
        ;;

    esac

else

    case $NGX_CC_NAME in
        gcc)
            # gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2
            #     3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2
            #     4.0.0, 4.0.1, 4.1.0

            . $NGX_AUTO/cc/gcc
        ;;

        clang)
            # Clang C compiler

            . $NGX_AUTO/cc/clang
        ;;

        icc)
            # Intel C++ compiler 7.1, 8.0, 8.1

            . $NGX_AUTO/cc/icc
        ;;

        sunc)
            # Sun C 5.7 Patch 117837-04 2005/05/11

            . $NGX_AUTO/cc/sunc
        ;;

        ccc)
            # Compaq C V6.5-207

            . $NGX_AUTO/cc/ccc
        ;;

        acc)
            # aCC: HP ANSI C++ B3910B A.03.55.02

            . $NGX_AUTO/cc/acc
        ;;

        msvc*)
            # MSVC++ 6.0 SP2, MSVC++ Toolkit 2003

            . $NGX_AUTO/cc/msvc
        ;;

        owc)
            # Open Watcom C 1.0, 1.2

            . $NGX_AUTO/cc/owc
        ;;

        bcc)
            # Borland C++ 5.5

            . $NGX_AUTO/cc/bcc
        ;;

    esac

fi

CFLAGS="$CFLAGS $NGX_CC_OPT"
NGX_TEST_LD_OPT="$NGX_LD_OPT"

if [ "$NGX_PLATFORM" != win32 ]; then

    if test -n "$NGX_LD_OPT"; then
        ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\"
        ngx_feature_name=
        ngx_feature_run=no
        ngx_feature_incs=
        ngx_feature_path=
        ngx_feature_libs=
        ngx_feature_test=
        . $NGX_AUTO/feature

        if [ $ngx_found = no ]; then
            echo $0: error: the invalid value in --with-ld-opt=\"$NGX_LD_OPT\"
            echo
            exit 1
        fi
    fi


    ngx_feature="-Wl,-E switch"
    ngx_feature_name=
    ngx_feature_run=no
    ngx_feature_incs=
    ngx_feature_path=
    ngx_feature_libs=-Wl,-E
    ngx_feature_test=
    . $NGX_AUTO/feature

    if [ $ngx_found = yes ]; then
        MAIN_LINK="-Wl,-E"
    fi


    if [ "$NGX_CC_NAME" = "sunc" ]; then
        echo "checking for gcc builtin __sync operations ... disabled"
    else
        ngx_feature="gcc builtin __sync operations"
        ngx_feature_name=NGX_HAVE_GCC_ATOMIC
        ngx_feature_run=yes
        ngx_feature_incs=
        ngx_feature_path=
        ngx_feature_libs=
        ngx_feature_test="long  n = 0;
                          if (!__sync_bool_compare_and_swap(&n, 0, 1))
                              return 1;
                          if (__sync_fetch_and_add(&n, 1) != 1)
                              return 1;
                          if (n != 2)
                              return 1;
                          __sync_synchronize();"
        . $NGX_AUTO/feature
    fi


    if [ "$NGX_CC_NAME" = "sunc" ]; then
        echo "checking for gcc builtin __atomic operations ... disabled"
    else
        ngx_feature="gcc builtin __atomic operations"
        ngx_feature_name=NGX_HAVE_GCC_ATOMIC_STORE_AND_LOAD
        ngx_feature_run=yes
        ngx_feature_incs=
        ngx_feature_path=
        ngx_feature_libs=
        ngx_feature_test="long  n = 0;
                          __atomic_store_n(&n, 1, __ATOMIC_RELEASE);
                          if (__atomic_load_n(&n, __ATOMIC_ACQUIRE) != 1)
                              return 1"
        . $NGX_AUTO/feature
    fi


    if [ "$NGX_CC_NAME" = "ccc" ]; then
        echo "checking for C99 variadic macros ... disabled"
    else
        ngx_feature="C99 variadic macros"
        ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS"
        ngx_feature_run=yes
        ngx_feature_incs="#include <stdio.h>
#define var(dummy, ...)  sprintf(__VA_ARGS__)"
        ngx_feature_path=
        ngx_feature_libs=
        ngx_feature_test="char  buf[30]; buf[0] = '0';
                          var(0, buf, \"%d\", 1);
                          if (buf[0] != '1') return 1"
        . $NGX_AUTO/feature
    fi


    ngx_feature="gcc variadic macros"
    ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS"
    ngx_feature_run=yes
    ngx_feature_incs="#include <stdio.h>
#define var(dummy, args...)  sprintf(args)"
    ngx_feature_path=
    ngx_feature_libs=
    ngx_feature_test="char  buf[30]; buf[0] = '0';
                      var(0, buf, \"%d\", 1);
                      if (buf[0] != '1') return 1"
    . $NGX_AUTO/feature


    ngx_feature="gcc builtin 64 bit byteswap"
    ngx_feature_name="NGX_HAVE_GCC_BSWAP64"
    ngx_feature_run=no
    ngx_feature_incs=
    ngx_feature_path=
    ngx_feature_libs=
    ngx_feature_test="if (__builtin_bswap64(0)) return 1"
    . $NGX_AUTO/feature


#    ngx_feature="inline"
#    ngx_feature_name=
#    ngx_feature_run=no
#    ngx_feature_incs="int inline f(void) { return 1 }"
#    ngx_feature_path=
#    ngx_feature_libs=
#    ngx_feature_test=
#    . $NGX_AUTO/feature
#
#    if [ $ngx_found = yes ]; then
#    fi

fi
