Documentation: Add start of a Porting guide

This commit is contained in:
Andrew Kaster 2024-10-10 11:18:22 -06:00 committed by Andreas Kling
parent 9dd7b901ab
commit 3b2b86303f
Notes: github-actions[bot] 2024-10-11 07:09:04 +00:00

83
Documentation/Porting.md Normal file
View file

@ -0,0 +1,83 @@
# Porting to new Operating System Environments
This document outlines the steps required to port Ladybird to a new OS environment, and expectations for such ports to
be accepted into the mainline repository.
## Types of Ports
There are two types of ports that can be made to Ladybird:
- Chrome port: We define the "browser chrome" as the UI layer. This includes the browser window, tabs, address bar, etc.
- Platform port: This includes the underlying platform-specific code that interacts with the OS. This includes things like
file I/O, networking, and process management.
### Chrome Ports
There are currently three supported chrome ports:
- Qt6: The generic chrome port.
- AppKit/Cocoa: The macOS native port, which uses the AppKit framework.
- Headless: A headless port that does not have a UI, used for testing.
### Platform Ports
There are currently two supported platform ports:
- GNU/Linux: The Linux platform port that may work on other POSIX platforms
- macOS: The macOS platform port
Many other POSIX desktop platforms are known to work, or have worked in the past, but are not officially supported.
These include Alpine Linux, FreeBSD, OpenBSD, and Haiku. Support for these Unixen is community-supported, meaning there
is no regular CI guaranteeing that each master commit keeps them working. Patches to bring them back in line
are welcome!
There is currently one in progress platform port:
- Android: The Android platform port, using the Android SDK/NDK directly.
## Porting Steps
### Chrome ports
Chrome ports mostly concern themselves with the UI layer. This means the main Ladybird process, using LibWebView.
To create a new Ladybird chrome, you will need to implement a new `WebView::ViewImplementation` subclass.
ViewImplementation is the main interface between the UI process and WebContent processes. It is expected that each tab
of the browser will have its own WebContent process. This is all managed by the WebView layer.
Each chrome must also subclass `WebView::Application` to add any chrome-specific command-line flags.
TODO: Explain any more details that are necessary
### Platform ports
Platform ports concern themselves with the underlying OS-specific code. In Ladybird, this code is largely contained in
the AK and LibCore libraries.
AK is the standard template library for Ladybird. The first step of a new platform port is a new platform define in
`AK/Platform.h`. This define will be used to conditionally compile platform-specific code.
In AK, the most likely class to need platform-specific code is `AK::StackInfo`.
LibCore is an abstraction over POSIX. It contains classes to wrap lower level OS functionality into APIs that are
comfortable for Ladybird developers to use. The most likely place to need adjustment is `Core::System`, followed by
`Core::Process` and `Core::Socket`.
Ladybird makes heavy use of IPC, and the IPC layer is in `LibIPC`. This layer is mostly platform-agnostic, but there are
some platform-specific details in LibCore that may need to be adjusted. The IPC system is based on Unix domain sockets,
so any platform that supports Unix domain sockets should be able to use the IPC system out of the box.
## Special Consideration
### Windows
Over the years excitement about a native windows port has waxed and waned. The main issue is that Ladybird is built on
top of LibCore, which is a POSIX abstraction. Windows is not POSIX, and so a Windows port requires a significant amount
of effort to implement.
To limit the scope of the work, we have decided that a Windows port will need the following properties:
- Target x86_64-windows-msvc and arm64-windows-msvc only. We are not interested in accepting patches to make MinGW or MSYS2 work.
- The port must use `clang-cl.exe` as the compiler. We are not interested in accepting patches to make MSVC work.
- Platform `#ifdef`s must stay within AK and LibCore, with a few exceptions in LibWebView.
- Prefer separate cpp files with the same interface to `#ifdef`s within a single file.
- Avoid `#ifdef`s in headers, as much as possible.