On Thu, Mar 19, 2020 at 10:38:30PM +0100, Christian Weisgerber wrote:
> Make use of "find -exec {} +" (which is POSIX) and "find -delete"
> (which is not) throughout the ports Makefiles.
Thanks, I've been building up a diff for stuff I came across but never
did the full sweep.

> Specifically:
> 
> * Replace find|xargs with find -exec {} +
>   find|xargs is an outdated construct.  The -exec {} + invocation
>   automatically avoids a number of corner cases (see xargs -0, -r).
>   Also, since the exit status of the left-hand side of a pipe is
>   ignored, find|xargs hides some problem.
xargs also executes the command even if find doesn't yield entries,
unless -r is used.

> * Replace -exec {} \; with -exec {} + if applicable.
>   Calling a command a few times with many arguments is simply more
>   efficient than calling it many times with a single argument.
> 
> * Use the -delete operator to remove files and empty directories.
>   I'm ambivalent about this since it isn't POSIX, but people seem
>   to like it.
All major find implementations have it, its faster and much less error
prone;  we've only had it since 2017, though.

> I also combined and tweaked some find(1) invocations while there.
Some invocations omit the `-type' primary entirely or put it *after*
the `-name' primary.

Missing type checks should be easily added to every incovation lacking
them, they're clearer to read and might even speed things up by
preventing direcctory names to be matched against "*.orig" for example.

When both primaries are present, `-type' should occur first for similar
reasons: if you're looking for files with specific names, you don't want
to string compare names first only to discard the file later on because
it is a directory or symbolic link;  some invocations do `-name' before
`-type' and I'd argue that swapping their order is both safe to do and
actually a bit faster (for big file trees (with slow I/O)).


> The patch touches 136 files, so it's possible a mistake has slipped
> in, but it successfully passed an amd64 bulk build.
Passing bulks sound good, I skimmed through the diff but couldn't find
issues.

> x11/qt5/Makefile.inc runs find(1) on directories that don't exist
> in all qt5/* ports.  Previously the find|xargs construct accidentally
> hid the find errors.  I went with -find here, i.e., use make's "-"
> to ignore any non-zero exit status.
Yes, I'd argue hiding errors through the command or showing them but
igoring the exit code within make is practically the same.

OK kn


NB: Feel free to incorporate my feedback and commit together, otherwise
I can simply go over the things I mentioned after your diff landed.

Reply via email to