2016-06-06 19 views
1

Ich kompiliere eine Bibliothek namens libCMSDataFormat.so. Wenn libCMSDataFormat.so kompiliert wird, macht es potentiell eine (oder mehrere) .pcm Dateien (dies ist plattformabhängig) Wenn diese Dateien erstellt werden, sollten sie an einen anderen Speicherort (namens $ OBJ) kopiert werden. Aber wenn sie nicht existieren, soll das Programm normal enden, d.h. ohne einen Fehler.Bedingte Kopie einer möglicherweise nicht vorhandenen Datei mit gnu make

Folgende Arbeiten, wenn die .pcm Datei gemacht wird, aber es funktioniert nicht für die Plattform, wo die .pcm Datei nicht erzeugt wird (dh Kopie gibt einen Fehler, da keine Datei gefunden wird) erhalten Anregungen

SRC=../src 
OBJ=../lib 
all: $(OBJ) $(OBJ)/libCMSDataFormat.so MoveFile 
.Phony : MoveFile 
MoveFile: $(OBJ)/libCMSDataFormat.so 
ifeq ($(*.pcm $(SRC)),) 
    @echo "copying.." 
    cp $(SRC)/*_rdict.pcm $(OBJ) 
else 
    @echo "no .pcm found!" 
endif 

(Rule for `libCMSDataFormat.so` follows which might (or might not!) create one or more `*.pcm` files in `$(SRC)`. 

zu dies ist für beide Fälle willkommen, vorzugsweise auch für den Fall, dass mehr als eine .pcm generiert wird.

Antwort

0

Das Problem, das auftritt, ist, dass die Bedingung zu früh ausgewertet wird. Wenn Sie die Funktion $ (if) verwenden, wird ihre Auswertung zurückgestellt, bis die Regel ausgeführt wird. Das bedeutet, dass alle .pcm-Dateien als Nebeneffekt der frühen Build-Phasen erstellt werden.

SRC=../src 
OBJ=../lib 
all: $(OBJ) $(OBJ)/libCMSDataFormat.so MoveFile 
.Phony : MoveFile 
MoveFile: $(OBJ)/libCMSDataFormat.so 
     $(if $(wildcard $(SRC)/*.pcm), \ 
      @echo "copying.."; \ 
      cp $(SRC)/*_rdict.pcm $(OBJ) \ 
      , \ 
      @echo "no .pcm found!") 

Natürlich ist eine Option, einfach immer cp, laufen, aber seinen Rückkehrcode ignorieren (Sie können dies tun, indem Sie die erste Zeile des Rezeptes mit - prefixing). Es wird jedoch nicht empfohlen, da es auch Fehler verbergen kann, die auftreten, wenn die .pcm-Dateien vorhanden sind, aber nicht kopiert werden können.

+0

Hallo Droid Coder, vielen Dank für die freundliche Antwort! In der Zwischenzeit habe ich einen (hässlichen!) Work-Around gefunden, aber ich werde Ihren Vorschlag so schnell wie möglich prüfen. Danke für Ihr Bemühen! Merijn –