Mercurial > hg > nginx
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 |