crazzy
crazzy

Reputation: 169

How to know if a makefile variable is a string of char or numbers?

It probably sounds very elementary but I am unable to find a way to classify a makefile variable into text or number. My pseudocode is like this:

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

How to do this? I am using the GNU Make (in cygwin/Windows). I read the make.pdf that comes with it but could not find a way.

Thanks in Advance

Upvotes: 0

Views: 2479

Answers (2)

Renaud Pacalet
Renaud Pacalet

Reputation: 29280

EDIT: adopted a suggestion by bobbogo that does not depend on the number of characters to purge.

I assume you use GNU make. Here is a make-only solution, without calling the shell. For performance reasons, depending on your use of it, it can be preferable. Moreover, it does not depend on which shell make uses. Last but not least, it uses recursion and I like recursion:

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))

Demo:

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.

Explanation: PURGE is a recursive macro that takes two arguments. The first one ($(1)) is a string to test, the second one ($(2)) is a list of words to match. If $(2) is the empty list PURGE returns $(1). Else, it calls itself with two new parameters:

  • the value of $(1) where the first word of $(2) has been substituted by nothing,
  • $(2) from which the first word has been removed

and returns the result. So, if you call PURGE with a string and the list of all digits, it returns the empty string if and only if the string contained only digits.

Upvotes: 2

Florian Weimer
Florian Weimer

Reputation: 33717

All make variables are strings. To find out whether a string is in fact a number, you need some elementary text analysis functions. GNU make itself does not offer anything convenient in this area, but you could run a shell command to do the job, perhaps like this:

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

This results in:

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

However, such string processing can be quite unreliable if the string contains special characters.

Upvotes: 1

Related Questions