103

I'm writing a Makefile that does string matching at one place, the code is like:

if test ...; \
    then \
    shell scripts... \
fi

ifeq ($(DIST_TYPE),nightly)
    shell scripts ...
endif

Here the first if is shell script, the second ifeq is GNU Make's conditional. However the following error generates:

ifeq (nightly,nightly)

/bin/sh: -c: line 0: syntax error near unexpected token `nightly,nightly'

/bin/sh: -c: line 0: `ifeq (nightly,nightly)'

What's happening here? It seems that Make is trying to call the shell.

BenMorel
  • 34,448
  • 50
  • 182
  • 322
Ryan Li
  • 9,020
  • 7
  • 33
  • 62
  • You are confusing conditional statements in `sh` (such as the first) with conditional statements in `make` (such as the second). – reinierpost Jun 11 '12 at 08:11

2 Answers2

335

I played around the code and found that the conditional statements should be written without indentation, and this solved my problem.

If there is no indentation, Make will treat it as a directive for itself; otherwise, it's regarded as a shell script.

Example code

Wrong:

target:
    ifeq (foo, bar)
        ...
    endif

Correct:

target:
ifeq (foo, bar)
    ...
endif
Ryan Li
  • 9,020
  • 7
  • 33
  • 62
13

In addition, if the conditional statements is used in define functions, like:

define myFunc
ifeq (foo, bar)
    ...
endif
endef

In this case, Make will also treat it as a shell script.

This problem can be solved by using if-function instead:

define myFunc
    $(if condition,then-part[,else-part])
endef
congusbongus
  • 13,359
  • 7
  • 71
  • 99
SenZhang
  • 141
  • 1
  • 6