On 03/12/19 17:07, Eric Blake wrote: > On 3/12/19 10:15 AM, Laszlo Ersek wrote: > >> I'm acutely aware of portable vs. non-portable shell scripts. While >> working on the code, I specifically checked that "local" was not >> specified in SUSv4. The point is, I didn't care, because I didn't target >> a POSIX system, but a GNU system. >> >> We already require GNU Make, to my knowledge. Perhaps not by decree, but >> through the feature set that we use. > > Indeed, qemu fails to build under BSD make. > >> I really want to keep "local", as it keeps the shell variable namespace >> clean. Regarding the functions that I did put in the "global namespace", >> I was careful to prefix them suitably. > > Yes, using local makes bash functions easier to write. (And I've been > trying to argue that POSIX should adopt local, but there is a > fundamental difference between ksh local (static scoping) and bash local > (dynamic scoping) that neither shell is willing to switch their existing > practice to meet at common ground - which is why POSIX hasn't > standardized anything yet)
Interesting! I didn't know about this. "local" has always seemed like a "no brainer" to me (for POSIX to incorporate), but given the actual conflict between bash and ksh, I guess it might never happen. (Also, it should be quite obvious at this point that the only "ksh" command I have ever typed has been "exit" :) ) >> IMO, it's perfectly fine to require the shell to be bash here, given >> that this feature is meant for a subset of maintainers (and not for >> end-users), and that building edk2 already requires a quite sizeable set >> of packages installed (such as nasm, iasl, ...) So this feature is not >> meant for any random POSIX system. >> >> What I did miss in fact was that "GNU Make" didn't imply "/bin/bash": > > Yep, I can see how that was not obvious, and I also agree that: > >> Thus, the real fix here is to be explicit about the bash requirement. I >> should add >> >> SHELL=/bin/bash >> >> near the top of "Makefile.edk2". > > this should indeed force the use of bash for all shell snippets and > $(shell) invocations in that makefile (and let you get away with > 'source' instead of '.', as well as the use of 'local' within the > sourced functions). > Awesome, thank you. Laszlo