I have a very comfortable way to compile my project via a few lines of bash commands. But now I need to compile it via makefile. Considering, that every command is run in its own shell, my question is what is the best way to run multi-line bash command, depended on each other, in makefile? For example, like this:
for i in `find`
do
all="$all $i"
done
gcc $all
Also, can someone explain why even single-line command bash -c 'a=3; echo $a > file'
works correct in terminal, but create empty file in makefile case?
I would use backslash-newline:
UPD.
Or, in case if just want pass the whole list returned by
find
togcc
:Of course, the proper way to write a Makefile is to actually document which targets depend on which sources. In the trivial case, the proposed solution will make
foo
depend on itself, but of course,make
is smart enough to drop a circular dependency. But if you add a temporary file to your directory, it will "magically" become part of the dependency chain. Better to create an explicit list of dependencies once and for all, perhaps via a script.GNU make knows how to run
gcc
to produce an executable out of a set of.c
and.h
files, so maybe all you really need amounts toWhat's wrong with just invoking the commands?
And for your second question, you need to escape the
$
by using$$
instead, i.e.bash -c '... echo $$a ...'
.EDIT: Your example could be rewritten to a single line script like this:
As indicated in the question, every sub-command is run in its own shell. This makes writing non-trivial shell scripts a little bit messy -- but it is possible! The solution is to consolidate your script into what make will consider a single sub-command (a single line).
Tips for writing shell scripts within makefiles:
$
by replacing with$$
;
between commands\
set -e
to match make's provision to abort on sub-command failure()
or{}
to emphasize the cohesiveness of a multiple line sequence -- that this is not a typical makefile command sequenceHere's an example inspired by the OP: