2010-08-11 6 views
0

J'écris un Makefile qui doit trouver le répertoire d'un programme installé, qui se trouve dans PATH; ou c'est-à-dire, est supposé être en PATH. Par exemple: si le binaire est /opt/Xilinx/12.1/ISE_DS/ISE/bin/lin64/xst, le chemin que je cherche est /opt/Xilinx/12.1/ISE_DS/ISE. Le programme pourrait également être trouvé comme /home/markus/Xilinx/10.1/ISE/bin/lin64/xst par exemple. Xilinx a inclus la partie ISE_DS du chemin uniquement dans les versions ultérieures.Couper une chaîne après apparition d'une sous-chaîne dans un Makefile

En fait, la sous-chaîne /bin/lin64/xst ne peut pas être simplement supprimée, car elle peut aussi être /bin/lin/xst en fonction de votre installation. Le Makefile pourrait faire quelque chose comme XILINX_PATH = $(shell which xst) et ensuite traiter cette chaîne selon l'exemple ci-dessus, mais je ne peux pas comprendre comment le faire de manière propre.

Le mieux que je pouvais trouver est la suivante:

XILINX_PATH_1 = $(shell which xst) 
XILINX_PATH_2 = $(subst /bin/lin64/xst,,${XILINX_PATH_1}) 
XILINX_PATH = $(subst /bin/lin/xst,,${XILINX_PATH_2}) 

est-il une meilleure solution?

Répondre

0

Cela semble fonctionner:

XILINX_PATH = $(shell which xst | sed 's%bin\/lin\(64\)*/xst%%') 

Notez que le * vraiment doit être ? pour le bien de la bonne tenue, mais je vais avoir du mal à obtenir que pour travailler. Je ferai quelques expériences de plus et publierai une mise à jour si je le résous.

EDIT:
En utilisant \? au lieu de * travaux sur les versions non obsolètes de gnumake (ou au moins 3,81) et est plus correct.

+0

Génial! Je vous remercie. Cela semble tellement mieux. –