Replace third_party/gif: Preflight changes

Something is breaking client code in unexpected ways.  Let's try this
piecemeal.

  - skia_libgifcodec_path gn var. Default is
    third_party/externals/libgifcodec.  Anfroid framework uses
    third_party/libgifcodec.

  - skia_use_libgifcodec gn var; defaults to !skia_use_wuffs.  Allow
    disabling both codecs.

  - GN template("optional"): add public_include_dirs, similar to
    public_defines.

  - SK_USE_LIBGIFCODEC, ifdef for skia_use_libgifcodec.

  - SkCodec.cpp: use SK_USE_LIBGIFCODEC

Original CL:  https://review.skia.org/254582

Cq-Include-Trybots: luci.skia.skia.primary:Build-Debian9-Clang-x86-devrel-Android_SKQP
Bug: skia:9654
Change-Id: I70561f5f945656065e4b318d5fff505961fb0b6b
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/255578
Reviewed-by: Hal Canary <halcanary@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
diff --git a/BUILD.gn b/BUILD.gn
index 4d6bfab..c60ec4e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -211,6 +211,9 @@
       if (defined(invoker.public_configs)) {
         configs = invoker.public_configs
       }
+      if (defined(invoker.public_include_dirs)) {
+        include_dirs = invoker.public_include_dirs
+      }
     }
     source_set(target_name) {
       check_includes = false
@@ -608,7 +611,8 @@
 }
 
 optional("gif") {
-  enabled = !skia_use_wuffs
+  enabled = !skia_use_wuffs && skia_use_libgifcodec
+  public_defines = [ "SK_USE_LIBGIFCODEC" ]
   sources = [
     "src/codec/SkGifCodec.cpp",
     "third_party/gif/SkGifImageReader.cpp",
diff --git a/gn/gn_to_bp.py b/gn/gn_to_bp.py
index 2443358..e649b4b 100644
--- a/gn/gn_to_bp.py
+++ b/gn/gn_to_bp.py
@@ -318,6 +318,7 @@
     'skia_use_fontconfig':                'false',
     'skia_use_fixed_gamma_text':          'true',
     'skia_include_multiframe_procs':      'false',
+    'skia_libgifcodec_path':              '"third_party/libgifcodec"',
   }
   d['target_os'] = target_os
   if target_os == '"android"':
diff --git a/gn/skia.gni b/gn/skia.gni
index 5f5fe90..01a5210 100644
--- a/gn/skia.gni
+++ b/gn/skia.gni
@@ -29,6 +29,7 @@
   skia_generate_workarounds = false
   skia_include_multiframe_procs = false
   skia_lex = false
+  skia_libgifcodec_path = "third_party/externals/libgifcodec"
   skia_pdf_subset_harfbuzz = false  # TODO: set skia_pdf_subset_harfbuzz to skia_use_harfbuzz.
   skia_qt_path = getenv("QT_PATH")
   skia_skqp_global_error_tolerance = 0
@@ -93,6 +94,7 @@
   skia_enable_nvpr = !skia_enable_flutter_defines
   skia_enable_spirv_validation = is_skia_dev_build && is_debug && !skia_use_dawn
   skia_use_dng_sdk = !is_fuchsia && skia_use_libjpeg_turbo && skia_use_zlib
+  skia_use_libgifcodec = !skia_use_wuffs
   skia_use_sfntly = skia_use_icu
 }
 
diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp
index cc5b9bf..41587f8 100644
--- a/src/codec/SkCodec.cpp
+++ b/src/codec/SkCodec.cpp
@@ -26,7 +26,7 @@
 #include "src/codec/SkWebpCodec.h"
 #ifdef SK_HAS_WUFFS_LIBRARY
 #include "src/codec/SkWuffsCodec.h"
-#else
+#elif defined(SK_USE_LIBGIFCODEC)
 #include "src/codec/SkGifCodec.h"
 #endif
 
@@ -45,7 +45,7 @@
     #endif
     #ifdef SK_HAS_WUFFS_LIBRARY
         { SkWuffsCodec_IsFormat, SkWuffsCodec_MakeFromStream },
-    #else
+    #elif defined(SK_USE_LIBGIFCODEC)
         { SkGifCodec::IsGif, SkGifCodec::MakeFromStream },
     #endif
     #ifdef SK_HAS_PNG_LIBRARY
diff --git a/tools/skqp/create_apk.py b/tools/skqp/create_apk.py
index 2f6d94e..27bff79 100755
--- a/tools/skqp/create_apk.py
+++ b/tools/skqp/create_apk.py
@@ -150,7 +150,11 @@
             gn_args = opts.gn_args(arch)
             args = ' '.join('%s=%s' % (k, v) for k, v in gn_args.items())
             check_call(['bin/gn', 'gen', build, '--args=' + args])
-            check_call(['ninja', '-C', build, lib])
+            try:
+                check_call(['ninja', '-C', build, lib])
+            except subprocess.CalledProcessError:
+                check_call(['ninja', '-C', build, '-t', 'clean'])
+                check_call(['ninja', '-C', build, lib])
             dst = '%s/%s' % (lib_dir, skia_to_android_arch_name_map[arch])
             makedirs(dst)
             shutil.copy(os.path.join(build, lib), dst)