解剖Nginx·自動指令碼篇(5)編譯器相關主指令碼
解剖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
表示option
,obj
表示object
,bin
表示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
表示directory
,sep
表示seperator
,regex
表示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
-
相關文章
- 精讀Nginx·自動指令碼篇(5)編譯器相關主指令碼Nginx指令碼編譯
- 解剖Nginx·自動指令碼篇(7)型別相關指令碼系列Nginx指令碼型別
- 解剖Nginx·自動指令碼篇(3)原始碼相關變數指令碼 auto/sourcesNginx指令碼原始碼變數
- 解剖Nginx·自動指令碼篇(6)編譯器名稱變數指令碼 auto/cc/nameNginx指令碼編譯變數
- 解剖Nginx·自動指令碼篇(4)工具型指令碼系列Nginx指令碼
- 解剖Nginx·自動指令碼篇(1)解析配置選項指令碼 auto/optionsNginx指令碼
- 解剖Nginx·自動指令碼篇(2)設定初始變數指令碼 auto/initNginx指令碼變數
- 精讀 Nginx 原始碼·自動指令碼篇(3)原始碼相關變數指令碼 auto/sourcesNginx原始碼指令碼變數
- 精讀 Nginx·自動指令碼篇(4)工具型指令碼系列Nginx指令碼
- 精讀Nginx原始碼·自動指令碼篇(2)設定初始變數指令碼 auto/initNginx原始碼指令碼變數
- ant指令碼實現的Android自動編譯指令碼Android編譯
- DG相關指令碼指令碼
- 自動配置php、mysql、nginx的指令碼PHPMySqlNginx指令碼
- 精讀Nginx原始碼·自動指令碼篇(1)如何讀取配置選項?Nginx原始碼指令碼
- QTP - 指令碼相關收集QT指令碼
- 使用shell指令碼自動修改Xcode工程編譯版本號指令碼XCode編譯
- 自編碼器及其相關模型模型
- 5.6 MySql主從自動切換指令碼MySql指令碼
- Java的指令碼機制、編譯器APIJava指令碼編譯API
- 自動ftp指令碼FTP指令碼
- mysql5.6主主叢集自動同步指令碼MySql指令碼
- 學習Ant編譯指令碼編譯指令碼
- 6502 指令譯碼器
- sql_trace相關指令碼SQL指令碼
- 編譯FFMPEG原始碼的指令碼編寫案例編譯原始碼指令碼
- 自動化(YUM/編譯)安裝PHP(5.3/5.5/7.0/7.1)指令碼編譯PHP指令碼
- Window下采用ant 指令碼構建Android自動化編譯指令碼Android編譯
- Linux管理指令碼之自動執行指令碼Linux指令碼
- specjvm自動化指令碼JVM指令碼
- 自動備份指令碼指令碼
- docker指令碼自動化Docker指令碼
- LNMP自動部署指令碼LNMP指令碼
- awr自動收集指令碼指令碼
- 自動化RMAN指令碼指令碼
- Oracle 效能相關常用指令碼(SQL)Oracle指令碼SQL
- 自動化指令碼安裝mysql shell指令碼範例指令碼MySql
- CentOS7 nginx啟動指令碼CentOSNginx指令碼
- ssh自動輸入密碼指令碼 切換目錄指令碼密碼指令碼