摘要:用來組織編譯流程。會構造的編譯選項賦值針對版本操作系統等添加參數。向寫入通用的頭文件檢查操作系統特性。以下腳本為核心原文件生成的規則。為不同的系統做了大量的編譯優化,充分挖掘性能。代碼量大,手動編寫枯燥易出錯。
周生政
nginx構建使用shell語言生成makefile,以及ngx_auto_config.h,ngx_auto_headers.h,ngx_modules.c。其中ngx_auto_config.h為各種常量定義,ngx_auto_headers.h為頭文件,ngx_modules.c為nginx模塊。makefile用來組織編譯流程。configure主流程
auto/options
根據configure的參數,初始化和configure參數相關的變量值
auto/init
定義自動生成的文件名稱
auto/source
定義模塊名稱, 頭文件查找目錄, 頭文件,源文件
auto/cc/conf
選擇編譯器。假設選擇gcc。會構造gcc的編譯選項, 賦值CFLAGS, 針對gcc版本、操作系統、cpu等添加參數。
auto/headers
向ngx_auto_headers.h寫入通用的頭文件
auto/os/conf
檢查操作系統特性。以linux,x86為例。
檢查epoll,sendfile, sched_setaffinity, crypt_r, crypt_r等功能
auto/unix
檢查poll,kqueue, crypt, fcntl, posix_fadvise, directio, statfs, dlopen, sched_yield, setsockopt, getsockopt,accept4等特性。定義指針,size_t,time_t長度,一些typedef,機器大小端。
auto/modules
根據用戶編譯參數,定義一些常量;
#ifndef NGX_HAVE_PWRITE #define NGX_HAVE_PWRITE 1 #endif #ifndef NGX_SYS_NERR #define NGX_SYS_NERR 135 #endif
生成ngx_modules.c
extern ngx_module_t ngx_http_range_body_filter_module; extern ngx_module_t ngx_http_not_modified_filter_module; ngx_module_t *ngx_modules[] = { &ngx_core_module, &ngx_errlog_module, &ngx_conf_module,
auto/lib/conf
pcre, openssl, md5,libgd,zlib等庫
auto/make
創建makefile腳本
auto/lib/make
依賴庫makefile
auto/install
makefile的install部分
auto/summary
匯總一些檢查信息
makefile 分析nginx精簡版makefile
CC = cc CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused -Werror -g -ggdb3 -O0 -Wno-error CPP = cc -E LINK = $(CC) ALL_INCS = -I src/core -I src/event ... -I src/mail CORE_DEPS = src/core/nginx.h src/core/ngx_config.h ... src/core/ngx_palloc.h CORE_INCS = -I src/core -I src/event ... -I objs HTTP_DEPS = src/http/ngx_http.h src/http/ngx_http_request.h ... src/http/modules/ngx_http_ssi_filter_module.h HTTP_INCS = -I src/http -I src/http/modules objs/nginx: objs/src/core/nginx.o objs/src/core/ngx_log.o ... objs/src/core/ngx_palloc.o $(LINK) -o objs/nginx ... objs/src/core/ngx_log.o -lpthread -lcrypt -lpcre -lcrypto -lcrypto -lz objs/ngx_modules.o: $(CORE_DEPS) objs/ngx_modules.c $(CC) -c $(CFLAGS) $(CORE_INCS) -o objs/ngx_modules.o objs/ngx_modules.c objs/src/http/modules/ngx_http_upstream_keepalive_module.o: $(CORE_DEPS) $(HTTP_DEPS) src/http/modules/ngx_http_upstream_keepalive_module.c $(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) -o objs/src/http/modules/ngx_http_upstream_keepalive_module.o src/http/modules/ngx_http_upstream_keepalive_module.c objs/src/http/modules/ngx_http_stub_status_module.o: $(CORE_DEPS) $(HTTP_DEPS) src/http/modules/ngx_http_stub_status_module.c $(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) -o objs/src/http/modules/ngx_http_stub_status_module.o src/http/modules/ngx_http_stub_status_module.c生成makefile的循環腳本
在makefile中有很多objs/src/*.o為target的規則,是通過腳本批量生成。
以下腳本為核心原文件生成makefile的規則。
# the core sources for ngx_src in $CORE_SRCS do ngx_src=`echo $ngx_src | sed -e "s///$ngx_regex_dirsep/g"` ngx_obj=`echo $ngx_src | sed -e "s#^(.*.)cpp$#$ngx_objs_dir1$ngx_objext#g" -e "s#^(.*.)cc$#$ngx_objs_dir1$ngx_objext#g" -e "s#^(.*.)c$#$ngx_objs_dir1$ngx_objext#g" -e "s#^(.*.)S$#$ngx_objs_dir1$ngx_objext#g"` cat << END >> $NGX_MAKEFILE $ngx_obj: $(CORE_DEPS)$ngx_cont$ngx_src $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX END done
在auto/make中一共會有四個大循環,來自動化生成大量的規則。
核心源文件
http源文件
mail源文件
misc源文件
采用shell編寫的原因nginx是模塊化開發,有大量的模塊可供用戶選擇。nginx為不同的系統做了大量的編譯優化,充分挖掘性能。nginx代碼量大,手動編寫makefile枯燥易出錯。基于以上原因,nginx的configure采用shell腳本開發,只編譯選擇模塊,為不同系統提供不同編譯參數,手動生成makefile規則。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40199.html
摘要:請注意這里的和是全局變量,而和是模塊的靜態變量是模塊級的全局變量,這一點很重要,后面會詳細分析。當編譯進一個模塊的時候,就被賦值為當前模塊的處理函數。所以整體看來,就像用全局變量組成的一條單向鏈表。 最近開始使用Nginx的第三方擴展解決實際的問題,對Nginx的擴展開發產生了一些興趣,在閱讀第三方代碼時產生了一些心得和體會。本文詳細分析了進行Nginx過濾器開發的時候,Nginx提供...
摘要:而對于堆內存,通常需要程序員進行管理。我們通常說的內存管理亦是只堆空間內存管理。內存管理整體可以分為個部分,第一部分是常規的內存池,用于進程平時所需的內存管理第二部分是共享內存的管理。將內存塊按照的整數次冪進行劃分最小為最大為。 施洪寶 一. 概述 應用程序的內存可以簡單分為堆內存,棧內存。對于棧內存而言,在函數編譯時,編譯器會插入移動棧當前指針位置的代碼,實現棧空間的自管理。而對于...
摘要:結構體數組,用來表示該模塊可以在配置文件中配置的項目,及其操作指令。 源文件路徑 srccore gx_conf_file.h srccore gx_conf_file.c 主要內容 本篇的主要目的在于分析Nginx的配置功能。由于Nginx的配置基本就是對模塊的配置,因此,在討論配置功能之前,需要先分析Nginx的模塊功能。 對于模塊功能,這里的重點不在于某個模塊的細節,而...
摘要:每個模塊由以下幾部分構成結構體代表模塊本身,其指針被放入數組中。結構體用來表示模塊的配置內容,其中部分成員可以通過配置文件進行配置。調用該中的函數,該函數最終初始化模塊對應的結構體,完成配置。因此,分析源碼中的配置指令,就是分析結構體。 本篇的上篇 Nginx 源碼分析:從模塊到配置(上),建議閱讀本篇前先閱讀上篇。 關于模塊 Nginx的架構高度模塊化。每個模塊各司其職,組合在一...
摘要:下源碼安裝一前言之前,我的開發環境是。重新加載權限表將確保所有到目前為止所做的更改將立即生效。然后,和注意,如果是使用二進制包安裝了及相應的開發庫,不需要指定路徑。五參考資料入門教程編譯安裝編譯安裝 Debian9下源碼安裝LNMP 一、前言 之前,我的開發環境是Windows-10+PHP-7.1+Nginx-1.10+MariaDB-10.1。 后面開發需要使用到memcached...
閱讀 2671·2023-04-25 18:10
閱讀 1606·2019-08-30 15:53
閱讀 2788·2019-08-30 13:10
閱讀 3216·2019-08-29 18:40
閱讀 1128·2019-08-23 18:31
閱讀 1201·2019-08-23 16:49
閱讀 3400·2019-08-23 16:07
閱讀 877·2019-08-23 15:27