Taylor R Campbell <campbell+netbsd-tech-userlevel%mumble.net@localhost> wrote:
| Date: Sat, 05 Nov 2016 18:47:54 +0100
| From: Steffen Nurpmeso <steffen%sdaoden.eu@localhost>
|
| I am currently fixing the build system of the MUA i maintain
| because the portable version of bmake looses CFLAGS (and LDFLAGS
| i think) from the environment.
|
|Can you share a small isolated example that demonstrates the problem
|you're observing? Certainly bmake does respect environment variables
|for make macro expansion:
|
|% printf 'x:;@echo ${CFLAGS}' | CFLAGS=abcd bmake -f /dev/stdin
|abcd
|% printf 'x:;@echo ${CFLAGS}' | bmake -f /dev/stdin CFLAGS=abcd
|abcd
|
|However, following POSIX, any assignments in the makefile itself
|override environment variables, unless you use the -e option:
...
There are no assignments, the file is
.SUFFIXES: .o .c .x .y
.c.o:
$(CC) -I./ $(CFLAGS) -c $(<)
.c.x:
$(CC) -I./ -E $(<) > $(@)
.c:
$(CC) -I./ $(CFLAGS) $(LDFLAGS) -o $(@) $(<)
But i see now that i already have needed such a fix two years back
for cross-compilation on Void Linux! The commit message reads
...
- make PREFIX=/usr ...
+ make CC=$CC PREFIX=/usr ...
i finally assume that environment variables that are defined by
make(1) itself by definition are not passed through to
subprocesses by the used make(1) but instead reset to the make(1)
default-ones. I have seen similar problems for S-CText, fixed
there for example on 2014-04-14 in [7cc84aa] by explicitly setting
the variable (as shown above) when calling those.
Let's see if that fixes Void Linux. If not i think we either have
to document this problem (as for UnixWare where you have to pass
-e, but which has unfortunate side-effects) or even replace the
...
and i think the standard leaves that undefined. Note however that
this fix was for a make(1) rule invoking $(SHELL) which in turn
starts other $(MAKE) instances (the fix was
-_prego = $(SHELL) ./mk-conf.sh
+_prego = SHELL="$(SHELL)" MAKE="$(MAKE)" \
+ CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
+ $(SHELL) ./mk-conf.sh
back then) but this time there is a direct invocation:
compile_check() {
variable=$1 topic=$2 define=$3
_check_preface "${variable}" "${topic}" "${define}"
if ${make} -f ${makefile} XINCS="${INCS}" \
^^^ $make==bmake, $makefile as above
CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" \
^^^ this line new and fixes issue
./${tmp}.o &&
[ -f ./${tmp}.o ]; then
msg 'yes'
and then i think this is not quite right given that CFLAGS and
LDFLAGS are exported into the environment. I.e., my ~/.profile
exports CFLAGS='-01 -g' by default and i would be surprised if
that isn't inherited! So the attached test program yields
?0[steffen@wales tmp]$ make=make sh bm.sh
clang -I./ -g -O -g -DBLA="-g -O -g" -o bm bm.c
ok
?0[steffen@wales tmp]$ make=smake sh bm.sh
...clang -I./ -g -O -g -DBLA="-g -O -g" -o bm bm.c
ok
?0[steffen@wales tmp]$ make=bmake sh bm.sh
cc -pipe -I./ -g -DBLA="-g" -o bm bm.c
no
Ciao.
--steffen
Attachment:
bm.sh
Description: Bourne shell script