Make: определить платформу с помощью регулярных выражений - PullRequest
1 голос
/ 24 сентября 2019

Я пишу make-файл, который просматривает вывод uname, но по какой-то причине системное имя uname слишком конкретное, например, CYGWIN-NT-1.2.3.Мне нужно сравнить это с регулярным выражением.

В настоящее время я могу обнаружить только определенные строки, например

ifeq (${value},CYGWIN-NT-4.5)
   do something
elif

Как я могу сравнить с регулярным выражением, например, CYGWIN *?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Вы не можете использовать регулярные выражения в GNU make (без использования shell или подобного для вызова сценария оболочки, который обрабатывает регулярные выражения).

Но вам не нужны регулярные выражения для сравнения, которое вы ищетедля, который просто чтобы увидеть, если значение начинается с данной строки.Вы можете использовать функцию фильтра :

ifneq (,$(filter CYGWIN%,$(value)))
  ...on cygwin...
endif
0 голосов
/ 25 сентября 2019

В простых случаях часто используются глобусы вместо полных регулярных выражений. gmtt - это библиотека GNUmake, которая их реализует.Ваш пример может выглядеть так:

include gmtt/gmtt.mk

PLATFORM := CYGWIN-NT-3.5

ifneq ($(call glob-match,$(PLATFORM),CYGWIN-*-4.?),)
$(info We are on Cygwin 4.x)
endif

ifneq ($(call glob-match,$(PLATFORM),CYGWIN-*-3.?),)
$(info We are on Cygwin 3.x)
endif

ifneq ($(call glob-match,$(PLATFORM),Ubuntu*),)
$(info We are on Ubuntu)
endif

Вывод:

$ make
We are on Cygwin 3.x

Чтобы упростить и упростить такие выборы, gmtt имеет табличные данные и функции выбора, которые часто делают его более понятнымчто происходит:

include gmtt/gmtt.mk

PLATFORM := CYGWIN-NT-3.5

define AVAILABLE-PLATFORMS :=
2
CYGWIN-*-4.?     toolX
CYGWIN-*-3.?     toolY
Ubuntu*          toolZ
endef


# select column 2 from the table line(s) which glob-match the current platform:
USED-TOOL := $(call select,2,$(AVAILABLE-PLATFORMS),$$(call glob-match,$(PLATFORM),$$1))

$(info We are using $(USED-TOOL))

Вывод:

We are using toolY

При использовании ячеек таблицы с пробелами возникает оговорка (вы должны экранировать пробелы с помощью spc-mask и преобразовать их обратнос spc-unmask при использовании значения), но в большинстве случаев это довольно простое программирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...