Kandoの日記: Cygwinのgcc-4対応に伴うgcc.exeのトラブル 8
Cygwinを久方ぶりに更新しようとしたところsetup.exeが古く、新しく入れなおせというので一旦アンインストールの後、再インストール。
例によってデフォルトではgccもmakeも使えないので再度setup。するとgcc-4が使えるようになったという。しかし現在私はCygwinのgcc4に特に用事はないので4は選ばないでインストール。
そしてbinにPathを通してWindowsのコマンド・プロンプトから(Cygwin外からgccを使えるかどうか試すため)gccを呼んでみる:
gcc --version
するとコマンドがないという。しかし見たところそういう名前のファイルはある。
それにCygwin内から(あるいはコマンド・プロンプト内で起動したbashから)は実行できる。
試しに同じディレクトリにあるgcc-3.exeをコマンド・プロンプトから呼んでみると:
gcc-3 --version
で動く。よくよく調べると試験中のgcc-4とgcc-3の共存を狙ってか、gcc.exeがCygwin内の別のファイル(そしてそれはgcc-3.exeへのWindowsショートカットになっている)へのシンボリック・リンクになっていてこれをCygwin外のWindowsでは認識できないようだ。
これは大変困る。 この状態ではCygwinのプロンプトやCygwinのmakeからは起動できても、Cygwin外のWindows環境からgcc.exeを指定して呼ぶ場合に呼び出せない。
特にCOINS(http://coins-compiler.osdn.jp/index.html)はCプリプロセッサとしてgccを呼び出して利用している。
WindowsにはUNIXのような透過的なシンボリック・リンクが(標準では)存在しないし、ショートカットではファイル名が変わってしまう。(.lnkという拡張子がつく)
結局致し方なくgcc-3.exeをgcc.exeにコピー。これで取りあえず(COINSも含めて)動作はするようだが、Cygwinの標準インストールからは逸脱した状態になっているのでこのままでは今後のCygwinの更新でsetup.exeを利用する場合支障が出るように思う・・・。といってgcc.exeを呼んでいるコード(COINSとか)を全部修正して回るわけにも行かないし…困った話だ。
ln -s gcc-3.exe gcc.exe で (スコア:1)
シンボリックリンク張れば十分だと思うが?
# NTFS なら、という限定が付くが。
ちなみに、私の環境だと
となる。
ポイントは Baseの alternatives を入れることのようだ。これを入れると gcc.exe が /etc/alternatives/gcc.exe を指すようになるが、/etc/alternatives/gcc.exe は実は gcc-3.exe へのシンボリックリンクになっている。
で、自分が今何を使っているのか、などは
% alternatives --display gcc
で出てくる。例えばこんな感じ:
(日本語モードなのは気にしないように)。
alternatives.exe のヘルプも man page も余りにもそっけないので困るが、多分
とやれば gcc-3.exe 用の環境になると思う。
fjの教祖様
Re:ln -s gcc-3.exe gcc.exe で (スコア:1)
alternatives.exe の使い方についてはこんなページがあった。
http://blog.goo.ne.jp/shihei_1951/e/6592c32bf22e7a0e167634ff4357d3f1 [goo.ne.jp]
このページの通りにやったら、切り替えできました。
は無視してください。
fjの教祖様
Re:ln -s gcc-3.exe gcc.exe で (スコア:1)
ありがとうございます。
・NTFSのシンボリックリンク:
NTFSで可能なのは知っているんですが、問題は追加でツールをインストールしないといけないところ(その後のパッチやサービスパックでひっそり追加されていない限りは)です。私の環境だけならばいいのですが、COINSとその拡張になっている我々のツールの利用者全員にその手順(追加のインストールと非標準のシンボリック・リンク)をガイドするのは結構な悪夢です。
・alternatives.exe:
その説明を読んだ感じではalternatives.exeはalternativesディレクトリにあるショートカットのほうを操作してたりしないですかね?
Cygwin環境外からgcc.exeを呼ぼうとするときの問題はalternativesディレクトリのWindowsショートカットへのCygwinシンボリックリンクが正しく認識できないことに躓きその1、gcc.exeという名前のexeファイルがどこにも存在せず(alternativesディレクトリのWindowsショートカットはファイル名が違うので代替にならない)、Path変数をどう設定しても見つけられないことに躓きその2があるので…。
Re:ln -s gcc-3.exe gcc.exe で (スコア:1)
いや、Cygwin の ln コマンドで、シンボリックリンク作れますが…ハードリンクも作れますが…(NTFSなら)。
alternatives をインストールすると、/usr/bin/gcc.exe が /etc/alternatives/gcc.exeに対するシンボリックリンクになります。多分、alternativesに対する別のコマンドで指定できるんだと思うが…。
で、alternatives は普段は /etc/alternatives/下のリンクを張り替えようです。
基本的に cygwin - bash 上から動かす が最後のポイントでしょうか。
fjの教祖様
bashですか (スコア:1)
欲しいのはgccだけでCygwin全体はいらないので以前はMingwを使っていたんですが、
Mingwは一頃更新が止まってるようだったのでCygwinのgcc.exeを呼び出すという妥協を。
Re:bashですか (スコア:1)
のわんと。
私の場合、「cygwin は使うなら全部!! 全部以外ありえねーから。部分的に引っ張ってくると、あれが足りないだのこれが不足しているだので絶対はまるから」という経験上、全部インストール以外やらないのですが…。
今、http://www.mingw.org/ [mingw.org]から手繰ってDownloads [sourceforge.net]を見たところ、2008年4月に MinGW 5.1.4 というインストーラーが出ていて、それを使うと gcc-2.95.3, gcc-3.4.5, gcc-4.3.0 からインストールするものを選べるようですね。
こっちに戻ったほうが良いような気がしますよ、そういう使い方の場合は。
fjの教祖様
Minimalサイコーw (スコア:1)
MinGWは2007年頭頃だったか、Msysも含め全てのコマンドが何故かCore2Duoのマシンで立ち上がってすぐに落ちるという現象があって、さらにサイトが放置みたいな雰囲気だったのでもう止まってしまったのかと完全に諦めムードでここしばらくはチェックしていませんでした。更新されていてCore2Duo問題が解決しているなら戻りたいと思います。喜んでw
Minimalサイコーw
冗談はともかく、EclipseのCDTだったり、COINS(Javaで書かれている)が呼んだり、COINSを拡張した我らがコンパイラが呼んだり、Antから呼んだりという使い方なのです。加えて評価用のサンプルアルゴリズムしかコンパイルしてないので、ライブラリも標準しか(場合によっては標準すら)使わないですし…。
それでもこれまではgcc以外にmakeも使っていたので周辺コマンドも多少入用だったのですが、現在Antに全面的に乗り換えてしまおうとしているのでホントgccしか使わなくなる予定なのです。
COINSでプリプロセッサ・コマンドを指定する (スコア:1)
その後、COINSのサイトでマニュアルを調べまして一応プリプロセッサ・コマンドをCOINSを起動する時にコマンドラインで指定できることは確認しました。そこにgcc-3.exeを指定するとかですかねぇ・・・。設定に関する説明は増えますがCygwin環境をこねくり回すよりはマシ?
2 コンパイラドライバ
2.2 ドライバの使い方
2.2.3 COINSオプション
その他
http://coins-compiler.osdn.jp/COINSdoc/driver/driver.html#others [osdn.jp]
-coins:preprocessor=preprocessor-command