パスワードを忘れた? アカウント作成
80416 journal

Kandoの日記: Cygwinのgcc-4対応に伴うgcc.exeのトラブル 8

日記 by Kando

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とか)を全部修正して回るわけにも行かないし…困った話だ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • シンボリックリンク張れば十分だと思うが?
    # NTFS なら、という限定が付くが。

    ちなみに、私の環境だと

    $ gcc --version
    gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)

    となる。

    ポイントは Baseの alternatives を入れることのようだ。これを入れると gcc.exe が /etc/alternatives/gcc.exe を指すようになるが、/etc/alternatives/gcc.exe は実は gcc-3.exe へのシンボリックリンクになっている。

    で、自分が今何を使っているのか、などは
    % alternatives --display gcc
    で出てくる。例えばこんな感じ:

    $ alternatives --display gcc
    gcc -ステータスは自動です。
    リンクは現在 /usr/bin/gcc-3.exe を指しています。
    /usr/bin/gcc-3.exe - 優先項目 30
      スレーブ cc: /usr/bin/cc-3.exe
      スレーブ cpp: /usr/bin/cpp-3.exe
      スレーブ gcov: /usr/bin/gcov-3.exe
      スレーブ i686-pc-cygwin-gcc-4.3.2:
      スレーブ i686-pc-cygwin-gcc: /usr/bin/i686-pc-cygwin-gcc-3.exe
      スレーブ protoize: /usr/bin/protoize-3.exe
      スレーブ unprotoize: /usr/bin/unprotoize-3.exe
      スレーブ cpp.1.gz: /usr/share/man/man1/cpp-3.1.gz
      スレーブ gcc.1.gz: /usr/share/man/man1/gcc-3.1.gz
      スレーブ gcov.1.gz: /usr/share/man/man1/gcov-3.1.gz
    /usr/bin/gcc-4.exe - 優先項目 20
      スレーブ cc:
      スレーブ cpp: /usr/bin/cpp-4.exe
      スレーブ gcov: /usr/bin/gcov-4.exe
      スレーブ i686-pc-cygwin-gcc-4.3.2: /usr/bin/i686-pc-cygwin-gcc-4.3.2.exe
      スレーブ i686-pc-cygwin-gcc: /usr/bin/i686-pc-cygwin-gcc-4.exe
      スレーブ protoize:
      スレーブ unprotoize:
      スレーブ cpp.1.gz: /usr/share/man/man1/cpp-4.1.gz

    (日本語モードなのは気にしないように)。

    alternatives.exe のヘルプも man page も余りにもそっけないので困るが、多分

    $ alternatives.exe --auto gcc

    とやれば gcc-3.exe 用の環境になると思う。

    --
    fjの教祖様
    • alternatives.exe の使い方についてはこんなページがあった。
      http://blog.goo.ne.jp/shihei_1951/e/6592c32bf22e7a0e167634ff4357d3f1 [goo.ne.jp]
      このページの通りにやったら、切り替えできました。

      alternatives.exe のヘルプも man page も余りにもそっけないので困るが、多分

      $ alternatives.exe --auto gcc

      とやれば gcc-3.exe 用の環境になると思う。

      は無視してください。

      --
      fjの教祖様
      親コメント
      • ありがとうございます。

        ・NTFSのシンボリックリンク:
        NTFSで可能なのは知っているんですが、問題は追加でツールをインストールしないといけないところ(その後のパッチやサービスパックでひっそり追加されていない限りは)です。私の環境だけならばいいのですが、COINSとその拡張になっている我々のツールの利用者全員にその手順(追加のインストールと非標準のシンボリック・リンク)をガイドするのは結構な悪夢です。

        ・alternatives.exe:
        その説明を読んだ感じではalternatives.exeはalternativesディレクトリにあるショートカットのほうを操作してたりしないですかね?

        Cygwin環境外からgcc.exeを呼ぼうとするときの問題はalternativesディレクトリのWindowsショートカットへのCygwinシンボリックリンクが正しく認識できないことに躓きその1、gcc.exeという名前のexeファイルがどこにも存在せず(alternativesディレクトリのWindowsショートカットはファイル名が違うので代替にならない)、Path変数をどう設定しても見つけられないことに躓きその2があるので…。

        親コメント
        • ・NTFSのシンボリックリンク:

          いや、Cygwin の ln コマンドで、シンボリックリンク作れますが…ハードリンクも作れますが…(NTFSなら)。

          ・alternatives.exe:

          alternatives をインストールすると、/usr/bin/gcc.exe が /etc/alternatives/gcc.exeに対するシンボリックリンクになります。多分、alternativesに対する別のコマンドで指定できるんだと思うが…。

          で、alternatives は普段は /etc/alternatives/下のリンクを張り替えようです。

          基本的に cygwin - bash 上から動かす が最後のポイントでしょうか。

          --
          fjの教祖様
          親コメント
          • 欲しいのはgccだけでCygwin全体はいらないので以前はMingwを使っていたんですが、
            Mingwは一頃更新が止まってるようだったのでCygwinのgcc.exeを呼び出すという妥協を。

            親コメント
            • のわんと。

              私の場合、「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の教祖様
              親コメント
              • MinGWは2007年頭頃だったか、Msysも含め全てのコマンドが何故かCore2Duoのマシンで立ち上がってすぐに落ちるという現象があって、さらにサイトが放置みたいな雰囲気だったのでもう止まってしまったのかと完全に諦めムードでここしばらくはチェックしていませんでした。更新されていてCore2Duo問題が解決しているなら戻りたいと思います。喜んでw

                Minimalサイコーw

                冗談はともかく、EclipseのCDTだったり、COINS(Javaで書かれている)が呼んだり、COINSを拡張した我らがコンパイラが呼んだり、Antから呼んだりという使い方なのです。加えて評価用のサンプルアルゴリズムしかコンパイルしてないので、ライブラリも標準しか(場合によっては標準すら)使わないですし…。
                それでもこれまではgcc以外にmakeも使っていたので周辺コマンドも多少入用だったのですが、現在Antに全面的に乗り換えてしまおうとしているのでホントgccしか使わなくなる予定なのです。

                親コメント
  • その後、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

typodupeerror

UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie

読み込み中...