# -*- icu-dependencies -*-
# Copyright (C) 2016 and later: Unicode, Inc. and others.
# License & terms of use: http://www.unicode.org/copyright.html
# Copyright (C) 2011-2016, International Business Machines
# Corporation and others. All Rights Reserved.
#
# file name: dependencies.txt
#
# created on: 2011may26
# created by: Markus W. Scherer
#
# See https://unicode-org.github.io/icu/processes/release/tasks/healthy-code.html#check-library-dependencies

# Standard library symbols used by ICU --------------------------------------- #

system_symbols:
  deps
    # C
    PIC system_misc system_debug malloc_functions ubsan
    c_strings c_string_formatting
    int_functions floating_point trigonometry
    exp_and_tanhf
    stdlib_qsort
    system_locale
    stdio_input stdio_output file_io dir_io mmap_functions dlfcn
    # C++
    cplusplus iostream
    std_mutex

group: PIC
    # Position-Independent Code (-fPIC) requires a Global Offset Table.
    _GLOBAL_OFFSET_TABLE_

group: system_misc
    abort

group: system_debug
    __assert_fail __stack_chk_fail

group: malloc_functions
    free malloc realloc

group: std_mutex
    std::condition_variable::notify_one()
    std::condition_variable::wait(std::unique_lock<std::mutex>&)
    std::condition_variable::notify_all()
    std::condition_variable::condition_variable()
    std::condition_variable::~condition_variable()
    std::condition_variable_any::condition_variable_any()
    std::condition_variable_any::~condition_variable_any()
    pthread_once
    pthread_mutex_lock
    pthread_mutex_unlock

group: ubsan
    # UBSan=UndefinedBehaviorSanitizer, clang -fsanitize=bounds
    __ubsan_handle_out_of_bounds

group: c_strings
    isspace isdigit
    __ctype_b_loc  # for <ctype.h>
    # We must not use tolower and toupper because they are system-locale-sensitive (Turkish i).
    strlen strchr strrchr strstr strcmp strncmp strcpy strncpy strcat strncat
    memchr memcmp memcpy memmove memset
    # BSD version of memcmp().
    bcmp
    # Additional symbols in an optimized build.
    __strcpy_chk __strncpy_chk __strcat_chk __strncat_chk
    __rawmemchr __memcpy_chk __memmove_chk __memset_chk
    # glibc
    __isoc23_strtol __isoc23_strtoul

group: c_string_formatting
    atoi atol strtod strtod_l strtol strtoul
    sprintf snprintf
    # Additional symbols in an optimized build.
    __sprintf_chk

group: int_functions
    div

group: floating_point
    abs fabs floor ceil modf fmod log pow round sqrt trunc

group: exp_and_tanhf
    expf tanhf

group: trigonometry
    acos asin atan atan2 cos sin tan
    # Additional symbols in an optimized build.
    sincos

group: stdlib_qsort
    qsort

group: system_locale
    getenv
    nl_langinfo setlocale newlocale freelocale
    gettimeofday localtime_r tzname tzset __timezone

group: stdio_input
    fopen fclose fgets fread fseek ftell rewind feof fileno
    # Additional symbols in an optimized build.
    __fgets_chk __fread_chk fread_unlocked

group: stdio_output
    fflush fwrite
    stdout

group: file_io
    open close stat
    # Additional symbols in an optimized build.
    __xstat

group: dir_io
    opendir closedir readdir readlink realpath # for a hack to get the time zone name

group: mmap_functions  # for memory-mapped data loading
    mmap munmap

group: dlfcn
    dlopen dlclose dlsym  # called by putil.o only for icuplug.o

group: cplusplus
    __dynamic_cast
    # The compiler generates references to the global operator delete
    # even when no code actually uses it.
    # ICU must not _use_ the global operator delete.
    "operator delete(void*)"
    "operator delete(void*, unsigned long)"
    # ICU also must not use the global operator new.
    # "operator new[](unsigned long)"

    # _Unwind_Resume is related to exceptions:
    # "A call to this routine is inserted as the end of a landing pad that performs cleanup,
    # but does not resume normal execution. It causes unwinding to proceed further."
    # (Linux Standard Base Specification 1.3)
    # Even though ICU does not actually use (nor handle) exceptions.
    _Unwind_Resume
    # std::terminate() looks similar to _Unwind_Resume:
    # "Calls the current terminate handler."
    std::terminate()

group: iostream
    "std::basic_ios<char, std::char_traits<char> >::clear(std::_Ios_Iostate)"
    "std::basic_ios<char, std::char_traits<char> >::eof() const"
    "std::basic_ios<char, std::char_traits<char> >::fail() const"
    "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)"
    std::ios_base::Init::Init()
    std::ios_base::Init::~Init()
    std::ios_base_library_init()
    std::istream::get()
    std::istream::putback(char)
    # Additional symbols in an optimized build.
    "std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)"

# ICU common library --------------------------------------------------------- #

library: stubdata
    stubdata.o  # Exports icudt48_dat.

library: common
    # All files in the common library are listed in its dependencies.
  deps
    # Libraries and groups that the common library depends on.
    pluralmap
    date_interval
    breakiterator
    uts46 filterednormalizer2 normalizer2 loadednormalizer2 canonical_iterator
    normlzr unormcmp unorm
    idna2003 stringprep
    stringenumeration
    unistr_props unistr_case unistr_case_locale unistr_titlecase_brkiter unistr_cnv
    cstr
    uniset_core uniset_props uniset_closure usetiter uset uset_props
    static_unicode_sets
    uiter edits
    ucasemap ucasemap_titlecase_brkiter script_runs
    uprops ubidi_props ucase uscript uscript_props emojiprops characterproperties
    ubidi ushape ubiditransform
    resourcebundle service_registration resbund_cnv ures_cnv icudataver ucat
    currency
    locale_display_names2
    conversion converter_selector ucnv_set ucnvdisp
    messagepattern simpleformatter
    icu_utility icu_utility_with_props
    ustr_wcs
    unifiedcache
    ucharstriebuilder ucharstrieiterator
    bytestriebuilder bytestrieiterator
    hashtable uhash uvector uvector32 uvector64 ulist
    propsvec utrie2 utrie2_builder ucptrie umutablecptrie utrie_swap
    sort
    uinit utypes errorcode
    icuplug
    platform
    localematcher

group: pluralmap
    # TODO: Move to i18n library, ticket #11926.
    pluralmap.o
  deps
    platform

group: date_interval  # class DateInterval
    dtintrv.o
  deps
    platform

group: breakiterator
    # We could try to split off a breakiterator_builder group,
    # but we still need uniset_props for code like in the ThaiBreakEngine constructor
    # which does
    #   fThaiWordSet.applyPattern(UNICODE_STRING_SIMPLE("[[:Thai:]&[:LineBreak=SA:]]"), status)
    brkiter.o brkeng.o ubrk.o
    rbbi.o rbbinode.o rbbiscan.o rbbisetb.o rbbistbl.o rbbitblb.o
    rbbidata.o rbbirb.o rbbi_cache.o
    dictionarydata.o dictbe.o lstmbe.o mlbe.o
    # BreakIterator::makeInstance() factory implementation makes for circular dependency
    # between BreakIterator base and FilteredBreakIteratorBuilder.
    filteredbrk.o
  deps
    resourcebundle service_registration
    schriter utext uniset_core uniset_props
    uhash ustack utrie2_builder
    ucharstrie bytestrie
    ucharstriebuilder  # for filteredbrk.o
    normlzr  # for dictbe.o, should switch to Normalizer2
    uvector32 # for dictbe.o
    exp_and_tanhf # for lstmbe.o
    usetiter # for dictbe.o

group: unormcmp  # unorm_compare()
    unormcmp.o
  deps
    filterednormalizer2
    uniset_props  # for uniset_getUnicode32Instance()
    ucase

group: unorm  # old normalization C API
    unorm.o
  deps
    filterednormalizer2
    uniset_props  # for uniset_getUnicode32Instance()
    uiter

group: normlzr  # old Normalizer C++ class
    normlzr.o
  deps
    filterednormalizer2
    uniset_props  # for uniset_getUnicode32Instance()
    schriter

group: uts46
    uts46.o
  deps
    normalizer2 loadednormalizer2 punycode
    uchar  # for u_charType() (via U_GET_GC_MASK(c))
    ubidi_props  # for u_charDirection() & ubidi_getJoiningType()
    bytestream

group: filterednormalizer2
    filterednormalizer2.o
  deps
    normalizer2

group: idna2003
    uidna.o
  deps
    stringprep punycode

group: stringprep
    usprep.o
  deps
    unorm  # could change to use filterednormalizer2 directly for Unicode 3.2 normalization
    normalizer2
    ubidi_props utrie

group: canonical_iterator
    caniter.o
  deps
    normalizer2 usetiter

group: loadednormalizer2
    loadednormalizer2impl.o
  deps
    normalizer2

group: normalizer2
    normalizer2.o
    normalizer2impl.o
  deps
    uniset_core
    bytestream bytesinkutil  # for UTF-8 output
    umutablecptrie  # for building CanonIterData & FCD
    utrie_swap  # TODO(ICU-20170): move unorm2_swap() to a separate file
    uvector  # for building CanonIterData
    uhash  # for the instance cache
    udata

group: punycode
    punycode.o
  deps
    platform

group: static_unicode_sets
    static_unicode_sets.o
  deps
    resourcebundle uniset_props

group: uset_props
    uset_props.o
  deps
    uniset_closure uniset_props uniset_core

group: uset
    uset.o
  deps
    uniset_core

group: uniset_closure
    uniset_closure.o
  deps
    uniset_core unistr_case_locale unistr_titlecase_brkiter

group: uniset_props
    uniset_props.o ruleiter.o
  deps
    uniset_core uprops unistr_case characterproperties
    parsepos
    resourcebundle
    propname unames

group: parsepos
    parsepos.o
  deps
    platform

group: usetiter  # UnicodeSetIterator
    usetiter.o
  deps
    uniset_core

group: uniset_core
    unifilt.o unifunct.o
    uniset.o bmpset.o unisetspan.o
  deps
    patternprops
    icu_utility
    uvector

group: icu_utility_with_props
    util_props.o
  deps
    icu_utility uchar ucase uprops

group: icu_utility
    util.o
  deps
    patternprops platform

group: utext
    utext.o
  deps
    ucase

group: stringenumeration
    ustrenum.o uenum.o
  deps
    platform

group: schriter
    schriter.o
    # The UCharCharacterIterator implements virtual void getText(UnicodeString& result)
    # so it depends on UnicodeString, therefore it makes little sense to split
    # schriter and uchriter into separate groups.
    uchriter.o
  deps
    chariter

group: chariter
    chariter.o
  deps
    platform

group: uiter
    uiter.o
  deps
    platform

group: unistr_cnv
    unistr_cnv.o
  deps
    conversion

group: cstr
    cstr.o
  deps
    unistr_cnv

group: uscript
    uscript.o  # uscript_getCode() accepts a locale ID and loads its script code data
  deps
    propname resourcebundle

group: uscript_props  # script metadata properties
    uscript_props.o
  deps
    platform

group: uprops
    uprops.o
  deps
    normalizer2 loadednormalizer2
    uchar
    ubidi_props
    unistr_case ustring_case  # only for case folding
    ucase
    emojiprops

group: characterproperties
    characterproperties.o
  deps
    uprops
    uniset_core

group: propname
    propname.o
  deps
    bytestrie

group: unames
    unames.o
  deps
    uchar udata

group: script_runs
    usc_impl.o
  deps
    uchar

group: uchar
    uchar.o
  deps
    ucptrie utrie2

group: messagepattern  # for MessageFormat and tools
    messagepattern.o
  deps
    patternprops platform

group: simpleformatter
    simpleformatter.o
  deps
    platform

group: patternprops
    patternprops.o
  deps
    PIC ubsan

group: ushape
    ushape.o
  deps
    ubidi_props

group: ubidi
    ubidi.o ubidiln.o ubidiwrt.o
  deps
    ubidi_props
    uchar  # for doWriteReverse() which uses IS_COMBINING(u_charType(c))

group: ubiditransform
    ubiditransform.o
  deps
    ubidi ushape

group: ubidi_props
    ubidi_props.o
  deps
    utrie2

group: emojiprops
    emojiprops.o
  deps
    ucharstrie ucharstrieiterator
    ucptrie udata

group: unistr_props
    unistr_props.o
  deps
    uchar platform

group: unistr_case_locale
    unistr_case_locale.o
  deps
    unistr_case ustring_case_locale

group: unistr_case
    unistr_case.o
  deps
    ustring_case

group: unistr_titlecase_brkiter
    unistr_titlecase_brkiter.o
  deps
    ustr_titlecase_brkiter

group: ustr_titlecase_brkiter
    ustr_titlecase_brkiter.o
  deps
    breakiterator
    ustring_case_locale ucase

group: edits
    edits.o
  deps
    # Edits::Iterator::toString() calls ICU_Utility::appendNumber()
    icu_utility
    platform

group: ucasemap_titlecase_brkiter
    ucasemap_titlecase_brkiter.o
  deps
    ucasemap breakiterator utext
    ustr_titlecase_brkiter  # ustrcase_getTitleBreakIterator()

group: ucasemap
    ucasemap.o
  deps
    ustring_case ustring_case_locale
    bytestream bytesinkutil  # for UTF-8 output
    resourcebundle  # uloc_getName() etc.

group: ustring_case_locale
    ustrcase_locale.o
  deps
    ustring_case
    resourcebundle  # for uloc_getDefault()

group: ustring_case
    ustrcase.o
  deps
    ucase uchar edits

group: ucase
    ucase.o
  deps
    utrie2

group: uinit
    uinit.o
  deps
    ucnv_io icuplug

group: converter_selector
    ucnvsel.o
  deps
    conversion propsvec utrie2_builder utrie_swap uset ucnv_set

group: ucnvdisp  # ucnv_getDisplayName()
    ucnvdisp.o
  deps
    conversion resourcebundle

group: ucnv_set  # ucnv_getUnicodeSet
    ucnv_set.o
  deps
    uset

group: conversion
    ustr_cnv.o
    ucnv.o ucnv_cnv.o ucnv_bld.o ucnv_cb.o ucnv_err.o
    ucnv_ct.o
    ucnvmbcs.o ucnv_ext.o
    ucnvhz.o ucnvisci.o ucnv_lmb.o ucnv2022.o
    ucnvlat1.o ucnv_u7.o ucnv_u8.o ucnv_u16.o ucnv_u32.o
    ucnvbocu.o ucnvscsu.o
  deps
    ucnv_io

group: ucnv_io
    ucnv_io.o
  deps
    sort stringenumeration udata

group: service_registration
    serv.o servnotf.o servlkf.o servlk.o servls.o servrbf.o servslkf.o
    locutil.o
  deps
    locale_display_names resourcebundle
    hashtable uvector

group: ucat  # message-catalog-like API
    ucat.o
  deps
    resourcebundle

group: locale_display_names
    locdispnames.o  # Locale.getDisplayName()
  deps
    locresdata

group: locale_display_names2
    locdspnm.o  # class LocaleDisplayNames
  deps
    resourcebundle currency simpleformatter unistr_titlecase_brkiter uchar

group: currency
    ucurr.o
  deps
    resourcebundle ulist ustring_case_locale
    stdlib_qsort  # for ucurr.o (which does not use ICU's uarrsort.o)
    static_unicode_sets usetiter

group: icudataver  # u_getDataVersion()
    icudataver.o
  deps
    resourcebundle

group: locresdata
    # This was intended to collect locale functions that load resource bundle data.
    # See the resourcebundle group about what else loads data.
    locresdata.o
  deps
    resourcebundle

group: resbund_cnv  # paths are Unicode strings
    resbund_cnv.o
  deps
    conversion resourcebundle ures_cnv

group: ures_cnv  # ures_openU, path is a Unicode string
    ures_cnv.o
  deps
    conversion resourcebundle

group: resourcebundle
    resource.o resbund.o uresbund.o uresdata.o
    locavailable.o
    # uloc_tag.c and uloc_keytype.cpp convert between
    # old ICU/LDML/CLDR locale IDs and newer BCP 47 IDs.
    # They use data from resource bundles for some of the mappings.
    # We might want to generate .h files for that data, to #include rather than load,
    # to minimize dependencies from this code.
    # Then we could separate this higher-level locale ID code from the resource bundle code.
    uloc.o uloc_tag.o uloc_keytype.o
    # Even basic locid.cpp via Locale constructors and Locale::getDefault()
    # depend on canonicalization and data loading.
    # We can probably only disentangle basic locale ID handling from resource bundle code
    # by hardcoding all of the locale ID data.
    locid.o locmap.o wintz.o
    # Do we need class LocaleBased? https://unicode-org.atlassian.net/browse/ICU-8608
    locbased.o
    loclikely.o
    localebuilder.o
    ulocale.o
    ulocbuilder.o
    loclikelysubtags.o
  deps
    udata ucol_swp
    sort stringenumeration uhash uvector
    uscript_props propname
    bytesinkutil
    errorcode
    lsr

group: localematcher
    localematcher.o
  deps
    resourcebundle localeprioritylist locdistance

group: localeprioritylist
    localeprioritylist.o
  deps
    resourcebundle

group: locdistance
    locdistance.o
  deps
    resourcebundle

group: lsr
    lsr.o
  deps
    platform

group: udata
    udata.o ucmndata.o udatamem.o restrace.o
    umapfile.o
  deps
    uhash platform stubdata
    file_io mmap_functions
    icu_utility

group: unifiedcache
    unifiedcache.o
  deps
    uhash
    platform

group: ucharstriebuilder
    ucharstriebuilder.o
  deps
    ucharstrie stringtriebuilder sort

group: ucharstrieiterator
    ucharstrieiterator.o
  deps
    ucharstrie uvector32

group: ucharstrie
    ucharstrie.o
  deps
    platform

group: bytestriebuilder
    bytestriebuilder.o
  deps
    bytestrie stringtriebuilder sort

group: bytestrieiterator
    bytestrieiterator.o
  deps
    bytestrie uvector32

group: bytestrie
    bytestrie.o
  deps
    platform

group: stringtriebuilder
    stringtriebuilder.o
  deps
    uhash

group: propsvec
    propsvec.o
  deps
    sort utrie2_builder

group: utrie_swap
    utrie_swap.o
  deps
    udata

group: umutablecptrie
    umutablecptrie.o
  deps
    ucptrie

group: ucptrie
    ucptrie.o
  deps
    platform

group: utrie2_builder
    utrie2_builder.o
  deps
    platform
    utrie2
    utrie  # for utrie2_fromUTrie()

group: utrie2  # Try to switch users to ucptrie.
    utrie2.o
  deps
    platform

group: utrie  # Callers should use ucptrie instead.
    utrie.o
  deps
    platform

group: hashtable  # Maps UnicodeString to value.
    uhash_us.o
  deps
    uhash

group: uhash
    uhash.o
  deps
    platform

group: ustack
    ustack.o
  deps
    uvector

group: uvector
    uvector.o
  deps
    platform
    sort  # for UVector::sort()

group: uvector32
    uvectr32.o
  deps
    platform

group: uvector64
    uvectr64.o
  deps
    platform

group: ulist
    ulist.o
  deps
    platform

group: sort
    uarrsort.o
  deps
    platform

group: ustr_wcs
    ustr_wcs.o
  deps
    platform

group: bytesinkutil
    bytesinkutil.o
  deps
    bytestream edits

group: bytestream
    bytestream.o
  deps
    platform

group: icuplug
    icuplug.o
  deps
    platform

group: ucol_swp
    ucol_swp.o
  deps
    utrie_swap

group: errorcode  # ErrorCode base class
    errorcode.o
  deps
    utypes
    platform

group: utypes  # u_errorName()
    utypes.o
  deps
    ubsan

group: platform
    # Files in the "platform" group.
    cmemory.o uobject.o
    cstring.o cwchar.o uinvchar.o
    charstr.o
    fixedstring.o
    unistr.o  # for CharString::appendInvariantChars(const UnicodeString &s, UErrorCode &errorCode)
    appendable.o stringpiece.o ustrtrns.o  # for unistr.o
    ustring.o  # Other platform files really just need u_strlen
    ustrfmt.o  # uprv_itou
    utf_impl.o
    putil.o
    ucln_cmn.o  # for putil.o which calls ucln_common_registerCleanup
    udataswp.o  # for uinvchar.o; TODO: move uinvchar.o swapper functions to udataswp.o?
    umath.o
    umutex.o sharedobject.o
    utrace.o
  deps
    # The "platform" group has no ICU dependencies.
    PIC system_misc system_debug malloc_functions ubsan
    c_strings c_string_formatting
    floating_point system_locale
    stdio_input dir_io
    dlfcn  # Move related code into icuplug.c?
    cplusplus
    std_mutex

# ICU i18n library ----------------------------------------------------------- #

library: i18n
  deps
    region localedata genderinfo charset_detector spoof_detection
    alphabetic_index collation collation_builder string_search
    dayperiodrules
    listformatter
    formatting formattable_cnv regex regex_cnv translit
    double_conversion number_representation number_output numberformatter
    number_skeletons number_usageprefs numberparser
    units_extra unitsformatter
    universal_time_scale
    uclean_i18n
    display_options

group: region
    region.o uregion.o
  deps
    icu_utility
    resourcebundle
    uvector uclean_i18n

group: localedata
    ulocdata.o
  deps
    uniset_props resourcebundle
    uset_props  # TODO: change to using C++ UnicodeSet, remove this dependency

group: genderinfo
    gender.o
  deps
    resourcebundle
    uclean_i18n

group: charset_detector
    csdetect.o csmatch.o csr2022.o csrecog.o csrmbcs.o csrsbcs.o csrucode.o csrutf8.o inputext.o ucsdet.o
  deps
    conversion
    uclean_i18n

group: spoof_detection
    uspoof.o uspoof_build.o uspoof_conf.o uspoof_impl.o scriptset.o
  deps
    uniset_props regex unorm uscript ubidi

group: alphabetic_index
    alphaindex.o
  deps
    collation localedata
    uclean_i18n

group: collation
    # The collation "runtime" code should not depend on the collation_builder code.
    # For example, loading from resource bundles does not fall back to
    # building from rules.
    collation.o collationcompare.o collationdata.o
    collationdatareader.o collationdatawriter.o
    collationfastlatin.o collationfcd.o collationiterator.o collationkeys.o
    collationroot.o collationrootelements.o collationsets.o
    collationsettings.o collationtailoring.o rulebasedcollator.o
    uitercollationiterator.o utf16collationiterator.o utf8collationiterator.o
    bocsu.o coleitr.o coll.o sortkey.o ucol.o
    ucol_res.o ucol_sit.o ucoleitr.o
  deps
    bytestream normalizer2 resourcebundle service_registration unifiedcache
    ucharstrieiterator uiter ulist uset usetiter uvector32 uvector64 utrie2
    uclean_i18n propname

group: collation_builder
    collationbuilder.o collationdatabuilder.o collationfastlatinbuilder.o
    collationruleparser.o collationweights.o
  deps
    canonical_iterator collation ucharstriebuilder uset_props

group: string_search
    search.o stsearch.o usearch.o
  deps
    breakiterator collation

group: dayperiodrules
    dayperiodrules.o
  deps
    resourcebundle uclean_i18n

group: listformatter
    listformatter.o ulistformatter.o
  deps
    uchar resourcebundle simpleformatter format uclean_i18n formatted_value_sbimpl

group: double_conversion
    double-conversion-bignum.o double-conversion-double-to-string.o
    double-conversion-bignum-dtoa.o double-conversion-cached-powers.o
    double-conversion-string-to-double.o double-conversion-fast-dtoa.o
    double-conversion-strtod.o
  deps
    platform

group: number_representation
    number_decimalquantity.o string_segment.o number_utils.o
    # TODO(ICU-21058) Move formatted_string_builder to its own unit.
    formatted_string_builder.o
  deps
    decnumber double_conversion
    # for trimming whitespace around fields
    static_unicode_sets
    # for data loading; that could be split off
    resourcebundle
    int_functions
    ucase uniset_core
    formatted_value

group: number_output
    # PluralRules and FormattedNumber
    number_output.o
    standardplural.o plurrule.o pluralranges.o
  deps
    # FormattedNumber internals:
    number_representation format formatted_value_sbimpl units
    # PluralRules internals:
    unifiedcache
    display_options
    icu_utility_with_props

group: numberformatter
    # ICU 60+ NumberFormatter API
    number_affixutils.o
    number_compact.o number_currencysymbols.o
    number_decimfmtprops.o
    number_fluent.o number_formatimpl.o
    number_grouping.o number_integerwidth.o number_longnames.o
    number_mapper.o number_modifiers.o
    number_notation.o number_padding.o
    number_patternmodifier.o number_patternstring.o
    number_scientific.o
    currpinf.o
    numrange_fluent.o numrange_impl.o
    # NOTE: This could go into its own dependency block, but it would require
    # refactoring more of the dependencies (e.g. removing class methods).
    number_simple.o
  deps
    decnumber double_conversion formattable units unitsformatter
    listformatter number_representation number_output
    numsys
    number_usageprefs
    number_rounding
    number_symbolswrapper
    uclean_i18n common

group: numsys
    dcfmtsym.o
    numsys.o
  deps
    currency
    resourcebundle
    uclean_i18n

group: number_usageprefs
    number_multiplier.o
    number_usageprefs.o
  deps
    number_rounding
    number_symbolswrapper
    unitsformatter

group: number_rounding
    number_rounding.o
  deps
    currency
    number_representation

group: number_skeletons
    # Number skeleton support; separated from numberformatter
    number_skeletons.o number_capi.o number_asformat.o numrange_capi.o
  deps
    numberformatter
    units_extra

group: number_symbolswrapper
    number_symbolswrapper.o
  deps
    platform
    numsys

group: numberparser
    numparse_affixes.o numparse_compositions.o numparse_currency.o
    numparse_decimal.o numparse_impl.o numparse_parsednumber.o
    numparse_scientific.o numparse_symbols.o
    numparse_validators.o
  deps
    numberformatter

group: formatting
    # TODO: Try to subdivide this ball of wax.
    # currencyformat
    curramt.o currfmt.o
    # pluralrules C API
    upluralrules.o
    # decimalformat
    unumsys.o
    decimfmt.o compactdecimalformat.o
    numfmt.o unum.o
    winnmfmt.o
    # scientificnumberformatter - would depend on dcfmtsym, so would be circular.
    scientificnumberformatter.o
    # rbnf
    nfrs.o nfrule.o nfsubs.o rbnf.o
    # measureformat
    measfmt.o quantityformatter.o
    # dateformat
    astro.o buddhcal.o calendar.o cecal.o chnsecal.o coptccal.o dangical.o ethpccal.o
    gregocal.o gregoimp.o hebrwcal.o indiancal.o islamcal.o iso8601cal.o japancal.o persncal.o taiwncal.o
    erarules.o  # mostly for Japanese eras
    ucal.o
    basictz.o olsontz.o rbtz.o simpletz.o timezone.o tzrule.o tztrans.o
    vtzone.o vzone.o wintzimpl.o zonemeta.o zrule.o ztrans.o
    tzfmt.o tzgnames.o tznames.o tznames_impl.o
    datefmt.o dtfmtsym.o dtitvfmt.o dtitvinf.o dtptngen.o dtrule.o reldtfmt.o reldatefmt.o
    smpdtfmt.o smpdtfst.o udateintervalformat.o udatpg.o windtfmt.o
    udat.o
    tmunit.o tmutamt.o tmutfmt.o
    # messageformat
    choicfmt.o msgfmt.o plurfmt.o selfmt.o umsg.o
    # MessageFormat 2
    messageformat2.o messageformat2_arguments.o messageformat2_checker.o
    messageformat2_data_model.o messageformat2_errors.o messageformat2_evaluation.o
    messageformat2_formattable.o messageformat2_formatter.o
    messageformat2_function_registry.o messageformat2_parser.o messageformat2_serializer.o
  deps
    decnumber formattable format units numberformatter number_skeletons numberparser
    formatted_value_sbimpl
    listformatter
    dayperiodrules
    collation collation_builder  # for rbnf
    common
    floating_point  # sqrt() for astro.o
    trigonometry  # for astro.o
    sharedbreakiterator # for reldatefmt.o
    uclean_i18n
    region
    formatted_value_iterimpl  # NOTE (2020-08-27): Not currently used.

group: sharedbreakiterator
    sharedbreakiterator.o
  deps
    breakiterator

group: units_extra
    measunit_extra.o
  deps
    units bytestriebuilder bytestrie resourcebundle uclean_i18n
    double_conversion

group: units
    measunit.o currunit.o
  deps
    stringenumeration errorcode

group: unitsformatter
    units_data.o units_converter.o units_complexconverter.o units_router.o
  deps
    resourcebundle units_extra double_conversion number_representation formattable sort
    number_rounding

group: decnumber
    decContext.o decNumber.o
  deps
    double_conversion uclean_i18n

group: formattable
    fmtable.o
    measure.o
  deps
    decnumber number_representation

group: formattable_cnv
    fmtable_cnv.o
  deps
    formattable unistr_cnv conversion

group: formatted_value
    formattedvalue.o
  deps
    platform

group: formatted_value_iterimpl
    formattedval_iterimpl.o
  deps
    formatted_value format uvector32

group: formatted_value_sbimpl
    formattedval_sbimpl.o
  deps
    number_representation

group: format
    format.o fphdlimp.o fpositer.o ufieldpositer.o
  deps
    resourcebundle parsepos uvector32

group: regex_cnv
    uregexc.o
  deps
    regex unistr_cnv

group: regex
    regexcmp.o regexst.o regextxt.o regeximp.o rematch.o repattrn.o uregex.o
  deps
    uniset_closure utext uvector32 uvector64 ustack
    breakiterator
    uinit  # TODO: Really needed?
    uclean_i18n

group: translit
    anytrans.o brktrans.o casetrn.o cpdtrans.o name2uni.o uni2name.o nortrans.o remtrans.o titletrn.o tolowtrn.o toupptrn.o
    esctrn.o unesctrn.o nultrans.o
    funcrepl.o quant.o rbt.o rbt_data.o rbt_pars.o rbt_rule.o rbt_set.o strmatch.o strrepl.o translit.o transreg.o tridpars.o utrans.o
  deps
    common
    formatting  # for Transliterator::getDisplayName()
    uclean_i18n

group: universal_time_scale
    utmscale.o
  deps
    ubsan

group: uclean_i18n
    ucln_in.o
  deps
    platform

group: display_options
    displayoptions.o
  deps
    platform

# ICU io library ------------------------------------------------------------- #

library: io
  deps
    ustdio ustream uclean_io

group: ustdio
    locbund.o sprintf.o sscanf.o ufile.o ufmt_cmn.o uprintf.o uprntf_p.o uscanf.o uscanf_p.o ustdio.o
  deps
    formatting conversion translit
    uclean_io
    stdio_output

group: ustream
    ustream.o
  deps
    unistr_cnv
    uchar  # for u_isWhitespace()
    iostream

group: uclean_io
    ucln_io.o
  deps
    platform
