我正在编写一个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})
有更好的解决方案吗?
答案 0 :(得分:0)
这似乎有效:
XILINX_PATH = $(shell which xst | sed 's%bin\/lin\(64\)*/xst%%')
请注意,为了整洁,*
确实应该是?
,但我无法让它发挥作用。如果我解决它,我会做更多的实验并发布更新。
修改:
使用\?
而不是*
适用于非过时版本的GNUMAKE(或者至少在3.81上)并且更正确。