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実行.
- テスト用build.xml
<?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>
cmdで確認
「gcc」はcmdからは実行できず(アクセス拒否!),(当然)「ant」からも実行できない?
経緯
「アクセスが拒否されました。(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 のエクスプローラでシンボリックリンクとして継ぎ直しをしなければなりません.cygwin と windows7 のシンボリックリンクは似て非なるものらしいことはわかるのですが,どこが違うのかは不明です.
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() { }