2012-04-05 10 views
1

私は楽しいために小さなCプログラムを書いています。私は、MinGW(Cのみ)、make、Notepad ++を、魅力的なIDEを変更に使用しないという練習として使用することに決めました。これまでのところ、とても楽しく楽しい。Portable make cleanルール

(MinGWのは==私はWindows上で働いています。)

を今のプログラムは、私はそれが完全に移植することを考えたバニラCに対してコンパイル以来。 MinGWのは、作るとgccは十分なルールからプログラムを作成するスマートです:

myprog: myprog.o other.o 
    $(CC) $(CFLAGS) $(LDFLAGS) $^ -o [email protected] 

もちろん、私は窓の午前以来、コンパイラはmyprog.exeを作成します。これはかなりスマートで、全体をかなり移植性にします。

までstandard targets私は実際にそのルールを使用しているので、少なくともcleanを実装したいと思います。さて、実際にWindows上で動作することをcleanターゲットは、次のようになります。

clean: 
    rm myprog.exe *.o 

プログラムが拡張子を持っていないため、このルールは間違いなく、POSIX環境では動作しません。 (PSOIX:GNU/Linuxだと思う)

fuをあまり使わないで、

これまでのところ、私はこの問題に関して本当に便利なドキュメントを見つけられませんでした。 autoconfとautomakeがどのように問題に取り組んでいるかを見ると、パターン@[email protected]が導入されています。しかし、それは環境を長時間にわたって設定するコードに依存します。

+0

'rm -f myprog myprog.exe * .o'の何が問題なのですか? – Beta

+0

これをLinux上で実行しようとしたことがありますか?うまくいかない...質問は飲酒可能性を指します。ルールはうまく動作します。 – rioki

+0

はい、私のバージョンで動作します(2.6.18-194.8.1.el5)。あなたのエラーは何ですか? (そして、なぜそれを飲みたいのですか?) – Beta

答えて

0

それを次のように解決した場合:それは非常にうまく問題を解決

UNAME = $(shell uname -o) 
ifeq ($(UNAME), Msys) 
    EXEEXT = .exe 
endif 

clean: 
    rm *.o myprog$(EXEEXT) 

を。それは完全に100%移植可能ではありませんが、最も一般的なケースで動作します。

1

変数としてバイナリ名(必要に応じてソースファイルの名前からそれを推論簡単のegrepコマンドで「()メイン」を定義する)を定義:

EXE_EXT_LINUX:= 
EXE_EXT_WINDOWS:=exe 
EXE_EXT:=$(EXE_EXT_$(PLATF)) 

BINARY_NAME:=$(notdir $(basename $(shell egrep -r -l --include=*.cpp '^[ \t]*?int[ \t]*?main[ \t]*?\(')))$(EXE_EXT) 

そして、このマクロの代わりにハードコード名を使用し

+0

これは半分だと思います正しい方向。しかし、これは残酷だと私は思う。 (特に私は2つのプログラムを実際に持っているので...)私はunameからの結果についてテストをするかもしれないと思う。 – rioki

関連する問題