xref: /unit/auto/modules/ruby (revision 2397:817968931c58)
1584Salexander.borisov@nginx.com
2584Salexander.borisov@nginx.com# Copyright (C) Alexander Borisov
3584Salexander.borisov@nginx.com# Copyright (C) NGINX, Inc.
4584Salexander.borisov@nginx.com
5584Salexander.borisov@nginx.com
6584Salexander.borisov@nginx.comshift
7584Salexander.borisov@nginx.com
8584Salexander.borisov@nginx.comfor nxt_option; do
9584Salexander.borisov@nginx.com
10584Salexander.borisov@nginx.com    case "$nxt_option" in
11584Salexander.borisov@nginx.com        -*=*) value=`echo "$nxt_option" | sed -e 's/[-_a-zA-Z0-9]*=//'`     ;;
12584Salexander.borisov@nginx.com           *) value="" ;;
13584Salexander.borisov@nginx.com    esac
14584Salexander.borisov@nginx.com
15584Salexander.borisov@nginx.com    case "$nxt_option" in
16584Salexander.borisov@nginx.com        --ruby=*)    NXT_RUBY="$value"                                    ;;
17584Salexander.borisov@nginx.com        --module=*)  NXT_RUBY_MODULE="$value"                             ;;
18584Salexander.borisov@nginx.com
19584Salexander.borisov@nginx.com        --help)
20584Salexander.borisov@nginx.com            cat << END
21584Salexander.borisov@nginx.com
22584Salexander.borisov@nginx.com    --ruby=FILE    set ruby executable, default: ruby
23584Salexander.borisov@nginx.com    --module=NAME  set unit ruby module name
24584Salexander.borisov@nginx.com
25584Salexander.borisov@nginx.comEND
26584Salexander.borisov@nginx.com            exit 0
27584Salexander.borisov@nginx.com        ;;
28584Salexander.borisov@nginx.com
29584Salexander.borisov@nginx.com        *)
30584Salexander.borisov@nginx.com            echo
31584Salexander.borisov@nginx.com            echo $0: error: invalid Ruby option \"$nxt_option\"
32584Salexander.borisov@nginx.com            echo
33584Salexander.borisov@nginx.com            exit 1
34584Salexander.borisov@nginx.com        ;;
35584Salexander.borisov@nginx.com    esac
36584Salexander.borisov@nginx.com
37584Salexander.borisov@nginx.comdone
38584Salexander.borisov@nginx.com
39584Salexander.borisov@nginx.com
40584Salexander.borisov@nginx.comif [ ! -f $NXT_AUTOCONF_DATA ]; then
41584Salexander.borisov@nginx.com   echo
42584Salexander.borisov@nginx.com   echo Please run common $0 before configuring module \"$nxt_module\".
43584Salexander.borisov@nginx.com   echo
44584Salexander.borisov@nginx.com   exit 1
45584Salexander.borisov@nginx.comfi
46584Salexander.borisov@nginx.com
47584Salexander.borisov@nginx.com. $NXT_AUTOCONF_DATA
48584Salexander.borisov@nginx.com
49584Salexander.borisov@nginx.com$echo "configuring Ruby module"
50584Salexander.borisov@nginx.com$echo "configuring Ruby module ..." >> $NXT_AUTOCONF_ERR
51584Salexander.borisov@nginx.com
52584Salexander.borisov@nginx.comNXT_RUBY=${NXT_RUBY=ruby}
53584Salexander.borisov@nginx.comNXT_RUBY_MODULE=${NXT_RUBY_MODULE=${NXT_RUBY}}
54584Salexander.borisov@nginx.com
55584Salexander.borisov@nginx.comnxt_found=no
56584Salexander.borisov@nginx.com
57584Salexander.borisov@nginx.comif /bin/sh -c "$NXT_RUBY -v" >> $NXT_AUTOCONF_ERR 2>&1; then
58584Salexander.borisov@nginx.com
592080Salx.manpages@gmail.com    NXT_RUBY_CFLAGS=
601539Svbart@nginx.com    NXT_RUBY_RUBYHDRDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyhdrdir"]'`
611539Svbart@nginx.com    NXT_RUBY_ARCHHDRDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyarchhdrdir"]'`
621539Svbart@nginx.com    NXT_RUBY_SITEDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["sitedir"]'`
631539Svbart@nginx.com    NXT_RUBY_LIBDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubylibdir"]'`
641539Svbart@nginx.com    NXT_RUBY_TOPDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["topdir"]'`
651539Svbart@nginx.com    NXT_RUBY_PREFIXDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubylibprefix"]'`
661540Svbart@nginx.com
671540Svbart@nginx.com    NXT_RUBY_GEMPATH=`$NXT_RUBY -rrubygems -e 'print Gem.default_path().join(":")'`
681489St.nateldemoura@f5.com
69584Salexander.borisov@nginx.com    NXT_RUBY_INCPATH="-I$NXT_RUBY_ARCHHDRDIR -I$NXT_RUBY_RUBYHDRDIR"
70584Salexander.borisov@nginx.com
711539Svbart@nginx.com    NXT_RUBY_LIBNAME=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["RUBY_SO_NAME"]'`
721539Svbart@nginx.com    NXT_RUBY_LIBSCONF=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["LIBS"]'`
731539Svbart@nginx.com    NXT_RUBY_LIBPATH=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["libdir"]'`
74863Svbart@nginx.com    NXT_RUBY_LIBS="-l$NXT_RUBY_LIBNAME $NXT_RUBY_LIBSCONF"
75584Salexander.borisov@nginx.com
762080Salx.manpages@gmail.com    if [ $NXT_CC_NAME = clang ]; then
772080Salx.manpages@gmail.com        # Workaround Clang bug
782080Salx.manpages@gmail.com        nxt_feature="-fdeclspec"
792080Salx.manpages@gmail.com        nxt_feature_name=
802080Salx.manpages@gmail.com        nxt_feature_run=
812080Salx.manpages@gmail.com        nxt_feature_incs="-fdeclspec"
822080Salx.manpages@gmail.com        nxt_feature_libs=
832080Salx.manpages@gmail.com        nxt_feature_test="#include <stdlib.h>
842080Salx.manpages@gmail.com
852080Salx.manpages@gmail.com                          __declspec(noreturn) static void f(void);
862080Salx.manpages@gmail.com
872080Salx.manpages@gmail.com                          static void f(void) {
882080Salx.manpages@gmail.com                              exit(0);
892080Salx.manpages@gmail.com                          }
902080Salx.manpages@gmail.com
912080Salx.manpages@gmail.com                          int main(void) {
922080Salx.manpages@gmail.com                              f();
932080Salx.manpages@gmail.com                          }"
942080Salx.manpages@gmail.com        . auto/feature
952080Salx.manpages@gmail.com
962080Salx.manpages@gmail.com        if [ $nxt_found = yes ]; then
972080Salx.manpages@gmail.com            NXT_RUBY_CFLAGS="$NXT_RUBY_CFLAGS -fdeclspec"
982080Salx.manpages@gmail.com        fi
992080Salx.manpages@gmail.com    fi
1002080Salx.manpages@gmail.com
101863Svbart@nginx.com    nxt_feature="Ruby library"
102584Salexander.borisov@nginx.com    nxt_feature_name=""
1031537Svbart@nginx.com    nxt_feature_run=value
1042242Sthresh@nginx.com    nxt_feature_incs="${NXT_RUBY_INCPATH} ${NXT_RUBY_CFLAGS}"
105584Salexander.borisov@nginx.com    nxt_feature_libs="${NXT_RUBY_LIBS}"
106584Salexander.borisov@nginx.com    nxt_feature_test="
107584Salexander.borisov@nginx.com        #include <ruby.h>
108584Salexander.borisov@nginx.com
1092228Sa.clayton@nginx.com        int main(void) {
1101537Svbart@nginx.com            static const char *argv[3] = {
1111537Svbart@nginx.com                \"NGINX_Unit\", \"-rrbconfig\",
1121537Svbart@nginx.com                \"-eprint RbConfig::CONFIG['libdir']\"
1131537Svbart@nginx.com            };
1141537Svbart@nginx.com
1151537Svbart@nginx.com            RUBY_INIT_STACK;
116584Salexander.borisov@nginx.com            ruby_init();
1171537Svbart@nginx.com            return ruby_run_node(ruby_options(3, (char **) argv));
118584Salexander.borisov@nginx.com        }"
119584Salexander.borisov@nginx.com
120584Salexander.borisov@nginx.com    . auto/feature
121584Salexander.borisov@nginx.com
1221537Svbart@nginx.com    if [ "$nxt_feature_value" != "$NXT_RUBY_LIBPATH" ]; then
123863Svbart@nginx.com        NXT_RUBY_LIBS="-L$NXT_RUBY_LIBPATH -Wl,-rpath,${NXT_RUBY_LIBPATH} $NXT_RUBY_LIBS"
124863Svbart@nginx.com
125863Svbart@nginx.com        nxt_feature="Ruby library in $NXT_RUBY_LIBPATH"
126863Svbart@nginx.com        nxt_feature_name=""
127863Svbart@nginx.com        nxt_feature_run=no
1282242Sthresh@nginx.com        nxt_feature_incs="${NXT_RUBY_INCPATH} ${NXT_RUBY_CFLAGS}"
129863Svbart@nginx.com        nxt_feature_libs="${NXT_RUBY_LIBS}"
130863Svbart@nginx.com        nxt_feature_test="
131863Svbart@nginx.com            #include <ruby.h>
132863Svbart@nginx.com
1332228Sa.clayton@nginx.com            int main(void) {
134863Svbart@nginx.com                ruby_init();
135863Svbart@nginx.com                return ruby_cleanup(0);
136863Svbart@nginx.com            }"
137863Svbart@nginx.com
138863Svbart@nginx.com        . auto/feature
139863Svbart@nginx.com    fi
140863Svbart@nginx.com
141584Salexander.borisov@nginx.comelse
142584Salexander.borisov@nginx.com    $echo "checking for Ruby ... not found"
143584Salexander.borisov@nginx.comfi
144584Salexander.borisov@nginx.com
145584Salexander.borisov@nginx.comif [ $nxt_found = no ]; then
146584Salexander.borisov@nginx.com    $echo
147584Salexander.borisov@nginx.com    $echo $0: error: no Ruby found.
148584Salexander.borisov@nginx.com    $echo
149584Salexander.borisov@nginx.com    exit 1;
150584Salexander.borisov@nginx.comfi
151584Salexander.borisov@nginx.com
152612Salexander.borisov@nginx.com
153612Salexander.borisov@nginx.comnxt_feature="Ruby version"
154612Salexander.borisov@nginx.comnxt_feature_name=""
155612Salexander.borisov@nginx.comnxt_feature_run=value
1562242Sthresh@nginx.comnxt_feature_incs="${NXT_RUBY_INCPATH} ${NXT_RUBY_CFLAGS}"
157612Salexander.borisov@nginx.comnxt_feature_libs="${NXT_RUBY_LIBS}"
158612Salexander.borisov@nginx.comnxt_feature_test="
159612Salexander.borisov@nginx.com    #include <ruby.h>
160612Salexander.borisov@nginx.com    #include <ruby/version.h>
161612Salexander.borisov@nginx.com
1622228Sa.clayton@nginx.com    int main(void) {
163612Salexander.borisov@nginx.com        printf(\"%s\", ruby_version);
164612Salexander.borisov@nginx.com        return 0;
165612Salexander.borisov@nginx.com    }"
166612Salexander.borisov@nginx.com
167612Salexander.borisov@nginx.com. auto/feature
168612Salexander.borisov@nginx.com
169584Salexander.borisov@nginx.com
170584Salexander.borisov@nginx.comif grep ^$NXT_RUBY_MODULE: $NXT_MAKEFILE 2>&1 > /dev/null; then
171584Salexander.borisov@nginx.com    $echo
172584Salexander.borisov@nginx.com    $echo $0: error: duplicate \"$NXT_RUBY_MODULE\" module configured.
173584Salexander.borisov@nginx.com    $echo
174584Salexander.borisov@nginx.com    exit 1;
175584Salexander.borisov@nginx.comfi
176584Salexander.borisov@nginx.com
1771489St.nateldemoura@f5.com
1781532St.nateldemoura@f5.comNXT_RUBY_MOUNTS_HEADER=nxt_${NXT_RUBY_MODULE}_mounts.h
179*2397Salx@nginx.comNXT_RUBY_MOUNTS_PATH=$NXT_BUILD_DIR/include/$NXT_RUBY_MOUNTS_HEADER
1801532St.nateldemoura@f5.com
1811532St.nateldemoura@f5.comcat << END > $NXT_RUBY_MOUNTS_PATH
1821489St.nateldemoura@f5.com
1831489St.nateldemoura@f5.comstatic const nxt_fs_mount_t  nxt_ruby_mounts[] = {
1841489St.nateldemoura@f5.com    {(u_char *) "$NXT_RUBY_RUBYHDRDIR", (u_char *) "$NXT_RUBY_RUBYHDRDIR",
1851673St.nateldemoura@f5.com     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
1861489St.nateldemoura@f5.com    {(u_char *) "$NXT_RUBY_ARCHHDRDIR", (u_char *) "$NXT_RUBY_ARCHHDRDIR",
1871673St.nateldemoura@f5.com     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
1881489St.nateldemoura@f5.com    {(u_char *) "$NXT_RUBY_SITEDIR", (u_char *) "$NXT_RUBY_SITEDIR",
1891673St.nateldemoura@f5.com     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
1901489St.nateldemoura@f5.com    {(u_char *) "$NXT_RUBY_LIBDIR", (u_char *) "$NXT_RUBY_LIBDIR",
1911673St.nateldemoura@f5.com     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
1921489St.nateldemoura@f5.com    {(u_char *) "$NXT_RUBY_TOPDIR", (u_char *) "$NXT_RUBY_TOPDIR",
1931673St.nateldemoura@f5.com     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
1941489St.nateldemoura@f5.com    {(u_char *) "$NXT_RUBY_PREFIXDIR", (u_char *) "$NXT_RUBY_PREFIXDIR",
1951673St.nateldemoura@f5.com     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
1961489St.nateldemoura@f5.com
1971489St.nateldemoura@f5.comEND
1981489St.nateldemoura@f5.com
1991489St.nateldemoura@f5.comfor path in `echo $NXT_RUBY_GEMPATH | tr ':' '\n'`; do
2001532St.nateldemoura@f5.com   $echo "{(u_char *) \"$path\", (u_char *) \"$path\"," >> $NXT_RUBY_MOUNTS_PATH
2011673St.nateldemoura@f5.com   $echo "NXT_FS_BIND, (u_char *) \"bind\", 0, NULL, 1, 1}," >> $NXT_RUBY_MOUNTS_PATH
2021489St.nateldemoura@f5.comdone
2031489St.nateldemoura@f5.com
2041532St.nateldemoura@f5.com$echo "};" >> $NXT_RUBY_MOUNTS_PATH
2051489St.nateldemoura@f5.com
2061489St.nateldemoura@f5.com
207584Salexander.borisov@nginx.com$echo " + Ruby module: ${NXT_RUBY_MODULE}.unit.so"
208584Salexander.borisov@nginx.com
209584Salexander.borisov@nginx.com. auto/cc/deps
210584Salexander.borisov@nginx.com
211584Salexander.borisov@nginx.com$echo >> $NXT_MAKEFILE
212584Salexander.borisov@nginx.com
213584Salexander.borisov@nginx.comNXT_RUBY_MODULE_SRCS=" \
214584Salexander.borisov@nginx.com    src/ruby/nxt_ruby.c \
215584Salexander.borisov@nginx.com    src/ruby/nxt_ruby_stream_io.c
216584Salexander.borisov@nginx.com"
217584Salexander.borisov@nginx.com
218584Salexander.borisov@nginx.com# The Ruby module object files.
219584Salexander.borisov@nginx.com
220743Smax.romanov@nginx.comnxt_objs=$NXT_BUILD_DIR/src/nxt_unit.o
221584Salexander.borisov@nginx.com
222584Salexander.borisov@nginx.comfor nxt_src in $NXT_RUBY_MODULE_SRCS; do
223584Salexander.borisov@nginx.com
224584Salexander.borisov@nginx.com    nxt_obj=${nxt_src%.c}-$NXT_RUBY_MODULE.o
225584Salexander.borisov@nginx.com    nxt_dep=${nxt_src%.c}-$NXT_RUBY_MODULE.dep
226584Salexander.borisov@nginx.com    nxt_dep_flags=`nxt_gen_dep_flags`
227584Salexander.borisov@nginx.com    nxt_dep_post=`nxt_gen_dep_post`
228584Salexander.borisov@nginx.com    nxt_objs="$nxt_objs $NXT_BUILD_DIR/$nxt_obj"
229584Salexander.borisov@nginx.com
230584Salexander.borisov@nginx.com    cat << END >> $NXT_MAKEFILE
231584Salexander.borisov@nginx.com
2321217Smax.romanov@nginx.com$NXT_BUILD_DIR/$nxt_obj:	$nxt_src $NXT_VERSION_H
233584Salexander.borisov@nginx.com	mkdir -p $NXT_BUILD_DIR/src/ruby
2342080Salx.manpages@gmail.com	\$(CC) -c \$(CFLAGS) $NXT_RUBY_CFLAGS -DNXT_RUBY_MOUNTS_H=\"$NXT_RUBY_MOUNTS_HEADER\" \\
2351532St.nateldemoura@f5.com           \$(NXT_INCS) $NXT_RUBY_INCPATH \\
236584Salexander.borisov@nginx.com	$nxt_dep_flags \\
237*2397Salx@nginx.com	-o \$@ $nxt_src
238584Salexander.borisov@nginx.com	$nxt_dep_post
239584Salexander.borisov@nginx.com
240584Salexander.borisov@nginx.com-include $NXT_BUILD_DIR/$nxt_dep
241584Salexander.borisov@nginx.com
242584Salexander.borisov@nginx.comEND
243584Salexander.borisov@nginx.com
244584Salexander.borisov@nginx.comdone
245584Salexander.borisov@nginx.com
246584Salexander.borisov@nginx.comcat << END >> $NXT_MAKEFILE
247584Salexander.borisov@nginx.com
248584Salexander.borisov@nginx.com.PHONY: ${NXT_RUBY_MODULE}
249584Salexander.borisov@nginx.com.PHONY: ${NXT_RUBY_MODULE}-install
250584Salexander.borisov@nginx.com.PHONY: ${NXT_RUBY_MODULE}-uninstall
251584Salexander.borisov@nginx.com
252584Salexander.borisov@nginx.comall: ${NXT_RUBY_MODULE}
253584Salexander.borisov@nginx.com
254*2397Salx@nginx.com${NXT_RUBY_MODULE}:	$NXT_BUILD_DIR/lib/unit/modules/${NXT_RUBY_MODULE}.unit.so
255584Salexander.borisov@nginx.com
256*2397Salx@nginx.com$NXT_BUILD_DIR/lib/unit/modules/${NXT_RUBY_MODULE}.unit.so:	$nxt_objs
257*2397Salx@nginx.com	\$(NXT_MODULE_LINK) -o \$@ $nxt_objs $NXT_RUBY_LIBS $NXT_LD_OPT
258584Salexander.borisov@nginx.com
259584Salexander.borisov@nginx.com
260584Salexander.borisov@nginx.cominstall: ${NXT_RUBY_MODULE}-install
261584Salexander.borisov@nginx.com
262706Sigor@sysoev.ru${NXT_RUBY_MODULE}-install: ${NXT_RUBY_MODULE} install-check
2632314Salx.manpages@gmail.com	install -d \$(DESTDIR)$NXT_MODULESDIR
264*2397Salx@nginx.com	install -p $NXT_BUILD_DIR/lib/unit/modules/${NXT_RUBY_MODULE}.unit.so \\
2652314Salx.manpages@gmail.com		\$(DESTDIR)$NXT_MODULESDIR/
266584Salexander.borisov@nginx.com
267584Salexander.borisov@nginx.com
268584Salexander.borisov@nginx.comuninstall: ${NXT_RUBY_MODULE}-uninstall
269584Salexander.borisov@nginx.com
270584Salexander.borisov@nginx.com${NXT_RUBY_MODULE}-uninstall:
2712314Salx.manpages@gmail.com	rm -f \$(DESTDIR)$NXT_MODULESDIR/${NXT_RUBY_MODULE}.unit.so
2722314Salx.manpages@gmail.com	@rmdir -p \$(DESTDIR)$NXT_MODULESDIR 2>/dev/null || true
273584Salexander.borisov@nginx.com
274584Salexander.borisov@nginx.comEND
275