2012-12-16 17 views
20

Nel mio Makefile ho bisogno di ottenere un elenco di tutte le directory presenti in qualche altra directory.Wildcard per ottenere l'elenco di tutte le directory

per ottenere un elenco di tutte le directory nella stessa cartella come il mio Makefile io uso:

DIRECTORIES = $(wildcard */) 

all: 
    echo $(DIRECTORIES) 

che funziona bene, e mi dà la lista desiderata. Tuttavia, se voglio avere una lista di tutte le directory in un'altra directory utilizzando

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

all: 
    echo $(DIRECTORIES) 

ho un elenco di tutti i file (con percorsi) in quella directory, tra cui .h e .cpp file.

Qualche suggerimento perché questo accade e come risolverlo? Altre soluzioni per ottenere l'elenco sono anche benvenute.

+0

Sei sicuro caratteri jolly è una buona idea? –

+0

@JonathanLeffler Non voglio aggiungere manualmente ogni directory, perché è un progetto più grande. Se hai un'idea su come evitare comunque i caratteri jolly, dimmelo. – Haatschii

+0

Il motivo per cui si sta verificando questo comportamento è dovuto a un bug nella versione di GLIBC: https://sourceware.org/bugzilla/show_bug.cgi?id=10278 – MadScientist

risposta

27

Usa sort e dir funzioni insieme con wildcard:

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

Da GNU make manuale:

$ (nomi dir ...) Estratti directory-parte di ciascun nome di file in nomi. La directory-parte del nome del file è tutto attraverso (e includendo) l'ultima barra in esso. Se il nome del file non contiene alcuna barra, la parte della directory è la stringa './'.

$ (elenco di ordinamento) Ordina le parole di elenco in ordine lessicale, rimuovendo parole duplicate. L'output è una lista di parole separate da singoli spazi.

guardare anche il secondo e il terzo metodo in questo articolo: Automatically Creating a List of Directories

+2

Sì, questo è il lavoro. Grazie mille. – Haatschii

+0

Mi sembra inutilmente complesso. Non so perché è necessario "ordinare", ad esempio. Puoi usare: '$ (dir $ (carattere jolly .../Test/* /.))' (Nota aggiungendo il '.' alla fine per assicurarti che il carattere finale non sia una barra) e funzionerà ovunque. – MadScientist

+0

@MadScientist, 'sort' garantisce che le directory vengano attraversate in ordine alfabetico. Questo è utile se si vuole essere in grado di dire a colpo d'occhio fino a che punto la build è andata avanti, per esempio. Quando l'ho omesso, ho scoperto che su Windows, le directory sono state attraversate in ordine alfabetico, ma su Linux non lo erano. – Alan

15

Prova:

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

che vi darà la lista di directory all'interno di una determinata directory senza andare in sottodirectory. Potrebbe essere necessario pulire l'elenco in quanto includerà . e ./ prima di ogni directory elencata.

+6

Per ottenere una lista senza '' è possibile utilizzare ' -mindepth 1 -maxdepth 1'. –