2012-03-02 58 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中的「安裝」規則顯然會失敗。有沒有辦法在執行這兩行之前檢查這個權限,並在這種情況下輸出一個適當的錯誤信息(可能是「你沒有足夠的權限來運行這個命令」)?

+0

請注意,這些檢查在Cygwin上並不值得。不寫在那裏可能會更好。 – reinierpost 2012-03-02 09:52:56

回答

5

Shell的/ bin/test或/ bin/[即使make本身沒有,也會讓你/bin/test -d /path/to/foo -a -w /path/to/foo

使目錄可訪問的一種替代方法是在測試它是否可寫之前嘗試使用mkdir -p來創建它。我已經知道要做到以下幾點:

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

如果第一個命令失敗,二是沒試過。如果該目錄已經存在,mkdir -p將會成功。

+0

完美工作,謝謝! 我使用過:if [-w/usr/lib] && [-w/usr/bin] – yzfr1 2012-03-02 17:03:39

+2

不要低估'mkdir -p'的價值。例如,如果您的文檔需要安裝在'$ {PREFIX}/share/$ {PKGNAME}/html /'中,運行一個'mkdir -p'而不是測試並創建每個單獨部分路徑。如果你真正的目標是「如果可能的話,寫入$ {PATH}」,這是一個更快的方法來達到它。 – ghoti 2012-03-05 03:39:07

+0

@ yzfr1,這不是什麼大問題,但是如果[-w/usr/lib] && [-w/usr/bin]'的使用比我在我的答案中提到的格式更多的資源。通過用'&&'連接兩個'''測試,如果你在POSIX shell中,你可以運行'/ bin/['binary *'*]。當然,如果你在bash中,'['是內置的,所以性能差異可以忽略不計。 – Graham 2017-03-11 00:03:20

0

您可以通過將少量shell腳本嵌入到makefile中來或多或少地做這些事情。

+0

好的,我意識到這一點。我正在尋找的是我可以用來實現這個特定的一段shell代碼。 – yzfr1 2012-03-02 02:26:30