BuildFuzzers.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #!/usr/bin/env bash
  2. set -e
  3. SCRIPT_PATH="$(dirname "${0}")"
  4. cd "${SCRIPT_PATH}"
  5. BEST_CLANG_CANDIDATE=""
  6. die() {
  7. >&2 echo "die: $*"
  8. exit 1
  9. }
  10. pick_clang() {
  11. local BEST_VERSION=0
  12. for CLANG_CANDIDATE in clang clang-17 clang-18 /opt/homebrew/opt/llvm/bin/clang ; do
  13. if ! command -v $CLANG_CANDIDATE >/dev/null 2>&1; then
  14. continue
  15. fi
  16. if $CLANG_CANDIDATE --version 2>&1 | grep "Apple clang" >/dev/null; then
  17. echo "Skipping Apple clang, as Apple does not ship libfuzzer with Xcode..."
  18. continue
  19. fi
  20. if ! $CLANG_CANDIDATE -dumpversion >/dev/null 2>&1; then
  21. continue
  22. fi
  23. local VERSION=""
  24. VERSION="$($CLANG_CANDIDATE -dumpversion)"
  25. local MAJOR_VERSION="${VERSION%%.*}"
  26. if [ "$MAJOR_VERSION" -gt "$BEST_VERSION" ]; then
  27. BEST_VERSION=$MAJOR_VERSION
  28. BEST_CLANG_CANDIDATE="$CLANG_CANDIDATE"
  29. fi
  30. done
  31. if [ "$BEST_VERSION" -lt 15 ]; then
  32. die "Please make sure that Clang version 15 or higher is installed."
  33. fi
  34. }
  35. # Save flags for oss-fuzz to avoid fuzzing Tools/
  36. # https://google.github.io/oss-fuzz/getting-started/new-project-guide/#temporarily-disabling-code-instrumentation-during-builds
  37. CFLAGS_SAVE="$CFLAGS"
  38. CXXFLAGS_SAVE="$CXXFLAGS"
  39. unset CFLAGS
  40. unset CXXFLAGS
  41. export AFL_NOOPT=1
  42. if [ "$#" -gt "0" ] && [ "--oss-fuzz" = "$1" ] ; then
  43. CXXFLAGS="$CXXFLAGS -DOSS_FUZZ=ON"
  44. fi
  45. # FIXME: Replace these CMake invocations with a CMake superbuild?
  46. echo "Building Lagom Tools..."
  47. cmake -GNinja -B Build/tools \
  48. -DLAGOM_TOOLS_ONLY=ON \
  49. -DCMAKE_CXX_FLAGS="$CXXFLAGS" \
  50. -DCMAKE_INSTALL_PREFIX=Build/tool-install \
  51. -Dpackage=LagomTools
  52. ninja -C Build/tools install
  53. # Restore flags for oss-fuzz
  54. export CFLAGS="${CFLAGS_SAVE}"
  55. export CXXFLAGS="${CXXFLAGS_SAVE}"
  56. unset AFL_NOOPT
  57. echo "Building Lagom Fuzzers..."
  58. if [ "$#" -gt "0" ] && [ "--oss-fuzz" = "$1" ] ; then
  59. echo "Building for oss-fuzz configuration..."
  60. cmake -GNinja -B Build/fuzzers \
  61. -DBUILD_SHARED_LIBS=OFF \
  62. -DENABLE_FUZZERS_OSSFUZZ=ON \
  63. -DFUZZER_DICTIONARY_DIRECTORY="$OUT" \
  64. -DCMAKE_C_COMPILER="$CC" \
  65. -DCMAKE_CXX_COMPILER="$CXX" \
  66. -DCMAKE_CXX_FLAGS="$CXXFLAGS -DOSS_FUZZ=ON" \
  67. -DLINKER_FLAGS="$LIB_FUZZING_ENGINE" \
  68. -DCMAKE_PREFIX_PATH=Build/tool-install
  69. ninja -C Build/fuzzers
  70. cp Build/fuzzers/bin/Fuzz* "$OUT"/
  71. elif [ "$#" -gt "0" ] && [ "--standalone" = "$1" ] ; then
  72. echo "Building for standalone fuzz configuration..."
  73. cmake -GNinja -B Build/lagom-fuzzers-standalone \
  74. -DENABLE_FUZZERS=ON \
  75. -DCMAKE_PREFIX_PATH=Build/tool-install
  76. ninja -C Build/lagom-fuzzers-standalone
  77. else
  78. echo "Building for local fuzz configuration..."
  79. pick_clang
  80. cmake -GNinja -B Build/lagom-fuzzers \
  81. -DENABLE_FUZZERS_LIBFUZZER=ON \
  82. -DENABLE_ADDRESS_SANITIZER=ON \
  83. -DENABLE_UNDEFINED_SANITIZER=ON \
  84. -DCMAKE_PREFIX_PATH=Build/tool-install \
  85. -DCMAKE_C_COMPILER=$BEST_CLANG_CANDIDATE \
  86. -DCMAKE_CXX_COMPILER="${BEST_CLANG_CANDIDATE/clang/clang++}"
  87. ninja -C Build/lagom-fuzzers
  88. fi