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