Как узнать, является ли переменная make-файла строкой символов или чисел? - PullRequest
0 голосов
/ 06 июля 2018

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

ifeq ($N, 'numeric')
CFLAGS+=-D$N
endif

Как это сделать? Я использую GNU Make (в Cygwin / Windows). Я прочитал make.pdf, который идет с ним, но не смог найти способ.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

РЕДАКТИРОВАТЬ : принято bobbogo предложение, которое не зависит от количества символов до purge .

Я предполагаю, что вы используете GNU make. Вот решение только для изготовления без вызова оболочки. По причинам производительности, в зависимости от вашего использования, это может быть предпочтительнее. Более того, это не зависит от того, какую оболочку используют. И последнее, но не менее важное: он использует рекурсию, а мне нравится рекурсия:

define PURGE
$(if $(2),$(call PURGE,$(subst $(firstword $(2)),,$(1)),$(filter-out $(firstword $(2)),$(2))),$(1))
endef

DIGITS := 0 1 2 3 4 5 6 7 8 9
define IS_NOT_A_NUMBER
$(call PURGE,$(1),$(DIGITS))
endef

CFLAGS += $(if $(call IS_NOT_A_NUMBER,$(N)),,-D$(N))
all:
    $(info N=$(N) => CFLAGS=$(CFLAGS))

Демо-версия:

host> make N=12345
N=12345 => CFLAGS=-D12345
make: 'all' is up to date.

host> make N=foobar
N=foobar => CFLAGS=
make: 'all' is up to date.

Объяснение: PURGE - рекурсивный макрос, который принимает два аргумента. Первый ($(1)) - строка для проверки, второй ($(2)) - список слов для сопоставления. Если $(2) - пустой список, PURGE возвращает $(1). Иначе, он вызывает себя с двумя новыми параметрами:

  • значение $(1), где первое слово $(2) заменено ничем,
  • $(2) из которого было удалено первое слово

и возвращает результат. Таким образом, если вы вызываете PURGE со строкой и списком всех цифр, она возвращает пустую строку тогда и только тогда, когда строка содержит только цифры.

0 голосов
/ 06 июля 2018

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

define is_number
$(shell test '$(1)' -eq '$(1)' 2>/dev/null && echo yes || echo no)
endef

ifeq ($(call is_number, $(N)),yes)
default:
    @echo N is a number
else
default:
    @echo N is not a number
endif

В результате:

$ make N=5
N is a number
$ make N=string
N is not a number

Однако такая обработка строки может быть весьма ненадежной, если строка содержит специальные символы.

...