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.
Why the Bash unexpected token syntax error occurs? As the error suggests this is a Bash syntax error, in other words it reports bad syntax somewhere in your script or command. There are many things that can go wrong in a Bash script and cause this error.
The ifeq directive begins the conditional, and specifies the condition. It contains two arguments, separated by a comma and surrounded by parentheses. Variable substitution is performed on both arguments and then they are compared.
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.
Wrong:
target: ifeq (foo, bar) ... endif
Correct:
target: ifeq (foo, bar) ... endif
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With