2017-06-14 93 views
0

我有一個變量$(target)GNU做:檢查文件是否是一個目錄

我建造這個變量$(target_dir)

的條件是:

  • 如果target是本地目錄,那麼target_dircurr_dir/target
  • 如果target本地目錄,然後target_dircurr_dir

目前我使用$(wildcard ...)檢查curr_dir/target存在:

target_as_dir := $(shell pwd)/$(target) 
target_is_dir := $(if $(wildcard $(target_as_dir)),1,) 
target_dir := $(if $(target_is_dir),$(target_as_dir),$(shell pwd)) 

然而,這種摔倒在以下情況下

src/ 
+--- foo/ 
    +-- makefile 
    +-- foo.cc 
    +-- foo -> ../build/foo/foo (this is a symlink) 

我在src/foo,和$(target) = foo

$(wildcard)上述聲明foo符號鏈接,我不希望它做的匹配。

我需要它匹配只有當它是一個目錄。任何其他文件系統類型都不應該匹配。

  • 我怎樣才能找到如果curr_dir/target是一個目錄,而不是其他文件?
+0

你的意思是'foo'是一個目錄的符號鏈接,但是你不希望它匹配到那個時候?或者,如果'foo'是一個目錄的符號鏈接,但如果'foo'是一個文件的符號鏈接則不行? – MadScientist

+0

不,「foo」符號鏈接只能是文件的符號鏈接。我已經意識到這可以像在通配符檢查中在'target_as_dir'末尾添加'。/'一樣簡單地解決:例如:'$(if $(wildcard $(target_as_dir)/。),1,)' –

+0

正確。這就是我想知道的原因,因爲如果你需要知道它是否是符號鏈接本身,而不是符號鏈接指向的內容,那就更困難了。實際上很少有UNIX工具讓你看到符號鏈接本身的類型,它們幾乎都默認遵循符號鏈接,並向你展示它指向的東西。如果你的系統有'stat'(大部分都是),這是你最好的選擇。但是你必須使用'$(shell ...)'來使用它;使自己永遠無法分辨符號鏈接和它指向的區別。 – MadScientist

回答

2

您可以使用unix test命令。

target = foo 
target_as_dir := $(shell pwd)/$(target) 
target_is_dir := $(shell test -d $(target_as_dir) -a ! -h $(target_as_dir); echo $$?) 
target_dir := $(if $(and $(findstring 0,$(target_is_dir)),$(findstring $(target_is_dir),0)),$(target_as_dir),$(shell pwd)) 

all: 
    echo $(target_dir) 

test -d $(target_as_dir) -a ! -h $(target_as_dir)檢查它是否是一個目錄(-d)和(-A)不(!)符號鏈接(H)。結果爲0或1. 0表示目錄,1表示其他所有內容。

$(and $(findstring....部分只是兩個字符串的比較。不幸的是,我不知道更好的方式來比較Makefile中的兩個字符串,而不使用第三方庫。

相關問題