[HarfBuzz] harfbuzz: Branch 'master' - 6 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Thu May 24 20:53:14 UTC 2018


 .circleci/config.yml        |    4 -
 src/dump-emoji.cc           |    1 
 src/dump-fon.cc             |    1 
 src/hb-coretext.cc          |    3 
 src/hb-open-type-private.hh |   11 ++
 src/hb-ot-layout.cc         |    1 
 src/hb-ot-post-table.hh     |    3 
 src/hb-private.hh           |  167 +++++++++++++++++++++++++++++---------------
 src/hb-subset-plan.cc       |   12 +--
 src/hb-subset.cc            |    1 
 src/hb-uniscribe.cc         |    8 --
 src/main.cc                 |    1 
 12 files changed, 139 insertions(+), 74 deletions(-)

New commits:
commit 31c4236d9643063e518289b28c3e17cedd8401e0
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu May 24 13:38:46 2018 -0700

    Underflow protection in hb_vector_t

diff --git a/src/hb-private.hh b/src/hb-private.hh
index 45f69904..0d1cc0ef 100644
--- a/src/hb-private.hh
+++ b/src/hb-private.hh
@@ -685,8 +685,9 @@ struct hb_vector_t
     return true;
   }
 
-  inline bool resize (unsigned int size)
+  inline bool resize (int size_)
   {
+    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
     if (!alloc (size))
       return false;
 
@@ -696,6 +697,7 @@ struct hb_vector_t
 
   inline void pop (void)
   {
+    if (!len) return;
     len--;
   }
 
@@ -709,10 +711,11 @@ struct hb_vector_t
      len--;
   }
 
-  inline void shrink (unsigned int l)
+  inline void shrink (int size_)
   {
-     if (l < len)
-       len = l;
+    unsigned int size = size_ < 0 ? 0u : (unsigned int) size_;
+     if (size < len)
+       len = size;
   }
 
   template <typename T>
commit f83e992c8b27111ab802fd7e5678592a0c717518
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu May 24 11:46:57 2018 -0700

    Mark CrapPool thread_local
    
    Not sure if I like to keep it. For now, aim for correctness.

diff --git a/src/dump-emoji.cc b/src/dump-emoji.cc
index 50a929be..280c5c9b 100644
--- a/src/dump-emoji.cc
+++ b/src/dump-emoji.cc
@@ -48,7 +48,7 @@
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
-void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+thread_local void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 void cbdt_callback (const uint8_t* data, unsigned int length,
diff --git a/src/dump-fon.cc b/src/dump-fon.cc
index 827de4a3..748de1ab 100644
--- a/src/dump-fon.cc
+++ b/src/dump-fon.cc
@@ -28,7 +28,7 @@
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
-void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+thread_local void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 template <typename Type, int Bytes> struct LEInt;
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 67049545..7f9b6be8 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -48,7 +48,7 @@
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
-void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+thread_local void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 
diff --git a/src/hb-private.hh b/src/hb-private.hh
index 4318eb97..45f69904 100644
--- a/src/hb-private.hh
+++ b/src/hb-private.hh
@@ -90,6 +90,14 @@ extern "C" void  hb_free_impl(void *ptr);
 	HB_UNUSED typedef int HB_PASTE(static_assertion_failed_at_line_, __LINE__) [(e) ? 1 : -1]
 #endif // static_assert
 
+#ifdef __GNUC__
+#if (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8))
+#define thread_local __thread
+#endif
+#else
+#define thread_local
+#endif
+
 #endif // __cplusplus < 201103L
 
 #if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE__)
@@ -570,12 +578,16 @@ static_assert (Namespace::Type::min_size + 1 <= sizeof (_Null##Type), "Null pool
 
 /* Global writable pool.  Enlarge as necessary. */
 
+/* To be fully correct, CrapPool must be thread_local. However, we do not rely on CrapPool
+ * for correct operation. It only exist to catch and divert program logic bugs instead of
+ * causing bad memory access. So, races there are not actually introducing incorrectness
+ * in the code. So maybe disable? Has ~12kb binary size overhead to have it. */
 #ifdef HB_NO_VISIBILITY
 static
 #else
 extern HB_INTERNAL
 #endif
-void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)]
+thread_local void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)]
 #ifdef HB_NO_VISIBILITY
 = {}
 #endif
diff --git a/src/hb-subset.cc b/src/hb-subset.cc
index ad273d04..e974d0f4 100644
--- a/src/hb-subset.cc
+++ b/src/hb-subset.cc
@@ -46,7 +46,7 @@
 
 #if !defined(HB_NO_VISIBILITY) && !defined(HB_SUBSET_BUILTIN)
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
-void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+thread_local void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 
diff --git a/src/main.cc b/src/main.cc
index f32490e7..2fec52f9 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -39,7 +39,7 @@ using namespace OT;
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
-void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+thread_local void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 int
commit 5d80129891107c7f629c6950b5d257f2a867eee0
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu May 24 11:33:15 2018 -0700

    Add CrapPool
    
    Common Regoin for Access Protection.  Like the NullPool, but writable.

diff --git a/src/dump-emoji.cc b/src/dump-emoji.cc
index 63af4a6a..50a929be 100644
--- a/src/dump-emoji.cc
+++ b/src/dump-emoji.cc
@@ -48,6 +48,7 @@
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 void cbdt_callback (const uint8_t* data, unsigned int length,
diff --git a/src/dump-fon.cc b/src/dump-fon.cc
index 81525f42..827de4a3 100644
--- a/src/dump-fon.cc
+++ b/src/dump-fon.cc
@@ -28,6 +28,7 @@
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 template <typename Type, int Bytes> struct LEInt;
diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index 1c771b09..6f639dca 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -932,6 +932,7 @@ struct ArrayOf
   }
   inline Type& operator [] (unsigned int i)
   {
+    if (unlikely (i >= len)) return Crap(Type);
     return arrayZ[i];
   }
   inline unsigned int get_size (void) const
@@ -1040,6 +1041,11 @@ struct OffsetListOf : OffsetArrayOf<Type>
     if (unlikely (i >= this->len)) return Null(Type);
     return this+this->arrayZ[i];
   }
+  inline const Type& operator [] (unsigned int i)
+  {
+    if (unlikely (i >= this->len)) return Crap(Type);
+    return this+this->arrayZ[i];
+  }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -1064,6 +1070,11 @@ struct HeadlessArrayOf
     if (unlikely (i >= len || !i)) return Null(Type);
     return arrayZ[i-1];
   }
+  inline Type& operator [] (unsigned int i)
+  {
+    if (unlikely (i >= len || !i)) return Crap(Type);
+    return arrayZ[i-1];
+  }
   inline unsigned int get_size (void) const
   { return len.static_size + (len ? len - 1 : 0) * Type::static_size; }
 
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 368a8465..67049545 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -48,6 +48,7 @@
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 
diff --git a/src/hb-private.hh b/src/hb-private.hh
index 4b9668e0..4318eb97 100644
--- a/src/hb-private.hh
+++ b/src/hb-private.hh
@@ -529,7 +529,7 @@ _hb_ceil_to_4 (unsigned int v)
  */
 
 /*
- * Null objects
+ * Static pools
  */
 
 /* Global nul-content Null pool.  Enlarge as necessary. */
@@ -547,7 +547,6 @@ const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)]
 = {}
 #endif
 ;
-
 /* Generic nul-content Null objects. */
 template <typename Type>
 static inline const Type& Null (void) {
@@ -569,6 +568,28 @@ namespace Namespace { \
 static_assert (Namespace::Type::min_size + 1 <= sizeof (_Null##Type), "Null pool too small.  Enlarge.")
 
 
+/* Global writable pool.  Enlarge as necessary. */
+
+#ifdef HB_NO_VISIBILITY
+static
+#else
+extern HB_INTERNAL
+#endif
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)]
+#ifdef HB_NO_VISIBILITY
+= {}
+#endif
+;
+/* CRAP pool: Common Region for Access Protection. */
+template <typename Type>
+static inline Type& Crap (void) {
+  static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+  Type *obj = reinterpret_cast<Type *> (_hb_CrapPool);
+  *obj = Null(Type);
+  return *obj;
+}
+#define Crap(Type) Crap<Type>()
+
 
 /* arrays and maps */
 
@@ -589,8 +610,18 @@ struct hb_vector_t
     arrayZ = static_array;
   }
 
-  inline Type& operator [] (unsigned int i) { return arrayZ[i]; }
-  inline const Type& operator [] (unsigned int i) const { return arrayZ[i]; }
+  inline Type& operator [] (unsigned int i)
+  {
+    if (unlikely (i >= len))
+      return Crap (Type);
+    return arrayZ[i];
+  }
+  inline const Type& operator [] (unsigned int i) const
+  {
+    if (unlikely (i >= len))
+      return Null (Type);
+    return arrayZ[i];
+  }
 
   inline Type *push (void)
   {
diff --git a/src/hb-subset.cc b/src/hb-subset.cc
index 98f95e02..ad273d04 100644
--- a/src/hb-subset.cc
+++ b/src/hb-subset.cc
@@ -46,6 +46,7 @@
 
 #if !defined(HB_NO_VISIBILITY) && !defined(HB_SUBSET_BUILTIN)
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 
diff --git a/src/main.cc b/src/main.cc
index 9a187366..f32490e7 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -39,6 +39,7 @@ using namespace OT;
 
 #ifndef HB_NO_VISIBILITY
 const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+void * _hb_CrapPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 #endif
 
 int
commit 673b764de050957b2d3b9972d9e55b3a2e5615f4
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed May 23 20:12:23 2018 -0700

    Move code around

diff --git a/src/hb-private.hh b/src/hb-private.hh
index d3381eb5..4b9668e0 100644
--- a/src/hb-private.hh
+++ b/src/hb-private.hh
@@ -315,7 +315,7 @@ static_assert ((sizeof (hb_var_int_t) == 4), "");
 
 
 
-/* Misc */
+/* Tiny functions */
 
 /*
  * Void!
@@ -522,6 +522,54 @@ _hb_ceil_to_4 (unsigned int v)
 
 
 
+/*
+ *
+ * Utility types
+ *
+ */
+
+/*
+ * Null objects
+ */
+
+/* Global nul-content Null pool.  Enlarge as necessary. */
+
+#define HB_NULL_POOL_SIZE 264
+static_assert (HB_NULL_POOL_SIZE % sizeof (void *) == 0, "Align HB_NULL_POOL_SIZE.");
+
+#ifdef HB_NO_VISIBILITY
+static
+#else
+extern HB_INTERNAL
+#endif
+const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)]
+#ifdef HB_NO_VISIBILITY
+= {}
+#endif
+;
+
+/* Generic nul-content Null objects. */
+template <typename Type>
+static inline const Type& Null (void) {
+  static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+  return *reinterpret_cast<const Type *> (_hb_NullPool);
+}
+#define Null(Type) Null<Type>()
+
+/* Specializaiton for arbitrary-content arbitrary-sized Null objects. */
+#define DEFINE_NULL_DATA(Namespace, Type, data) \
+} /* Close namespace. */ \
+static const char _Null##Type[sizeof (Namespace::Type) + 1] = data; /* +1 is for nul-termination in data */ \
+template <> \
+/*static*/ inline const Namespace::Type& Null<Namespace::Type> (void) { \
+  return *reinterpret_cast<const Namespace::Type *> (_Null##Type); \
+} \
+namespace Namespace { \
+/* The following line really exists such that we end in a place needing semicolon */ \
+static_assert (Namespace::Type::min_size + 1 <= sizeof (_Null##Type), "Null pool too small.  Enlarge.")
+
+
+
 /* arrays and maps */
 
 
@@ -1116,46 +1164,5 @@ round (double x)
 #endif
 
 
-/*
- * Null objects
- */
-
-/* Global nul-content Null pool.  Enlarge as necessary. */
-
-#define HB_NULL_POOL_SIZE 264
-static_assert (HB_NULL_POOL_SIZE % sizeof (void *) == 0, "Align HB_NULL_POOL_SIZE.");
-
-#ifdef HB_NO_VISIBILITY
-static
-#else
-extern HB_INTERNAL
-#endif
-const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)]
-#ifdef HB_NO_VISIBILITY
-= {}
-#endif
-;
-
-/* Generic nul-content Null objects. */
-template <typename Type>
-static inline const Type& Null (void) {
-  static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
-  return *reinterpret_cast<const Type *> (_hb_NullPool);
-}
-#define Null(Type) Null<Type>()
-
-/* Specializaiton for arbitrary-content arbitrary-sized Null objects. */
-#define DEFINE_NULL_DATA(Namespace, Type, data) \
-} /* Close namespace. */ \
-static const char _Null##Type[sizeof (Namespace::Type) + 1] = data; /* +1 is for nul-termination in data */ \
-template <> \
-/*static*/ inline const Namespace::Type& Null<Namespace::Type> (void) { \
-  return *reinterpret_cast<const Namespace::Type *> (_Null##Type); \
-} \
-namespace Namespace { \
-/* The following line really exists such that we end in a place needing semicolon */ \
-static_assert (Namespace::Type::min_size + 1 <= sizeof (_Null##Type), "Null pool too small.  Enlarge.")
-
-
 
 #endif /* HB_PRIVATE_HH */
commit 65aeabd62275b37c6bb6715f3341e45625f4ba6e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed May 23 16:15:28 2018 -0700

    Add hb_vector_t::push(const Type &v)
    
    Makes for cleaner code.

diff --git a/src/hb-coretext.cc b/src/hb-coretext.cc
index 3924c8eb..84cc22fd 100644
--- a/src/hb-coretext.cc
+++ b/src/hb-coretext.cc
@@ -770,10 +770,9 @@ _hb_coretext_shape (hb_shape_plan_t    *shape_plan,
       }
 
       if (event->start) {
-        active_feature_t *feature = active_features.push ();
+        active_feature_t *feature = active_features.push (event->feature);
 	if (unlikely (!feature))
 	  goto fail_features;
-	*feature = event->feature;
       } else {
         active_feature_t *feature = active_features.find (&event->feature);
 	if (feature)
diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh
index bec508c0..9a1edea6 100644
--- a/src/hb-ot-post-table.hh
+++ b/src/hb-ot-post-table.hh
@@ -126,10 +126,9 @@ struct post
       const uint8_t *end = (uint8_t *) table + table_length;
       for (const uint8_t *data = pool; data < end && data + *data <= end; data += 1 + *data)
       {
-	uint32_t *offset = index_to_offset.push ();
+	uint32_t *offset = index_to_offset.push (data - pool);
 	if (unlikely (!offset))
 	  break;
-	*offset = data - pool;
       }
     }
     inline void fini (void)
diff --git a/src/hb-private.hh b/src/hb-private.hh
index 183f2a41..d3381eb5 100644
--- a/src/hb-private.hh
+++ b/src/hb-private.hh
@@ -551,9 +551,17 @@ struct hb_vector_t
 
     return &arrayZ[len - 1];
   }
+  inline Type *push (const Type& v)
+  {
+    if (unlikely (!resize (len + 1)))
+      return nullptr;
+
+    arrayZ[len - 1] = v;
+    return &arrayZ[len - 1];
+  }
 
   /* Allocate for size but don't adjust len. */
-  inline bool alloc(unsigned int size)
+  inline bool alloc (unsigned int size)
   {
     if (likely (size <= allocated))
       return true;
@@ -738,9 +746,7 @@ struct hb_lockable_set_t
 	l.unlock ();
       }
     } else {
-      item = items.push ();
-      if (likely (item))
-	*item = v;
+      item = items.push (v);
       l.unlock ();
     }
     return item;
@@ -779,9 +785,7 @@ struct hb_lockable_set_t
     l.lock ();
     item_t *item = items.find (v);
     if (!item) {
-      item = items.push ();
-      if (likely (item))
-        *item = v;
+      item = items.push (v);
     }
     l.unlock ();
     return item;
diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc
index d70215b0..3e53e842 100644
--- a/src/hb-subset-plan.cc
+++ b/src/hb-subset-plan.cc
@@ -91,10 +91,8 @@ _populate_codepoints (hb_set_t *input_codepoints,
 {
   plan_codepoints.alloc (hb_set_get_population (input_codepoints));
   hb_codepoint_t cp = -1;
-  while (hb_set_next (input_codepoints, &cp)) {
-    hb_codepoint_t *wr = plan_codepoints.push();
-    *wr = cp;
-  }
+  while (hb_set_next (input_codepoints, &cp))
+    plan_codepoints.push(cp);
   plan_codepoints.qsort (_hb_codepoint_t_cmp);
 }
 
@@ -139,9 +137,9 @@ _populate_gids_to_retain (hb_face_t *face,
     if (!cmap.get_nominal_glyph (codepoints[i], &gid))
     {
       gid = -1;
-      *(bad_indices.push ()) = i;
+      bad_indices.push (i);
     }
-    *(old_gids.push ()) = gid;
+    old_gids.push (gid);
   }
 
   /* Generally there shouldn't be any */
@@ -166,7 +164,7 @@ _populate_gids_to_retain (hb_face_t *face,
   old_gids_sorted.alloc (hb_set_get_population (all_gids_to_retain));
   hb_codepoint_t gid = HB_SET_VALUE_INVALID;
   while (hb_set_next (all_gids_to_retain, &gid))
-    *(old_gids_sorted.push ()) = gid;
+    old_gids_sorted.push (gid);
 
   hb_set_destroy (all_gids_to_retain);
   glyf.fini ();
diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc
index 3cd419e8..3b52ad3f 100644
--- a/src/hb-uniscribe.cc
+++ b/src/hb-uniscribe.cc
@@ -696,10 +696,8 @@ _hb_uniscribe_shape (hb_shape_plan_t    *shape_plan,
 	{
 	  if (!j || active_features[j].rec.tagFeature != feature_records[feature_records.len - 1].tagFeature)
 	  {
-	    OPENTYPE_FEATURE_RECORD *feature = feature_records.push ();
-	    if (unlikely (!feature))
+	    if (unlikely (!feature_records.push (active_features[j].rec)))
 	      goto fail_features;
-	    *feature = active_features[j].rec;
 	  }
 	  else
 	  {
@@ -719,10 +717,8 @@ _hb_uniscribe_shape (hb_shape_plan_t    *shape_plan,
       }
 
       if (event->start) {
-        active_feature_t *feature = active_features.push ();
-	if (unlikely (!feature))
+	if (unlikely (!active_features.push (event->feature)))
 	  goto fail_features;
-	*feature = event->feature;
       } else {
         active_feature_t *feature = active_features.find (&event->feature);
 	if (feature)
commit 38ae0add7001c4db506d3a2c18b9960a2cae7b5d
Author: Ebrahim Byagowi <ebrahim at gnu.org>
Date:   Wed May 23 13:37:57 2018 +0430

    [ci] Revive the SunCC bot
    
    * Adds libnsl to the bot as it is now needed apparently
    * Disables hb-icu, apparently the newer ICU itself is not compatible with SunCC

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 73d33271..55820005 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -104,9 +104,9 @@ jobs:
       - image: fedora
     steps:
       - checkout
-      - run: dnf install -y gcc ragel cmake make which glib2-devel freetype-devel cairo-devel libicu-devel graphite2-devel wget tar bzip2 python || true
+      - run: dnf install -y gcc ragel cmake make which glib2-devel freetype-devel cairo-devel libicu-devel graphite2-devel wget tar bzip2 python libnsl || true
       - run: wget http://$ODSUSER:$ODSPASS@behdad.org/harfbuzz-private/OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 && tar xf OracleDeveloperStudio12.6-linux-x86-bin.tar.bz2 --owner root --group root --no-same-owner
-      - run: CC=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/suncc CXX=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/sunCC cmake -DHB_HAVE_GRAPHITE2=ON -DHB_BUILTIN_UCDN=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_ICU=ON -DHB_HAVE_FREETYPE=ON -Bbuild -H.
+      - run: CC=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/suncc CXX=/root/project/OracleDeveloperStudio12.6-linux-x86-bin/developerstudio12.6/bin/sunCC cmake -DHB_HAVE_GRAPHITE2=ON -DHB_BUILTIN_UCDN=ON -DHB_HAVE_GLIB=ON -DHB_HAVE_FREETYPE=ON -Bbuild -H.
       - run: make -Cbuild
       - run: CTEST_OUTPUT_ON_FAILURE=1 make -Cbuild test
       - run: make -Cbuild install


More information about the HarfBuzz mailing list