Nginx · 자동 스 크 립 트 편 해부 (7) 유형 관련 스 크 립 트 시리즈

6331 단어
Nginx · 자동 스 크 립 트 편 해부 (7) 유형 관련 스 크 립 트 시리즈
  • Author: Poechant
  • Blog: blog.CSDN.net/Poechant
  • Email: zhongchao.ustc#gmail.com (#->@)
  • Date: March 12th, 2012
  • Copyright © 유 대 · Poechant
  • 1 auto/types/sizeof
    이 스 크 립 트 의 기능 은 테스트 프로그램 을 통 해 주어진 ngx_type 의 크기 를 알 수 있 습 니 다.
    1.1 알림 정보 표시
    echo $ngx_n "checking for $ngx_type size ...$ngx_c"
    
    cat << END >> $NGX_AUTOCONF_ERR
    
    ----------------------------------------
    checking for $ngx_type size
    
    END
    

    1.2 계산 ngx_type 을 생 성 하 는 테스트 프로그램
    cat << END > $NGX_AUTOTEST.c
    
    #include <sys/types.h>
    #include <sys/time.h>
    $NGX_INCLUDE_UNISTD_H
    #include <signal.h>
    #include <sys/resource.h>
    $NGX_INCLUDE_INTTYPES_H
    $NGX_INCLUDE_AUTO_CONFIG_H
    
    int main() {
        printf("%d", sizeof($ngx_type));
        return 0;
    }
    
    END
    

    1.3 컴 파일 테스트 프로그램
    우선 컴 파일 된 명령 을 생 성 합 니 다.
    ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"
    

    주의 -o $NGX_AUTOTEST 는 실행 가능 한 파일 을 만 들 고 컴 파일 을 실행 하 는 것 입 니 다.
    eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
    

    1.4 테스트 프로그램 실행, 획득 ngx_sizeNGX_AUTOTEST 파일 이 존재 하고 실행 가능 하 다 면 ngx_size 크기 를 설정 합 니 다.
    ngx_size=
    if [ -x $NGX_AUTOTEST ]; then
        ngx_size=`$NGX_AUTOTEST`
        echo " $ngx_size bytes"
    fi
    

    1.5 삭제 NGX_AUTOTEST 테스트 프로그램 실행 가능 한 파일
    rm -f $NGX_AUTOTEST
    

    1.6 정수 최대 치 설정
    각각 32 비트 시스템 의 데이터 크기 와 64 비트 시스템 의 데이터 크기 를 처리 하고 정수 최대 치 를 설정 합 니 다.기타 상황 은 잘못 처리 되 었 다.
    case $ngx_size in
        4)
            if [ "$ngx_type"="long" ]; then
                ngx_max_value=2147483647L
            else
                ngx_max_value=2147483647
            fi
    
            ngx_max_len='(sizeof("-2147483648") - 1)'
        ;;
    
        8)
            if [ "$ngx_type"="long long" ]; then
                ngx_max_value=9223372036854775807LL
            else
                ngx_max_value=9223372036854775807L
            fi
    
            ngx_max_len='(sizeof("-9223372036854775808") - 1)'
        ;;
    
        *)
            echo
            echo "$0: error: can not detect $ngx_type size"
    
            echo "----------"    >> $NGX_AUTOCONF_ERR
            cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR
            echo "----------"    >> $NGX_AUTOCONF_ERR
            echo $ngx_test       >> $NGX_AUTOCONF_ERR
            echo "----------"    >> $NGX_AUTOCONF_ERR
    
            exit 1
    esac
    

    2 auto/types/typedef
    두 순환 을 통 해 각각 처리 ngx_typengx_types.objs/ngx_auto_config.h 파일 에 쓰기 typedef 정의.
    2.1 테스트 프로그램 생 성
    cat << END > $NGX_AUTOTEST.c
    
    #include <sys/types.h>
    #include <signal.h>
    #include <sys/socket.h>
    #include <sys/time.h>
    #include <sys/resource.h>
    #include <netinet/in.h>
    $NGX_INCLUDE_INTTYPES_H
    
    int main() {
        $ngx_try i = 0;
        return 0;
    }
    
    END
    

    2.2 컴 파일 테스트 프로그램
    ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
              -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"
    
    eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
    

    2.3 설정 ngx_found
    if [ -x $NGX_AUTOTEST ]; then
        if [ $ngx_try = $ngx_type ]; then
            echo " found"
            ngx_found=yes
        else
            echo ", $ngx_try used"
            ngx_found=$ngx_try
        fi
    fi
    

    2.4 테스트 프로그램 실행 가능 한 파일 삭제
    rm -f $NGX_AUTOTEST
    

    2.5 이상 상황
    if [ $ngx_found = no ]; then
        echo $ngx_n " $ngx_try not found$ngx_c"
    
        echo "----------"    >> $NGX_AUTOCONF_ERR
        cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR
        echo "----------"    >> $NGX_AUTOCONF_ERR
        echo $ngx_test       >> $NGX_AUTOCONF_ERR
        echo "----------"    >> $NGX_AUTOCONF_ERR
    
    else
        break
    fi
    

    여기 서 순환 이 끝 났 습 니 다.그리고:
    if [ $ngx_found = no ]; then
        echo
        echo "$0: error: can not define $ngx_type"
    
        exit 1
    fi
    

    2.6 typedef 문 구 를 쓰기 objs/ngx_auto_config.hngx_found 는 원래 유형 이 고 ngx_type 는 별명 유형 이다.
    if [ $ngx_found != yes ]; then
        echo "typedef $ngx_found  $ngx_type;"   >> $NGX_AUTO_CONFIG_H
    fi
    

    3 auto/types/value
    이 는 auto/define 와 다소 유사 하지만 auto/define 'K 값 을 설 정 했 고 그 값 은 V' 로 'K 값 을 설정 하지 않 았 음' 과 상대 적 이다.auto/types/value 는 임의의 매개 변수 와 값 을 설정 합 니 다.
    cat << END >> $NGX_AUTO_CONFIG_H
    
    #ifndef $ngx_param
    #define $ngx_param  $ngx_value
    #endif
    
    END
    

    4 auto/types/uintptr_t
    4.1 알림
    echo $ngx_n "checking for uintptr_t ...$ngx_c"
    echo >> $NGX_ERR
    echo "checking for uintptr_t" >> $NGX_ERR
    

    4.2 테스트 프로그램 생 성
    cat << END > $NGX_AUTOTEST.c
    
    #include <sys/types.h>
    $NGX_INTTYPES_H
    
    int main() {
        uintptr_t i = 0;
        return 0;
    }
    
    END
    

    4.3 컴 파일 테스트 프로그램
    found=no
    
    eval "$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c >> $NGX_ERR 2>&1"
    
    if [ -x $NGX_AUTOTEST ]; then
        echo " uintptr_t found"
        found=yes
    else
        echo $ngx_n " uintptr_t not found" $ngx_c
    fi
    

    4.4 테스트 프로그램 실행 파일 삭제
    rm $NGX_AUTOTEST*
    

    4.5 실행 가능 한 파일 이 없 을 때의 처리
    if [ $found = no ]; then
        found="uint`expr 8 \* $ngx_ptr_size`_t"
        echo ", $found used"
    
        echo "typedef $found  uintptr_t;"                   >> $NGX_AUTO_CONFIG_H
        echo "typedef $found  intptr_t;" | sed -e 's/u//g'  >> $NGX_AUTO_CONFIG_H
    fi
    

    -
    "유 대 · Poechant 의 CSDN 블 로그": blog. CSDN. net / Poechant
    -
    원본 링크:http://blog.csdn.net/poechant/article/details/7359170

    좋은 웹페이지 즐겨찾기