ant,gcc,cygwin

「できないよ」というサイトもあり閉口していましたが,なんとなくコンパイルが通ったようです.

問題

$ uname -a
CYGWIN_NT-6.1-WOW64 etcpc 1.7.7(0.230/5/3) 2010-08-31 09:58 i686 Cygwin

の環境で,次のbuild.xmlを作成し,cygwin(bash)とコマンドプロンプト(cmd.exe)でant実行.

<?xml version="1.0" encoding="UTF-8"?>
<project name="TestTS" default="build"  basedir="."
	 xmlns:cpptasks="antlib:net.sf.antcontrib.cpptasks">

  <target name="build">
    <cpptasks:cc outtype="executable" subsystem="console" outfile="TestTS">
      <fileset dir="src" includes="*.c"/>
    </cpptasks:cc>
  </target>

</project>

cygwin(bash)で確認

gcc」は存在するけど,「ant」からは見えてはいるけど,実行できない?

cmdで確認

gcc」はcmdからは実行できず(アクセス拒否!),(当然)「ant」からも実行できない?

対処

/usr/bin/gcc.exeを削除して,/usr/bin/gcc-3.exeへのシンボリックリンクとして改めてgcc.exeという名前で作成する.

経緯

「アクセスが拒否されました。(access denied)」ということは,見えてはいるが実行してはまずいという意味でしょうか?「アクセス」だからといって,セキュリティの問題ではなさそうなのは,cygwin(bash)でもcmdでも同じエラーがantから返さたことから推測できます.つまり,

E:\cygwin\home\etc\projects\TestTS\build.xml:6: Could not launch gcc: java.io.IOException: Cannot run program "gcc": CreateProcess error=5, ?A?N?Z?X

というエラーは,cygwin でも,cmd でも同じだからです.
antはwindowsの規則に従うツールで,パス規則なども(windows規則にするなど)気を付ける必要があります.その辺りに問題がありそうです.まず,lsで確認すると,次のような2段階のリンクになっていたので,

/usr/bin/gcc.exe -> /etc/alternatives/gcc -> /usr/bin/gcc-3.exe

純化の為に,gcc.exeを削除して,1段階のシンボリックリンクに作成し直します.

/usr/bin/gcc.exe -> /usr/bin/gcc-3.exe

すると,antが動きました.ただし,cygwin で継ぎ直しをしてもだめで,Windows7エクスプローラシンボリックリンクとして継ぎ直しをしなければなりません.cygwinwindows7シンボリックリンクは似て非なるものらしいことはわかるのですが,どこが違うのかは不明です.
Cygwin ユーザーズガイドから引用します.

3.8.5. cygutils を利用してショートカットを作成する
もう一つの問題としては、 UNIX スタイルのリンク(他のファイルを指し示すファイル)と Microsoft の .link ファイル(ファイルへのショートカットを提供する) の違いが挙げられます。ちょっと見たところ、両者はそっくりに見えますが、現実には相当異なるものです。デフォルトでは、Cygwinシンボリックリンクを標準的な Microsoft の .lnk ファイルと互換性があるように作成する仕組みを使います。しかし、Cygwinシンボリックリンクには作業ディレクトリやアイコンなどといった、標準的な Microsoft のショートカットで利用できるような情報は含まれていません。

補遺

/etc/alternativesの中身

さらに,「/etc/alternatives」内を見ると関係しそうなシンボリックリンクが複数存在します.

c++ -> /usr/bin/c++-3.exe*				      
cc -> /usr/bin/cc-3.exe*				      
cpp -> /usr/bin/cpp-3.exe*				      
g++ -> /usr/bin/g++-3.exe*				      
gcc -> /usr/bin/gcc-3.exe*				      
gcov -> /usr/bin/gcov-3.exe*			      
i686-pc-cygwin-c++ -> /usr/bin/i686-pc-cygwin-c++-3.exe* 
i686-pc-cygwin-g++ -> /usr/bin/i686-pc-cygwin-g++-3.exe* 
i686-pc-cygwin-gcc -> /usr/bin/i686-pc-cygwin-gcc-3.exe* 

これらは,リンクの継ぎ直しが必要なのかも知れません.

エクスプローラでのシンボリックリンクの作成

Windows7エクスプローラからリンクを作成するには,Link Shell Extentionが便利です.右クリのコンテキストメニューに「リンク元として選択,リンクを作成...」という項目・機能が付加されます.

継ぎ直しが引き起こす先々の問題

「/etc/alternatives」はバージョンの違いを吸収するためのものなので,cygwin側からすると問題が起きそうですが,取り敢えず,現状ではよしとします.また,今回テストしたCプログラムは,次のような(すかすかの)ソースなので,今後,ライブラリなどを使用した際にどうなるのかは不明です.

main()
{
}