comparison auto/make @ 6383:85dea406e18f

Dynamic modules. The auto/module script is extended to understand ngx_module_link=DYNAMIC. When set, it links the module as a shared object rather than statically into nginx binary. The module can later be loaded using the "load_module" directive. New auto/module parameter ngx_module_order allows to define module loading order in complex cases. By default the order is set based on ngx_module_type. 3rd party modules can be compiled dynamically using the --add-dynamic-module configure option, which will preset ngx_module_link to "DYNAMIC" before calling the module config script. Win32 support is rudimentary, and only works when using MinGW gcc (which is able to handle exports/imports automatically). In collaboration with Ruslan Ermilov.
author Maxim Dounin <mdounin@mdounin.ru>
date Thu, 04 Feb 2016 20:25:29 +0300
parents 392959224560
children cfc3cfa434ec
comparison
equal deleted inserted replaced
6382:392959224560 6383:85dea406e18f
96 fi 96 fi
97 97
98 98
99 # the mail dependencies and include paths 99 # the mail dependencies and include paths
100 100
101 if [ $MAIL = YES ]; then 101 if [ $MAIL != NO ]; then
102 102
103 ngx_all_srcs="$ngx_all_srcs $MAIL_SRCS" 103 if [ $MAIL = YES ]; then
104 ngx_all_srcs="$ngx_all_srcs $MAIL_SRCS"
105 fi
104 106
105 ngx_deps=`echo $MAIL_DEPS \ 107 ngx_deps=`echo $MAIL_DEPS \
106 | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ 108 | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \
107 -e "s/\//$ngx_regex_dirsep/g"` 109 -e "s/\//$ngx_regex_dirsep/g"`
108 110
122 fi 124 fi
123 125
124 126
125 # the stream dependencies and include paths 127 # the stream dependencies and include paths
126 128
127 if [ $STREAM = YES ]; then 129 if [ $STREAM != NO ]; then
128 130
129 ngx_all_srcs="$ngx_all_srcs $STREAM_SRCS" 131 if [ $STREAM = YES ]; then
132 ngx_all_srcs="$ngx_all_srcs $STREAM_SRCS"
133 fi
130 134
131 ngx_deps=`echo $STREAM_DEPS \ 135 ngx_deps=`echo $STREAM_DEPS \
132 | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \ 136 | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \
133 -e "s/\//$ngx_regex_dirsep/g"` 137 -e "s/\//$ngx_regex_dirsep/g"`
134 138
202 206
203 ngx_objs=`echo $ngx_all_objs $ngx_modules_obj \ 207 ngx_objs=`echo $ngx_all_objs $ngx_modules_obj \
204 | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \ 208 | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \
205 -e "s/\//$ngx_regex_dirsep/g"` 209 -e "s/\//$ngx_regex_dirsep/g"`
206 210
211 ngx_libs=
207 if test -n "$NGX_LD_OPT$CORE_LIBS"; then 212 if test -n "$NGX_LD_OPT$CORE_LIBS"; then
208 ngx_libs=`echo $NGX_LD_OPT $CORE_LIBS \ 213 ngx_libs=`echo $NGX_LD_OPT $CORE_LIBS \
209 | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"` 214 | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`
210 fi 215 fi
211 216
212 ngx_link=${CORE_LINK:+`echo $CORE_LINK \ 217 ngx_link=${CORE_LINK:+`echo $CORE_LINK \
213 | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`} 218 | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}
214 219
220 ngx_main_link=${MAIN_LINK:+`echo $MAIN_LINK \
221 | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}
222
215 223
216 cat << END >> $NGX_MAKEFILE 224 cat << END >> $NGX_MAKEFILE
217 225
218 $NGX_OBJS${ngx_dirsep}nginx${ngx_binext}: $ngx_deps$ngx_spacer 226 $NGX_OBJS${ngx_dirsep}nginx${ngx_binext}: $ngx_deps$ngx_spacer
219 \$(LINK) ${ngx_long_start}${ngx_binout}$NGX_OBJS${ngx_dirsep}nginx$ngx_long_cont$ngx_objs$ngx_libs$ngx_link 227 \$(LINK) ${ngx_long_start}${ngx_binout}$NGX_OBJS${ngx_dirsep}nginx$ngx_long_cont$ngx_objs$ngx_libs$ngx_link$ngx_main_link
220 $ngx_rcc 228 $ngx_rcc
221 ${ngx_long_end} 229 ${ngx_long_end}
230
231 modules:
222 END 232 END
223 233
224 234
225 # ngx_modules.c 235 # ngx_modules.c
226 236
470 $ngx_src 480 $ngx_src
471 481
472 END 482 END
473 483
474 fi 484 fi
485
486
487 # dynamic modules
488
489 if test -n "$NGX_PCH"; then
490 ngx_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(CFLAGS) $ngx_use_pch \$(ALL_INCS)"
491 else
492 ngx_cc="\$(CC) $ngx_compile_opt $ngx_pic_opt \$(CFLAGS) \$(ALL_INCS)"
493 fi
494
495 ngx_obj_deps="\$(CORE_DEPS)"
496 if [ $HTTP != NO ]; then
497 ngx_obj_deps="$ngx_obj_deps \$(HTTP_DEPS)"
498 fi
499 if [ $MAIL != NO ]; then
500 ngx_obj_deps="$ngx_obj_deps \$(MAIL_DEPS)"
501 fi
502 if [ $STREAM != NO ]; then
503 ngx_obj_deps="$ngx_obj_deps \$(STREAM_DEPS)"
504 fi
505
506 for ngx_module in $DYNAMIC_MODULES
507 do
508 eval ngx_module_srcs="\$${ngx_module}_SRCS"
509 eval eval ngx_module_libs="\\\"\$${ngx_module}_LIBS\\\""
510
511 eval ngx_module_modules="\$${ngx_module}_MODULES"
512 eval ngx_module_order="\$${ngx_module}_ORDER"
513
514 ngx_modules_c=$NGX_OBJS/${ngx_module}_modules.c
515
516 cat << END > $ngx_modules_c
517
518 #include <ngx_config.h>
519 #include <ngx_core.h>
520
521 END
522
523 for mod in $ngx_module_modules
524 do
525 echo "extern ngx_module_t $mod;" >> $ngx_modules_c
526 done
527
528 echo >> $ngx_modules_c
529 echo 'ngx_module_t *ngx_modules[] = {' >> $ngx_modules_c
530
531 for mod in $ngx_module_modules
532 do
533 echo " &$mod," >> $ngx_modules_c
534 done
535
536 cat << END >> $ngx_modules_c
537 NULL
538 };
539
540 END
541
542 echo 'char *ngx_module_names[] = {' >> $ngx_modules_c
543
544 for mod in $ngx_module_modules
545 do
546 echo " \"$mod\"," >> $ngx_modules_c
547 done
548
549 cat << END >> $ngx_modules_c
550 NULL
551 };
552
553 END
554
555 echo 'char *ngx_module_order[] = {' >> $ngx_modules_c
556
557 for mod in $ngx_module_order
558 do
559 echo " \"$mod\"," >> $ngx_modules_c
560 done
561
562 cat << END >> $ngx_modules_c
563 NULL
564 };
565
566 END
567
568 ngx_modules_c=`echo $ngx_modules_c | sed -e "s/\//$ngx_regex_dirsep/g"`
569
570 ngx_modules_obj=`echo $ngx_modules_c \
571 | sed -e "s/\(.*\.\)c/\1$ngx_objext/"`
572
573 ngx_module_objs=
574 for ngx_src in $ngx_module_srcs
575 do
576 case "$ngx_src" in
577 src/*)
578 ngx_obj=$ngx_src
579 ;;
580 *)
581 ngx_obj="addon/`basename \`dirname $ngx_src\``"
582 mkdir -p $NGX_OBJS/$ngx_obj
583 ngx_obj="$ngx_obj/`basename $ngx_src`"
584 ;;
585 esac
586
587 ngx_module_objs="$ngx_module_objs $ngx_obj"
588 done
589
590 ngx_module_objs=`echo $ngx_module_objs \
591 | sed -e "s#\([^ ]*\.\)cpp#$NGX_OBJS\/\1$ngx_objext#g" \
592 -e "s#\([^ ]*\.\)cc#$NGX_OBJS\/\1$ngx_objext#g" \
593 -e "s#\([^ ]*\.\)c#$NGX_OBJS\/\1$ngx_objext#g" \
594 -e "s#\([^ ]*\.\)S#$NGX_OBJS\/\1$ngx_objext#g"`
595
596 ngx_deps=`echo $ngx_module_objs $ngx_modules_obj $LINK_DEPS \
597 | sed -e "s/ *\([^ ][^ ]*\)/$ngx_regex_cont\1/g" \
598 -e "s/\//$ngx_regex_dirsep/g"`
599
600 ngx_objs=`echo $ngx_module_objs $ngx_modules_obj \
601 | sed -e "s/ *\([^ ][^ ]*\)/$ngx_long_regex_cont\1/g" \
602 -e "s/\//$ngx_regex_dirsep/g"`
603
604 ngx_obj=$NGX_OBJS${ngx_dirsep}${ngx_module}${ngx_modext}
605
606 NGX_MODULES="$NGX_MODULES $ngx_obj"
607
608 if [ "$NGX_PLATFORM" = win32 ]; then
609 ngx_module_libs="$CORE_LIBS $ngx_module_libs"
610 fi
611
612 ngx_libs=
613 if test -n "$NGX_LD_OPT$ngx_module_libs"; then
614 ngx_libs=`echo $NGX_LD_OPT $ngx_module_libs \
615 | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`
616 fi
617
618 ngx_link=${CORE_LINK:+`echo $CORE_LINK \
619 | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}
620
621 ngx_module_link=${MODULE_LINK:+`echo $MODULE_LINK \
622 | sed -e "s/\//$ngx_regex_dirsep/g" -e "s/^/$ngx_long_regex_cont/"`}
623
624
625 cat << END >> $NGX_MAKEFILE
626
627 modules: $ngx_obj
628
629 $ngx_obj: $ngx_deps$ngx_spacer
630 \$(LINK) $ngx_long_start$ngx_binout$ngx_obj$ngx_long_cont$ngx_objs$ngx_libs$ngx_link$ngx_module_link
631 $ngx_long_end
632
633 $ngx_modules_obj: \$(CORE_DEPS)$ngx_cont$ngx_modules_c
634 $ngx_cc$ngx_tab$ngx_objout$ngx_modules_obj$ngx_tab$ngx_modules_c$NGX_AUX
635
636 END
637
638 for ngx_src in $ngx_module_srcs
639 do
640 case "$ngx_src" in
641 src/*)
642 ngx_obj=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`
643 ;;
644 *)
645 ngx_obj="addon/`basename \`dirname $ngx_src\``"
646 ngx_obj=`echo $ngx_obj/\`basename $ngx_src\` \
647 | sed -e "s/\//$ngx_regex_dirsep/g"`
648 ;;
649 esac
650
651 ngx_obj=`echo $ngx_obj \
652 | sed -e "s#^\(.*\.\)cpp\\$#$ngx_objs_dir\1$ngx_objext#g" \
653 -e "s#^\(.*\.\)cc\\$#$ngx_objs_dir\1$ngx_objext#g" \
654 -e "s#^\(.*\.\)c\\$#$ngx_objs_dir\1$ngx_objext#g" \
655 -e "s#^\(.*\.\)S\\$#$ngx_objs_dir\1$ngx_objext#g"`
656
657 ngx_src=`echo $ngx_src | sed -e "s/\//$ngx_regex_dirsep/g"`
658
659 cat << END >> $NGX_MAKEFILE
660
661 $ngx_obj: $ngx_obj_deps$ngx_cont$ngx_src
662 $ngx_cc$ngx_tab$ngx_objout$ngx_obj$ngx_tab$ngx_src$NGX_AUX
663
664 END
665
666 done
667 done