精讀Nginx·自動指令碼篇(5)編譯器相關主指令碼

鍾超發表於2012-03-14

精讀 Nginx·自動指令碼篇(5)編譯器相關主指令碼

  • Author: Poechant
  • Blog: blog.CSDN.net/Poechant
  • Email: zhongchao.ustc#gmail.com (#->@)
  • Date: March 12th, 2012
  • Copyright © 柳大·Poechant

在 Nginx 的自動指令碼中,auto/cc目錄下的所有指令碼都是用於編譯器相關配置使用的。Nginx的出色跨平臺性(Linux、Darwin、Solaris、Win32 等)就有這些指令碼的貢獻。該目錄下包含如下指令碼:

目錄

  • conf:主指令碼,配置編譯器的基本屬性,並根據系統的編譯器環境引用不同的指令碼。
  • name:與編譯器名稱相關的處理邏輯在該指令碼中。
  • gcc:GNU C 編譯器的 Specified 配置。
  • sunc:Sun C 編譯器的 Specified 配置。
  • acc:HP ANSI C++ 編譯器的 Specified 配置。
  • bcc:Borland C++ 編譯器的 Specified 配置。
  • ccc:Compaq C 編譯器的 Specified 配置。
  • icc:Intel C++ 編譯器的 Specified 配置。
  • msvc:Microsoft Visual C++ 編譯器的 Specified 配置。
  • owc:Open Watcom C 編譯器的 Specified 配置。

4.1 LINK 變數

LINK變數為:

LINK="\$(CC)"

4.2 編譯選項變數

有 include、編譯、輸出目標檔案、輸出可執行檔案。

ngx_include_opt="-I "
ngx_compile_opt="-c"
ngx_objout="-o "
ngx_binout="-o "

opt表示optionobj表示objectbin表示binary

4.3 副檔名變數

目標副檔名、可執行副檔名。

ngx_objext="o"
ngx_binext=

ext表示extension

4.4 ngx_long_start 和 ngx_long_end

相關變數為:

ngx_long_start=
ngx_long_end=

這兩個變數是在編譯選項中使用的,與平臺相關。在這裡做初始化。

4.4.1 ngx_long_start

  • 在 bcc 中,設定為'@&&|
  • 在 msvc 中,設定為@<<
  • 在 owc 中,設定為''

4.4.2 ngx_long_end

  • 在 bcc 中,設定為|
  • 在 msvc 中,設定為<<
  • 在 owc 中,設定為''

4.5 一些符號的配置

相關變數為:

ngx_regex_dirsep="\/"
ngx_dirsep='/'
  • ngx_regex_dirsep:正規表示式中的目錄分隔符
  • ngx_dirsep:目錄分隔符

dir表示directorysep表示seperatorregex表示regular expression

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

ngx_long_regex_cont=$ngx_regex_cont
ngx_long_cont=$ngx_cont

4.6 引用 auto/cc/name 指令碼

. auto/cc/name

4.7 平臺相關性配置

if test -n "$CFLAGS"; then
    CC_TEST_FLAGS="$CFLAGS $NGX_CC_OPT"
    case $NGX_CC_NAME in
        ccc)
            # Compaq C V6.5-207
            ngx_include_opt="-I"
        ;;
    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
            . auto/cc/gcc
        ;;
        icc)
            # Intel C++ compiler 7.1, 8.0, 8.1
            . auto/cc/icc
        ;;
        sunc)
            # Sun C 5.7 Patch 117837-04 2005/05/11
            . auto/cc/sunc
        ;;
        ccc)
            # Compaq C V6.5-207
            . auto/cc/ccc
        ;;
        acc)
            # aCC: HP ANSI C++ B3910B A.03.55.02
            . auto/cc/acc
        ;;
        msvc*)
            # MSVC++ 6.0 SP2, MSVC++ Toolkit 2003
            . auto/cc/msvc
        ;;
        owc)
            # Open Watcom C 1.0, 1.2
            . auto/cc/owc
        ;;
        bcc)
            # Borland C++ 5.5
            . auto/cc/bcc
        ;;
    esac
    CC_TEST_FLAGS="$CC_TEST_FLAGS $NGX_CC_OPT"
fi

4.8 feature

auto/feature指令碼,已經在《精讀 Nginx·自動指令碼篇(4)工具型指令碼系列》中介紹了。所以feature相關的程式碼很容易理解。

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=
    . 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

在執行configure的時候,--with-ld-opt指定了NGX_LD_OPT,然後設定feature相關變數。其他一些feature設定如下。

4.8.1 gcc builtin atomic operations 相關 feature

ngx_feature="gcc builtin atomic 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();"
. auto/feature

4.8.2 C99 variadic macros 相關 feature

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"
    . auto/feature
 fi

4.8.3 gcc variadic macros 相關 feature

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"
. auto/feature

4.9 結語

編譯器相關配置的其他指令碼,就不細緻分析了,這對 Nginx 的整體自動指令碼體系的學習理解並無多大裨益。不過如果你想了解這些內容,會有一些好處,對編寫跨平臺的軟體的自動指令碼很有幫助。能讓我們在不同系統的機器上享受美妙的configure過程,正是由這些編譯器相關的自動指令碼所保證的。

-

轉載請註明來自“柳大的CSDN部落格”:blog.csdn.net/Poechant

-

相關文章