Mam kilka plików Makefiles w katalogach specyficznych dla aplikacji, takich jak to:
/project1/apps/app_typeA/Makefile
/project1/apps/app_typeB/Makefile
/project1/apps/app_typeC/Makefile
Każdy plik Makefile zawiera plik .inc w tej ścieżce o jeden poziom wyżej:
/project1/apps/app_rules.inc
Wewnątrz app_rules.inc Ustawiam miejsce docelowe, w którym chcę umieścić pliki binarne po zbudowaniu. Chcę, aby wszystkie pliki binarne były na odpowiedniej app_type
ścieżce:
/project1/bin/app_typeA/
Próbowałem użyć$(CURDIR)
, w ten sposób:
OUTPUT_PATH = /project1/bin/$(CURDIR)
ale zamiast tego mam pliki binarne zakopane w całej nazwie ścieżki w ten sposób: (zauważ nadmiarowość)
/project1/bin/projects/users/bob/project1/apps/app_typeA
Co mogę zrobić, aby uzyskać „bieżący katalog” wykonania, aby wiedzieć tylko app_typeX
, jak umieścić pliki binarne w folderze odpowiednich typów?
źródło
$(lastword "$(MAKEFILE_LIST)")
makefile na ścieżce"Sub Directory/Makefile"
da ci"Directory/Makefile"
. Nie sądzę, żeby można to obejść, ponieważ$(MAKEFILE_LIST)
z dwoma makefile daje ci jeden ciąg znaków"Makefile One Makefile Two
, który nie obsługuje spacjicurrent_dir
mi nie działa.$(PWD)
robi i jest o wiele prostsze."solution only works when you are running make from the Makefile's current directory"
to łagodny sposób na powiedzenie „nie działa”. Chciałbym umieścić najnowszy artykuł na początku odpowiedzi.Jak zaczerpnięte stąd ;
Pokazuje się jako;
Mam nadzieję że to pomoże
źródło
dir
zamiastshell dirname
tego, że dostaje ścieżkę z końcowym/
znakiem.DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))))
$MAKEFILE_LIST
musi poprzedzać wszelkieinclude
operacje ( dokumenty ).dirname
- w przypadku, gdy na ścieżce znajdują się spacje.Jeśli używasz GNU make, $ (CURDIR) jest tak naprawdę zmienną wbudowaną. Jest to
lokalizacja, w której Makefile znajduje sięw bieżącym katalogu roboczym, prawdopodobnie tam, gdzie jest Makefile, ale nie zawsze .Zobacz Dodatek A Krótki przegląd w http://www.gnu.org/software/make/manual/make.html
źródło
/
. Próbowałem związany zgmake
wersją 3.11. Ale masz rację, jeślimake
nazywa się to asmake -f xxx/Makefile
.CURDIR
działa dla mnie tam, gdziePWD
nie. Zrobiłemmkdir -p a/s/d
to w każdym folderze, który miał makefile wydrukowanyPWD
iCURDIR
przed+$(MAKE) <subdir>
.źródło
Próbowałem wielu z tych odpowiedzi, ale na moim systemie AIX z GNU make 3.80 musiałem zrobić pewne rzeczy starej szkoły.
Okazuje się, że
lastword
,abspath
irealpath
nie dodawano aż do 3,81. :(Jak powiedzieli inni, nie jest to najbardziej elegancki, ponieważ wywołuje dwukrotnie powłokę i nadal ma problemy ze spacjami.
Ale ponieważ nie mam spacji na ścieżkach, działa dla mnie niezależnie od tego, jak zacząłem
make
:Wszystko mi dać
wherever
zacurrent_dir
i bezwzględna ścieżkawherever
domkfile_dir
.źródło
Podoba mi się wybrana odpowiedź, ale myślę, że bardziej pomocne byłoby pokazanie jej działania niż wyjaśnienie.
/tmp/makefile_path_test.sh
Wynik:
UWAGA: Ta funkcja
$(patsubst %/,%,[path/goes/here/])
służy do usuwania końcowego ukośnika.źródło
Oto jedna linijka, aby uzyskać bezwzględną ścieżkę do
Makefile
pliku przy użyciu składni powłoki:A oto wersja bez powłoki oparta na odpowiedzi @ 0xff :
Przetestuj go, drukując:
źródło
Rozwiązanie znalezione tutaj: https://sourceforge.net/p/ipt-netflow/bugs-requests-patches/53/
Rozwiązaniem jest : $ (CURDIR)
Możesz użyć tego w ten sposób:
źródło
$(CURDIR)
próbowano już bezskutecznie.make
został uruchomiony). Rzeczywiście tego chciał OP, ale tytuł pytania jest fałszywy, więc samo pytanie jest niespójne. To jest poprawna odpowiedź na niepoprawne pytanie. ;)O ile mi wiadomo, jest to jedyna odpowiedź, która działa poprawnie ze spacjami:
To zasadniczo działa poprzez ucieczkę spacje przez podstawienie
' '
za'\ '
który pozwala wprowadzić do analizowania go prawidłowo, a następnie usuwa nazwę pliku makefile wMAKEFILE_LIST
wykonując kolejne podstawienie więc jesteś w lewo z katalogu, który jest w makefile. Niezupełnie najbardziej kompaktowych coś na świecie, ale to działa.Skończysz z czymś takim, w którym wszystkie przestrzenie są unikane:
źródło
Przykład w celach informacyjnych, jak poniżej:
Struktura folderów może wyglądać następująco:
Gdzie są dwa Makefile, każdy jak poniżej;
Zobaczmy teraz zawartość plików Makefiles.
Teraz uruchom sample / Makefile, as;
Wyjaśnienie byłoby takie, że katalog macierzysty / domowy może być przechowywany w flagi środowiska i może być eksportowany, aby można go było używać we wszystkich plikach makef podkatalogów.
źródło
aktualizacja 2018/03/05 finnaly Używam tego:
Można go wykonać poprawnie w ścieżce względnej lub ścieżce bezwzględnej. Wykonano poprawne wywołane przez crontab. Wykonano poprawnie w innej powłoce.
pokaż przykład, własną ścieżkę drukowania a.sh.
stare: używam tego:
Może wyświetlać się poprawnie, jeśli zostanie wykonany w innej powłoce i innym katalogu.
źródło
Jedna linia w pliku Makefile powinna wystarczyć:
DIR := $(notdir $(CURDIR))
źródło