在Makefile中出现子字符串后剪切字符串

时间:2010-08-11 14:02:55

标签: makefile

我正在编写一个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 :(得分:0)

这似乎有效:

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

请注意,为了整洁,*确实应该是?,但我无法让它发挥作用。如果我解决它,我会做更多的实验并发布更新。

修改:
使用\?而不是*适用于非过时版本的GNUMAKE(或者至少在3.81上)并且更正确。