xref: /unit/auto/modules/ruby (revision 2080:651f5a37f5b8)
1
2# Copyright (C) Alexander Borisov
3# Copyright (C) NGINX, Inc.
4
5
6shift
7
8for nxt_option; do
9
10    case "$nxt_option" in
11        -*=*) value=`echo "$nxt_option" | sed -e 's/[-_a-zA-Z0-9]*=//'`     ;;
12           *) value="" ;;
13    esac
14
15    case "$nxt_option" in
16        --ruby=*)    NXT_RUBY="$value"                                    ;;
17        --module=*)  NXT_RUBY_MODULE="$value"                             ;;
18
19        --help)
20            cat << END
21
22    --ruby=FILE    set ruby executable, default: ruby
23    --module=NAME  set unit ruby module name
24
25END
26            exit 0
27        ;;
28
29        *)
30            echo
31            echo $0: error: invalid Ruby option \"$nxt_option\"
32            echo
33            exit 1
34        ;;
35    esac
36
37done
38
39
40if [ ! -f $NXT_AUTOCONF_DATA ]; then
41   echo
42   echo Please run common $0 before configuring module \"$nxt_module\".
43   echo
44   exit 1
45fi
46
47. $NXT_AUTOCONF_DATA
48
49$echo "configuring Ruby module"
50$echo "configuring Ruby module ..." >> $NXT_AUTOCONF_ERR
51
52NXT_RUBY=${NXT_RUBY=ruby}
53NXT_RUBY_MODULE=${NXT_RUBY_MODULE=${NXT_RUBY}}
54
55nxt_found=no
56
57if /bin/sh -c "$NXT_RUBY -v" >> $NXT_AUTOCONF_ERR 2>&1; then
58
59    NXT_RUBY_CFLAGS=
60    NXT_RUBY_RUBYHDRDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyhdrdir"]'`
61    NXT_RUBY_ARCHHDRDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubyarchhdrdir"]'`
62    NXT_RUBY_SITEDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["sitedir"]'`
63    NXT_RUBY_LIBDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubylibdir"]'`
64    NXT_RUBY_TOPDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["topdir"]'`
65    NXT_RUBY_PREFIXDIR=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["rubylibprefix"]'`
66
67    NXT_RUBY_GEMPATH=`$NXT_RUBY -rrubygems -e 'print Gem.default_path().join(":")'`
68
69    NXT_RUBY_INCPATH="-I$NXT_RUBY_ARCHHDRDIR -I$NXT_RUBY_RUBYHDRDIR"
70
71    NXT_RUBY_LIBNAME=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["RUBY_SO_NAME"]'`
72    NXT_RUBY_LIBSCONF=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["LIBS"]'`
73    NXT_RUBY_LIBPATH=`$NXT_RUBY -rrbconfig -e 'print RbConfig::CONFIG["libdir"]'`
74    NXT_RUBY_LIBS="-l$NXT_RUBY_LIBNAME $NXT_RUBY_LIBSCONF"
75
76    if [ $NXT_CC_NAME = clang ]; then
77        # Workaround Clang bug
78        nxt_feature="-fdeclspec"
79        nxt_feature_name=
80        nxt_feature_run=
81        nxt_feature_incs="-fdeclspec"
82        nxt_feature_libs=
83        nxt_feature_test="#include <stdlib.h>
84
85                          __declspec(noreturn) static void f(void);
86
87                          static void f(void) {
88                              exit(0);
89                          }
90
91                          int main(void) {
92                              f();
93                          }"
94        . auto/feature
95
96        if [ $nxt_found = yes ]; then
97            NXT_RUBY_CFLAGS="$NXT_RUBY_CFLAGS -fdeclspec"
98        fi
99    fi
100
101    nxt_feature="Ruby library"
102    nxt_feature_name=""
103    nxt_feature_run=value
104    nxt_feature_incs="${NXT_RUBY_INCPATH}"
105    nxt_feature_libs="${NXT_RUBY_LIBS}"
106    nxt_feature_test="
107        #include <ruby.h>
108
109        int main() {
110            static const char *argv[3] = {
111                \"NGINX_Unit\", \"-rrbconfig\",
112                \"-eprint RbConfig::CONFIG['libdir']\"
113            };
114
115            RUBY_INIT_STACK;
116            ruby_init();
117            return ruby_run_node(ruby_options(3, (char **) argv));
118        }"
119
120    . auto/feature
121
122    if [ "$nxt_feature_value" != "$NXT_RUBY_LIBPATH" ]; then
123        NXT_RUBY_LIBS="-L$NXT_RUBY_LIBPATH -Wl,-rpath,${NXT_RUBY_LIBPATH} $NXT_RUBY_LIBS"
124
125        nxt_feature="Ruby library in $NXT_RUBY_LIBPATH"
126        nxt_feature_name=""
127        nxt_feature_run=no
128        nxt_feature_incs="${NXT_RUBY_INCPATH}"
129        nxt_feature_libs="${NXT_RUBY_LIBS}"
130        nxt_feature_test="
131            #include <ruby.h>
132
133            int main() {
134                ruby_init();
135                return ruby_cleanup(0);
136            }"
137
138        . auto/feature
139    fi
140
141else
142    $echo "checking for Ruby ... not found"
143fi
144
145if [ $nxt_found = no ]; then
146    $echo
147    $echo $0: error: no Ruby found.
148    $echo
149    exit 1;
150fi
151
152
153nxt_feature="Ruby version"
154nxt_feature_name=""
155nxt_feature_run=value
156nxt_feature_incs="${NXT_RUBY_INCPATH}"
157nxt_feature_libs="${NXT_RUBY_LIBS}"
158nxt_feature_test="
159    #include <ruby.h>
160    #include <ruby/version.h>
161
162    int main() {
163        printf(\"%s\", ruby_version);
164        return 0;
165    }"
166
167. auto/feature
168
169
170if grep ^$NXT_RUBY_MODULE: $NXT_MAKEFILE 2>&1 > /dev/null; then
171    $echo
172    $echo $0: error: duplicate \"$NXT_RUBY_MODULE\" module configured.
173    $echo
174    exit 1;
175fi
176
177
178NXT_RUBY_MOUNTS_HEADER=nxt_${NXT_RUBY_MODULE}_mounts.h
179NXT_RUBY_MOUNTS_PATH=$NXT_BUILD_DIR/$NXT_RUBY_MOUNTS_HEADER
180
181cat << END > $NXT_RUBY_MOUNTS_PATH
182
183static const nxt_fs_mount_t  nxt_ruby_mounts[] = {
184    {(u_char *) "$NXT_RUBY_RUBYHDRDIR", (u_char *) "$NXT_RUBY_RUBYHDRDIR",
185     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
186    {(u_char *) "$NXT_RUBY_ARCHHDRDIR", (u_char *) "$NXT_RUBY_ARCHHDRDIR",
187     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
188    {(u_char *) "$NXT_RUBY_SITEDIR", (u_char *) "$NXT_RUBY_SITEDIR",
189     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
190    {(u_char *) "$NXT_RUBY_LIBDIR", (u_char *) "$NXT_RUBY_LIBDIR",
191     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
192    {(u_char *) "$NXT_RUBY_TOPDIR", (u_char *) "$NXT_RUBY_TOPDIR",
193     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
194    {(u_char *) "$NXT_RUBY_PREFIXDIR", (u_char *) "$NXT_RUBY_PREFIXDIR",
195     NXT_FS_BIND, (u_char *) "bind", 0, NULL, 1, 1},
196
197END
198
199for path in `echo $NXT_RUBY_GEMPATH | tr ':' '\n'`; do
200   $echo "{(u_char *) \"$path\", (u_char *) \"$path\"," >> $NXT_RUBY_MOUNTS_PATH
201   $echo "NXT_FS_BIND, (u_char *) \"bind\", 0, NULL, 1, 1}," >> $NXT_RUBY_MOUNTS_PATH
202done
203
204$echo "};" >> $NXT_RUBY_MOUNTS_PATH
205
206
207$echo " + Ruby module: ${NXT_RUBY_MODULE}.unit.so"
208
209. auto/cc/deps
210
211$echo >> $NXT_MAKEFILE
212
213NXT_RUBY_MODULE_SRCS=" \
214    src/ruby/nxt_ruby.c \
215    src/ruby/nxt_ruby_stream_io.c
216"
217
218# The Ruby module object files.
219
220nxt_objs=$NXT_BUILD_DIR/src/nxt_unit.o
221
222for nxt_src in $NXT_RUBY_MODULE_SRCS; do
223
224    nxt_obj=${nxt_src%.c}-$NXT_RUBY_MODULE.o
225    nxt_dep=${nxt_src%.c}-$NXT_RUBY_MODULE.dep
226    nxt_dep_flags=`nxt_gen_dep_flags`
227    nxt_dep_post=`nxt_gen_dep_post`
228    nxt_objs="$nxt_objs $NXT_BUILD_DIR/$nxt_obj"
229
230    cat << END >> $NXT_MAKEFILE
231
232$NXT_BUILD_DIR/$nxt_obj:	$nxt_src $NXT_VERSION_H
233	mkdir -p $NXT_BUILD_DIR/src/ruby
234	\$(CC) -c \$(CFLAGS) $NXT_RUBY_CFLAGS -DNXT_RUBY_MOUNTS_H=\"$NXT_RUBY_MOUNTS_HEADER\" \\
235           \$(NXT_INCS) $NXT_RUBY_INCPATH \\
236	$nxt_dep_flags \\
237	-o $NXT_BUILD_DIR/$nxt_obj $nxt_src
238	$nxt_dep_post
239
240-include $NXT_BUILD_DIR/$nxt_dep
241
242END
243
244done
245
246cat << END >> $NXT_MAKEFILE
247
248.PHONY: ${NXT_RUBY_MODULE}
249.PHONY: ${NXT_RUBY_MODULE}-install
250.PHONY: ${NXT_RUBY_MODULE}-uninstall
251
252all: ${NXT_RUBY_MODULE}
253
254${NXT_RUBY_MODULE}:	$NXT_BUILD_DIR/${NXT_RUBY_MODULE}.unit.so
255
256$NXT_BUILD_DIR/${NXT_RUBY_MODULE}.unit.so:	$nxt_objs
257	\$(NXT_MODULE_LINK) -o $NXT_BUILD_DIR/${NXT_RUBY_MODULE}.unit.so \\
258	$nxt_objs $NXT_RUBY_LIBS $NXT_LD_OPT
259
260
261install: ${NXT_RUBY_MODULE}-install
262
263${NXT_RUBY_MODULE}-install: ${NXT_RUBY_MODULE} install-check
264	install -d \$(DESTDIR)$NXT_MODULES
265	install -p $NXT_BUILD_DIR/${NXT_RUBY_MODULE}.unit.so \\
266		\$(DESTDIR)$NXT_MODULES/
267
268
269uninstall: ${NXT_RUBY_MODULE}-uninstall
270
271${NXT_RUBY_MODULE}-uninstall:
272	rm -f \$(DESTDIR)$NXT_MODULES/${NXT_RUBY_MODULE}.unit.so
273	@rmdir -p \$(DESTDIR)$NXT_MODULES 2>/dev/null || true
274
275END
276