Makefile:测试目录是否存在,并获取找到的第一个目录

Makefile:测试目录是否存在,并获取找到的第一个目录,makefile,Makefile,我正在使用makefile编译一个MATLAB/C项目。MATLAB通常可以安装到许多标准位置,具体取决于其版本,例如/Applications/MATLAB_2012b.app,/Applications/MATLAB_2013a.app,等等 最简单的方法是什么,一个接一个地查看这些路径是否存在,然后选择找到的第一条路径?我至少要测试五个值。我找到了$(通配符文件名)语法,但我想知道是否还有比逐个写出这些语法更短的语法 按要求作出澄清。我可以拼凑出一些有用的东西,但我确信这远远不是最好/最

我正在使用makefile编译一个MATLAB/C项目。MATLAB通常可以安装到许多标准位置,具体取决于其版本,例如
/Applications/MATLAB_2012b.app
/Applications/MATLAB_2013a.app
,等等

最简单的方法是什么,一个接一个地查看这些路径是否存在,然后选择找到的第一条路径?我至少要测试五个值。我找到了
$(通配符文件名)
语法,但我想知道是否还有比逐个写出这些语法更短的语法


按要求作出澄清。我可以拼凑出一些有用的东西,但我确信这远远不是最好/最简洁的方法。有更好的办法吗

ifeq ($(MATLAB),)
ifneq ($(wildcard /Applications/MATLAB_2011b.app),)
    MATLAB = /Applications/MATLAB_2011b.app
endif
endif

ifeq ($(MATLAB),)
ifneq ($(wildcard /Applications/MATLAB_2012a.app),)
    MATLAB = /Applications/MATLAB_2012a.app
endif
endif

ifeq ($(MATLAB),)
ifneq ($(wildcard /Applications/MATLAB_2012b.app),)
    MATLAB = /Applications/MATLAB_2012b.app
endif
endif

ifeq ($(MATLAB),)
ifneq ($(wildcard /Applications/MATLAB_2013a.app),)
    MATLAB = /Applications/MATLAB_2013a.app
endif
endif

如果存在第一个这样的目录,您可以获取它

MATLAB_DIR := $(firstword $(wildcard /Applications/MATLAB_*.app))
如果它不存在,变量将为空

ifeq (,$(MATLAB_DIR))
  $(error Matlab not found)
endif

如果路径中有空格,则可以改用shell。类似的方法可能会奏效:

MATLAB_DIR := $(shell ls -d /Applications/MATLAB_*.app | tail -n 1)

为了回答您关于文件/目录名中的空格的问题,大多数Makefile函数不处理文件名中的空格,而且大多数函数甚至不尊重转义空格的
\
方式


很少有变量像
$@
$这是不清楚的。
$(通配符/Applications/MATLAB_*.app
?@Beta请看编辑部分太糟糕了,这个问题限制了MATLAB_*.pattern的路径。@techtonik你的观点是什么?答案是一般性的。公认的答案假设路径有公共组件,这在一般情况下是不正确的。谢谢,这非常有用!不过我想我会使用
lastword
。在这里使用
:=
而不是
=
很重要(我现在查找差异)在这种情况下,
:=
更好,但不是必需的。如果MATLAB的路径中有空格,这将失败,因为
firstword
会将其拆分。您对如何在保持通配符通用性的同时解决此问题有何建议?也许我应该就此问一个单独的问题。如果您的路径有空格,您可以告诉我们e换成shell。类似的东西可能会起作用:
MATLAB_DIR:=$(shell ls/Applications/MATLAB_*.app | tail-n1)
谢谢。如果你不介意的话,我在你的答案中添加了这一点。最后的问题是如何逃逸这个空间,以便我可以正确使用路径。我这样做了:
空间:=
然后
空间+=
然后
然后
$(subst)$(空格),\,$(MATLAB_DIR))
。这是最简单的方法吗?
BASE_DIR_NAME := .
MATLAB_DIR := $(subst $(NULL) ,\ ,$(shell find $(BASE_DIR_PATH) -mindepth 1 -maxdepth 1 -name 'MATLAB_*.app' -type d -print | sort | head -1))

default:
    @echo MATLAB_DIR="$(MATLAB_DIR)"
    ls -l $(MATLAB_DIR)

.PHONY: default
$ ls -l
total 16
-rw-r--r-- 1 ash users  236 Mar 20 01:15 Makefile
drwxr-xr-x 2 ash users 4096 Mar 20 01:13 MATLAB_ a.app
drwxr-xr-x 2 ash users 4096 Mar 20 01:13 MATLAB_ b.app
drwxr-xr-x 2 ash users 4096 Mar 20 01:13 MATLAB_ c.app

$ find . -type f
./Makefile
./MATLAB_ a.app/file1
./MATLAB_ b.app/file2

$ make
MATLAB_DIR=./MATLAB_\ a.app
ls -l ./MATLAB_\ a.app
total 0
-rw-r--r-- 1 ash users 0 Mar 20 01:13 file1