[HarfBuzz] Cross-compiling HarfBuzz for ios

Anita Hui Anita.Hui at youilabs.com
Fri Jul 18 09:01:31 PDT 2014


Hi Steven and Behdad,

Thank you both for your responses! I spoke with my team lead and ultimately we were hoping to determine whether we can replace ICU entirely (LE, LX) with HarfBuzz. From reading your ticket I realize that Paragraph Layout uses other ICU services, but are there any ways to do what paragraph layout does with what’s available in HarfBuzz? Or are there any lightweight libraries that can do it?

Again, thanks for replying!

Anita Hui
Software Developer Co-op
anita.hui at youilabs.com

________________________________________
From: HarfBuzz <harfbuzz-bounces at lists.freedesktop.org> on behalf of Steven R. Loomis <srl at icu-project.org>
Sent: Thursday, July 17, 2014 7:21 PM
To: harfbuzz at lists.freedesktop.org
Subject: Re: [HarfBuzz] Cross-compiling HarfBuzz for ios

Here's what I would do:
* build ICU from source (with --enable-layout)
* after it built, *replace*  lib/libicule* ( the ICU layout engine) in
ICU's build dir with Harfbuzz's
  * also replace the whole source/layout directory with something
containing the harfbuzz headers
* Then, do a build in the source/layout*ex* directory

That should give you a libiculx linked against HB.

I filed an ICU ticket here: http://bugs.icu-project.org/trac/ticket/11023

Behdad: can you fix the wrapper page to link to this bug with "if you
use layoutex", and I will do the same on the ICU warning.


On 07/17/2014 04:03 PM, Steven R. Loomis wrote:
> Hi, let me take a look..
>
> On 07/17/2014 01:24 PM, Behdad Esfahbod wrote:
>> No idea.
>>
>> On 14-07-17 11:31 AM, Anita Hui wrote:
>>> Hi Behdad :)
>>>
>>> So I built the two static libraries libharfbuzz.a and libicu-le-hb.a, and put the two and their respective header files into my project, replacing libicule.a and its header files like so:
>>>
>>>     /Users/anitahui/Projects/main/Gladiator/uswish/samples/FocusAE/src/../../../thirdparty/prebuilt/ios/arch-arm/Debug/libicui18n.a
>>>     /Users/anitahui/Projects/main/Gladiator/uswish/samples/FocusAE/src/../../../thirdparty/prebuilt/ios/arch-arm/Debug/libiculx.a
>>>     /Users/anitahui/Projects/main/Gladiator/uswish/samples/FocusAE/src/../../../thirdparty/prebuilt/ios/arch-arm/Debug/libharfbuzz.a
>>>     /Users/anitahui/Projects/main/Gladiator/uswish/samples/FocusAE/src/../../../thirdparty/prebuilt/ios/arch-arm/Debug/libicu-le-hb.a
>>>     /Users/anitahui/Projects/main/Gladiator/uswish/samples/FocusAE/src/../../../thirdparty/prebuilt/ios/arch-arm/Debug/libicuuc.a
>>>     /Users/anitahui/Projects/main/Gladiator/uswish/samples/FocusAE/src/../../../thirdparty/prebuilt/ios/arch-arm/Debug/libicudata.a
>>>
>>> And I'm getting the error below for amv7 as well as armv7s:
>>>
>>> Undefined symbols for architecture armv7:
>>>   "icu_50::LayoutEngine::layoutEngineFactory(icu_50::LEFontInstance const*, int, int, LEErrorCode&)", referenced from:
>>>       icu_50::ParagraphLayout::ParagraphLayout(unsigned short const*, int, icu_50::FontRuns const*, icu_50::ValueRuns const*, icu_50::ValueRuns const*, icu_50::LocaleRuns const*, unsigned char, signed char, LEErrorCode&) in libiculx.a(ParagraphLayout.ao)
>>>   "icu_50::LayoutEngine::getGlyphs(unsigned int*, LEErrorCode&) const", referenced from:
>>>       icu_50::ParagraphLayout::ParagraphLayout(unsigned short const*, int, icu_50::FontRuns const*, icu_50::ValueRuns const*, icu_50::ValueRuns const*, icu_50::LocaleRuns const*, unsigned char, signed char, LEErrorCode&) in libiculx.a(ParagraphLayout.ao)
>>>   "icu_50::LayoutEngine::getGlyphPositions(float*, LEErrorCode&) const", referenced from:
>>>       icu_50::ParagraphLayout::ParagraphLayout(unsigned short const*, int, icu_50::FontRuns const*, icu_50::ValueRuns const*, icu_50::ValueRuns const*, icu_50::LocaleRuns const*, unsigned char, signed char, LEErrorCode&) in libiculx.a(ParagraphLayout.ao)
>>>   "vtable for icu_50::LEFontInstance", referenced from:
>>>       icu_50::LEFontInstance::LEFontInstance() in libuswish.a(YiLEFontInstanceFT.o)
>>>   NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
>>>   "icu_50::LEFontInstance::canDisplay(int) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::mapCharToGlyph(int, icu_50::LECharMapper const*, signed char) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "typeinfo for icu_50::LEFontInstance", referenced from:
>>>       typeinfo for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::mapCharToGlyph(int, icu_50::LECharMapper const*) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::xUnitsToPoints(float) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LayoutEngine::getCharIndices(int*, int, LEErrorCode&) const", referenced from:
>>>       icu_50::ParagraphLayout::ParagraphLayout(unsigned short const*, int, icu_50::FontRuns const*, icu_50::ValueRuns const*, icu_50::ValueRuns const*, icu_50::LocaleRuns const*, unsigned char, signed char, LEErrorCode&) in libiculx.a(ParagraphLayout.ao)
>>>   "icu_50::LEFontInstance::unitsToPoints(LEPoint&, LEPoint&) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::xPixelsToUnits(float) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::pixelsToUnits(LEPoint&, LEPoint&) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::transformFunits(float, float, LEPoint&) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::yPixelsToUnits(float) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::mapCharsToGlyphs(unsigned short const*, int, int, signed char, icu_50::LECharMapper const*, signed char, icu_50::LEGlyphStorage&) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::getLineHeight() const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::yUnitsToPoints(float) const", referenced from:
>>>       vtable for CYILEFontInstanceFT in libuswish.a(YiLEFontInstanceFT.o)
>>>   "icu_50::LEFontInstance::~LEFontInstance()", referenced from:
>>>       CYILEFontInstanceFT::CYILEFontInstanceFT(CYITextRendererFT*, int) in libuswish.a(YiLEFontInstanceFT.o)
>>>       CYILEFontInstanceFT::~CYILEFontInstanceFT() in libuswish.a(YiLEFontInstanceFT.o)
>>> ld: symbol(s) not found for architecture armv7
>>> clang: error: linker command failed with exit code 1 (use -v to see invocation)
>>>
>>> Do you have any ideas as to what I'm doing wrong or any thing I may have missed?
>>>
>>> Thanks!
> Are you really linking against the wrapper or partly against the real
> libicule?
>
>
> ICU ParagraphLayout doesn't have an option to build against HarfBuzz so
> you will have to probably do that manually.
>
> Probably ICU's ParagraphLayout (libicul*x*) is linking against ICU's
> *libicule*.
>
> -s
>>> ________________________________________
>>> From: Behdad Esfahbod <behdad.esfahbod at gmail.com> on behalf of Behdad Esfahbod <behdad at behdad.org>
>>> Sent: Wednesday, July 16, 2014 3:02 PM
>>> To: Anita Hui; harfbuzz at lists.freedesktop.org
>>> Subject: Re: [HarfBuzz] Cross-compiling HarfBuzz for ios
>>>
>>> D'oh.  Up to you whether you do static or dynamic linking, but icu-le-hb uses
>>> HarfBuzz, so yes, you need libharfbuzz one way or another.  If you want
>>> all-static, they you need libharfbuzz.a.
>>>
>>> On 14-07-16 02:43 PM, Anita Hui wrote:
>>>> Oh, so do you mean that I would need to link the executable with libharfbuzz.a to use libicu-le-hb.a to replace libicule.a?
>>>>
>>>> Or that I need to have HarfBuzz on my system in order to build libicu-le-hb.a, which I can then use as a replacement for libicule.a without having to link the executable with libharfbuzz.a?
>>>>
>>>> ________________________________________
>>>> From: Behdad Esfahbod <behdad.esfahbod at gmail.com> on behalf of Behdad Esfahbod <behdad at behdad.org>
>>>> Sent: Wednesday, July 16, 2014 2:12 PM
>>>> To: Anita Hui; harfbuzz at lists.freedesktop.org
>>>> Subject: Re: [HarfBuzz] Cross-compiling HarfBuzz for ios
>>>>
>>>> On 14-07-16 02:11 PM, Anita Hui wrote:
>>>>> Just so I'm sure I understand, does this mean that libicu-le-hb.a is standalone and can directly replace libicule.a without anything extra?
>>>> Yes, as long as by "standalone" you mean "only needs harfbuzz". :)
>>>>
>>>>> Also thanks for responding so quickly :D
>>>>>
>>>>> ________________________________________
>>>>> From: Behdad Esfahbod <behdad.esfahbod at gmail.com> on behalf of Behdad Esfahbod <behdad at behdad.org>
>>>>> Sent: Wednesday, July 16, 2014 12:47 PM
>>>>> To: Anita Hui; harfbuzz at lists.freedesktop.org
>>>>> Subject: Re: [HarfBuzz] Cross-compiling HarfBuzz for ios
>>>>>
>>>>> On 14-07-16 12:42 PM, Anita Hui wrote:
>>>>>> Hi Behdad,
>>>>>>
>>>>>> Thanks for your response! I have a general question about building static HarfBuzz libraries for replacing icu-LE. I noticed in the configure process when checking for tools, it checks for ICU. Does this mean that I need to have ICU in order to build libharfbuzz-icu.a? Please correct me if I'm wrong but I'm guessing that I need libharfbuzz-icu.a with libicu-le-hb.a in order to replace libicule.a.
>>>>> You don't need libharfbuzz-icu to use icu-le-hb.  Same way that ICU Layout
>>>>> doesn't actually depend on the rest of ICU. :)
>>>>>
>>>>> behdad
>>>>>
>>>>>> Again, thank you for replying! It's much appreciated :)
>>>>>>
>>>>>> Anita
>>>>>>
>
>
> _______________________________________________
> HarfBuzz mailing list
> HarfBuzz at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/harfbuzz


--

IBMer but all opinions are mine.
https://www.ohloh.net/accounts/srl295 // fingerprint @ https://ssl.icu-project.org/trac/wiki/Srl



More information about the HarfBuzz mailing list