2012-03-02 46 views
3

Makefileルールで、指定されたディレクトリに書き込む権限があるかどうかを確認する方法はありますか?これは私が書いているのMakefileのごく一部です:Makefile:ディレクトリへの書き込み権限を確認する

APP_NAME = electro 
CC = gcc 
C_FLAGS = -Wall 
LIB_DIR = lib 
SRC_DIR = src 
INST_DIR = /usr/bin 
INST_LIBDIR = /usr/lib 
LIBS = libcomponent.so libpower.so libresistance.so 
L_FLAGS = -lresistance -lpower -lcomponent 

.PHONY: lib 

lib: 
    @$(MAKE) --directory=$(LIB_DIR) 

install: $(SRC_DIR)/main.c lib 
    (cd $(LIB_DIR); cp $(LIBS) $(INST_LIBDIR)) 
    $(CC) $(C_FLAGS) -o $(INST_DIR)/$(APP_NAME) $(L_FLAGS) $< 
    @echo "$(APP_NAME) installed successfully." 

ユーザーが/ usr/libおよび/ usr/binにへの書き込み権限を持っていない場合は「インストール」のルールは明らかに失敗します。この2つの行を実行する前にこの許可をチェックする方法があり、その場合には適切なエラーメッセージを出力します(おそらく "このコマンドを実行するのに十分な権限がありません"という行に沿って)

+0

これらのチェックはCygwinではあまり価値がないことに注意してください。そこに書き込むことに失敗するほうが良いかもしれません。 – reinierpost

答えて

5

シェルの/ bin/testまたは/ bin/[makeはそれ自身ではなくても、/bin/test -d /path/to/foo -a -w /path/to/fooになります。

ディレクトリをアクセス可能にするもう1つの方法は、書き込み可能かどうかをテストする前にmkdir -pでディレクトリを作成することです。私は次のことを行うことが知られています:

mkdir -p ${TARGETDIR} && test -w ${TARGETDIR} 

最初のコマンドが失敗した場合、2番目のコマンドは試行されません。ディレクトリが既に存在する場合は、mkdir -pが成功します。

+0

完璧に働いて、ありがとう! 私が使ったのは:[-w/usr/lib] && [-w/usr/bin] – yzfr1

+2

'mkdir -p'の値を過小評価しないでください。たとえば、ドキュメントを '$ {PREFIX}/share/$ {PKGNAME}/html /'にインストールする必要がある場合は、テストするのではなく、 'mkdir -p'を実行して個々の部分を作成する方が簡単ですパス。実際の目的が「可能ならば$ {PATH}に書き込む」ことだと、これはより早く到達する方法です。 – ghoti

+0

@ yzfr1、大したことではありませんが、[-w/usr/lib] && [-w/usr/bin] 'が私の答えで述べた形式よりも多くのリソースを使用する場合。 2つの '['テストを '&&'で結合することで、POSIXシェルの場合は '/ bin/['バイナリ*を2回*実行します。もちろん、あなたがbashであれば、 '['は組み込まれているので、パフォーマンスの差はごくわずかです。 – Graham

0

シェルスクリプトの小さなビットをメイクファイルに埋め込むことで、多かれ少なかれそうしたことができます。

+0

はい、私はそれを認識しています。私が探しているのは、それを達成するために使用できる特定のシェルコードです。 – yzfr1

関連する問題