blob: 5624460e590dae7c9d1650f2f103d006c485cb52 [file] [log] [blame]
# Notes specific to building ICU in Fuchsia tree
This note is specific to compiling ICU for Fuchsia as a target, but only within
the Fuchsia git source code repository.
On Fuchsia we need to compile ICU at 3 separate but not always different ICU
commit IDs. I call these ICU "flavors", and Fuchsia has "default", "stable",
and "latest" flavors defined today.
This setup fights a bit with the way the default ICU build works, since all of
the above flavors end up wanting to place some of their outputs in
`$root_build_dir` under the same name (e.g. `icudtl.dat`). Such a setup causes
GN to complain about multiple build rules defining the same output, and fail
the build. So the vanilla setup does not work for us.
To have 3 possibly different ICUs coexist in peace in the Fuchsia tree, the
following changes are needed in the ICU library proper:
- We introduced a file `//build/icu.gni` which will live in the Fuchsia git
tree, and contains the shared configuration to be used instead of
`config.gni`. Without it, compilation will fail saying that multiple config
files define the same args. Since providing this config file to all
downstream deps would be tedious, and error prone, there is a
Fuchsia-specific branch in `config.gni` which will look for `//build/icu.gni`
only if the configuration indicates we are building Fuchsia, and building in
the Fuchsia git source tree.
- Added some flags and conditionals to avoid
putting key artifacts into `$root_build_dir`. Without it, compilation will
fail because all ICU flavors we compile will want to put same-named artifacts
into the same spot in `$root_build_dir`.
- The above conditionals caused some of the variables to become unused in some
code paths, so I marked those as `not_needed`. This should not adversely
affect any builds, Fuchsia or otherwise.
- Started storing the major version of the library in a JSON file at the root
directory. This allows tools other than GN to read the file, and use
standardized tools for parsing the value. Without this, we'd need to rely on
possibly brittle parsing to achieve the same effect, which seemed unnecessary.
- I modified [scripts/update.sh] to transition to updating the JSON file, so
the update process to update the above JSON file instead of the `.gni` file
directly so the ICU update process does not change for the human operator.
These settings should only take effect in the Fuchsia in-tree build of ICU.
While there might be some value in having `//build/icu.gni` defined in each
downstream build, this seemed like an overkill at this time.