Re: Conditional broken line in recipe

Alejandro Colomar <[email protected]>
Newsgroups gmane.comp.gnu.make.general
Organization Linux
Message-ID <[email protected]>
On 2023-09-03 13:11, Alejandro Colomar wrote:
> Hi Paul,
> 
> On 2023-09-03 04:09, Paul Smith wrote:
>> On Sun, 2023-09-03 at 01:03 +0200, Alejandro Colomar wrote:
>>> I was also wondering... is ONESHELL significant for performance? 
>>> Does the reduction in number of shells speed up things?
>>
>> It might increase performance but that's not what it's for primarily,
> 
> For those wondering, here's an experiment with a rule that runs a few
> shells (given appropriate values for certain variables):
> 
> 
> $ time make -j install DESTDIR=/tmp/foo Z=.gz LINK_PAGES=symlink >/dev/null
> 
> real	0m6.229s
> user	0m17.820s
> sys	0m5.269s
> $ sed -i '/ONESHELL/s/^/#/' GNUmakefile 
> $ time make -j install DESTDIR=/tmp/bar Z=.gz LINK_PAGES=symlink >/dev/null
> 
> real	0m8.511s
> user	0m23.823s
> sys	0m7.511s
> 
> 
> It's not orders of magnitude, but it might be interesting to cut a
> 25%, considering no obvious pitfalls (when you overcome the SHELL
> errors, that is :D).  For rules with just 1 canned recipe, the times
> didn't change.
> 
> Here's the rule I used (I chose it because it's the most complex rule
> in the Makefile, as it has 3 canned recipes):
> 
> 
> $(_manpages):
> 	$(info INSTALL	$@)
> 	<$< \
> 	$(SED) $(foreach s, $(MANSECTIONS), \
> 		-e '/^\.so /s, man$(s)/\(.*\)\.$(s)$$, $(notdir $(man$(s)dir))/\1$(man$(s)ext)$(Z),') \
> 	| $(INSTALL_DATA) -T /dev/stdin $@
> ifeq ($(LINK_PAGES),symlink)
> 	if $(GREP) '^\.so ' <$@ >/dev/null; then \
> 		$(GREP) '^\.so ' <$@ \
> 		| $(SED) 's,^\.so \(.*\),../\1,' \
> 		| $(XARGS) -I tgt $(LN) -fsT tgt $@; \
> 	fi
> endif
> ifeq ($(Z),.bz2)
> 	if ! $(TEST) -L $@; then \
> 		$(BZIP2) $(BZIP2FLAGS) <$@ \
> 		| $(SPONGE) $@; \
> 	fi
> else ifeq ($(Z),.gz)
> 	if ! $(TEST) -L $@; then \
> 		$(GZIP) $(GZIPFLAGS) <$@ \
> 		| $(SPONGE) $@; \
> 	fi
> else ifeq ($(Z),.lz)
> 	if ! $(TEST) -L $@; then \
> 		$(LZIP) $(LZIPFLAGS) <$@ \
> 		| $(SPONGE) $@; \
> 	fi
> else ifeq ($(Z),.xz)
> 	if ! $(TEST) -L $@; then \
> 		$(XZ) $(XZFLAGS) <$@ \
> 		| $(SPONGE) $@; \
> 	fi
> endif
> 
> 
> 
>> at least not in my opinion.  It's there for people who want to use
>> shells other than POSIX sh as their SHELL value,
> 
> Well, my SHELL is not the POSIX sh, as I'm using bash(1), but I get
> it's still POSIX-sh-like, not python.  :)
> 
>> where it's not so easy
>> to create an entire script on a single line and using backslashes.
> 
> Can we really call it script if it's invoked via sh -c?  It's more
> like a command line.  :)
> 
> Jokes apart, can you put an example of such a scenario?  I'm not
> imagining it.

Never mind; a python script could be it.

> 
> 
> BTW, apart from fixing the SHELL (which was a good thing, anyway),
> the only change I needed was to remove the '+' from a couple of
> recipes (and keep only the first one).  Not a big deal.  Most rules
> work without modification.
> 
> 
> Cheers,
> 
> Alex
> 

-- 
<http://www.alejandro-colomar.es/>
GPG key fingerprint: A9348594CE31283A826FBDD8D57633D441E25BB5
OpenPGP_signature (application/pgp-signature, 833 B) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.