mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 13:27:35 +00:00
Build: Allow building serenityOS ext2 root filesystem on macOS host
This commit is contained in:
parent
b62dbcbf59
commit
49a789ad04
4 changed files with 82 additions and 10 deletions
|
@ -10,7 +10,10 @@ die() {
|
||||||
if [ "$(id -u)" != 0 ]; then
|
if [ "$(id -u)" != 0 ]; then
|
||||||
die "this script needs to run as root"
|
die "this script needs to run as root"
|
||||||
fi
|
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..."
|
echo "setting up disk image..."
|
||||||
qemu-img create _disk_image "${DISK_SIZE:-600}"m || die "couldn't create 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"
|
chown "$build_user":"$build_group" _disk_image || die "couldn't adjust permissions on disk image"
|
||||||
|
@ -22,7 +25,11 @@ echo "done"
|
||||||
|
|
||||||
printf "mounting filesystem... "
|
printf "mounting filesystem... "
|
||||||
mkdir -p mnt
|
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"
|
echo "done"
|
||||||
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
|
|
|
@ -24,7 +24,8 @@ echo "done"
|
||||||
printf "setting up device nodes... "
|
printf "setting up device nodes... "
|
||||||
mkdir -p mnt/dev
|
mkdir -p mnt/dev
|
||||||
mkdir -p mnt/dev/pts
|
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/tty0 c 4 0
|
||||||
mknod mnt/dev/tty1 c 4 1
|
mknod mnt/dev/tty1 c 4 1
|
||||||
mknod mnt/dev/tty2 c 4 2
|
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/ttyS1 c 4 65
|
||||||
mknod mnt/dev/ttyS2 c 4 66
|
mknod mnt/dev/ttyS2 c 4 66
|
||||||
mknod mnt/dev/ttyS3 c 4 67
|
mknod mnt/dev/ttyS3 c 4 67
|
||||||
mknod -m 666 mnt/dev/random c 1 8
|
mknod mnt/dev/random c 1 8
|
||||||
mknod -m 666 mnt/dev/null c 1 3
|
mknod mnt/dev/null c 1 3
|
||||||
mknod -m 666 mnt/dev/zero c 1 5
|
mknod mnt/dev/zero c 1 5
|
||||||
mknod -m 666 mnt/dev/full c 1 7
|
mknod mnt/dev/full c 1 7
|
||||||
mknod -m 666 mnt/dev/debuglog c 1 18
|
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/keyboard c 85 1
|
||||||
mknod mnt/dev/psaux c 10 1
|
mknod mnt/dev/psaux c 10 1
|
||||||
mknod -m 666 mnt/dev/audio c 42 42
|
mknod mnt/dev/audio c 42 42
|
||||||
mknod -m 666 mnt/dev/ptmx c 5 2
|
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/hda b 3 0
|
||||||
mknod mnt/dev/hdb b 3 1
|
mknod mnt/dev/hdb b 3 1
|
||||||
mknod mnt/dev/hdc b 4 0
|
mknod mnt/dev/hdc b 4 0
|
||||||
|
@ -66,7 +75,12 @@ chown -R 200:200 mnt/home/nona
|
||||||
echo "done"
|
echo "done"
|
||||||
|
|
||||||
printf "installing userland... "
|
printf "installing userland... "
|
||||||
|
|
||||||
|
if [ "$(uname)" != "Darwin" ]; then
|
||||||
find ../Userland/ -type f -executable -exec cp {} mnt/bin/ \;
|
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
|
chmod 4755 mnt/bin/su
|
||||||
echo "done"
|
echo "done"
|
||||||
|
|
||||||
|
|
25
ReadMe.md
25
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?
|
## How do I build and run this?
|
||||||
|
|
||||||
|
### Linux prerequisites
|
||||||
Make sure you have all the dependencies installed:
|
Make sure you have all the dependencies installed:
|
||||||
|
|
||||||
```bash
|
```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
|
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.
|
Go into the `Toolchain/` directory and run the **BuildIt.sh** script.
|
||||||
|
|
||||||
Once you've built the toolchain, go into the `Kernel/` directory, then run
|
Once you've built the toolchain, go into the `Kernel/` directory, then run
|
||||||
|
|
26
Toolchain/BuildFuseExt2.sh
Executable file
26
Toolchain/BuildFuseExt2.sh
Executable file
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue