Makefile и регулярное выражение совпадают в оболочке - PullRequest
0 голосов
/ 13 сентября 2011

Мой make-файл не может определить марку и версию ld.

Типичная строка версии (я ожидаю) выглядит следующим образом. Я ищу (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

Есть ли проблемы с регулярным выражением, которое я хочу использовать? Или есть проблемы с интерпретатором регулярных выражений оболочки? (Я также понимаю, что должен использовать \. - для ясности опущен).

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Возможно, регулярное выражение неполное

Попробуйте:

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

Обратите внимание на \(.*\) для соответствия в скобках.

0 голосов
/ 13 сентября 2011

Нашел .... Мне понадобился дополнительный период перед звездочкой:

# 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])')
...