diff --git a/Kernel/build-image-qemu.sh b/Kernel/build-image-qemu.sh index 4a32a83902..760b75da60 100755 --- a/Kernel/build-image-qemu.sh +++ b/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() { diff --git a/Kernel/build-root-filesystem.sh b/Kernel/build-root-filesystem.sh index d9a6f34e44..bf1bc386e8 100755 --- a/Kernel/build-root-filesystem.sh +++ b/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" diff --git a/ReadMe.md b/ReadMe.md index df4601002b..6351fdd39f 100644 --- a/ReadMe.md +++ b/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 diff --git a/Toolchain/BuildFuseExt2.sh b/Toolchain/BuildFuseExt2.sh new file mode 100755 index 0000000000..3876f58b37 --- /dev/null +++ b/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