Chcę napisać plik Makefile, który uruchamia testy. Testy znajdują się w katalogu „./tests”, a pliki wykonywalne do przetestowania w katalogu „./bin”.
Kiedy uruchamiam testy, nie widzą plików exec, ponieważ katalogu ./bin nie ma w $ PATH.
Kiedy robię coś takiego:
EXPORT PATH=bin:$PATH
make test
wszystko działa poprawnie. Jednak muszę zmienić $ PATH w Makefile.
Zawartość Simple Makefile:
test all:
PATH=bin:${PATH}
@echo $(PATH)
x
Wyświetla ścieżkę poprawnie, jednak nie znajduje pliku x.
Kiedy robię to ręcznie:
$ export PATH=bin:$PATH
$ x
wszystko jest w porządku.
Jak mogłem zmienić $ PATH w Makefile?
../test/test_to_run
? Przepraszam, jeśli źle zrozumiałem pytanie..
. Jest to jednak prawdopodobnie niepraktyczne.Odpowiedzi:
Czy próbowałeś
export
dyrektywy Make samego (zakładając, że używasz GNU Make)?W twoim przykładzie jest również błąd:
Po pierwsze, edytowana wartość
echo
jest rozwinięciemPATH
zmiennej wykonywanym przez Make, a nie powłokę. Jeśli wypisze oczekiwaną wartość, to myślę, że ustawiłeśPATH
zmienną gdzieś wcześniej w swoim Makefile lub w powłoce, która wywołała Make. Aby temu zapobiec, powinieneś uciec od dolarów:Po drugie, w żadnym wypadku to nie zadziała, ponieważ Make wykonuje każdy wiersz przepisu w oddzielnej powłoce . Można to zmienić, wpisując przepis w jednej linii:
źródło
$(PATH)
zostanie ustawiona na wartośćPATH
powłoki wywołującej make. Zgodnie z instrukcją „Każda zmienna środowiskowa, która sprawia, że widzi się po uruchomieniu, jest przekształcana w zmienną make o tej samej nazwie i wartości”.PATH
został prawidłowo odzwierciedlone w zmiennych (echo $(PATH)
) oraz w środowiskach Polecenia (env
,which python
,bash -c python
), ale nie wydaje się być stosowany podczas lokalizowania wykonywalny dla polecenia: komendapython
ciągle uruchamia Plik wykonywalny Pythona na oryginalePATH
.Zgodnie z projektem
make
parser wykonuje wiersze w oddzielnych wywołaniach powłoki, dlatego zmiana zmiennej (np.PATH
) W jednej linii, zmiana może nie zostać zastosowana w kolejnych wierszach (zobacz ten post ).Jednym ze sposobów obejścia tego problemu jest przekształcenie wielu poleceń w jeden wiersz (oddzielony znakiem
;
) lub użycie specjalnego celu One Shell (.ONESHELL
od wersji GNU Make 3.82).Alternatywnie możesz podać
PATH
zmienną w momencie wywołania powłoki. Na przykład:źródło
$(shell)
inwokacjami! : D Przykład: pastebin.com/Pii8pmkDZmiany ścieżki wydają się być trwałe, jeśli najpierw ustawisz zmienną SHELL w pliku makefile:
Nie wiem, czy jest to pożądane zachowanie, czy nie.
źródło
which
aenv
teraz wybierz nową PATH, ale bezpośrednie wykonanie pliku binarnego nadal nie występuje w zmodyfikowanej PATH, tylko w oryginalnej.Zwykle jawnie podaję ścieżkę do pliku wykonywalnego:
Używam również tej techniki do uruchamiania nienatywnych plików binarnych w emulatorze, takim jak QEMU, jeśli kompiluję krzyżowo:
Jeśli make używa powłoki sh, to powinno działać:
źródło
Aby ustawić
PATH
zmienną, tylko w Makefile, użyj czegoś takiego:źródło