From: nobu.nakada@... Date: 2000-07-11T01:32:04+09:00 Subject: [ruby-list:23788] Re: environment variables なかだです。 At Mon, 10 Jul 2000 17:40:02 +0900, WATANABE Hirofumi wrote: > RUBYLIB_PREFIX はわたなべが勝手に組み込んだ機能で EMX 版 > Perl から拝借. DJGPP, Cygwin, mswin32, mingw32 で使える. > #OS/2 で使えないのはなんか変だから入れといたほうがいいか. > path1;path2 > か > path1 path2 > という形式でなければならない. これは default の $: の最初の > 部分が path1 とマッチしたら path2 に置き換える. > RUBYLIB を設定しなくても default のディレクトリ構造を活用で > きる. > > % env RUBYLIB_PREFIX='/usr/local/lib/ruby;f:/ruby' ruby -e 'puts $:' > f:/ruby/site_ruby/1.5/i386-cygwin > f:/ruby/site_ruby/1.5 > f:/ruby/site_ruby > f:/ruby/1.5/i386-cygwin > /usr/local/lib > f:/ruby/1.5 > . 発端は、MS の OS にはドライブレターってものががあるから prefix=/usr/local みたいのだけではうまくない、RUBYLIB_PREFIX で できるけれど、それはソースを見ないと分からない。という話でした。 それと、Win95/98 だとあまり環境変数を作られてもうれしくない、どっちか というとバイナリのインストールされているディレクトリからの相対で見てくれ た方がいい、ということもあるようです。 --- ruby.c- Wed Jun 28 17:26:54 2000 +++ ruby.c Mon Jul 10 12:20:17 2000 @@ -888,19 +888,18 @@ ruby_libpath() GetModuleFileName(NULL, libpath, sizeof libpath); #elif defined(DJGPP) extern char *__dos_argv0; - strcpy(libpath, __dos_argv0); + strncpy(libpath, __dos_argv0, FILENAME_MAX); #endif p = strrchr(libpath, '\\'); if (p) { *p = 0; - if (!strcasecmp(p-4, "\\bin")) - p -= 4; + if (p-libpath > 3 && !strcasecmp(p-4, "\\bin")) + p[-4] = 0; } else { strcpy(libpath, "."); p = libpath + 1; } - strcpy(p, "\\lib"); #if defined(__CYGWIN32__) p = (char *)malloc(strlen(libpath)+10); if (!p) @@ -909,7 +908,10 @@ ruby_libpath() strcpy(libpath, p); free(p); #else - for (p = libpath; *p; p++) +#ifndef CharNext /* defined as CharNext[AW] on Windows. */ +#define CharNext(p) ((p) + 1) +#endif + for (p = libpath; *p; p = CharNext(p)) if (*p == '\\') *p = '/'; #endif @@ -920,6 +922,15 @@ ruby_libpath() void ruby_prog_init() { +#if defined(_WIN32) || defined(DJGPP) + char *libpath = ruby_libpath(); + int prefix_len = strlen(libpath); + +#define ADDPATH(p) (strncpy(libpath + prefix_len, (p), FILENAME_MAX - prefix_len), addpath(libpath)) +#else +#define ADDPATH(p) addpath(p) +#endif + init_ids(); ruby_sourcefile = "ruby"; @@ -930,21 +941,18 @@ ruby_prog_init() rb_define_readonly_variable("$-p", &do_print); rb_define_readonly_variable("$-l", &do_line); - addpath(RUBY_LIB); -#if defined(_WIN32) || defined(DJGPP) - addpath(ruby_libpath()); -#endif + ADDPATH(RUBY_LIB); - addpath(RUBY_ARCHLIB); + ADDPATH(RUBY_ARCHLIB); #ifdef RUBY_THIN_ARCHLIB - addpath(RUBY_THIN_ARCHLIB); + ADDPATH(RUBY_THIN_ARCHLIB); #endif - addpath(RUBY_SITE_LIB); - addpath(RUBY_SITE_LIB2); - addpath(RUBY_SITE_ARCHLIB); + ADDPATH(RUBY_SITE_LIB); + ADDPATH(RUBY_SITE_LIB2); + ADDPATH(RUBY_SITE_ARCHLIB); #ifdef RUBY_SITE_THIN_ARCHLIB - addpath(RUBY_SITE_THIN_ARCHLIB); + ADDPATH(RUBY_SITE_THIN_ARCHLIB); #endif #ifdef RUBY_SEARCH_PATH --- win32/config.h.vc- Wed May 17 00:50:48 2000 +++ win32/config.h.vc Fri Jul 7 16:38:26 2000 @@ -40,12 +40,14 @@ #define FILE_COUNT _cnt #define DLEXT ".so" #define DLEXT2 ".dll" -#define RUBY_LIB "/usr/local/lib/ruby/1.5" -#define RUBY_SITE_LIB "/usr/local/lib/ruby/site_ruby" -#define RUBY_SITE_LIB2 "/usr/local/lib/ruby/site_ruby/1.5" -#define RUBY_PLATFORM "i386-mswin32" -#define RUBY_ARCHLIB "/usr/local/lib/ruby/1.5/i386-mswin32" -#define RUBY_SITE_ARCHLIB "/usr/local/lib/ruby/site_ruby/1.5/i386-mswin32" +#define RUBY_LIB_PREFIX "/lib/ruby" +#define RUBY_LIB_VERSION "1.5" +#define RUBY_LIB RUBY_LIB_PREFIX "/" RUBY_LIB_VERSION +#define RUBY_SITE_LIB RUBY_LIB_PREFIX "/site_ruby" +#define RUBY_SITE_LIB2 RUBY_SITE_LIB "/" RUBY_LIB_VERSION +#define RUBY_PLATFORM "i586-mswin32" +#define RUBY_ARCHLIB RUBY_LIB "/" RUBY_PLATFORM +#define RUBY_SITE_ARCHLIB RUBY_SITE_LIB2 "/" RUBY_PLATFORM #define SIZEOF_INT 4 #define SIZEOF_SHORT 2 -- そうだ 強気に ちょっと インチキに☆彡 中田 "Bugるくらいがちょうどいいかも;-)" 伸悦