РЕДАКТИРОВАТЬ : принято 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
со строкой и списком всех цифр, она возвращает пустую строку тогда и только тогда, когда строка содержит только цифры.