Makefile:测试存在的目录并找到第一个发现

问题描述:

我正在使用makefile来编译MATLAB/C项目。通常,MATLAB可以安装到许多标准位置,具体取决于它的版本,例如, /Applications/MATLAB_2012b.app,/Applications/MATLAB_2013a.appMakefile:测试存在的目录并找到第一个发现

什么是最简单的方法来查看这些路径是否存在,并逐一找到第一个?至少会有五个值我想测试。我发现了$(wildcard filename)的语法,但我想知道是否有比编写一个接一个更短的内容。


澄清,根据要求。我可以拼凑一些可以工作的东西,但我相信这远不是最好/最简洁的做法。有没有更好的办法?

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 
+0

这是不清楚。 '$(wildcard/Applications/MATLAB _ *。app')有什么问题? – Beta 2013-03-19 16:14:51

+0

@Beta请参阅编辑请求 – Szabolcs 2013-03-19 16:27:03

+0

太糟糕了,这个问题限制了MATLAB_ *模式的路径 – 2013-03-29 07:24:52

,如果它存在

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) 
+0

谢谢,这是非常有用的!我想我会使用'lastword'。重要的是你在这里使用':='而不是'=' '?(我正在寻找差异) – Szabolcs 2013-03-19 16:29:40

+0

在这种情况下':='更好,但不是必需的。http:// stackoverflow。com/questions/448910/makefile-variable-assignment – AtnNn 2013-03-19 16:33:01

+0

如果由于'firstword'会将它分开,MATLAB的路径中会有空格,这将失败。你有什么建议如何解决这个问题,同时保持通配符的一般性?也许我应该为此提出一个单独的问题。 – Szabolcs 2013-03-19 16:44:30

回答您关于文件/目录名称空间的问题,大部分的Makefile的功能在文件名处理空间,也最不尊重甚至逃避空间的\方式。

[email protected]$<$%和功能wildcard几个变量似乎正确处理\转义序列作为一个空间,但大多数其他的makefile变量,像firstword等功能。不能处理空格。

如果在通配符中找到有效的目录,则无法区分列表中的2个有效目录与路径中具有空格的单个目录。

如果您使用的是Makefiles,我建议尽可能避免在路径中留有空格。

但总是有解决方法;)假设你在一个* nix环境中,并且有findsort命令可用,这似乎工作。

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