Chcę dodać cel Make, który uruchamia program z envdir.
ENVDIR := $(shell command -v envdir)
serve: | $(ENVDIR)
$(ENVDIR) /usr/local/myservice/env python -m SimpleHTTPServer 8000
Chodzi o to, że jeśli użytkownik nie ma zainstalowanego envdir, zainstaluje je dla nich. Potrzebuję charakteru fajki, ponieważ nie zawsze chcę, żeby to działało; Chcę tylko, żeby była jakakolwiek jego wersja. Niestety, nie mogę przewidzieć, gdzie będzie zainstalowany envdir.
UNAME := $(shell uname)
$(ENVDIR):
ifeq ($(UNAME), Darwin)
brew install daemontools
endif
ifeq ($(UNAME), Linux)
sudo apt-get install daemontools
endif
# Add other operating systems here as appropriate...
Innym problemem, który napotykam, jest to, że jeśli użytkownik nie ma zainstalowanego envdir, zmienna ocenia pusty ciąg. Tak więc a) Mój cel "install envdir" faktycznie nie działa, a b) po uruchomieniu, $ (ENVDIR) nadal jest ustawiony na pusty ciąg, więc załadowanie go w celu wyświetlania nie działa.
Czy istnieje sposób, aby: a) uzyskać docelowy poziom instalacji do uruchomienia, nawet jeśli ENVDIR jest niezdefiniowany, oraz b) przedefiniować wartość zmiennej na końcu uruchomienia celu "install envdir"?
Proszę nie odpowiadać słowami "dlaczego używacie envdir" - napotykam ten problem z wieloma różnymi plikami binarnymi, na których polegam, tak się złożyło, że był to łatwy do udostępnienia przykład.
Dlaczego nie używasz warunku, aby odróżnić przypadki, w których 'envdir' jest już zainstalowany i przypadki, w których nie jest? 'ifeq ($ (ENVDIR),) ... else ... endif' mógłby prawdopodobnie to zrobić. I na końcu receptury instalacyjnej 'envdir' możesz po prostu ponownie wywołać make zamiast próbować zmienić wartość zmiennej' ENVDIR' (wiem, * rekursywna marka jest zła *, ale złe rzeczy są czasami bardzo przydatne). –