make(1) will use environment variables but as you noticed there are subtle differences.
A simple Makefile:
Code:
test:
.ifdef CFLAGS
@echo Yes, CFLAGS has been defined: $${CFLAGS}
env | grep CFLAGS
.else
@echo No, CFLAGS has not been defined !!!
.endif
test2:
.ifdef MONKEY
@echo Yes, MONKEY has been defined: $${MONKEY}
env | grep MONKEY
.else
@echo No, MONKEY has not been defined !!!
.endif
Some tests with the
test2 target:
Code:
$ env MONKEY=gorilla make test2
Yes, MONKEY has been defined: gorilla
env | grep MONKEY
MONKEY=gorilla
$ make test2 MONKEY=chimp
Yes, MONKEY has been defined: chimp
env | grep MONKEY
MONKEY=chimp
MAKEFLAGS= MONKEY=chimp
$ make test2
No, MONKEY has not been defined !!!
Note that when setting the environment variable with the
env(1) utility, the
MAKEFLAGS= MONKEY=chimp does not show in the environment output.
With
CFLAGS:
Code:
$ env CFLAGS=-02 make test
Yes, CFLAGS has been defined: -02
env | grep CFLAGS
CFLAGS=-02
$ make CFLAGS=-O2 test
Yes, CFLAGS has been defined: -O2
env | grep CFLAGS
MAKEFLAGS= CFLAGS=-O2
CFLAGS=-O2
$ make test
Yes, CFLAGS has been defined:
env | grep CFLAGS
*** Error 1 in /home/adriaan/TEST (Makefile:4 'test')
According to
make(1) CFLAGS is an internal make variable. This explains the output of
$ make test
where it has been defined but apparently does not have a value assigned yet.
It seems that only when you specify the variable like
# make CFLAGS=xxx
it is seen as a one of the
MAKEFLAGS.