我使用makefile编译MATLAB / C项目。 MATLAB通常可以安装到许多标准位置,具体取决于其版本,例如: /Applications/MATLAB_2012b.app
,/Applications/MATLAB_2013a.app
等
最简单的方法是逐个查看这些路径是否存在,并找到第一个路径?我想测试至少五个值。我找到了$(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 :(得分:1)
如果存在,您可以获得第一个这样的目录
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)
答案 1 :(得分:1)
要回答有关文件/目录名称中的空格的问题,大多数Makefile函数都不处理文件名中的空格,并且大多数都不尊重\
转义空格的方式。
$@
,$<
,$%
和函数wildcard
等少数变量似乎正确地将\
转义序列作为空格处理,但大多数其他makefile变量和函数,如firstword
等。无法处理空间。
假设您在通配符中找到有效目录,则无法区分列表中的2个有效目录与路径中包含空格的单个目录。
如果您正在使用Makefile,我建议尽可能避免在路径中留有空格。
但总有解决方法;)假设您处于可用find
和sort
命令的* nix环境中,这似乎有效。
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
这是Makefile的目录结构和输出:
$ 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