mirror of
https://github.com/RGBCube/serenity
synced 2025-06-01 12:08:14 +00:00

There have been multiple reports of Xcode 14.0 (based on upstream LLVM 14) segfaulting when compiling `LibCore/Process.cpp`. Let's require Xcode 14.3, which is a known good version based on LLVM 15. Note that Xcode 14.3 requires macOS Ventura, so users of Monterey or older are expected to get Homebrew Clang instead. Homebrew Clang 13 also suffers from the same crash. Although I have not tested on Linux, the backtrace points to the middle-end, so x86_64 is also likely to be affected. LLVM 14 was released 14 months ago, so it's not an unreasonable requirement.
96 lines
3 KiB
Bash
Executable file
96 lines
3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
set -e
|
|
|
|
SCRIPT_PATH="$(dirname "${0}")"
|
|
cd "${SCRIPT_PATH}"
|
|
|
|
BEST_CLANG_CANDIDATE=""
|
|
|
|
die() {
|
|
>&2 echo "die: $*"
|
|
exit 1
|
|
}
|
|
|
|
pick_clang() {
|
|
local BEST_VERSION=0
|
|
for CLANG_CANDIDATE in clang clang-14 clang-15 /opt/homebrew/opt/llvm/bin/clang ; do
|
|
if ! command -v $CLANG_CANDIDATE >/dev/null 2>&1; then
|
|
continue
|
|
fi
|
|
if $CLANG_CANDIDATE --version 2>&1 | grep "Apple clang" >/dev/null; then
|
|
echo "Skipping Apple clang, as Apple does not ship libfuzzer with Xcode..."
|
|
continue
|
|
fi
|
|
if ! $CLANG_CANDIDATE -dumpversion >/dev/null 2>&1; then
|
|
continue
|
|
fi
|
|
local VERSION=""
|
|
VERSION="$($CLANG_CANDIDATE -dumpversion)"
|
|
local MAJOR_VERSION="${VERSION%%.*}"
|
|
if [ "$MAJOR_VERSION" -gt "$BEST_VERSION" ]; then
|
|
BEST_VERSION=$MAJOR_VERSION
|
|
BEST_CLANG_CANDIDATE="$CLANG_CANDIDATE"
|
|
fi
|
|
done
|
|
if [ "$BEST_VERSION" -lt 14 ]; then
|
|
die "Please make sure that Clang version 14 or higher is installed."
|
|
fi
|
|
}
|
|
|
|
# Save flags for oss-fuzz to avoid fuzzing Tools/
|
|
# https://google.github.io/oss-fuzz/getting-started/new-project-guide/#temporarily-disabling-code-instrumentation-during-builds
|
|
CFLAGS_SAVE="$CFLAGS"
|
|
CXXFLAGS_SAVE="$CXXFLAGS"
|
|
unset CFLAGS
|
|
unset CXXFLAGS
|
|
export AFL_NOOPT=1
|
|
|
|
# FIXME: Replace these CMake invocations with a CMake superbuild?
|
|
echo "Building Lagom Tools..."
|
|
cmake -GNinja -B Build/tools \
|
|
-DBUILD_LAGOM=OFF \
|
|
-DCMAKE_INSTALL_PREFIX=Build/tool-install \
|
|
-Dpackage=LagomTools
|
|
ninja -C Build/tools install
|
|
|
|
# Restore flags for oss-fuzz
|
|
export CFLAGS="${CFLAGS_SAVE}"
|
|
export CXXFLAGS="${CXXFLAGS_SAVE}"
|
|
unset AFL_NOOPT
|
|
|
|
echo "Building Lagom Fuzzers..."
|
|
|
|
if [ "$#" -gt "0" ] && [ "--oss-fuzz" = "$1" ] ; then
|
|
echo "Building for oss-fuzz configuration..."
|
|
cmake -GNinja -B Build/fuzzers \
|
|
-DBUILD_LAGOM=ON \
|
|
-DBUILD_SHARED_LIBS=OFF \
|
|
-DENABLE_FUZZERS_OSSFUZZ=ON \
|
|
-DCMAKE_C_COMPILER="$CC" \
|
|
-DCMAKE_CXX_COMPILER="$CXX" \
|
|
-DCMAKE_CXX_FLAGS="$CXXFLAGS -DOSS_FUZZ=ON" \
|
|
-DLINKER_FLAGS="$LIB_FUZZING_ENGINE" \
|
|
-DCMAKE_PREFIX_PATH=Build/tool-install
|
|
ninja -C Build/fuzzers
|
|
cp Build/fuzzers/Fuzzers/Fuzz* "$OUT"/
|
|
elif [ "$#" -gt "0" ] && [ "--standalone" = "$1" ] ; then
|
|
echo "Building for standalone fuzz configuration..."
|
|
cmake -GNinja -B Build/lagom-fuzzers-standalone \
|
|
-DBUILD_LAGOM=ON \
|
|
-DENABLE_FUZZERS=ON \
|
|
-DCMAKE_PREFIX_PATH=Build/tool-install
|
|
ninja -C Build/lagom-fuzzers-standalone
|
|
else
|
|
echo "Building for local fuzz configuration..."
|
|
pick_clang
|
|
cmake -GNinja -B Build/lagom-fuzzers \
|
|
-DBUILD_LAGOM=ON \
|
|
-DENABLE_FUZZERS_LIBFUZZER=ON \
|
|
-DENABLE_ADDRESS_SANITIZER=ON \
|
|
-DENABLE_UNDEFINED_SANITIZER=ON \
|
|
-DCMAKE_PREFIX_PATH=Build/tool-install \
|
|
-DCMAKE_C_COMPILER=$BEST_CLANG_CANDIDATE \
|
|
-DCMAKE_CXX_COMPILER="${BEST_CLANG_CANDIDATE/clang/clang++}"
|
|
ninja -C Build/lagom-fuzzers
|
|
fi
|