[#10793] 今度こそ (patch of the ruby-1.4.6 for NT4.0&VC4.0 on DEC Alpha.) — kou@...1609.sip.eee.yamaguchi-u.ac.jp (Koichi Okada)

岡田です。

10 messages 2000/09/01

[#10920] SIGINT on windows — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

17 messages 2000/09/14
[#11077] Re: SIGINT on windows — matz@... (Yukihiro Matsumoto) 2000/09/27

まつもと ゆきひろです

[#10944] dummy DLL on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

19 messages 2000/09/18
[#10955] Re: dummy DLL on Windows — WATANABE Hirofumi <eban@...> 2000/09/19

わたなべです.

[#10963] Re: dummy DLL on Windows — "Nobuyoshi.Nakada" <nobu.nakada@...> 2000/09/19

なかだです。

[#10964] Re: dummy DLL on Windows — WATANABE Hirofumi <eban@...> 2000/09/19

わたなべです.

[#10978] [PATCH] require in require — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

15 messages 2000/09/20

[#10985] httphead.rb proxy version problem — Katsuyuki Komatsu <komatsu@...>

小松です.

16 messages 2000/09/20
[#10989] Re: httphead.rb proxy version problem — Minero Aoki <aamine@...> 2000/09/20

あおきです。

[ruby-dev:10874] Re: bmingw package

From: "Nobuyoshi.Nakada" <nobu.nakada@...>
Date: 2000-09-08 12:39:34 UTC
List: ruby-dev #10874
なかだです。

At Fri, 8 Sep 2000 10:01:36 +0900
WATANABE Hirofumi <eban@os.rim.or.jp> wrote:
> :  あー、そういえばそんなこともあったような。でもスクリプトがテキストモー
> :ドじゃなきゃならない理由もとくにないような気も。
> 
> でもスクリプトはふつうテキストファイルとして扱うでしょう, やっぱ.
> それよりは "r" が "rt" と同じ意味だから勝手にそうなってしま
> うというべきか.
> Cygwin で binary mount してれば気がつかないんだけど.

  いや当然すべて binary mount ですが。:-)

# というか、訳の分からんバイナリファイルがやたらとあるんで、うかつに変換
# されると非常にまずいという。

> :> 考えてみれば cygwin は chmod +x すればいいし,
> :
> :  これってできましたっけ? cygwin だと単純に先頭が #! だったら実行可能と
> :みなされるものと思ってましたが。
> 
> 今は ntsec とか ntea があるので好きなように設定できます.
> でも Windows 95/98/Me だと駄目かも.
> 
> % touch foo
> % ls -l foo
> -rw-r--r--   1 watanabe ruby            0 Sep  8 09:46 foo
> % chmod +x foo
> % ls -l foo   
> -rwxr-xr-x   1 watanabe ruby            0 Sep  8 09:46 foo
> % chmod 0600 foo
> % ls -l foo     
> -rw-------   1 watanabe ruby            0 Sep  8 09:46 foo
> % uname -a
> CYGWIN_NT-4.0 HOGE 1.1.4(0.26/3/2) 2000-08-03 20:53 i686 unknown

  うーん、できない。uname -a はおんなじなのに。ちなみに ntsec とか ntea 
って何でしょうか。

  ついでに、cygwin-1.1.4.tar.gz に入ってる libcygwin.a って 
__cygwin_dll_entry@12 ってシンボルが抜けてないですか? DLL がリンクできな
いようなんで 20000717 のに戻したんですが。

> :  実行ファイルに #!.*ruby があったら常に -x $0 が指定されたようにするっ
> :てことですか。そこまでしなくてもスタブは別でいいんでは。
> 
> ruby.exe 自体も小さいからこれがスタブを兼ねられれば理想的か
> なというのがあって.
> 
> :> 相対パスに関しては ruby.exe を LoadLibraryEx して 
> :> GetModuleFileName すればできそう.
> :> ruby.xxxxx.dll でもいいけど.
> :
> :  DLL を基準にするならこんな感じでしょうか。
> 
> GetModuleFileName に渡す handle をグローバル変数にして
> スタブ用の main.c を用意するのほうがいいかな.

  #ifdef でオブジェクトを作り分けるようにしてみました。

> :+#define RubyModuleHandle GetModuleHandle(LIBRUBY_SO".")
> 
> この LIBRUBY_SO"." はなんでしょう?
> LIBRUBY_SO にはたとえば "ruby.cygwin.dll" が入ってるんですよね?

  拡張子がついてないことはないと思いますが、一応の用心というか、.so にし
たときのためというか。でも . を含んでれば関係ないような気も。


diff -pruPX ./.excludes current/main.c devel/main.c
--- current/main.c	Mon May 29 11:10:18 2000
+++ devel/main.c	Fri Sep  8 19:29:52 2000
@@ -28,16 +28,43 @@ int _CRT_glob = 0;
 #include <console.h>
 #endif
 
+#ifdef _WIN32
+#include <windows.h>
+HMODULE ruby_loadpath_base_module;
+#endif
+
 int
+#ifdef RUBYW
+WINAPI WinMain(HINSTANCE ins, HINSTANCE prev, LPSTR cmdline, int showcmd)
+#else
 main(argc, argv, envp)
     int argc;
     char **argv, **envp;
+#endif
 {
+#ifdef LIBRUBY
+    char **newargv;
+#endif
+#ifdef RUBYW
+    int argc;
+    char **argv;
+#endif
+
 #if defined(NT)
     NtInitialize(&argc, &argv);
 #endif
 #if defined(__MACOS__) && defined(__MWERKS__)
     argc = ccommand(&argv);
+#endif
+
+#ifdef LIBRUBY
+    ruby_loadpath_base_module = GetModuleHandle(LIBRUBY);
+    newargv = ALLOCA_N(char*, argc + 3);
+    MEMCPY(newargv + 2, argv, char*, argc + 1);
+    newargv[0] = argv[0];
+    newargv[1] = "-x";
+    argc += 2;
+    argv = newargv;
 #endif
 
     ruby_init();
diff -pruPX ./.excludes current/rb2exe.in devel/rb2exe.in
--- current/rb2exe.in	Thu Jan  1 09:00:00 1970
+++ devel/rb2exe.in	Thu Sep  7 21:18:49 2000
@@ -0,0 +1,54 @@
+#!./miniruby
+# -*- ruby -*-
+
+BINARY = {}
+defmode = nil
+while arg = ARGV.shift
+  /^--?(\w[-\w]*)=(.*)/ =~ arg or break
+  open($2, 'rb') {|f| BINARY[$1] = f.read}
+  defmode ||= $1
+end
+unless defmode and ARGV.empty?
+  STDERR.puts "usage: #{$0} -MODE=STUB... [output]"
+  exit 1
+end
+$>.reopen(arg, 'wb') if arg
+
+print <<'EOF'
+#!/usr/bin/ruby
+
+BINARY = {}
+EOF
+BINARY.keys.each do |mode|
+  puts "\nBINARY[:#{mode}], = <<'EOS'.unpack('m')"
+  puts [BINARY[mode]].pack("m")
+  puts 'EOS'
+end
+print <<'EOF'
+
+require 'optparse'
+mode = :console
+strip = false
+ARGV.options do |q|
+  q.banner = "usage: #{q.program_name = File.basename($0, '.*')} [options] file...\n"
+  q.on('-x', '--[no-]strip', 'strip till #! ruby line') {|strip|}
+EOF
+BINARY.keys.sort.each do |mode|
+  puts "  q.on('--#{mode}', 'make #{mode} application') {mode = :#{mode}}"
+end
+puts "  q.on('--mode=MODE', [:#{BINARY.keys.join(', :')}], 'application mode') {|mode|}"
+print <<'EOF'
+  q.order! do |script|
+    output = script.sub(/\.rb$/, '') + '.exe'
+    print "creating #{output} from #{script}..."
+    script = open(script) {|f| f.read}
+    if strip
+      script.sub!(/\A.*^(\#! *\S*ruby)/m, '\1')
+    else
+      /\A\#! *\S*ruby/ =~ script
+    end or script = "#! ruby\n" + script
+    open(output, 'wb') {|f| f.print BINARY[mode], "\n", script}
+    puts "done"
+  end
+end
+EOF
diff -pruPX ./.excludes current/ruby.c devel/ruby.c
--- current/ruby.c	Tue Aug 15 15:22:42 2000
+++ devel/ruby.c	Fri Sep  8 19:07:57 2000
@@ -42,6 +42,11 @@ char *strstr _((const char*,const char*)
 char *getenv();
 #endif
 
+#ifdef _WIN32
+HMODULE ruby_loadpath_base_module;
+/* handle to base module of loadpath, defaulted to executable file if NULL */
+#endif
+
 VALUE ruby_debug = Qfalse;
 VALUE ruby_verbose = Qfalse;
 static int sflag = 0;
@@ -210,7 +215,7 @@ ruby_init_loadpath()
     char *p;
     size_t rest;
 #if defined(_WIN32)
-    GetModuleFileName(NULL, libpath, sizeof libpath);
+    GetModuleFileName(ruby_loadpath_base_module, libpath, sizeof libpath);
 #elif defined(DJGPP)
     extern char *__dos_argv0;
     strncpy(libpath, __dos_argv0, FILENAME_MAX);
@@ -218,7 +223,7 @@ ruby_init_loadpath()
     p = strrchr(libpath, '\\');
     if (p) {
 	*p = 0;
-	if (p-libpath > 3 && !strcasecmp(p-4, "\\bin")) {
+	if (p-libpath > 3 && !(strcasecmp(p-4, "\\bin") && strcasecmp(p-4, "\\lib"))) {
 	    p -= 4;
 	    *p = 0;
 	}


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦


In This Thread