2012-04-05 4 views
1

Ich schreibe ein kleines C-Programm zum Spaß. Ich entschied mich, MinGW (nur C), make und Notepad ++ als Übung zu verwenden, um keine ausgefallenen IDEs zu verwenden. So weit, so gut und lustig.Tragbare make clean Regel

(MinGW == Ich arbeite unter Windows.)

Jetzt, da das Programm gegen C Vanille kompiliert dachte ich, es voll tragbar zu machen. MinGW machen und gcc ist intelligent genug, um ein Programm aus der Regel zu erstellen:

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

Offensichtlich, da ich auf Windows bin der Compiler erstellt myprog.exe. Das ist ziemlich schlau und macht die ganze Sache ziemlich tragbar.

Soweit standard targets gehe ich möchte mindestens clean implementieren, da ich tatsächlich diese Regel verwenden. Nun ist das saubere Ziel, die auf Windows tatsächlich funktioniert wie folgt aussieht:

clean: 
    rm myprog.exe *.o 

Diese Regel wird auf jeden Fall nicht in einer POSIX-Umgebung arbeiten, weil Programme nicht Erweiterungen gibt. (PSOIX: Think GNU/Linux)

Gibt es einen portablen Weg, ein sauberes zu implementieren, ohne viel zu machen?

Bisher habe ich keine wirklich nützliche Dokumentation zu diesem Thema gefunden. Wenn Sie sich ansehen, wie autoconf und automake das Problem angehen, führen sie das Muster @[email protected] ein. Aber das erfordert einen langen Konfigurationscode, der die Umgebung testet.

+0

Was ist los mit 'rm -f myprog myprog.exe * .o'? – Beta

+0

Haben Sie jemals versucht, das unter Linux auszuführen? Funktioniert nicht ... Die Frage bezieht sich auf Trinkbarkeit; Die Regel funktioniert gut auf Mingw. – rioki

+0

Ja, ich habe, und es funktioniert auf meiner Version (2.6.18-194.8.1.el5). Was ist dein Fehler? (Und warum sollten Sie es trinken wollen?) – Beta

Antwort

0

Wenn es die folgende Weise gelöst:

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

clean: 
    rm *.o myprog$(EXEEXT) 

es das Problem ganz gut gelöst. Obwohl es nicht zu 100% portabel ist, funktioniert es am häufigsten.

1

Definieren Sie den Namen der Binärdatei als Variable (es optional aus dem Namen der Quelldatei ableiten Definition von „main()“ mit einem einfachen egrep-Befehl):

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) 

Und verwenden Sie dieses Makro anstelle von fest codierten Namen

+0

Ich denke, das ist die Hälfte in die richtige Richtung; aber ich denke, das ist Overkill. (Zumal ich eigentlich zwei Programme habe ...) Ich denke, ich könnte mit einem Test auf das Ergebnis von uname gehen. – rioki