Discussion:
[Toybox] [PATCH 1/2] macOS: use getconf rather than nproc for portability.
Rob Landley
2018-11-28 22:42:51 UTC
Permalink
Needed to build for macOS.
---
scripts/make.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/make.sh b/scripts/make.sh
index 306a7cd..59b1fd2 100755
--- a/scripts/make.sh
+++ b/scripts/make.sh
@@ -15,7 +15,7 @@ source ./configure
UNSTRIPPED="generated/unstripped/$(basename "$OUTNAME")"
# Try to keep one more cc invocation going than we have processors
-[ -z "$CPUS" ] && CPUS=$(($(nproc)+1))
+[ -z "$CPUS" ] && CPUS=$(($(getconf _NPROCESSORS_ONLN)+1))
Hmmm, I did that because:

$ taskset 1 nproc
1
$ taskset 1 getconf _NPROCESSORS_ONLN
8

Is there another...

$ taskset 1 getconf -a | grep NPROC
_NPROCESSORS_CONF 8
_NPROCESSORS_ONLN 8

Sigh.

The theory was if nproc doesn't exist then $(nproc) resolves to an empty string
and $((+1)) becomes 1 (not an error, I checked), so it should still work, just
single-threaded? And then you could "CPUS=1 make" to set it manually if necessary...

Is this an _optimization_ for macos, or is it a build break? (I used to have a
mac laptop but sent it to a college student on twitter who wore out her computer.)

Would this work instead?

if [ -z "$CPUS" ]
then
# nproc respects taskset, fall back to getconf for macos
[ ! -z "$(type -P nproc)" ] && CPUS=$(($(nproc)+1)) ||
CPUS=$(($(getconf _NPROCESSORS_ONLN))
fi

(I just dug up an aboriginal linux image and confirmed that type -P exists in
bash 2.05b from the dawn of time. Now with extra shellshock! I used to use which
but Red Hat broke it so their version prints out crap when it _doesn't_ find
stuff. The <strike>aristocrats</strike> people behind systemd!)
if [ -z "$SED" ]
then
That was put in for macos previously. I _thought_ this worked...

Hmmm... Toybox has a bootstrap issue where it provides tools that can build
toybox but sometimes has to run in environments that don't have those tools. I
keep thinking there should be some kind of build script that builds _just_ the
tools needed to build toybox, without requiring a configure step. Unfortunately,
$CFLAGS and library probes and such remain fiddly enough I haven't done it yet,
although I should be able to come up with a "no frills" hardwired build that's
portable-ish, for _just_ the build tools? (Yeah, which tools are the build
tools? That's mkroot territoy...)

And this wouldn't help macos because the resulting nproc (calling
sched_getaffinity()) wouldn't _run_ on macos. (Sed probably would, unless its
libc's regex was crazy...)

Rob
Rob Landley
2018-11-29 00:43:30 UTC
Permalink
yeah, sed seems to work okay. right now (with a bunch of source hacks
that i'll try to clean up and send to you) i have the following subset
basename cat chmod cmp comm cut dirname dos2unix du echo egrep false
fgrep file grep head help hostname id ln md5sum mkdir mktemp od paste
patch pwd readlink realpath rm rmdir sed setsid sha1sum sleep sort
tee timeout true uname uniq unix2dos wc whoami xargs xxd
(note that i say "building". hostname at least doesn't work yet.)
I wonder if anybody has a macosx dev environment I could ssh into to test stuff out?

I tried to boot Darwin under qemu rather a lot, but as with BSD:

https://landley.net/notes-2007.html#28-11-2007
https://lists.gnu.org/archive/html/qemu-devel/2008-02/msg00443.html

I eventually lost interest...

Rob
Rob Landley
2018-11-29 01:33:06 UTC
Permalink
yeah, bitrot is my big fear too. i really don't want to have to
actually get a mac. (even if i'm not paying for it, this current
macbook pro genuinely is the most awful laptop i've ever used.)
but i suspect i could always just update the mac toybox prebuilt "on
demand", which i assume would work out to "once every couple of years
or so". obviously i'll admit that to the build folks up front though
:-)
Meanwhile I continue to ponder porting android to Hexagon and such, and would
want it to "just work" as much as possible. (Yeah bionic would need new stuff,
but llvm already has https://twitter.com/landley/status/1062570074752589824 ) So
"build from source in a genericish way" is worth extra cycles from me when it's
low hanging fruit...

I'm told the mac mini is back. Alas their cheapest/crappiest one is $800 so I'm
not likely to get it. But as an ssh-able test machine, there should be one in a
lab somewhere? (How do you regression test the mac build now?)

Rob
David Seikel
2018-11-29 06:34:13 UTC
Permalink
This post might be inappropriate. Click to display it.
Loading...