Обрезка строки после появления подстроки в Makefile - PullRequest
0 голосов
/ 11 августа 2010

Я пишу Makefile, который должен определить каталог установленной программы, который можно найти в PATH; или, так сказать, предполагается, что в PATH.

Например: если двоичный файл - /opt/Xilinx/12.1/ISE_DS/ISE/bin/lin64/xst, то путь, который я ищу, - /opt/Xilinx/12.1/ISE_DS/ISE. Программа также может быть найдена как /home/markus/Xilinx/10.1/ISE/bin/lin64/xst например. Xilinx включил часть пути ISE_DS только в более поздних версиях.

Фактически подстрока /bin/lin64/xst не может быть просто удалена, поскольку она также может быть /bin/lin/xst в зависимости от вашей установки.

Makefile может сделать что-то вроде XILINX_PATH = $(shell which xst), а затем обработать эту строку в соответствии с приведенным выше примером, но я не могу понять, как это сделать чистым способом.

Лучшее, что я мог придумать, это:

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})

Есть ли лучшее решение?

1 Ответ

0 голосов
/ 11 августа 2010

Это похоже на работу:

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

Обратите внимание, что * действительно должно быть ? ради аккуратности, но у меня проблемы с тем, чтобы заставить это работать. Я сделаю еще несколько экспериментов и выложу обновление, если решу.

EDIT:
Использование \? вместо * работает на устаревших версиях GNUMAKE (или, по крайней мере, на 3.81) и является более правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...