2016-10-27 1 views
0

Ich habe ein Makefile, das ich verwende, um eine einzelne Datei zu kompilieren. Wenn ich ein Argument übergeben muss, verwende ich target = targetFile.Verwenden von Makefile-Argumenten ohne foo =

Das Skript übernimmt das Argument, sucht nach der Datei (innerhalb desselben Verzeichnisses), die den gleichen Wert wie das Argument hat, und kompiliert sie.

Ich verwende dies für die Kompilierung von Problemen von UHUNT und UVA, die eine einzelne C++ Datei verwenden. Also brauche ich nicht mehrere Makefiles für mehrere Quelldateien. Ein einzelnes Makefile für mehrere Quelldateien ist der Grund, warum ich das Makefile gemacht habe.

Hier ist der Code, den ich

OBJS = $(target).o 
CC = g++ 
CFLAGS = -Wall -g -std=c++11 
INCLUDE = -I./$(target) 

#default command to run 
all : Main-$(target) clean run 

#compile and build 
Main-$(target) : $(OBJS) 
    $(CC) $(CFLAGS) $^ -o [email protected] 
%.o : %.cpp 
    $(CC) -c $(CFLAGS) $< 

#remove object and any other garbage files. 
clean: 
    rm -rf -d $(target).o *~ *% *# .#* 

#remove the compiled file 
clean-all: 
    $(clean) rm Main-$(target) 

#run the compiled file 
run: 
    ./Main-$(target) 

Der Befehl, den ich zu kompilieren so weit haben, ist zu bedienen, make target=sourceFile

Auch habe ich nicht die Dateierweiterung, ich meine Quelle alle Dateierweiterungen werden CPP

Was will ich am Ende ist: make sourceFile

J ust eine Randnotiz, für die Verwendung des Befehls sauber und clean-all, ich benutze

make target=sourceFile clean

make target=sourceFile clean-all

Ich würde es vorziehen, wenn ich verwenden kann:

make sourceFile clean

make sourceFile clean-all

+0

Verschieben Sie möglicherweise die allgemeinen Teile in eine Vorlage, die Sie einschließen können, und haben Sie ein schmales Hauptmakefile, das nur die spezifischen Ziele bereitstellt, die Sie möchten. –

Antwort

0

Sie können die gemeinsame Makefile-Variable MAKECMDGOALS verwenden, die co enthält alle Ziele, die übergeben werden sollen.

Bitte versuchen Sie diese Variante

CC = g++ 
CFLAGS = -Wall -g 
MAKECMDGOALS := $(filter-out clean, $(MAKECMDGOALS)) 

.PHONY: $(MAKECMDGOALS) 
$(MAKECMDGOALS): 
     $(CC) $(CFLAGS) [email protected] -o [email protected] 

clean: 
     rm -f *.o 

hier die Linien

$(MAKECMDGOALS): 
     $(CC) $(CFLAGS) [email protected] -o [email protected] 

wird für jedes Wort in MAKECMDGOALS separaten Build-Ziele generieren.

Hinweis, wir brauchen dieses Makefile, um zu wissen, dass "sauber" ein Ziel für das Entfernen von Sachen ist, aber nicht Build Main-clean versuchen. Deshalb entfernen wir clean von MAKECMDGOALS mit Filter-out-Funktion.

Wenn wir also make a b clean ausführen, wird das Build-System automatisch generieren Ziele für den Aufbau Main-a und Main-b und benutzen Sie dann ggf. bereits geschrieben clean Ziel

+0

Ich habe den Code nur ein wenig modifiziert. Der ursprüngliche Code erstellte einen Ordner der Datei, die kompiliert wurde. Hier ist der modifizierte Code [Github Gist] (https://gist.github.com/Clumsy-Coder/4de8cae3e845728c2d169aaa3e1e429d) –

0

Haftungsausschluss - dies ist eine Nicht-Standard nutzen, und wird daher offen up alle Arten von Fällen, so dass ich es nicht empfehlen. Dies ist besser für ein Shell-Skript geeignet, das make aufruft. Das ist gesagt ... es ist eine interessante Frage.

Sie können nicht make xxx clean tun, und es nicht versuchen, xxx zu bauen (es sei denn, Sie tun einige wirklich fiese Cludge mit rekursive machen, aber ich werde nicht dorthin gehen).Man könnte zwar so etwas wie make clean-xxx tun, wie folgt:

%:Main-% 

Main-%:%.cpp 
    $(CC) $(CFLAGS) $< -o [email protected] 

clean-%: 
    rm Main-$* 

Beachten Sie, dass %-clean einen kürzeren Schaft hat, und dafür hat Vorrang vor dem % wenn das Make-Ziel mit clean- beginnt.

Verwandte Themen