4

Makefile を使用して MATLAB/C プロジェクトをコンパイルしています。/Applications/MATLAB_2012b.appMATLAB は通常、そのバージョンに応じて、いくつかの標準的な場所 ( など) にインストールできます/Applications/MATLAB_2013a.app

これらのパスが存在するかどうかを 1 つずつ確認し、最初に見つかったパスを取得する最も簡単な方法は何ですか? テストしたい値が少なくとも 5 つあります。構文はわかりました$(wildcard filename)が、これらを 1 つずつ書き出すより短いものはないかと考えていました。


要求に応じて説明。機能するものをつなぎ合わせることができますが、これはこれを行うための最良/最も簡潔な方法からはほど遠いと確信しています. より良い方法はありますか?

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
4

2 に答える 2

1

ファイル/ディレクトリ名のスペースに関する質問に答えるために、ほとんどの Makefile 関数はファイル名のスペースを処理せず、\スペースをエスケープする方法さえ尊重しません。

$@$<$%および関数のような変数はほとんどなく、エスケープ シーケンスをスペースとして正しくwildcard処理しているように見えますが、他のほとんどのメイクファイル変数および関数は, などです。スペースを処理できません。\firstword

ワイルドカードで有効なディレクトリを見つけた場合、リスト内の 2 つの有効なディレクトリと、パスにスペースが含まれる単一のディレクトリを区別することは不可能です。

Makefile を使用している場合は、パスにできるだけスペースを入れないようにすることをお勧めします。

しかし、常に回避策があります ;)コマンドが利用可能な*nix 環境にいると仮定するとfind、これは機能するようです。sort

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
于 2013-03-20T08:24:08.107 に答える
1

そのような最初のディレクトリが存在する場合は取得できます

MATLAB_DIR := $(firstword $(wildcard /Applications/MATLAB_*.app))

存在しない場合、変数は空になります

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

パスにスペースが含まれている場合は、代わりにシェルを使用できます。このようなものがうまくいくかもしれません:

MATLAB_DIR := $(shell ls -d /Applications/MATLAB_*.app | tail -n 1)
于 2013-03-19T16:25:39.623 に答える