auto/make文件是作为nginx生成Makefile脚本最主要文件。下面我们来分析一下该脚本:
auto/make脚本
脚本内容如下:
1) 构造相应目录
这里NGX_MAKEFILE
在auto/init脚本中被赋值为objs/Makefile。
在auto/cc/conf脚本中ngx_regex_dirsep=”\/”,即斜杠目录分隔符。
NGX_USE_PCH
为空,因此ngx_use_pch也为空。
2) 设置编译、链接器
这里$CC
为在auto/options脚本中被置为cc
。
CFLAGS
在auto/cc/gcc脚本中被置为:
CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g
CPP
在auto/cc/gcc脚本中被设置为cc -E
。
LINK
在auto/cc/conf脚本中被设置为$(CC)
。
3) 处理PERL CFLAGS
NGX_PERL_CFLAGS
为空,不进行处理。
4) 处理依赖的头文件
我们先来看如下脚本:
sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont$ngx_include_opt\1/g"
该脚本的含义为匹配任意两个空格之间的字符,且这两个空格之间本身不能为空格,这样讲匹配到的结果赋值给\1
。例如:
# str=`echo "fff ggg qqq" | sed -e "s/ *\([^ ][^ ]*\)/-I\1/g"`
# echo $str
fff-Iggg-Iqqq
另外在auto/cc/conf脚本中:
上述ngx_regex_cont变量中,第一、第二个反斜杠表示对\
进行转义,使得第二个反斜杠作为普通的字符使用。最后一个反斜杠作为shell脚本中连接下一行使用。
NGX_OBJS
值为objs。
最后生成的各变量情况如下:
从上面我们看到,ALL_INCS
相对于CORE_INCS
多包含了http相关的头文件路径。
5) 处理http相关依赖
当前HTTP
为YES
。最后生成的各变量情况如下:
6) 处理MAIL相关依赖项
当前MAIL
在auto/options脚本中默认被设置为NO
,我们也并未手动启用。
7) 处理STREAM相关依赖项
当前STREAM
在auto/options脚本中默认被设置为NO
,且我们也并未手动启用。
8) 处理MISC_SRCS及ADDON_SRCS
当前MISC_SRCS
及NGX_ADDON_SRCS
均为空。
9) 处理Nginx相关源文件、依赖文件、库文件
上面首先处理所有源文件的目录分隔符,然后对NGX_ADDON_SRCS
进行遍历,生成对应的编译目录,并将相应的编译目录添加到ngx_all_srcs中。
将ngx_all_srcs目录下后缀名为.cpp
,.cc
,.c
,.S
文件替换成.0
后缀保存在ngx_all_objs变量中。我们在auto/cc/conf脚本中将ngx_object
定义为o
。
我们在auto/init脚本中将NGX_MODULES_C
定义为:
NGX_MODULES_C=$NGX_OBJS/ngx_modules.c
这里注意sed -e "s/\(.*\.\)c/\1$ngx_objext/
,其中.*
会在第一个匹配后在匹配0个或多个字符,这可以处理类似于test.helloworld.c这样的文件名。
此处NGX_RES
,NGX_RC
,NGX_ICONS
,NGX_RCC
均为空。
ngx_deps变量保存所有生成nginx所需要依赖的.o
文件,.a
库文件;而ngx_objs变量保存所有.o
文件.
上面处理ngx_libs,ngx_link,ngx_main_link。当前CORE_LINK
值为空;MAIN_LINK
值为-Wl,-E
。
这里注意:
sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"
后半段的含义为在一行的开始加上$ngx_long_regex_cont
。
10) Makefile中生成build、binary等target
其中NGX_OBJS
值为objs;ngx_binout
在auto/cc/conf脚本中被设置为-o
。最后给出具体的生成结果以做参考:
build: binary modules manpage
binary: objs/nginx
objs/nginx: objs/src/core/nginx.o \
objs/src/core/ngx_log.o \
objs/src/core/ngx_palloc.o \
objs/src/core/ngx_array.o \
objs/src/core/ngx_list.o \
objs/src/core/ngx_hash.o \
objs/src/core/ngx_buf.o \
objs/src/core/ngx_queue.o \
objs/src/core/ngx_output_chain.o \
objs/src/core/ngx_string.o \
objs/src/core/ngx_parse.o \
objs/src/core/ngx_parse_time.o \
objs/src/core/ngx_inet.o \
objs/src/core/ngx_file.o \
objs/src/core/ngx_crc32.o \
objs/src/core/ngx_murmurhash.o \
objs/src/core/ngx_md5.o \
objs/src/core/ngx_rbtree.o \
objs/src/core/ngx_radix_tree.o \
objs/src/core/ngx_slab.o \
objs/src/core/ngx_times.o \
objs/src/core/ngx_shmtx.o \
objs/src/core/ngx_connection.o \
objs/src/core/ngx_cycle.o \
objs/src/core/ngx_spinlock.o \
objs/src/core/ngx_rwlock.o \
objs/src/core/ngx_cpuinfo.o \
objs/src/core/ngx_conf_file.o \
objs/src/core/ngx_module.o \
objs/src/core/ngx_resolver.o \
objs/src/core/ngx_open_file_cache.o \
objs/src/core/ngx_crypt.o \
objs/src/core/ngx_proxy_protocol.o \
objs/src/core/ngx_syslog.o \
objs/src/event/ngx_event.o \
objs/src/event/ngx_event_timer.o \
objs/src/event/ngx_event_posted.o \
objs/src/event/ngx_event_accept.o \
objs/src/event/ngx_event_connect.o \
objs/src/event/ngx_event_pipe.o \
objs/src/os/unix/ngx_time.o \
objs/src/os/unix/ngx_errno.o \
objs/src/os/unix/ngx_alloc.o \
objs/src/os/unix/ngx_files.o \
objs/src/os/unix/ngx_socket.o \
objs/src/os/unix/ngx_recv.o \
objs/src/os/unix/ngx_readv_chain.o \
objs/src/os/unix/ngx_udp_recv.o \
objs/src/os/unix/ngx_send.o \
objs/src/os/unix/ngx_writev_chain.o \
objs/src/os/unix/ngx_udp_send.o \
objs/src/os/unix/ngx_channel.o \
objs/src/os/unix/ngx_shmem.o \
objs/src/os/unix/ngx_process.o \
objs/src/os/unix/ngx_daemon.o \
objs/src/os/unix/ngx_setaffinity.o \
objs/src/os/unix/ngx_setproctitle.o \
objs/src/os/unix/ngx_posix_init.o \
objs/src/os/unix/ngx_user.o \
objs/src/os/unix/ngx_dlopen.o \
objs/src/os/unix/ngx_process_cycle.o \
objs/src/os/unix/ngx_linux_init.o \
objs/src/event/modules/ngx_epoll_module.o \
objs/src/os/unix/ngx_linux_sendfile_chain.o \
objs/src/event/ngx_event_openssl.o \
objs/src/event/ngx_event_openssl_stapling.o \
objs/src/core/ngx_regex.o \
objs/src/http/ngx_http.o \
objs/src/http/ngx_http_core_module.o \
objs/src/http/ngx_http_special_response.o \
objs/src/http/ngx_http_request.o \
objs/src/http/ngx_http_parse.o \
objs/src/http/modules/ngx_http_log_module.o \
objs/src/http/ngx_http_request_body.o \
objs/src/http/ngx_http_variables.o \
objs/src/http/ngx_http_script.o \
objs/src/http/ngx_http_upstream.o \
objs/src/http/ngx_http_upstream_round_robin.o \
objs/src/http/ngx_http_file_cache.o \
objs/src/http/ngx_http_write_filter_module.o \
objs/src/http/ngx_http_header_filter_module.o \
objs/src/http/modules/ngx_http_chunked_filter_module.o \
objs/src/http/modules/ngx_http_range_filter_module.o \
objs/src/http/modules/ngx_http_gzip_filter_module.o \
objs/src/http/ngx_http_postpone_filter_module.o \
objs/src/http/modules/ngx_http_ssi_filter_module.o \
objs/src/http/modules/ngx_http_charset_filter_module.o \
objs/src/http/modules/ngx_http_userid_filter_module.o \
objs/src/http/modules/ngx_http_headers_filter_module.o \
objs/src/http/ngx_http_copy_filter_module.o \
objs/src/http/modules/ngx_http_not_modified_filter_module.o \
objs/src/http/modules/ngx_http_static_module.o \
objs/src/http/modules/ngx_http_autoindex_module.o \
objs/src/http/modules/ngx_http_index_module.o \
objs/src/http/modules/ngx_http_auth_basic_module.o \
objs/src/http/modules/ngx_http_access_module.o \
objs/src/http/modules/ngx_http_limit_conn_module.o \
objs/src/http/modules/ngx_http_limit_req_module.o \
objs/src/http/modules/ngx_http_geo_module.o \
objs/src/http/modules/ngx_http_map_module.o \
objs/src/http/modules/ngx_http_split_clients_module.o \
objs/src/http/modules/ngx_http_referer_module.o \
objs/src/http/modules/ngx_http_rewrite_module.o \
objs/src/http/modules/ngx_http_ssl_module.o \
objs/src/http/modules/ngx_http_proxy_module.o \
objs/src/http/modules/ngx_http_fastcgi_module.o \
objs/src/http/modules/ngx_http_uwsgi_module.o \
objs/src/http/modules/ngx_http_scgi_module.o \
objs/src/http/modules/ngx_http_memcached_module.o \
objs/src/http/modules/ngx_http_empty_gif_module.o \
objs/src/http/modules/ngx_http_browser_module.o \
objs/src/http/modules/ngx_http_upstream_hash_module.o \
objs/src/http/modules/ngx_http_upstream_ip_hash_module.o \
objs/src/http/modules/ngx_http_upstream_least_conn_module.o \
objs/src/http/modules/ngx_http_upstream_keepalive_module.o \
objs/src/http/modules/ngx_http_upstream_zone_module.o \
objs/ngx_modules.o \
../pcre-8.40/.libs/libpcre.a \
../zlib-1.2.11/libz.a
$(LINK) -o objs/nginx \
objs/src/core/nginx.o \
objs/src/core/ngx_log.o \
objs/src/core/ngx_palloc.o \
objs/src/core/ngx_array.o \
objs/src/core/ngx_list.o \
objs/src/core/ngx_hash.o \
objs/src/core/ngx_buf.o \
objs/src/core/ngx_queue.o \
objs/src/core/ngx_output_chain.o \
objs/src/core/ngx_string.o \
objs/src/core/ngx_parse.o \
objs/src/core/ngx_parse_time.o \
objs/src/core/ngx_inet.o \
objs/src/core/ngx_file.o \
objs/src/core/ngx_crc32.o \
objs/src/core/ngx_murmurhash.o \
objs/src/core/ngx_md5.o \
objs/src/core/ngx_rbtree.o \
objs/src/core/ngx_radix_tree.o \
objs/src/core/ngx_slab.o \
objs/src/core/ngx_times.o \
objs/src/core/ngx_shmtx.o \
objs/src/core/ngx_connection.o \
objs/src/core/ngx_cycle.o \
objs/src/core/ngx_spinlock.o \
objs/src/core/ngx_rwlock.o \
objs/src/core/ngx_cpuinfo.o \
objs/src/core/ngx_conf_file.o \
objs/src/core/ngx_module.o \
objs/src/core/ngx_resolver.o \
objs/src/core/ngx_open_file_cache.o \
objs/src/core/ngx_crypt.o \
objs/src/core/ngx_proxy_protocol.o \
objs/src/core/ngx_syslog.o \
objs/src/event/ngx_event.o \
objs/src/event/ngx_event_timer.o \
objs/src/event/ngx_event_posted.o \
objs/src/event/ngx_event_accept.o \
objs/src/event/ngx_event_connect.o \
objs/src/event/ngx_event_pipe.o \
objs/src/os/unix/ngx_time.o \
objs/src/os/unix/ngx_errno.o \
objs/src/os/unix/ngx_alloc.o \
objs/src/os/unix/ngx_files.o \
objs/src/os/unix/ngx_socket.o \
objs/src/os/unix/ngx_recv.o \
objs/src/os/unix/ngx_readv_chain.o \
objs/src/os/unix/ngx_udp_recv.o \
objs/src/os/unix/ngx_send.o \
objs/src/os/unix/ngx_writev_chain.o \
objs/src/os/unix/ngx_udp_send.o \
objs/src/os/unix/ngx_channel.o \
objs/src/os/unix/ngx_shmem.o \
objs/src/os/unix/ngx_process.o \
objs/src/os/unix/ngx_daemon.o \
objs/src/os/unix/ngx_setaffinity.o \
objs/src/os/unix/ngx_setproctitle.o \
objs/src/os/unix/ngx_posix_init.o \
objs/src/os/unix/ngx_user.o \
objs/src/os/unix/ngx_dlopen.o \
objs/src/os/unix/ngx_process_cycle.o \
objs/src/os/unix/ngx_linux_init.o \
objs/src/event/modules/ngx_epoll_module.o \
objs/src/os/unix/ngx_linux_sendfile_chain.o \
objs/src/event/ngx_event_openssl.o \
objs/src/event/ngx_event_openssl_stapling.o \
objs/src/core/ngx_regex.o \
objs/src/http/ngx_http.o \
objs/src/http/ngx_http_core_module.o \
objs/src/http/ngx_http_special_response.o \
objs/src/http/ngx_http_request.o \
objs/src/http/ngx_http_parse.o \
objs/src/http/modules/ngx_http_log_module.o \
objs/src/http/ngx_http_request_body.o \
objs/src/http/ngx_http_variables.o \
objs/src/http/ngx_http_script.o \
objs/src/http/ngx_http_upstream.o \
objs/src/http/ngx_http_upstream_round_robin.o \
objs/src/http/ngx_http_file_cache.o \
objs/src/http/ngx_http_write_filter_module.o \
objs/src/http/ngx_http_header_filter_module.o \
objs/src/http/modules/ngx_http_chunked_filter_module.o \
objs/src/http/modules/ngx_http_range_filter_module.o \
objs/src/http/modules/ngx_http_gzip_filter_module.o \
objs/src/http/ngx_http_postpone_filter_module.o \
objs/src/http/modules/ngx_http_ssi_filter_module.o \
objs/src/http/modules/ngx_http_charset_filter_module.o \
objs/src/http/modules/ngx_http_userid_filter_module.o \
objs/src/http/modules/ngx_http_headers_filter_module.o \
objs/src/http/ngx_http_copy_filter_module.o \
objs/src/http/modules/ngx_http_not_modified_filter_module.o \
objs/src/http/modules/ngx_http_static_module.o \
objs/src/http/modules/ngx_http_autoindex_module.o \
objs/src/http/modules/ngx_http_index_module.o \
objs/src/http/modules/ngx_http_auth_basic_module.o \
objs/src/http/modules/ngx_http_access_module.o \
objs/src/http/modules/ngx_http_limit_conn_module.o \
objs/src/http/modules/ngx_http_limit_req_module.o \
objs/src/http/modules/ngx_http_geo_module.o \
objs/src/http/modules/ngx_http_map_module.o \
objs/src/http/modules/ngx_http_split_clients_module.o \
objs/src/http/modules/ngx_http_referer_module.o \
objs/src/http/modules/ngx_http_rewrite_module.o \
objs/src/http/modules/ngx_http_ssl_module.o \
objs/src/http/modules/ngx_http_proxy_module.o \
objs/src/http/modules/ngx_http_fastcgi_module.o \
objs/src/http/modules/ngx_http_uwsgi_module.o \
objs/src/http/modules/ngx_http_scgi_module.o \
objs/src/http/modules/ngx_http_memcached_module.o \
objs/src/http/modules/ngx_http_empty_gif_module.o \
objs/src/http/modules/ngx_http_browser_module.o \
objs/src/http/modules/ngx_http_upstream_hash_module.o \
objs/src/http/modules/ngx_http_upstream_ip_hash_module.o \
objs/src/http/modules/ngx_http_upstream_least_conn_module.o \
objs/src/http/modules/ngx_http_upstream_keepalive_module.o \
objs/src/http/modules/ngx_http_upstream_zone_module.o \
objs/ngx_modules.o \
-ldl -lpthread -lcrypt ../pcre-8.40/.libs/libpcre.a -lssl -lcrypto -ldl ../zlib-1.2.11/libz.a \
-Wl,-E
11) 处理ngx_modules.c
NGX_PCH
在auto/init脚本中被初始化为空,并且在我们当前环境中也未在其他脚本对其做相应修改。
最后给出具体的生成结果以作参考:
objs/ngx_modules.o: $(CORE_DEPS) \
objs/ngx_modules.c
$(CC) -c $(CFLAGS) $(CORE_INCS) \
-o objs/ngx_modules.o \
objs/ngx_modules.c
12) 生成编译CORE_SRCS源文件的编译代码
遍历CORE_SRC
目录下的每一个以.cpp
,.cc
,.c
,.S
结尾的源文件,然后生成编译该源文件的代码;ngx_objout
在auto/cc/conf脚本中被定义为-o
;ngx_tab
在auto/cc/conf脚本中被定义为:
ngx_tab=' \
'
最后我们给出一个示例(src/core/nginx.c):
objs/src/core/nginx.o: $(CORE_DEPS) \
src/core/nginx.c
$(CC) -c $(CFLAGS) $(CORE_INCS) \
-o objs/src/core/nginx.o \
src/core/nginx.c
13) 生成编译HTTP源文件的代码
此处HTTP
在auto/options脚本中被默认设置为YES
.然后针对HTTP模块分别生成了ngx_cc与ngx_perl_cc。
遍历HTTP_SRC
目录下的所有源文件,然后生成编译脚本。这里给出一个示例:
objs/src/http/ngx_http.o: $(CORE_DEPS) $(HTTP_DEPS) \
src/http/ngx_http.c
$(CC) -c $(CFLAGS) $(CORE_INCS) $(HTTP_INCS) \
-o objs/src/http/ngx_http.o \
src/http/ngx_http.c
14) 生成编译MAIL模块源文件的代码
当前MAIL
模块并未启用。
15) 生成编译STREAM模块源文件的代码
当前STREAM
模块并未启用。
16) 生成编译MISC模块源文件的代码
当前MISC_SRCS
为空,因此本段代码其实并不执行。
17) 生成编译ADDON_SRCS目录源文件的代码
此脚本主要针对外部静态模块。外部静态模块一般提供config脚本,config脚本调用auto/module完成相应的配置,将需要编译的源文件等存放在NGX_ADDON_SRCS
变量中。
此处可能还特别针对那些不是通过--add-module=*
方式传入的外部静态模块。
当前我们并没有添加任何外部静态模块。
19) 处理外部静/动态模块配置
针对外部静/动态模块,在进行编译之前可能会需要进行相应的配置,此处执行相应目录的config.make配置文件。
20) 处理WIN32资源文件
当前我们是在Linux平台,因此不会使用到。
21) 处理预编译头
针对当前我们Linux环境,NGX_PCH
为空,因此本段代码并不会执行。
22) 处理动态模块
这里NGX_PCH
为空,因此执行else分支,生成ngx_cc与ngx_perl_cc两个略有不同的编译选项。
如上生成所需要的依赖项。此处HTTP
为YES
,而MAIL
与STREAM
均为启用。
如上遍历$DYNAMIC_MODULES
:
首先在循环中求得每一个module的相关信息:
此处获得对应ngx_module
所相关的:
ngx_module_srcs: 源文件
ngx_module_libs: 所依赖的库文件
ngx_module_modules: 所依赖的所有modules
ngx_module_order: 模块的加载顺序
ngx_modules_c: 需要生成的一个接口文件名
上面我们指定了需要生成的接口文件名$ngx_modules_c
,如下我们生成该文件:
生成过程比较简单,最终生成一个类似如下的文件:
如下在Makefile中生成编译该模块的相关代码:
上面首先遍历ngx_module_srcs
文件夹下的所有文件,找出对应的源文件,从而求得所依赖的.o
名存放在ngx_module_objs变量中。
接着求的依赖文件:ngx_deps
将上面求的的ngx_module_objs
合并上ngx_modules_obj
(注意这两个变量不同),即所有的.o
文件保存到变量ngx_objs中。
然后再找出所有的依赖库文件、链接文件:ngx_libs
,ngx_link
,ngx_module_link
。
最后生成Makefile中相应的target。
如下是生成编译成ngx_module_objs
的Makefile脚本:
脚本比较简单,主要就是遍历ngx_module_srcs
文件夹,找出其中源文件,然后生成对应的编译代码。
至此,我们完成了整个auto/make脚本的分析。这是我们最后要生成的Makefile的主要部分,但是由于还剩下其他一些部分,等所有部分讲解完成,我们会贴出该Makefile文件,以作参考。