构建说明
要运行Darling,您必须使用64位x86 Linux发行版。Darling不能在32位x86系统上使用,甚至不能运行32位应用程序。
依赖项
要编译Darling,需要Clang;至少需要Clang 11。您可以通过编辑Toolchain.cmake来强制使用特定版本的Clang(如果系统上安装了它)。
还需要至少4GB的RAM进行构建。使用交换空间可能有助于减少内存使用,但可能会显着减慢构建速度。
需要Linux 5.0或更高版本。
Debian 10/11
sudo apt install cmake clang-6.0 bison flex xz-utils libfuse-dev libudev-dev pkg-config \
libc6-dev-i386 libcap2-bin git git-lfs libglu1-mesa-dev libcairo2-dev \
libgl1-mesa-dev libtiff5-dev libfreetype6-dev libxml2-dev libegl1-mesa-dev libfontconfig1-dev \
libbsd-dev libxrandr-dev libxcursor-dev libgif-dev libpulse-dev libavformat-dev libavcodec-dev \
libswresample-dev libdbus-1-dev libxkbfile-dev libssl-dev llvm-dev
Debian 12
sudo apt install cmake clang bison flex xz-utils libfuse-dev libudev-dev pkg-config \
libc6-dev-i386 libcap2-bin git git-lfs libglu1-mesa-dev libcairo2-dev \
libgl1-mesa-dev libtiff5-dev libfreetype6-dev libxml2-dev libegl1-mesa-dev libfontconfig1-dev \
libbsd-dev libxrandr-dev libxcursor-dev libgif-dev libpulse-dev libavformat-dev libavcodec-dev \
libswresample-dev libdbus-1-dev libxkbfile-dev libssl-dev llvm-dev
Debian Testing
sudo apt install cmake clang-9 bison flex xz-utils libfuse-dev libudev-dev pkg-config \
libc6-dev-i386 libcap2-bin git git-lfs libglu1-mesa-dev libcairo2-dev \
libgl1-mesa-dev libtiff5-dev libfreetype6-dev libxml2-dev libegl1-mesa-dev libfontconfig1-dev \
libbsd-dev libxrandr-dev libxcursor-dev libgif-dev libpulse-dev libavformat-dev libavcodec-dev \
libswresample-dev libdbus-1-dev libxkbfile-dev libssl-dev llvm-dev
Ubuntu 20.04:
sudo apt install cmake clang-12 bison flex libfuse-dev libudev-dev pkg-config libc6-dev-i386 \
gcc-multilib libcairo2-dev libgl1-mesa-dev libglu1-mesa-dev libtiff5-dev \
libfreetype6-dev git git-lfs libelf-dev libxml2-dev libegl1-mesa-dev libfontconfig1-dev \
libbsd-dev libxrandr-dev libxcursor-dev libgif-dev libavutil-dev libpulse-dev \
libavformat-dev libavcodec-dev libswresample-dev libdbus-1-dev libxkbfile-dev \
libssl-dev llvm-distutils
Ubuntu 22.04:
sudo apt install cmake automake clang-15 bison flex libfuse-dev libudev-dev pkg-config libc6-dev-i386 \
gcc-multilib libcairo2-dev libgl1-mesa-dev curl libglu1-mesa-dev libtiff5-dev \
libfreetype6-dev git git-lfs libelf-dev libxml2-dev libegl1-mesa-dev libfontconfig1-dev \
libbsd-dev libxrandr-dev libxcursor-dev libgif-dev libavutil-dev libpulse-dev \
libavformat-dev libavcodec-dev libswresample-dev libdbus-1-dev libxkbfile-dev \
libssl-dev libstdc++-12-dev
Arch Linux & Manjaro:
安装依赖项:
sudo pacman -S --needed make cmake clang flex bison icu fuse gcc-multilib \
lib32-gcc-libs pkg-config fontconfig cairo libtiff mesa glu llvm libbsd libxkbfile \
libxcursor libxext libxkbcommon libxrandr ffmpeg git git-lfs
Fedora and CentOS
sudo dnf install make cmake clang bison dbus-devel flex glibc-devel.i686 fuse-devel \
systemd-devel elfutils-libelf-devel cairo-devel freetype-devel.{x86_64,i686} \
libjpeg-turbo-devel.{x86_64,i686} fontconfig-devel.{x86_64,i686} libglvnd-devel.{x86_64,i686} \
mesa-libGL-devel.{x86_64,i686} mesa-libEGL-devel.{x86_64,i686} mesa-libGLU-devel.{x86_64,i686} \
libtiff-devel libxml2-devel libbsd-devel git git-lfs libXcursor-devel \
libXrandr-devel giflib-devel pulseaudio-libs-devel libxkbfile-devel \
openssl-devel llvm libcap-devel libavcodec-free-devel libavformat-free-devel
OpenSUSE Tumbleweed
需要仅使用64位组件
构建Darling。请参见Build Options以获取说明。
sudo zypper install make cmake-full clang10 bison flex python-base glibc fuse-devel \
libsystemd0 libelf1 cairo-devel libfreetype6 libjpeg-turbo libfontconfig1 libglvnd \
Mesa-libGL-devel Mesa-libEGL-devel libGLU1 libxml2-tools libbsd-devel git git-lfs \
libXcursor-devel giflib-devel ffmpeg-4 ffmpeg-4-libavcodec-devel \
ffmpeg-4-libavformat-devel libpulse-devel pulseaudio-utils libxkbfile-devel openssl \
llvm libcap-progs libtiff-devel libjpeg8-devel libXrandr-devel dbus-1-devel glu-devel \
ffmpeg-4-libswresample-devel
Alpine Linux
确保启用community存储库。Alpine还不支持32位构建,因此请确保禁用它。
sudo apk add cmake clang bison flex xz fuse-dev pkgconfig libcap git git-lfs \
python3 glu-dev cairo-dev mesa-dev tiff-dev freetype-dev libxml2-dev fontconfig-dev \
libbsd-dev libxrandr-dev libxcursor-dev giflib-dev pulseaudio-dev ffmpeg-dev dbus-dev \
libxkbfile-dev openssl-dev libexecinfo-dev make gcc g++ xdg-user-dirs
这些是在Alpine上构建和运行Darling所需的最低要求。当然,如果您想运行GUI应用程序,您还需要一个桌面环境。
获取源代码
Darling使用git-lfs。如果需要,请按照官方说明进行设置。
由于Darling广泛使用Git子模块,因此您不能使用普通的git clone。请像这样克隆:
git clone --recursive https://github.com/darlinghq/darling.git
注意:源代码树需要多达5GB的磁盘空间!
更新源代码
如果您已经克隆了Darling并希望获取最新更改,请在源根目录执行以下操作:
git lfs install
git pull
git submodule update --init --recursive
构建
Darling的构建系统是CMake。默认情况下,CMake生成Makefiles。
注意:构建可能需要高达16GB的磁盘空间!然后,Darling的安装本身最多占用1GB。
构建和安装
现在让我们构建Darling:
# 进入克隆的源代码目录
cd darling
# 删除之前安装的Darling
tools/uninstall
# 创建构建目录
mkdir build && cd build
# 配置构建
cmake ..
# 构建和安装Darling
make
sudo make install
构建选项
禁用32位库
Darling通常会构建所有库的32位和64位版本,以使32位程序在Darling下运行。但是,这意味着Darling还需要某些本机库的32位版本。如果您无法设置多库环境,或者只想构建64位组件,请在配置时使用-DTARGET_i386=OFF
来禁用32位组件的构建。
并行构建
另一种加速构建的方法是使用多个作业运行make。为此,请运行make -j8
,其中8是您选择的当前作业数。通常,避免运行超过机器CPU核心数量两倍的作业。
“统一”JavaScriptCore构建
如果您仍然想构建JavaScriptCore并且有一些可用的RAM,JavaScriptCore还支持一种称为“统一构建”的构建模式。这种构建模式可以将JSC的构建时间减半,但代价是导致略高的RAM使用率。在Darling中,可以通过在配置构建时添加-DJSC_UNIFIED_BUILD=ON
来启用此构建模式。
Ninja构建系统
作为make的替代方案,ninja默认支持并行处理,并具有更好的进度指示器。
按照正常的构建说明进行,直到达到cmake ..
步骤。将其替换为cmake .. -GNinja
。现在,您可以使用ninja而不是make进行构建。
Ninja无法链接libcsu
如果您使用Ninja,库“libcsu”可能无法链接。解决方案是删除位于“./src/external/csu/libcsu.a”的库,然后重试。有关更多信息,请参见此问题。
调试构建
默认情况下,CMake设置了一个非调试、非发布的构建。如果运行LLDB并遇到指示缺少调试符号的消息,请确保您正在进行调试构建。为此,请使用-DCMAKE_BUILD_TYPE=Debug
。
单元测试
Darling有一些有限的单元测试。这些默认情况下不会构建,但可以使用-DENABLE_TESTS=1
启用。然后,这些测试将安装到Darling容器内的/usr/libexec
目录中。
额外的非标准二进制文件
Darling尽可能坚持标准的macOS安装。但是,如果您想构建和安装一些其他软件包(例如GNU tar),您可以添加-DADDITIONAL_PACKAGES=ON
。
自定义安装前缀
要将Darling安装在自定义目录中,请使用CMAKE_INSTALL_PREFIX CMake选项。但是,Darling安装不是可移植的,因为安装前缀硬编码到darling可执行文件中。这是有意的。如果您移动了Darling安装,您将收到以下错误消息:
Cannot mount overlay: No such file or directory
Cannot open mnt namespace file: No such file or directory
如果您希望正确移动Darling安装,唯一受支持的选项是卸载当前的Darling安装,然后使用不同的安装前缀重新构建Darling。
手动设置CMAKE_C_COMPILER和CMAKE_CXX_COMPILER
如果CMAKE_C_COMPILER和CMAKE_CXX_COMPILER尚未设置,配置脚本将尝试定位clang/clang++。
通常,您无需担心设置这些变量。尽管如此,您可以在配置构建时添加-DCMAKE_C_COMPILER="/absolute/path/to/clang"
和-DCMAKE_CXX_COMPILER="/absolute/path/to/clang++"
,以强制配置脚本使用特定的clang编译器。
仅构建特定组件
默认情况下,几乎构建了Darling的所有组件,类似于完整的macOS安装。但是,您还可以选择仅使用CMake中的COMPONENTS配置选项构建Darling的某些组件。这是要构建的组件的逗号分隔列表。默认情况下,COMPONENTS设置为stock(其中包括各种其他组件)。目前已识别以下组件:
基本组件
core
- 构建darlingserver、mldr、launchd和libSystem(以及一些主机端可执行文件)。这是运行Darling下的可执行文件所需的最小目标集。请注意,大多数可执行文件依赖于各种其他程序和系统服务,这些服务不由此组件提供;这将仅支持极简的可执行文件(例如“Hello world”可执行文件)。system
- 包括core和进入shell所需的一切(包括一个shell:bash和zsh),并执行基本系统功能(即基本的系统守护程序)。 脚本运行时 - 请注意,您可能还希望将这些与system一起使用,但这不是绝对必需的python
- 包括core和Python 2.7运行时和标准库,以及需要Python的其他程序。ruby
- 包括core和Ruby 2.6运行时和标准库,以及需要Ruby的其他程序。perl
- 包括core和Perl 5.18和5.28运行时和标准库,以及需要Perl的其他程序。 CLI组件cli
- 包括system和大多数独立的命令行程序(即不需要额外运行时或复杂框架/库的程序)。 请注意,这不包括Vim;这是因为Vim依赖于AppKit和CoreServices(这被认为是GUI组件)。但是,cli_dev组件包括这些框架,因此它还包括Vim。cli_dev
- 包括cli、python、ruby和perl,以及通常被视为GUI目标的一些其他目标。这些额外的目标对Xcode CLI工具的某些部分是必要的。如果您想在命令行上使用Xcode构建和开发软件,并且不需要/不想要完整的GUI安装,则这是您想要的组件。cli_extra
- 包括cli和在标准macOS安装上未安装的一些其他程序(例如GNU tar)。 GUI组件 - 请注意,这些组件中没有一个包括cli或任何其他与CLI相关的组件。一些应用程序可能依赖于某些CLI程序或脚本运行时的可用性,因此您可能还需要自己包括cli、python、ruby等。gui
- 包括system和运行基本Cocoa、Metal和OpenGL应用程序所需的一切。请注意,这仅包括GUI应用程序所需的最小内容;大多数应用程序还将需要其他框架(例如音频、视频、位置等)。gui_frameworks
- 包括gui和由Cocoa应用程序依赖的许多与GUI相关的框架。请注意,此组件仅包括非存根框架。gui_stubs
- 包括gui_frameworks和许多带存根的与GUI相关的框架。 重型框架 - 这些是可以显著减缓构建和/或在安装后占用大量空间但对于绝大多数程序而言是不必要的框架。jsc
- JavaScriptCore - 这是用于执行JavaScript代码的大型框架,主要用于Web浏览器。这通常会使构建延迟额外的30分钟到1小时。webkit
- WebKit - 这是另一个大型框架,仅用于Web浏览器(嵌入式或其他
)。 伞形组件 - 这些是仅包含其他组件的组件,旨在方便选择常见构建的大片组件。
stock
- 包括cli、python、ruby、perl和gui_stubs(这些隐含地包括core、system、gui和gui_frameworks)。这是标准构建所选择的默认组件,旨在匹配默认与标准macOS安装一起包含的软件。all
- 包括所有其他组件。换句话说,这包括stock、jsc、webkit和cli_extra。
已知问题
BackBox 如果您的发行版是Backbox,并且在构建过程中遇到问题,请尝试以下命令:
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-6.0 600
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-6.0 600
SELinux 在SELinux上,启动Darling时可能会看到以下错误:
Cannot open mnt namespace file: No such file or directory
要解决此问题,请尝试以下命令:setsebool -P mmap_low_allowed 1
。
损坏的符号链接 Darling在很大程度上依赖符号链接。在支持此功能的文件系统上构建Darling非常重要。
如果您尽管在支持符号链接的文件系统上下载和构建Darling,仍然遇到问题,请检查您的git配置,确保您没有故意禁用它(例如,core.symlinks=false
)。
文件系统支持
Darling使用overlayfs在macOS样式的根文件系统之上实现前缀。虽然overlayfs对较低的(只读的)文件系统(其中包含您的/usr
目录)不太挑剔,但对于较高的文件系统(除非您覆盖DPREFIX
环境变量,否则为您的主目录)有更严格的要求。
引用内核文档:
较低的文件系统可以是Linux支持的任何文件系统,也不需要是可写的。较低的文件系统甚至可以是另一个overlayfs。较高的文件系统通常将是可写的,如果是可写的,它必须支持创建
trusted.*
扩展属性,并且必须在readdir
响应中提供有效的d_type
,因此NFS不适用。
除了不支持NFS之外,已知ZFS和eCryptfs加密存储也无法工作。
如果尝试使用不受支持的文件系统,将打印以下错误:
Cannot mount overlay: Invalid argument