To simplify the difference, I tested only running the target $(MAINOBJ)
in uncommon.mk
, adding the debug log below in uncommon.mk
.
$(MAINOBJ): $(srcdir)/$(MAINSRC)
@echo "n: $(n)"
@echo "V: $(V)"
@echo "Q: $(Q)"
@echo "ECHO1: $(ECHO1)"
@echo "ECHO0: $(ECHO0)"
@echo "ECHO: $(ECHO)"
$(ECHO) compiling $(srcdir)/$(MAINSRC)
$(Q) $(CC) $(MAINCPPFLAGS) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$(srcdir)/$(MAINSRC)
I executed as follows.
git clean -fdx
autoconf
./configure
In the case of Q=
, the compiling ./main.c
is printed.
rm main.o
make Q= main.o 2>&1 | tee make_main_o_q_debug.log
n: :
V: 0
Q:
ECHO1: 0
ECHO0: echo
ECHO: @echo
compiling ./main.c
gcc -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Werror=deprecated-declarations -Werror=div-by-zero -Werror=duplicated-cond -Werror=implicit-function-declaration -Werror=implicit-int -Werror=misleading-indentation -Werror=pointer-arith -Werror=write-strings -Werror=old-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Werror=undef -std=gnu99 -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-strict-overflow -DRUBY_DEVEL=1 -fvisibility=hidden -fexcess-precision=standard -DRUBY_EXPORT -fPIE -I. -I.ext/include/x86_64-linux -I./include -I. -I./enc/unicode/14.0.0 -o main.o -c ./main.c
In the case of V=1
, the compiling ./main.c
is not printed.
rm main.o
make V=1 main.o 2>&1 | tee make_main_o_v1_debug.log
n: :
V: 1
Q:
ECHO1: :
ECHO0: :
ECHO: @:
gcc -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Werror=deprecated-declarations -Werror=div-by-zero -Werror=duplicated-cond -Werror=implicit-function-declaration -Werror=implicit-int -Werror=misleading-indentation -Werror=pointer-arith -Werror=write-strings -Werror=old-style-definition -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Werror=undef -std=gnu99 -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-strict-overflow -DRUBY_DEVEL=1 -fvisibility=hidden -fexcess-precision=standard -DRUBY_EXPORT -fPIE -I. -I.ext/include/x86_64-linux -I./include -I. -I./enc/unicode/14.0.0 -o main.o -c ./main.c
The difference comes from the ECHO1
setting in Makefile.in
. In my assumption on the line, if V
equals 1
the ECHO1
is set as $n
(= :
), otherwise ECHO1
is set as the value of V
. I couldn't find the this syntax in the GNU make official document.
https://github.com/ruby/ruby/blob/049303eff39d654f198b441e8e5f0f5b75a25e74/template/Makefile.in#L9
ECHO1 = $(V:1=$n)
So, my conclusion is the current logic for V
and Q
is intentional. And I would close this ticket.