2016-04-05 5 views
0

In meinem Makefile überprüfe ich, ob eine Datei existiert, und führe je nach Ergebnis dieser Prüfung einen anderen Code aus.GNU Make - Setzen eines Flags, wenn mehrere Dateien existieren

Zuvor gab es nur eine relevante Datei, OUTLIB_CACHE.

OUTLIB_CACHE := filename 
OUTLIB_CACHE_EXITS := $(shell if [ -f $(OUTLIB_CACHE) ]; then echo "1"; fi;) 
ifneq ($(OUTLIB_CACHE_EXISTS),1)  
    # do something 
endif 

Jetzt bin Einführung ich eine zweite entsprechende Datei in einer Liste sowohl der Dateinamen zu speichern:

OUTLIB_CACHE_LIST := filename1 filename2 

Ich möchte die OUTLIB_CACHE_EXISTS Flag auf true gesetzt, wenn und nur wenn alle Dateien in OUTLIB_CACHE_LIST existiert. Was wäre der beste Weg, dies zu tun?

Antwort

1

Sie können jedes Element OUTLIB_CACHE_LIST mit einem Befehl ersetzen, dann die resultierenden Befehle in einer Shell ausführen:

OUTLIB_CACHE_MISSING := $(shell $(patsubst %,test -e "%" || echo missing;,$(OUTLIB_CACHE_LIST))) 

Wenn alle Mitglieder vorhanden sind, dann wird die Ausgabe des Shell-Befehl leer sein wird, ist es sonst enthält ein Wort für jede fehlende Datei. Sie können für Leere testen:

ifneq ($(OUTLIB_CACHE_MISSING),)  
    # do something 
endif 

Wenn Sie wissen wollen, welche Dateien fehlen, können Sie nicht nur ! mit % ersetzen, weil patsubst ersetzt nur die ersten % es findet. Stattdessen könnten Sie foreach verwenden:

OUTLIB_CACHE_MISSING := $(shell $(foreach f,$(OUTLIB_CACHE_LIST),test -e "$f" || echo "$f";)) 

dies in einem prüfbaren Beispiel alle zusammen umsetzen:

OUTLIB_CACHE_LIST := /etc /bin 
#OUTLIB_CACHE_LIST += /nonexistent 

OUTLIB_CACHE_MISSING := $(shell $(foreach f,$(OUTLIB_CACHE_LIST),test -e "$f" || echo "$f";)) 

.PHONY: all 

all: 
ifneq ($(OUTLIB_CACHE_MISSING),) 
    false "$(OUTLIB_CACHE_MISSING)" 
else 
    true "No missing files" 
endif 

Kommentar- der zweiten Zeile die erste Filiale des if auszuwählen.


N.B. Sie wollten wissen, ob die Dateien existieren, also habe ich test -e statt -f oder -r verwendet. Sie wissen, welcher Test für Ihren Fall tatsächlich angemessen ist ...

+0

Vielen Dank! Das ist definitiv eine funktionierende Lösung. Es würde mich interessieren, ob es auch andere Möglichkeiten gibt. Nur ein Kommentar zu Ihrem nicht getesteten Code - der zweite "%" wird nicht ersetzt - patsubst erweitert nur den ersten Platzhalter, den er sieht. –

+0

Danke, Jacob - Ich habe die Antwort entsprechend aktualisiert. –

1

einfach OUTLIB_CACHE_EXISTS definieren als

OUTLIB_CACHE_EXISTS := $(shell if ls $(OUTLIB_CACHE_LIST) >/dev/null 2>&1; then echo "1"; fi) 
0

Es folgt, ist keine Notwendigkeit, Shell-Funktionen zu verwenden, für die Existenz von mehreren Dateien in machen, um zu testen. Ich verwende das folgende Konstrukt, um make anständige Fehlermeldungen für ein sehr komplexes Makefile auszugeben. Ich nehme an, Sie können es bei Bedarf Ihren Bedürfnissen anpassen. Die ursprüngliche Idee stammt (wahrscheinlich) von https://stackoverflow.com/a/20566812/1905491.

$(foreach p,$(ALL_INCLUDES),$(if $(wildcard $(p)),,$(info $(p) does not exist!) $(eval err:=yes))) 
$(if $(err),$(error Aborting),)