From: adgjmptw / super-r.net
Subject: [ruby-list:45080] Re: WindowsでMySQL/Rubyを使おうとするとmysql.so (LoadError)
Date: Tue, 17 Jun 2008 19:53:50 +0900

>  ↓なにこの構文。
>   checking_for "#{func}() in #{LIBARG%lib}" do
>       until r = try_func(func, libs, &b) or paths.empty?
> 	$LIBPATH = libpath | [paths.shift]
>       end
>   (略)
>  end

checking_forは関数(トップレベルで定義されているメソッド)で、
引数が "#{func}() in #{LIBARG%lib}" です。
func, LIBARG%libの評価結果が文字列に埋め込まれます。
で、その関数にブロックを渡しています。

>   try_link(<<"SRC", libs, &b) or try_link(<<"SRC", libs, &b)
> #{COMMON_HEADERS}
> #{headers}
> /*top*/
> int main() { return 0; }
> int t() { void ((*volatile p)()); p = (void ((*)()))#{func}; return 0; }
> SRC  ←1
> #{headers}
> /*top*/
> int main() { return 0; }
> int t() { #{func}(); return 0; }
> SRC  ←2
(snip)
> try_link(<<"SRC", libs, &b) or try_link(<<"SRC", libs, &b)
> って何だ? なぜ同じ式をorで繋ぐのだろう?

たて続けになったヒアドキュメントです。
見た目が同じ式だが、同じ式ではないです。
ここで「SRC」が1、2のようにふたつあることに注意してほしい。

最初の<<"SRC"はこれ、

#{COMMON_HEADERS}
#{headers}
/*top*/
int main() { return 0; }
int t() { void ((*volatile p)()); p = (void ((*)()))#{func}; return 0; }

次の<<"SRC"がこれ

#{headers}
/*top*/
int main() { return 0; }
int t() { #{func}(); return 0; }


で、ふたつの式をorでつないでいるのは、最初のtry_linkが偽を返したときのみ、
次のtry_linkを評価するという意味です。
最初のtry_linkが真を返したら、次のtry_linkは評価しません。

> 'cl' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイ
> ルとして認識されていません。
> と出力される。
> 
> clはコマンドラインのコンパイラだったと思ったのでcl.exeを検索してPATHに追加。
> すると今度はmspdb70.dllが無いといわれるのでこれも検索してPATHに追加。

Debian GNU/Linuxとかならビルド時に必要なライブラリを
こんなコマンド一発でインストールしてくれるのだが…
「sudo apt-get build-dep libmysql-ruby」
パッケージシステムがないのはつらいもの…

依存関係を満たすために手作業でいろいろインストールしていくのは、
自分なら発狂しそうです。

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/