diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 10904023779e..1a82097d2268 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -58,7 +58,7 @@ jobs: export is_official=true fi if [[ "${{ runner.os }}" == "Windows" ]] ; then - export gn_flags='win_vc="C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC" win_toolchain_version="15.0" win_sdk="C:\\Program Files (x86)\\Windows Kits\\10" win_sdk_version="10.0.18362.0" cc="clang" cxx="clang++" clang_win="C:\Program Files\LLVM" clang_win_version="9.0.0"' + export gn_flags='is_trivial_abi=false win_vc="C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC" win_toolchain_version="17.9" win_sdk="C:\\Program Files\\Windows Kits\\10" win_sdk_version="10.0.22621.0" cc="clang" cxx="clang++" clang_win="C:\Program Files\LLVM" clang_win_version="16.0.0"' if [[ "${{ matrix.mode }}" == "Debug" ]] ; then export gn_flags="$gn_flags extra_cflags=[\"-MTd\"]" else @@ -73,7 +73,7 @@ jobs: else export gn_flags='cc="clang-12" cxx="clang++-12"' fi - gn gen out/${{ matrix.mode }}-${{ matrix.arch }} --args="is_debug=$is_debug is_official_build=$is_official skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_sfntly=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=\"${{ matrix.arch }}\" $gn_flags" + gn gen out/${{ matrix.mode }}-${{ matrix.arch }} --args="is_debug=$is_debug is_official_build=$is_official skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=\"${{ matrix.arch }}\" $gn_flags" - name: Compiling run: ninja -C out/${{ matrix.mode }}-${{ matrix.arch }} skia modules - name: Copying Files diff --git a/README.md b/README.md index 6466a30d9206..53e867ac4804 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ In the following sections you will find straightforward steps to compile Skia. You can always check the [official Skia instructions](https://skia.org/docs/user/build) and select the OS you are building for. [Aseprite](https://github.com/aseprite/aseprite) and -[laf](https://github.com/aseprite/laf) use the **`aseprite-m102`** branch. +[laf](https://github.com/aseprite/laf) use the **`aseprite-m124`** branch. So remember to checkout that specific branch. These are the platform-specific steps to compile Skia: @@ -36,12 +36,12 @@ Download and uncompress it in some place like `C:\deps\depot_tools`. [It's recommended to compile Skia with Clang](https://github.com/google/skia/blob/master/site/user/build.md#a-note-on-software-backend-performance) -to get better performance. So you will need to [download Clang](https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.0/LLVM-13.0.0-win64.exe), +to get better performance. So you will need to [download Clang](https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.6/LLVM-17.0.6-win64.exe), and install it on a folder like `C:\deps\llvm` (a folder without whitespaces). Open a command prompt window (`cmd.exe`) and call: - call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat" -arch=x64 + call "C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\VsDevCmd.bat" -arch=x64 The command above is required while attempting to compile the 64-bit version of skia. When compiling the 32-bit version, it is possible to open a [developer command prompt](https://docs.microsoft.com/en-us/dotnet/framework/tools/developer-command-prompt-for-vs) instead. @@ -56,10 +56,11 @@ Then: Just ignore it.) cd C:\deps - git clone -b aseprite-m102 https://github.com/aseprite/skia.git + git clone -b aseprite-m124 https://github.com/aseprite/skia.git cd skia set GIT_EXECUTABLE=git.bat - python tools/git-sync-deps + python3 tools/git-sync-deps + python3 bin/fetch-ninja (The `tools/git-sync-deps` will take some minutes because it downloads a lot of packages, please wait and re-run the same command in case it @@ -68,17 +69,25 @@ fails.) Finally, if you've downloaded Clang, use this command: set PATH=C:\deps\llvm\bin;%PATH% - set PATH=C:\deps\depot_tools\bootstrap-3_8_0_chromium_8_bin\python\bin;%PATH% - gn gen out/Release-x64 --args="is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_sfntly=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=""x64"" cc=""clang"" cxx=""clang++"" clang_win=""c:\deps\llvm"" win_vc=""C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC"" extra_cflags=[""-MT""]" + gn gen out/Release-x64 --args="is_debug=false is_official_build=true is_trivial_abi=false skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=""x64"" cc=""clang"" cxx=""clang++"" clang_win=""c:\deps\llvm"" clang_win_version=""17.0.6"" win_vc=""C:\Program Files\Microsoft Visual Studio\2022\Community\VC"" extra_cflags=[""-MT""]" ninja -C out/Release-x64 skia modules If you haven't installed Clang, and want to compile Skia with MSVC (anyway it's not recommended because the performance penalty is too big), you can use the following commands instead: - gn gen out/Release-x64 --args="is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_sfntly=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=""x64"" win_vc=""C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC"" extra_cflags=[""-MT""]" + gn gen out/Release-x64 --args="is_debug=false is_official_build=true is_trivial_abi=false skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=""x64"" win_vc=""C:\Program Files\Microsoft Visual Studio\2022\Community\VC"" extra_cflags=[""-MT""]" ninja -C out/Release-x64 skia modules +### For debugging + +For debugging purposes you can compile the debug version of the +library, e.g. for LLVM: + + set PATH=C:\deps\llvm\bin;%PATH% + gn gen out/Debug-x64 --args="is_debug=true is_official_build=false is_trivial_abi=false skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=""x64"" cc=""clang"" cxx=""clang++"" clang_win=""c:\deps\llvm"" clang_win_version=""17.0.6"" win_vc=""C:\Program Files\Microsoft Visual Studio\2022\Community\VC"" extra_cflags=[""-MTd""]" + ninja -C out/Debug-x64 skia modules + ## Skia on macOS These steps will create a `deps` folder in your home directory with a @@ -89,11 +98,12 @@ several minutes to finish: mkdir $HOME/deps cd $HOME/deps git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git - git clone -b aseprite-m102 https://github.com/aseprite/skia.git + git clone -b aseprite-m124 https://github.com/aseprite/skia.git export PATH="${PWD}/depot_tools:${PATH}" cd skia - python tools/git-sync-deps - gn gen out/Release-x64 --args="is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_sfntly=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=\"x64\" extra_cflags=[\"-stdlib=libc++\", \"-mmacosx-version-min=10.9\"] extra_cflags_cc=[\"-frtti\"]" + python3 tools/git-sync-deps + python3 bin/fetch-ninja + gn gen out/Release-x64 --args="is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=\"x64\" extra_cflags=[\"-stdlib=libc++\", \"-mmacosx-version-min=10.9\"] extra_cflags_cc=[\"-frtti\"]" ninja -C out/Release-x64 skia modules ### Skia on macOS for Apple Silicon @@ -101,7 +111,7 @@ several minutes to finish: If you want to compile Skia for Apple Silicon (e.g. M1), you have to specify the `arm64` CPU architecture: - gn gen out/Release-arm64 --args="is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_sfntly=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=\"arm64\" extra_cflags=[\"-stdlib=libc++\", \"-mmacosx-version-min=11.0\"] extra_cflags_cc=[\"-frtti\"]" + gn gen out/Release-arm64 --args="is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false target_cpu=\"arm64\" extra_cflags=[\"-stdlib=libc++\", \"-mmacosx-version-min=11.0\"] extra_cflags_cc=[\"-frtti\"]" ninja -C out/Release-arm64 skia modules ## Skia on Linux @@ -114,26 +124,27 @@ several minutes to finish: mkdir $HOME/deps cd $HOME/deps git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git - git clone -b aseprite-m102 https://github.com/aseprite/skia.git + git clone -b aseprite-m124 https://github.com/aseprite/skia.git export PATH="${PWD}/depot_tools:${PATH}" cd skia - python tools/git-sync-deps - -Next step is to generate the compilation rules. You have two options, run just one: - -1. Generate rules for compiling skia using clang (recommended if you - have clang compiler): - - gn gen out/Release-x64 --args='is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_sfntly=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false cc="clang" cxx="clang++" extra_cflags_cc=["-stdlib=libc++"] extra_ldflags=["-stdlib=libc++"]' - -2. Generate rules for compiling skia using the default compiler - (usually g++): + python3 tools/git-sync-deps + python3 bin/fetch-ninja + gn gen out/Release-x64 --args="is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false" + ninja -C out/Release-x64 skia modules - gn gen out/Release-x64 --args="is_debug=false is_official_build=true skia_use_system_expat=false skia_use_system_icu=false skia_use_system_libjpeg_turbo=false skia_use_system_libpng=false skia_use_system_libwebp=false skia_use_system_zlib=false skia_use_sfntly=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=false skia_use_system_harfbuzz=false" +# Internal Details -Final step: +* `is_trivial_abi`: As we are mixing MSVC/Clang, the Windows + compilation needs the `is_trivial_abi=false` option as indicated + [here](https://groups.google.com/g/skia-discuss/c/ze-_PUljtkk/m/sdTNWL3rAQAJ), + in other case we can get an infinite loop `SkOnce::operator()` - ninja -C out/Release-x64 skia modules +* `-MT`: We are creating a static-linked version of Skia library, + that's why we have the `extra_cflags=["-MTd"]` option, so we don't + need to distribute the MSVC C++ runtime DLLs. -**REMEMBER**: When compiling Aseprite or laf, check that you are using -the same compiler (clang or g++) as the one used for compiling skia. +* `-frtti`: On macOS we've detected a [strange bug](https://bugs.llvm.org/show_bug.cgi?id=37487) + where linking object files compiled with `-frtti` and `-fno-rtti` + (the default Skia option) breaks the normal function of + `std::exception` hierarchy. That's why we're compiling with run-time + type information `extra_cflags_cc=["-frtti"]`.