2012-12-16 14 views
20

w moim Makefile muszę uzyskać listę wszystkich katalogów znajdujących się w innym katalogu uzyskać.Wildcard do listy wszystkich katalogów

Aby uzyskać listę wszystkich katalogów w tym samym folderze co mój Makefile używam:

DIRECTORIES = $(wildcard */) 

all: 
    echo $(DIRECTORIES) 

który działa dobrze i daje mi żądaną listę. Jednakże, jeśli chcę mieć listę wszystkich katalogów w innym katalogu używając

DIRECTORIES = $(wildcard ../Test/*/) 

all: 
    echo $(DIRECTORIES) 

uzyskać listę wszystkich plików (ze ścieżkami) w tym katalogu, w tym .h i .cpp plików.

sugestie dlaczego tak się dzieje i jak to naprawić? Inne rozwiązania w celu uzyskania listy są również mile widziane.

+0

Czy na pewno symboli wieloznacznych jest dobrym pomysłem? –

+0

@ JonathanLeffler Nie chcę dodawać każdego katalogu ręcznie, ponieważ jest to większy projekt. Jeśli jednak masz pomysł, jak uniknąć dzikiej karty, powiedz mi. – Haatschii

+0

Powodem widzisz to zachowanie jest spowodowane błędem w wersji glibc: https://sourceware.org/bugzilla/show_bug.cgi?id=10278 – MadScientist

Odpowiedz

27

Zastosowanie sort i dir funkcje wraz z wildcard:

DIRECTORY = $(sort $(dir $(wildcard ../Test/*/))) 

Od GNU make instrukcja:

$ (dir nazwach ...) Ekstrakty katalog-część każdej nazwy pliku w nazwy. Część-katalogu nazwy pliku zawiera wszystko, aż do ostatniego ukośnika. Jeśli nazwa pliku nie zawiera ukośnika, częścią katalogu jest ciąg "./".

$ (lista sortowania) Sortuje słowa listy w kolejności leksykalnej, usuwając zduplikowane słowa. Dane wyjściowe to lista słów oddzielonych pojedynczymi odstępami.

Również spojrzeć na drugiej i trzeciej metody w tym artykule: Automatically Creating a List of Directories

+2

Tak, to działa. Dziękuję bardzo. – Haatschii

+0

Wydaje mi się to niepotrzebnie skomplikowane. Nie wiem, dlaczego musisz "sortować" na przykład. można użyć: '$ (reż $ (wildcard ../ Test/* /).)' (uwaga dodanie The '.' na koniec, aby zapewnić, że ostateczna postać nie jest ukośnik) i będzie działać wszędzie. – MadScientist

+0

@MadScientist The 'sort' zapewnia, że ​​katalogi są wykonywane w kolejności alfabetycznej. Jest to przydatne, jeśli chcesz na pierwszy rzut oka ocenić, na ile zaawansowanie trwało, na przykład. Kiedy go pominięto, odkryłem, że w systemie Windows katalogi były sortowane alfabetycznie, ale w systemie Linux nie były. – Alan

15

Spróbuj:

$(shell find <directory> -maxdepth 1 -type d) 

który daje listę katalogów wewnątrz danego katalogu bez wchodzenia podkatalogów. Być może trzeba wyczyścić tę listę w górę, ponieważ będzie zawierać . i ./ przed każdym katalogu na liście.

+6

Aby uzyskać listę bez '' można użyć ' -mindepth 1 -maxdepth 1'. –

Powiązane problemy