The correct solution would be:
while read -r CURRENT_LINE; do \
LINE="$${CURRENT_LINE}" ;
echo "LINE:$${LINE}"; \
done
You need to distinguish between make variables and bash variables, and understand that make expands make variables before passing strings to the shell.
echo "$$CURRENT_LINE" ; \ ##WORKING FINE, display line by line
LINE=$(shell echo "$$CURRENT_LINE") ; \ ##NOT WORKING
echo "line:-$(LINE)" ; \ ##empty
This has two errors: first, you're running $(shell ...), which starts a new shell when make is parsing the recipe... (notice that this is before the recipe runs, and therefore before CURRENT_LINE
is set), so in this shell instance, $CURRENT_LINE
will expand to empty. The second issue is that you're doing an echo of $(LINE)
, which is also expanded at make parse time to make's value of its LINE
variable. You would need to use $$LINE
, which make would expand to $LINE
before passing to the shell, and then the shell would be able to expand to its value of $LINE
.
For the next part:
LINE=$$(CURRENT_LINE) ; \ ##NOT WORKING
echo "line:-$(LINE)" ; \ ##empty
First line should be LINE=$$CURRENT_LINE
or LINE=$${CURRENT_LINE}
. Bash treats items in $(...)
as commands, not variables. This also has a second error that the echo line echo's $(LINE)
is again a make variable, which is empty.
y=$(subst :, ,$$CURRENT_LINE) ; \ ##NOT WORKING
echo "y:- $(y)"; \ ##empty
So again this is an order thing -- $(subst ...)
is expanded at make parse time (before the recipe is actually passed to shell). What it's doing is it's substituting on the string $CURRENT_LINE
, not the expanded version of this. Also, you're printing the make version of $(y)
again.