macosskia

How to build Skia viewer on MacOS arm64?


I am able to build Skia, but I am not able to link the viewer.

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
git clone https://github.com/google/skia.git
export PATH="$PWD/depot_tools:$PATH"
cd skia
python tools/git-sync-deps

bin/gn gen out/release --args="is_official_build=false skia_use_libjpeg_turbo_decode=false skia_use_libjpeg_turbo_encode=false extra_cflags_cc=[\"-frtti\"] target_cpu=\"arm64\""

ninja -C out/release skia
ninja -C out/release viewer

Error:

✦ ❯ ninja -C out/release viewer
ninja: Entering directory `out/release'
[1/1] link viewer
FAILED: viewer
c++ -Wl,-rpath,@loader_path/. -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -Wl,-w -target arm64-apple-macos11  @./viewer.rsp -framework ApplicationServices -framework OpenGL -framework AppKit -framework Foundation -framework QuartzCore -framework Cocoa -framework AVFoundation   -ldl -o ./viewer
Undefined symbols for architecture arm64:
  "SkJpegDecoder::Decode(sk_sp<SkData>, SkCodec::Result*, void*)", referenced from:
      (anonymous namespace)::DataResourceProvider::loadImageAsset(char const*, char const*, char const*) const in libsvg.a[32](libsvg.SkSVGOpenTypeSVGDecoder.o)
  "SkJpegDecoder::IsJpeg(void const*, unsigned long)", referenced from:
      (anonymous namespace)::DataResourceProvider::loadImageAsset(char const*, char const*, char const*) const in libsvg.a[32](libsvg.SkSVGOpenTypeSVGDecoder.o)
  "SkJpegEncoder::Encode(SkWStream*, SkPixmap const&, SkJpegEncoder::Options const&)", referenced from:
      skiagm::EncodeGM::onDraw(SkCanvas*) in gm.encode.o
      skiagm::encode_pixmap_and_make_image(SkPixmap const&, SkJpegEncoder::AlphaOption) in gm.encode_alpha_jpeg.o
      encode_data(SkEncodedImageFormat, SkBitmap const&, int) in gm.encode_platform.o
      skiagm::encode_data(SkBitmap const&, SkEncodedImageFormat) in gm.encode_srgb.o
      new_texture_image_GM(SkCanvas*, SkString*)::$_2::operator()() const in gm.image.o
      skiagm::ColorCubeGM::onOnceBeforeDraw() in gm.jpg_color_cube.o
      make_image(GrRecordingContext*, skgpu::graphite::Recorder*) in gm.yuv420_odd_dim.o
      ...
ld: symbol(s) not found for architecture arm64
clang++: error: linker command failed with exit code 1 (use -v to see invocation)

Solution

  • Given the Encode/Decode undefined symbols, try this gn command :

    bin/gn gen out/release --args="is_official_build=false \
      skia_use_libjpeg_turbo_decode=true \
      skia_use_libjpeg_turbo_encode=true \
      extra_cflags_cc=[\"-frtti\"] \
      target_cpu=\"arm64\""