2011-09-13 87 views
0

我的makefile無法確定ld的make和版本。Shell(sh),Makefile和Regex

典型的版本字符串(我期望)如下。我在中間的某個地方找(1)固定在左邊GNU LD,(2)版本:

$ ld -v 
GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303 

使用星號時,它不匹配。下面,計數(從-c)始終爲0。

EGREP = egrep 
GNU_LD210_OR_LATER = $(shell $(LD) -v 2>&1 | $(EGREP) -i -c "^gnu ld * (2.1[0-9]|2.[2-9])") 

如果我刪除了星號和版本,我能趕上的什麼,我找兼職:

GNU_LD = $(shell $(LD) -v 2>&1 | $(EGREP) -i -c "^gnu ld") 

後來,我去上使用類似的標誌:

ifeq ($(GNU_LD210_OR_LATER),1) 
    LDFLAGS += -Wl,-z,nodlopen 
endif 

ifneq ($(GNU_LD212_OR_LATER),0) 
    LDFLAGS += -Wl,--exclude-libs,ALL 
endif 

ifneq ($(GNU_LD215_OR_LATER),0) 
    LDFLAGS += -Wl,-z,relro -Wl,-z,now 
endif 

是否有任何問題與我想使用的正則表達式?或者shell的正則表達式解釋器有問題嗎? (我也意識到我應該使用\. - 爲了清楚起見省略)。

傑夫

回答

2

也許正則表達式是不完整的

嘗試:

EGREP = egrep 
GNU_LD210_OR_LATER = $(shell $(LD) -v 2>&1 | $(EGREP) -i -c '^gnu ld \(.*\) (2.1[0-9]|2.[2-9])') 

注意\(.*\)匹配的括號內。

+0

羅伯特 - 我扔點給你。我不需要parens(它們可能不存在於Fedora,BSD等LD中)。但我確實需要這段時間。傑夫 – jww

-1

發現它....我所需要的星號之前的加時賽:

# For -nodlopen, which appeared around 2000 (Binutils 2.10). 
# http://sourceware.org/ml/binutils/2011-09/msg00049.html 
GNU_LD210_OR_LATER = $(shell $(LD) -v 2>&1 | $(EGREP) -i -c '^gnu ld .* (2\.1[0-9]|2\.[2-9])')