2010-11-03 6 views
0

J'essaie de faire ce qui suit dans un Makefile. Pour une raison quelconque, je ne peux pas le faire fonctionner à droite:Make: Snippet ne fonctionne pas comme prévu

  1. Obtenez la première ligne d'un fichier
  2. Vérifiez si la ligne commence par «/»
  3. Si la ligne ne fonctionne pas, précédez un chemin à chaque ligne dans le fichier

Voici le code que j'ai:

if test $${$(shell head -n 1 ./root/lib/modules/$(KERNEL_VERSION)/modules.dep):0:1} -ne '/' then \ 
    cat ./root/lib/modules/$(KERNEL_VERSION)/modules.dep | while read line; do echo "/lib/modules/$(KERNEL_VERSION)/$$line"; done > /tmp/modules.dep.new; \ 
    cp /tmp/modules.dep.new ./root/lib/modules/$(KERNEL_VERSION)/modules.dep; \ 
    rm /tmp/modules.dep.new; \ 
fi 

la commande de la tête ne retourne rien. Si je cours seul, je reçois la première ligne du fichier.

+0

Pas vraiment traiter votre problème, mais ce qui se passe si vous remplacez la tête avec "1Q sed"? Pourrait aider à affiner le problème. En outre, are = vous suare le cwd est où vous pensez qu'il est, et KERNEL_VERSION est défini? –

+0

@Paul: Le chemin est presque certainement correct (cwd correct et KERNEL_VERSION défini) s'il peut obtenir la première ligne du fichier. – Beta

+0

Pas forcément parce qu'il n'obtient la première ligne que lorsqu'il exécute la commande principale ("Si je cours seul, j'obtiens la première ligne du fichier.") Et quand il est exécuté dans le Makefile, il ne reçoit rien (" commande ne renvoie rien ") –

Répondre

0

Je ne peux pas votre if test a -ne b approche du travail (scripts shell est pas vraiment ma main forte), mais personnellement, je le ferais de cette façon:

FILE = ./root/lib/modules/$(KERNEL_VERSION)/modules.dep 

PREFIX = /lib/modules/$(KERNEL_VERSION) 

foo: 
    sed -i -e 'H;$$!d;x;s/.//;/^\//!{s|^|$(PREFIX)|;s|\n|\n$(PREFIX)|g}' $(FILE) 

EDIT:

Venez y penser, cela est un peu plus élégante:

sed -i '1{h;s/\(.\).*/\1/;s/\//a$(PREFIX)/;s/.//;x};H;g;s/\n.*//;x;s/\n//' $(FILE) 

E DIT:

Attendez, ce qui est encore mieux:

@sed -i '1{/^\//!{x;s/^/$(PREFIX)/;x}};G;s/\(.*\)\n\(.*\)/\2\1/' $(FILE) 
Questions connexes