2012-04-10 8 views
1

Ich wollte ein generisches Makefile erstellen, das den Quelldateinamen übernehmen kann, es kompilieren und als Objektdatei und ausführbare Datei speichern. Beide Dateien verwenden den ursprünglichen Quellennamen. Danke für Ihre Hilfe.Generisches Makefile, das unabhängig vom Quelldateinamen ist

 exec: \ 

    compile 
    ./helloworld #I would like to input source outside the make file. 




    compile: \ 

    helloworld.c 

    gcc -Wall helloworld.c -o helloworld #<== 

    echo 'compiling'    
    touch compile 


#I would like makefile to automatically save both object and exec. 
#as the source file name. 
+2

Dies ist nicht der Zweck des Makefiles, dies ist ein Shell-Skript aufgerufen. – Eregrith

+0

Also, wenn du 'tomorrow.c' schreibst, und du machst' make tomorrow', willst du Make 'tomorrow.o' und' tomorrow' aufbauen und dann 'tomorrow' laufen lassen, ist das richtig? – Beta

+0

Ja, das ist richtig. Ich werde mir die $ bash-Option ansehen. – agape

Antwort

1

können Sie die so $(MAKECMDGOALS) Variable verwenden:

CFLAGS = -Wall 

$(MAKECMDGOALS): $(MAKECMDGOALS).o 

und dann einfach so abgeben nennen:

make myfile 

Wenn Sie Make 3.81 oder höher, so kann dies werden:

CFLAGS = -Wall 

.SECONDARY: # Prevents intermediate files from being deleted 

Wenn Sie die Zwischenobjektdatei nicht speichern möchten, benötigen Sie nicht einmal ein Makefile. Sie können einfach tun:

make bar CFLAGS=-Wall 
+0

make MAKECMDGOALS = myfile.c ist das korrekte – agape

+0

@agape: '$ (MAKECMDGOALS)' nimmt auf, was auch immer Sie geben Machen Sie als sein Ziel. Siehe meine aktualisierte Antwort. –

+0

Ich werde es morgen versuchen. Vielen Dank für Ihre Hilfe – agape

1

Fabrikat hat Regeln in integrierten, die wissen, wie eine ausführbare Datei aus einer Quelldatei erstellen, wenn sie den gleichen Namen haben. Du brauchst also gar kein Makefile!

$ ls 
foobar.c 

$ make foobar 
cc foobar.c -o foobar 

Nicht, dass es keine Notwendigkeit, zu Chaos mit .SECONDARY da macht eine direkte Regel hat eine ausführbare Datei aus einer .c zu bauen, ohne zuerst die .o zu Kompilieren (so gibt es keine Zwischendatei). Selbst wenn dies nicht der Fall ist, hat es hier keinen Vorteil, die .o-Datei zu behalten, so dass es sich nicht lohnt, dies zu tun (IMO).

Wenn Sie Compiler oder Flags ändern möchten, können Sie eine Make-Datei haben, die andere als einige variable Zuweisungen von nichts besteht:

$ ls 
foobar.c  Makefile 

$ cat Makefile 
CC = gcc 
CFLAGS = -Wall 

$ make foobar 
gcc -Wall foobar.c -o foobar 
+0

Ich habe das Makefile erstellt und CC = gcc und CFLAGS = -Walll eingegeben. aber es kompiliert meine test.c-Datei nicht. Ich werde versuchen, dies in mein vorheriges Makefile einzufügen. – agape

+0

Wenn Sie 'test.c' haben, führen Sie' make test' aus, oder? Es wird definitiv funktionieren. BTW, Ihr Programm "test" aufzurufen, ist im Allgemeinen eine schlechte Idee: Es gibt eine eingebaute Shell namens "test". Wenn Sie also versuchen, Ihr Programm auszuführen, werden Sie verwirrt sein, es sei denn, Sie geben einen Pfad wie './test 'ein. – MadScientist

Verwandte Themen