Explorar o código

Build: Allow building serenityOS ext2 root filesystem on macOS host

Stefano Cristiano %!s(int64=5) %!d(string=hai) anos
pai
achega
49a789ad04
Modificáronse 4 ficheiros con 82 adicións e 10 borrados
  1. 9 2
      Kernel/build-image-qemu.sh
  2. 22 8
      Kernel/build-root-filesystem.sh
  3. 25 0
      ReadMe.md
  4. 26 0
      Toolchain/BuildFuseExt2.sh

+ 9 - 2
Kernel/build-image-qemu.sh

@@ -10,7 +10,10 @@ die() {
 if [ "$(id -u)" != 0 ]; then
     die "this script needs to run as root"
 fi
-
+if [ "$(uname)" = "Darwin" ]; then
+    export PATH="/usr/local/opt/e2fsprogs/bin:$PATH"
+    export PATH="/usr/local/opt/e2fsprogs/sbin:$PATH"
+fi
 echo "setting up disk image..."
 qemu-img create _disk_image "${DISK_SIZE:-600}"m || die "couldn't create disk image"
 chown "$build_user":"$build_group" _disk_image || die "couldn't adjust permissions on disk image"
@@ -22,7 +25,11 @@ echo "done"
 
 printf "mounting filesystem... "
 mkdir -p mnt
-mount _disk_image mnt/ || die "couldn't mount filesystem"
+if [ "$(uname)" = "Darwin" ]; then
+    fuse-ext2 _disk_image mnt -o rw+,allow_other,uid=501,gid=20 || die "couldn't mount filesystem"
+else
+    mount _disk_image mnt/ || die "couldn't mount filesystem"
+fi
 echo "done"
 
 cleanup() {

+ 22 - 8
Kernel/build-root-filesystem.sh

@@ -24,7 +24,8 @@ echo "done"
 printf "setting up device nodes... "
 mkdir -p mnt/dev
 mkdir -p mnt/dev/pts
-mknod -m 666 mnt/dev/fb0 b 29 0
+mknod mnt/dev/fb0 b 29 0
+chmod 666 mnt/dev/fb0
 mknod mnt/dev/tty0 c 4 0
 mknod mnt/dev/tty1 c 4 1
 mknod mnt/dev/tty2 c 4 2
@@ -33,15 +34,23 @@ mknod mnt/dev/ttyS0 c 4 64
 mknod mnt/dev/ttyS1 c 4 65
 mknod mnt/dev/ttyS2 c 4 66
 mknod mnt/dev/ttyS3 c 4 67
-mknod -m 666 mnt/dev/random c 1 8
-mknod -m 666 mnt/dev/null c 1 3
-mknod -m 666 mnt/dev/zero c 1 5
-mknod -m 666 mnt/dev/full c 1 7
-mknod -m 666 mnt/dev/debuglog c 1 18
+mknod mnt/dev/random c 1 8
+mknod mnt/dev/null c 1 3
+mknod mnt/dev/zero c 1 5
+mknod mnt/dev/full c 1 7
+mknod mnt/dev/debuglog c 1 18
+# random, is failing (randomly) on fuse-ext2 on macos :)
+chmod 666 mnt/dev/random || true 
+chmod 666 mnt/dev/null
+chmod 666 mnt/dev/zero
+chmod 666 mnt/dev/full
+chmod 666 mnt/dev/debuglog
 mknod mnt/dev/keyboard c 85 1
 mknod mnt/dev/psaux c 10 1
-mknod -m 666 mnt/dev/audio c 42 42
-mknod -m 666 mnt/dev/ptmx c 5 2
+mknod mnt/dev/audio c 42 42
+mknod mnt/dev/ptmx c 5 2
+chmod 666 mnt/dev/audio
+chmod 666 mnt/dev/ptmx
 mknod mnt/dev/hda b 3 0
 mknod mnt/dev/hdb b 3 1
 mknod mnt/dev/hdc b 4 0
@@ -66,7 +75,12 @@ chown -R 200:200 mnt/home/nona
 echo "done"
 
 printf "installing userland... "
+
+if [ "$(uname)" != "Darwin" ]; then
 find ../Userland/ -type f -executable -exec cp {} mnt/bin/ \;
+else
+find ../Userland/ -type f -perm +111 -exec cp {} mnt/bin/ \;
+fi
 chmod 4755 mnt/bin/su
 echo "done"
 

+ 25 - 0
ReadMe.md

@@ -64,6 +64,7 @@ There's also a [Patreon](https://www.patreon.com/serenityos) if you would like t
 
 ## How do I build and run this?
 
+### Linux prerequisites
 Make sure you have all the dependencies installed:
 
 ```bash
@@ -77,6 +78,30 @@ sudo apt-get install gcc-8 g++-8
 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 800 --slave /usr/bin/g++ g++ /usr/bin/g++-8
 ```
 
+### macOS prerequisites
+Make sure you have all the dependencies installed:
+```bash
+brew install coreutils
+brew install qemu
+brew install wget
+brew install e2fsprogs
+brew install m4
+brew install autoconf
+brew install libtool
+brew install automake
+brew cask install osxfuse
+Toolchain/BuildFuseExt2.sh
+```
+
+Notes: 
+- fuse-ext2 is not available as brew formula so it must be installed using `BuildFuseExt2.sh`
+- Xcode and `xcode-tools` must be installed (`git` is required by some scripts)
+- coreutils is needed to build gcc cross compiler
+- qemu is needed to run the compiled OS image. You can also build it using the `BuildQemu.sh` script
+- osxfuse, e2fsprogs, m4, autoconf, automake, libtool and `BuildFuseExt2.sh` are needed if you want to build the root filesystem disk image natively on macOS. This allows mounting an EXT2 fs and also installs commands like `mke2fs` that are not available on stock macOS. 
+- If you install some commercial EXT2 macOS fs handler instead of osxfuse and fuse-ext2, you will need to `brew install e2fsprogs` to obtain `mke2fs` anyway.
+
+### Build
 Go into the `Toolchain/` directory and run the **BuildIt.sh** script.
 
 Once you've built the toolchain, go into the `Kernel/` directory, then run

+ 26 - 0
Toolchain/BuildFuseExt2.sh

@@ -0,0 +1,26 @@
+#!/bin/sh
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+export PATH="/usr/local/opt/m4/bin:$PATH"
+
+die() {
+    echo "die: $*"
+    exit 1
+}
+
+if [[ "$OSTYPE" != "darwin"* ]]; then
+    die "This script makes sense to be run only on macOS"
+fi
+
+mkdir -p "$DIR"/Tarballs
+pushd "$DIR"/Tarballs
+
+if [ ! -d fuse-ext2 ]; then
+    git clone https://github.com/alperakcan/fuse-ext2.git	
+fi
+
+cd fuse-ext2
+./autogen.sh
+CFLAGS="-I/usr/local/include/osxfuse/ -I/$(brew --prefix e2fsprogs)/include" LDFLAGS="-L$(brew --prefix e2fsprogs)/lib" ./configure
+make
+sudo make install
+popd