I have this in my Makefile:
run:
for x in *.bin ; do ./$$x ; done
such that it launches all executables one by one. I want to do this:
run:
for x in *.bin ; do ./$$x &; done
so that it starts each executable and puts it in the background. I get a syntax error for the above statement when I put the ampersand.
I dont want to invoke the make as make &
since this will run processes in the background but still one by one, whereas I want individual executables to run in the background, so that at any instant I have more than one executable running.
Thank you in advance.
Try to execute via a subshell:
run:
for x in *.bin ; do (./$$x &); done
Maybe make -j
is a better option. Try a Makefile
that looks something like this:
BINS = $(shell echo *.bin)
.PHONY: $(BINS)
run: $(BINS)
*.bin:
./$@
And then execute with make -j <jobs>
where <jobs>
is number of simultaneous jobs to run.
The syntax error you're getting is a shell syntax error, rather than a problem with make syntax. The ampersand is in fact a command terminator/separator, just as semicolon is; so the way to express the for loop you want is:
run:
for x in *.bin ; do ./$$x & done
However, as others have noted, where it's practical it's usually more flexible to express things directly as make dependencies rather than complicated shell snippets and shell loops.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With