annotate root-filesystem.sh @ 1786:0787ceb820bf draft 1.4.2

When x86-64 switched on NPTL in uClibc, distcc broke, and it turns out fully native compiles under qemu never worked due to qemu not quite emulating floating point right and confusing the perl build with zero not comparing equal to zero. As long as it's broken anyway, switch it over to musl and fix it up on that side. It's no longer worth trying to fix anything broken in uClibc, the project is dead. (I'm aware of uClibc-ng, and am treating it exactly the same way I treated the ecommstation reboot of OS/2.)
author Rob Landley <rob@landley.net>
date Fri, 11 Sep 2015 13:25:14 -0500
parents 7f1b9fb1099e
children f326dbd73bee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
177
6b4844b708b9 dash->bash.
Rob Landley <rob@landley.net>
parents: 164
diff changeset
1 #!/bin/bash
43
6d16887ec084 Intermediate snapshot. Doesn't work yet.
Rob Landley <rob@landley.net>
parents:
diff changeset
2
1116
2b68517f5b62 Break out simple-root-filesystem.sh and root-filesystem.sh (adding native-compiler.sh output), and use NO_NATIVE_COMPILER to determine which to use. Rename STATIC_CC_HOST to CROSS_HOST_ARCH.
Rob Landley <rob@landley.net>
parents: 1108
diff changeset
3 # Build a basic busybox+uClibc root filesystem for a given target.
888
626288dd5cf3 Lots of comments.
Rob Landley <rob@landley.net>
parents: 882
diff changeset
4
1128
e5f9681a8b3c Lots of comment updates. Add a NO_HOST_TOOLS=1 config option, and a few "time" calls to stages that didn't have them. Put native-compiler.sh after root-filesystem.sh in build so it's slightly easier to document.
Rob Landley <rob@landley.net>
parents: 1116
diff changeset
5 # Requires a cross-compiler (or simple-cross-compiler) in the $PATH or in
e5f9681a8b3c Lots of comment updates. Add a NO_HOST_TOOLS=1 config option, and a few "time" calls to stages that didn't have them. Put native-compiler.sh after root-filesystem.sh in build so it's slightly easier to document.
Rob Landley <rob@landley.net>
parents: 1116
diff changeset
6 # the build directory. In theory you can supply your own as long as the
e5f9681a8b3c Lots of comment updates. Add a NO_HOST_TOOLS=1 config option, and a few "time" calls to stages that didn't have them. Put native-compiler.sh after root-filesystem.sh in build so it's slightly easier to document.
Rob Landley <rob@landley.net>
parents: 1116
diff changeset
7 # prefix- name is correct.
e5f9681a8b3c Lots of comment updates. Add a NO_HOST_TOOLS=1 config option, and a few "time" calls to stages that didn't have them. Put native-compiler.sh after root-filesystem.sh in build so it's slightly easier to document.
Rob Landley <rob@landley.net>
parents: 1116
diff changeset
8
669
1cf41855bb85 More error checking.
Rob Landley <rob@landley.net>
parents: 661
diff changeset
9 source sources/include.sh || exit 1
1398
b74d36876c0a Replace read_arch_dir with load_target, which understands that sources/targets/$TARGET can be a file or a directory.
Rob Landley <rob@landley.net>
parents: 1358
diff changeset
10 load_target "$1"
783
db06a8c1bfed Lots of changes to move buildall.sh functionality into build.sh.
Rob Landley <rob@landley.net>
parents: 782
diff changeset
11 check_for_base_arch || exit 0
941
7dd3fb4dd333 Minor cleanups and comments, introduce check_prerequisite function.
Rob Landley <rob@landley.net>
parents: 937
diff changeset
12 check_prerequisite "${ARCH}-cc"
685
90ab1a1f4db5 Teach build not to rebuild base architecture toolchains. Factor out some common code while there.
Rob Landley <rob@landley.net>
parents: 675
diff changeset
13
658
dc5512d734f0 Actually put MANIFEST into mini-native.
Rob Landley <rob@landley.net>
parents: 633
diff changeset
14 # Determine which directory layout we're using
dc5512d734f0 Actually put MANIFEST into mini-native.
Rob Landley <rob@landley.net>
parents: 633
diff changeset
15
1727
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
16 mkdir -p "$STAGE_DIR"/{tmp,proc,sys,dev,home,mnt,root} &&
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
17 chmod a+rwxt "$STAGE_DIR/tmp" || dienow
1139
2c6d799f0451 Fix a dangling symlink that confuses root-filesystem.sh, and add some comments.
Rob Landley <rob@landley.net>
parents: 1133
diff changeset
18
1727
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
19 STAGE_USR="$STAGE_DIR/usr"
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
20
1727
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
21 # Having lots of repeated locations at / and also under /usr is silly, so
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
22 # symlink them together. (The duplication happened back in the 1970's
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
23 # when Ken and Dennis ran out of space on their PDP-11's root disk and
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
24 # leaked the OS into the disk containing the user home directories. It's
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
25 # been mindlessly duplicated ever since.)
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
26 for i in bin sbin lib etc
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
27 do
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
28 mkdir -p "$STAGE_USR/$i" && ln -s "usr/$i" "$STAGE_DIR/$i" || dienow
45c936d93711 Drop ROOT_NODIRS, it's not worth the complexity to support both layouts.
Rob Landley <rob@landley.net>
parents: 1708
diff changeset
29 done
395
c2b290c1df40 Upgrade BUILD_SHORT to make a small busybox+uClibc system in /usr, with top level symlinks (/bin, /lib, etc) and adjustments to boot script and run-emulator.
Rob Landley <rob@landley.net>
parents: 390
diff changeset
30
713
9282f84b31a1 Add NATIVE_TOOLCHAIN=only, to build _just_ the native toolchain (sae set of packages as the cross compiler, only --enable-shared and with uClibc++).
Rob Landley <rob@landley.net>
parents: 711
diff changeset
31 # Copy qemu setup script and so on.
9282f84b31a1 Add NATIVE_TOOLCHAIN=only, to build _just_ the native toolchain (sae set of packages as the cross compiler, only --enable-shared and with uClibc++).
Rob Landley <rob@landley.net>
parents: 711
diff changeset
32
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
33 cp -r "$SOURCES/root-filesystem/." "$STAGE_USR/" &&
1221
6a4968ae5ac8 Add new "/src/host-info" file to target, with CROSS_TARGET and KARCH values.
Rob Landley <rob@landley.net>
parents: 1206
diff changeset
34 echo -e "CROSS_TARGET=$CROSS_TARGET\nKARCH=$KARCH" > \
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
35 "$STAGE_USR/src/host-info" &&
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
36 cp "$SRCDIR"/MANIFEST "$STAGE_USR/src" || dienow
52
6d6551a37687 Add make to mini-native (required one more option switched on in uClibc), add
Rob Landley <rob@landley.net>
parents: 51
diff changeset
37
1151
b55c80be32b6 Add SIMPLE_ROOT_OVERLAY.
Rob Landley <rob@landley.net>
parents: 1140
diff changeset
38 # If user specified different files to put in the root filesystem, add them.
b55c80be32b6 Add SIMPLE_ROOT_OVERLAY.
Rob Landley <rob@landley.net>
parents: 1140
diff changeset
39 # (This overwrites existing files.)
b55c80be32b6 Add SIMPLE_ROOT_OVERLAY.
Rob Landley <rob@landley.net>
parents: 1140
diff changeset
40
b55c80be32b6 Add SIMPLE_ROOT_OVERLAY.
Rob Landley <rob@landley.net>
parents: 1140
diff changeset
41 if [ ! -z "$SIMPLE_ROOT_OVERLAY" ]
b55c80be32b6 Add SIMPLE_ROOT_OVERLAY.
Rob Landley <rob@landley.net>
parents: 1140
diff changeset
42 then
b55c80be32b6 Add SIMPLE_ROOT_OVERLAY.
Rob Landley <rob@landley.net>
parents: 1140
diff changeset
43 cd "$TOP"
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
44 tar -c -C "$SIMPLE_ROOT_OVERLAY" . | tar -x -C "$STAGE_DIR" || dienow
1151
b55c80be32b6 Add SIMPLE_ROOT_OVERLAY.
Rob Landley <rob@landley.net>
parents: 1140
diff changeset
45 fi
b55c80be32b6 Add SIMPLE_ROOT_OVERLAY.
Rob Landley <rob@landley.net>
parents: 1140
diff changeset
46
1708
b871f0e7b837 Build the compiler wrapper static if possible, and only copy libraries into the simple-root-filesystem if we need them.
Rob Landley <rob@landley.net>
parents: 1676
diff changeset
47 # Build toybox
52
6d6551a37687 Add make to mini-native (required one more option switched on in uClibc), add
Rob Landley <rob@landley.net>
parents: 51
diff changeset
48
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
49 STAGE_DIR="$STAGE_USR" build_section busybox
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
50 cp "$WORK"/config-busybox "$STAGE_USR"/src || dienow
1544
e2f722cc97a6 Make busybox build by default, switch override knob to BUSYBOX=1 to use defconfig busybox, always use toybox for oneit, cleanup/fix record-commands logic.
Rob Landley <rob@landley.net>
parents: 1511
diff changeset
51 build_section toybox
1133
1ad777637d2d Migrate oneit out of toybox into sources/toys as a standalone program, and fix it so pid 1 has / as its working directory so we can umount /home if necessary.
Rob Landley <rob@landley.net>
parents: 1128
diff changeset
52
83
8fb80545fe84 Move the "hello world" source into sources/toys. Build (in mini-native)
Rob Landley <rob@landley.net>
parents: 81
diff changeset
53 # Put statically and dynamically linked hello world programs on there for
315
7fe514d773b9 Install setup script even for BUILD_SHORT.
Rob Landley <rob@landley.net>
parents: 311
diff changeset
54 # test purposes.
83
8fb80545fe84 Move the "hello world" source into sources/toys. Build (in mini-native)
Rob Landley <rob@landley.net>
parents: 81
diff changeset
55
1676
0f4499211cfa Move hello.c into /src in the root filesystem so the instructions in the README to try building it aren't wrong.
Rob Landley <rob@landley.net>
parents: 1544
diff changeset
56 "${ARCH}-cc" "${SOURCES}/root-filesystem/src/hello.c" -Os $CFLAGS \
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
57 -o "$STAGE_USR/bin/hello-dynamic" || dienow
1036
e021bba5e22e Yank ugly STAGE_DIR adjustment and instead teach busybox/toybox bilds to auto-detect "bin" directory on install. (And while we're at it, don't build hello-dynamic on static-only system.)
Rob Landley <rob@landley.net>
parents: 1034
diff changeset
58
1083
cb4dbdb7f2cd Make BUILD_STATIC take comma separated list of packages, or "all" or "none". Default behavior should remain the same.
Rob Landley <rob@landley.net>
parents: 1062
diff changeset
59 if [ "$BUILD_STATIC" != none ]
1036
e021bba5e22e Yank ugly STAGE_DIR adjustment and instead teach busybox/toybox bilds to auto-detect "bin" directory on install. (And while we're at it, don't build hello-dynamic on static-only system.)
Rob Landley <rob@landley.net>
parents: 1034
diff changeset
60 then
1676
0f4499211cfa Move hello.c into /src in the root filesystem so the instructions in the README to try building it aren't wrong.
Rob Landley <rob@landley.net>
parents: 1544
diff changeset
61 "${ARCH}-cc" "${SOURCES}/root-filesystem/src/hello.c" -Os $CFLAGS -static \
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
62 -o "$STAGE_USR/bin/hello-static" || dienow
1708
b871f0e7b837 Build the compiler wrapper static if possible, and only copy libraries into the simple-root-filesystem if we need them.
Rob Landley <rob@landley.net>
parents: 1676
diff changeset
63 STATIC=--static
b871f0e7b837 Build the compiler wrapper static if possible, and only copy libraries into the simple-root-filesystem if we need them.
Rob Landley <rob@landley.net>
parents: 1676
diff changeset
64 else
b871f0e7b837 Build the compiler wrapper static if possible, and only copy libraries into the simple-root-filesystem if we need them.
Rob Landley <rob@landley.net>
parents: 1676
diff changeset
65 STATIC=
1036
e021bba5e22e Yank ugly STAGE_DIR adjustment and instead teach busybox/toybox bilds to auto-detect "bin" directory on install. (And while we're at it, don't build hello-dynamic on static-only system.)
Rob Landley <rob@landley.net>
parents: 1034
diff changeset
66 fi
944
fc134a13357e Largeish refactoring and cleanup of compiler build:
Rob Landley <rob@landley.net>
parents: 941
diff changeset
67
1472
a4673f17b7c0 Add record-commands wrapper and plumbing to target image, so you can record-commands /mnt/init in a native build.
Rob Landley <rob@landley.net>
parents: 1398
diff changeset
68 # Debug wrapper for use with /usr/src/record-commands.sh
a4673f17b7c0 Add record-commands wrapper and plumbing to target image, so you can record-commands /mnt/init in a native build.
Rob Landley <rob@landley.net>
parents: 1398
diff changeset
69
1708
b871f0e7b837 Build the compiler wrapper static if possible, and only copy libraries into the simple-root-filesystem if we need them.
Rob Landley <rob@landley.net>
parents: 1676
diff changeset
70 "${ARCH}-cc" "$SOURCES/toys/wrappy.c" -Os $CFLAGS $STATIC \
b871f0e7b837 Build the compiler wrapper static if possible, and only copy libraries into the simple-root-filesystem if we need them.
Rob Landley <rob@landley.net>
parents: 1676
diff changeset
71 -o "$STAGE_USR/bin/record-commands-wrapper" || dienow
1472
a4673f17b7c0 Add record-commands wrapper and plumbing to target image, so you can record-commands /mnt/init in a native build.
Rob Landley <rob@landley.net>
parents: 1398
diff changeset
72
1062
abc8ddd4d9f0 Don't have root-filesystem.sh suck in the native-compiler.sh output, have build.sh collate those instead before calling system-image.sh. (That way the root-filesystem.sh tarball does't include the native compiler output.)
Rob Landley <rob@landley.net>
parents: 1036
diff changeset
73 # Do we need shared libraries?
944
fc134a13357e Largeish refactoring and cleanup of compiler build:
Rob Landley <rob@landley.net>
parents: 941
diff changeset
74
1708
b871f0e7b837 Build the compiler wrapper static if possible, and only copy libraries into the simple-root-filesystem if we need them.
Rob Landley <rob@landley.net>
parents: 1676
diff changeset
75 if ! is_in_list toybox $BUILD_STATIC || ! is_in_list busybox $BUILD_STATIC
1062
abc8ddd4d9f0 Don't have root-filesystem.sh suck in the native-compiler.sh output, have build.sh collate those instead before calling system-image.sh. (That way the root-filesystem.sh tarball does't include the native compiler output.)
Rob Landley <rob@landley.net>
parents: 1036
diff changeset
76 then
abc8ddd4d9f0 Don't have root-filesystem.sh suck in the native-compiler.sh output, have build.sh collate those instead before calling system-image.sh. (That way the root-filesystem.sh tarball does't include the native compiler output.)
Rob Landley <rob@landley.net>
parents: 1036
diff changeset
77 echo Copying compiler libraries...
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
78 mkdir -p "$STAGE_USR/lib" || dienow
1062
abc8ddd4d9f0 Don't have root-filesystem.sh suck in the native-compiler.sh output, have build.sh collate those instead before calling system-image.sh. (That way the root-filesystem.sh tarball does't include the native compiler output.)
Rob Landley <rob@landley.net>
parents: 1036
diff changeset
79 (path_search \
abc8ddd4d9f0 Don't have root-filesystem.sh suck in the native-compiler.sh output, have build.sh collate those instead before calling system-image.sh. (That way the root-filesystem.sh tarball does't include the native compiler output.)
Rob Landley <rob@landley.net>
parents: 1036
diff changeset
80 "$("$ARCH-cc" --print-search-dirs | sed -n 's/^libraries: =*//p')" \
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
81 "*.so*" 'cp -H "$DIR/$FILE" "$STAGE_USR/lib/$FILE"' \
1062
abc8ddd4d9f0 Don't have root-filesystem.sh suck in the native-compiler.sh output, have build.sh collate those instead before calling system-image.sh. (That way the root-filesystem.sh tarball does't include the native compiler output.)
Rob Landley <rob@landley.net>
parents: 1036
diff changeset
82 || dienow) | dotprogress
1198
78e786334c5b Polish the strip logic a bit.
Rob Landley <rob@landley.net>
parents: 1178
diff changeset
83
78e786334c5b Polish the strip logic a bit.
Rob Landley <rob@landley.net>
parents: 1178
diff changeset
84 [ -z "$SKIP_STRIP" ] &&
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
85 "${ARCH}-strip" --strip-unneeded "$STAGE_USR"/lib/*.so
1034
27c38c82401d Move make, bash, and distcc builds into native-compiler.sh. (Break 'em out into sources/sections/*.build.)
Rob Landley <rob@landley.net>
parents: 1008
diff changeset
86 fi
944
fc134a13357e Largeish refactoring and cleanup of compiler build:
Rob Landley <rob@landley.net>
parents: 941
diff changeset
87
fc134a13357e Largeish refactoring and cleanup of compiler build:
Rob Landley <rob@landley.net>
parents: 941
diff changeset
88 # Clean up and package the result
713
9282f84b31a1 Add NATIVE_TOOLCHAIN=only, to build _just_ the native toolchain (sae set of packages as the cross compiler, only --enable-shared and with uClibc++).
Rob Landley <rob@landley.net>
parents: 711
diff changeset
89
1198
78e786334c5b Polish the strip logic a bit.
Rob Landley <rob@landley.net>
parents: 1178
diff changeset
90 [ -z "$SKIP_STRIP" ] &&
1511
e59de35d8437 Leave STAGE_DIR alone and add STAGE_USR instead.
Rob Landley <rob@landley.net>
parents: 1482
diff changeset
91 "${ARCH}-strip" "$STAGE_USR"/{bin/*,sbin/*}
53
3fd961e31444 Build a gcc wrapper for _target_, and add a "strip" command to halve the
Rob Landley <rob@landley.net>
parents: 52
diff changeset
92
783
db06a8c1bfed Lots of changes to move buildall.sh functionality into build.sh.
Rob Landley <rob@landley.net>
parents: 782
diff changeset
93 create_stage_tarball
576
036dbe218036 Add BASE_ARCH support, so a hardware architecture can specify a base architecture and just provide a different kernel.
Rob Landley <rob@landley.net>
parents: 572
diff changeset
94
50
5aeba79b8f5f Remove qemu build (it's in cross-compiler.sh now), move uClibc build right
Rob Landley <rob@landley.net>
parents: 46
diff changeset
95 # Color back to normal
52
6d6551a37687 Add make to mini-native (required one more option switched on in uClibc), add
Rob Landley <rob@landley.net>
parents: 51
diff changeset
96 echo -e "\e[0mBuild complete"