2017-07-01 2 views
0

structure du répertoire de mon projet est la suivante:Comment obtenir la liste non récursive du contenu du répertoire avec leurs chemins dans Makefile?

enter image description here

Mon Makefile ressemble à ceci:

dir1_contents = $(shell ls dir1/*) 
dir3_contents = $(shell ls dir3/*) 

all: clean_dir1 clean_dir3 

clean_dir1: 
    echo 'dir1_contents = $(dir1_contents)' 

clean_dir3: 
    echo 'dir3_contents = $(dir3_contents)' 

Quand je lance make, voici ce que je reçois:

$ pwd 
make-test 

$ make -s 
dir1_contents = dir1/file2.junk dir1/dir2: file1.junk 
dir3_contents = dir3/file3.junk 

Je veux obtenir le contenu de dir1 dans dir1_contents. Mais je ne veux pas le contenu récursif. Juste le contenu qui est immédiatement au-dessous du répertoire dir1. Comment puis-je le faire?

Si je supprime le /* des deux premières lignes du Makefile, j'obtiens le bon contenu que je veux. Mais ils manquent leurs chemins que je dois aussi:

$ pwd 
make-test 

$ make -s 
dir1_contents = dir2 file2.junk 
dir3_contents = file3.junk 

Comment puis-je obtenir le contenu à droite que je veux avec les chemins de fichiers que j'ai besoin aussi?

+0

'dir1_contents = dir1 /' – igagis

+0

igagis $ (shell ls dir1), qui ne fonctionne pas: https://gist.github.com/saqib-zmi/0a245d7af4451e91e064ef949ed322f4 –

+1

Cette solution peut être corrigée: 'dir1_contents = $ (addprefix dir1 /, $ (shell ls dir1))', mais j'aime encore mieux ma solution. – Beta

Répondre

2

Le problème que vous avez est lié à la façon dont fonctionne ls, ce n'est rien à voir avec GNU make. Si vous exécutez ls dir1/* le shell étend le caractère générique avant d'appeler ls, c'est donc la même que la course:

ls dir1/dir2 dir1/file2.junk 

Et quand vous ls un répertoire, il affiche le contenu du répertoire par défaut, la sortie est:

$ ls dir1/dir2 dir1/file2.junk 
dir1/file2.junk 

dir1/dir2: 
file1.junk 

(allez-y et essayez ceci à l'invite de commande). Puisque c'est ce que le shell imprime, c'est le résultat que vous obtenez.

Si vous voulez juste voir les répertoires mais pas les fichiers dans les répertoires, vous pouvez ajouter l'option -d à la commande ls:

$ ls -d dir1/dir2 dir1/file2.junk 
dir1/file2.junk dir1/dir2 

Ou, dans le makefile:

dir1_contents = $(shell ls -d dir1/*) 
dir3_contents = $(shell ls -d dir3/*) 

Cependant, je pense que ce n'est pas une bonne façon de le faire de toute façon. Pourquoi ne pas utiliser la fonction intégrée wildcard de GNU make à la place? En plus d'être plus simple à comprendre, c'est BEAUCOUP plus portable et beaucoup plus efficace (la version ci-dessus nécessite l'appel d'un shell et du programme ls). Je vous recommande d'utiliser aussi := pas =, de sorte que vous effectuez uniquement l'opération générique une fois:

dir1_contents := $(wildcard dir1/*) 
dir3_contents := $(wildcard dir3/*) 
+0

Merci! OUI! –

+0

Question de suivi ici: https://stackoverflow.com/questions/44877381/how-to-exclude-a-particular-file-with-gnumakes-wildcard-function –