Makefile 在生成文件中出现子字符串后剪切字符串

Makefile 在生成文件中出现子字符串后剪切字符串,makefile,Makefile,我正在编写一个Makefile,它需要找出一个已安装程序的目录,该目录可以在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/

我正在编写一个Makefile,它需要找出一个已安装程序的目录,该目录可以在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})
有更好的解决方案吗?

这似乎有效:

XILINX_PATH = $(shell which xst | sed 's%bin\/lin\(64\)*/xst%%')
注意,*真的应该是吗?为了整洁,但我很难让它工作。如果我解决了问题,我会再做一些实验并发布更新

编辑:
使用\?而不是*适用于GNUMAKE的非过时版本,或者至少适用于3.81版本,而且更为正确。

太棒了!非常感谢。这看起来好多了。