auto/lib/make脚本主要用于编译nginx所依赖的一些外部库文件。

1. auto/lib/make脚本

脚本内容如下:

# Copyright (C) Igor Sysoev
# Copyright (C) Nginx, Inc.


if [ $PCRE != NONE -a $PCRE != NO -a $PCRE != YES ]; then
    . auto/lib/pcre/make
fi

if [ $MD5 != NONE -a $MD5 != NO -a $MD5 != YES ]; then
    . auto/lib/md5/make
fi

if [ $SHA1 != NONE -a $SHA1 != NO -a $SHA1 != YES ]; then
    . auto/lib/sha1/make
fi

if [ $OPENSSL != NONE -a $OPENSSL != NO -a $OPENSSL != YES ]; then
    . auto/lib/openssl/make
fi

if [ $ZLIB != NONE -a $ZLIB != NO -a $ZLIB != YES ]; then
    . auto/lib/zlib/make
fi

if [ $NGX_LIBATOMIC != NO -a $NGX_LIBATOMIC != YES ]; then
    . auto/lib/libatomic/make
fi

if [ $USE_PERL != NO ]; then
    . auto/lib/perl/make
fi

1) PCRE库

if [ $PCRE != NONE -a $PCRE != NO -a $PCRE != YES ]; then
    . auto/lib/pcre/make
fi

在auto/options中,我们通过在执行configure传入:

--with-pcre=../pcre-8.40

因此这里会执行auto/lib/pcre/make脚本。


2) MD5库

if [ $MD5 != NONE -a $MD5 != NO -a $MD5 != YES ]; then
    . auto/lib/md5/make
fi

在auto/options脚本中,MD5默认被初始化为NONE。我们这里使用Openssl中的MD5。因此并不会执行对应的make脚本。


3) SHA1库

if [ $SHA1 != NONE -a $SHA1 != NO -a $SHA1 != YES ]; then
    . auto/lib/sha1/make
fi

在auto/options脚本中SHA1默认被初始化为NONE;但是在auto/lib/conf脚本中会被设置为YES,使用Openssl中的SHA1。因此并不会执行对应的make脚本。


4) Openssl库

if [ $OPENSSL != NONE -a $OPENSSL != NO -a $OPENSSL != YES ]; then
    . auto/lib/openssl/make
fi

在auto/options脚本中OPENSSL默认被初始化为NONE。这里使用系统提供的openssl,并不需要额外执行对应的make脚本。


5) ZLIB库

if [ $ZLIB != NONE -a $ZLIB != NO -a $ZLIB != YES ]; then
    . auto/lib/zlib/make
fi

在auto/options中,我们通过在执行configure传入:

--with-zlib=../zlib-1.2.11

因此这里会执行auto/lib/zlib/make脚本。


6) libatomic库

if [ $NGX_LIBATOMIC != NO -a $NGX_LIBATOMIC != YES ]; then
    . auto/lib/libatomic/make
fi

在auto/options脚本中,NGX_LIBATOMIC默认被初始化为NO,此后也并未做相应修改。因此并不需要执行对应的make脚本。

7) PERL库

if [ $USE_PERL != NO ]; then
    . auto/lib/perl/make
fi

在auto/options脚本中,USE_PERL默认被初始化为NO,此后也并未做相应修改。因此并不需要执行对应的make脚本。

2. auto/lib/pcre/make脚本

脚本内容如下:

# Copyright (C) Igor Sysoev
# Copyright (C) Nginx, Inc.


case "$NGX_CC_NAME" in

    msvc)
        ngx_makefile=makefile.msvc
        ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC"
        ngx_pcre="PCRE=\"$PCRE\""
    ;;

    owc)
        ngx_makefile=makefile.owc
        ngx_opt="CPU_OPT=\"$CPU_OPT\""
        ngx_pcre=`echo PCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"`
    ;;

    bcc)
        ngx_makefile=makefile.bcc
        ngx_opt="-DCPU_OPT=\"$CPU_OPT\""
        ngx_pcre=`echo \-DPCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"`
    ;;

    *)
        ngx_makefile=
    ;;

esac


if [ -n "$ngx_makefile" ]; then

    cat << END                                                >> $NGX_MAKEFILE

`echo "$PCRE/pcre.lib:	$PCRE/pcre.h $NGX_MAKEFILE"			\
	| sed -e "s/\//$ngx_regex_dirsep/g"`
	\$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre $ngx_opt

`echo "$PCRE/pcre.h:" | sed -e "s/\//$ngx_regex_dirsep/g"`
	\$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre pcre.h

END

else

    cat << END                                                >> $NGX_MAKEFILE

$PCRE/pcre.h:	$PCRE/Makefile

$PCRE/Makefile:	$NGX_MAKEFILE
	cd $PCRE \\
	&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\
	&& CC="\$(CC)" CFLAGS="$PCRE_OPT" \\
	./configure --disable-shared $PCRE_CONF_OPT

$PCRE/.libs/libpcre.a:	$PCRE/Makefile
	cd $PCRE \\
	&& \$(MAKE) libpcre.la

END

fi

我们当前NGX_CC_NAME被置为gcc,因此变量ngx_makefile为空。因此会执行else部分代码声场Makefile:

    cat << END                                                >> $NGX_MAKEFILE

$PCRE/pcre.h:	$PCRE/Makefile

$PCRE/Makefile:	$NGX_MAKEFILE
	cd $PCRE \\
	&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\
	&& CC="\$(CC)" CFLAGS="$PCRE_OPT" \\
	./configure --disable-shared $PCRE_CONF_OPT

$PCRE/.libs/libpcre.a:	$PCRE/Makefile
	cd $PCRE \\
	&& \$(MAKE) libpcre.la

END

向objs/Makefile文件写入:

../pcre-8.40/pcre.h:	../pcre-8.40/Makefile

../pcre-8.40/Makefile:	objs/Makefile
	cd ../pcre-8.40 \
	&& if [ -f Makefile ]; then $(MAKE) distclean; fi \
	&& CC="$(CC)" CFLAGS="-O2 -fomit-frame-pointer -pipe " \
	./configure --disable-shared 

../pcre-8.40/.libs/libpcre.a:	../pcre-8.40/Makefile
	cd ../pcre-8.40 \
	&& $(MAKE) libpcre.la

3. auto/lib/zlib/make脚本

脚本内容如下:

# Copyright (C) Igor Sysoev
# Copyright (C) Nginx, Inc.


case "$NGX_CC_NAME" in

    msvc)
        ngx_makefile=makefile.msvc
        ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC"
        ngx_zlib="ZLIB=\"$ZLIB\""

    ;;

    owc)
        ngx_makefile=makefile.owc
        ngx_opt="CPU_OPT=\"$CPU_OPT\""
        ngx_zlib=`echo ZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"`
    ;;

    bcc)
        ngx_makefile=makefile.bcc
        ngx_opt="-DCPU_OPT=\"$CPU_OPT\""
        ngx_zlib=`echo \-DZLIB=\"$ZLIB\" | sed -e "s/\//$ngx_regex_dirsep/g"`
    ;;

    *)
        ngx_makefile=
    ;;

esac


done=NO


case "$NGX_PLATFORM" in

    win32)

        if [ -n "$ngx_makefile" ]; then
            cat << END                                        >> $NGX_MAKEFILE

`echo "$ZLIB/zlib.lib:	$NGX_MAKEFILE" | sed -e "s/\//$ngx_regex_dirsep/g"`
	\$(MAKE) -f auto/lib/zlib/$ngx_makefile $ngx_opt $ngx_zlib

END

        else

            cat << END                                        >> $NGX_MAKEFILE

$ZLIB/libz.a:	$NGX_MAKEFILE
	cd $ZLIB \\
	&& \$(MAKE) distclean \\
	&& \$(MAKE) -f win32/Makefile.gcc \\
		CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\
		libz.a

END

        fi

        done=YES
    ;;

    # FreeBSD: i386
    # Linux: i686

    *:i386 | *:i686)
        case $ZLIB_ASM in
            pentium)

                cat << END                                    >> $NGX_MAKEFILE

$ZLIB/libz.a:	$NGX_MAKEFILE
	cd $ZLIB \\
	&& \$(MAKE) distclean \\
	&& cp contrib/asm586/match.S . \\
	&& CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\
		./configure \\
	&& \$(MAKE) OBJA=match.o libz.a

END

                done=YES
            ;;

            pentiumpro)

                cat << END                                    >> $NGX_MAKEFILE

$ZLIB/libz.a:	$NGX_MAKEFILE
	cd $ZLIB \\
	&& \$(MAKE) distclean \\
	&& cp contrib/asm686/match.S . \\
	&& CFLAGS="$ZLIB_OPT -DASMV" CC="\$(CC)" \\
		./configure \\
	&& \$(MAKE) OBJA=match.o libz.a

END

                done=YES
            ;;

            NO)
            ;;

            *)
                echo "$0: error: invalid --with-zlib-asm=$ZLIB_ASM option."
                echo "The valid values are \"pentium\" and \"pentiumpro\" only".
                echo

                exit 1;
            ;;
        esac
    ;;

esac


if [ $done = NO ]; then

    cat << END                                                >> $NGX_MAKEFILE

$ZLIB/libz.a:	$NGX_MAKEFILE
	cd $ZLIB \\
	&& \$(MAKE) distclean \\
	&& CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\
		./configure \\
	&& \$(MAKE) libz.a

END

fi

我们当前NGX_CC_NAME被置为gcc,因此变量ngx_makefile为空。

我们在configure脚本中通过如下命令:

NGX_SYSTEM=`uname -s 2>/dev/null`
NGX_RELEASE=`uname -r 2>/dev/null`
NGX_MACHINE=`uname -m 2>/dev/null`

echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE"

NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";

求得NGX_PLATFORM值为:

# echo $NGX_PLATFORM
Linux:4.10.0-35-generic:i686

此处,ZLIB_ASM在auto/options默认被初始化为NO,因此执行如下脚本:

if [ $done = NO ]; then

    cat << END                                                >> $NGX_MAKEFILE

$ZLIB/libz.a:	$NGX_MAKEFILE
	cd $ZLIB \\
	&& \$(MAKE) distclean \\
	&& CFLAGS="$ZLIB_OPT" CC="\$(CC)" \\
		./configure \\
	&& \$(MAKE) libz.a

END

向objs/Makefile文件写入:

../zlib-1.2.11/libz.a:	objs/Makefile
	cd ../zlib-1.2.11 \
	&& $(MAKE) distclean \
	&& CFLAGS="-O2 -fomit-frame-pointer -pipe " CC="$(CC)" \
		./configure \
	&& $(MAKE) libz.a