gettext-tiny provides lightweight replacements for tools typically used
from the GNU gettext
suite, which is incredibly bloated and takes
a lot of time to build (in the order of an hour on slow devices).
the most notable component is msgfmt
which is used to create binary
translation files in the .mo
format out of textual input files in
.po
format. this is the most important tool for building software from
source, because it is used from the build processes of many software packages.
our msgfmt
implementation was initially a fake implementation that would
just output the english input string as the translation, which is sufficient
to get software to work, but it has since grown into a complete implementation.
unlike the GNU implementation, it can even expand input strings containing
so-called sysdep
strings into a constant translation table.
sysdep
strings were glued as an after-thought onto the GNU implementation to
deal with system-specific format strings, and in the GNU implementation those
are created at runtime, which requires mapping the entire .mo
file into
read/write memory locations, thereby wasting precious RAM for read-only data
that could otherwise be shared among processes.
other parts of gettext-tiny such as xgettext
and msgmerge
are still stubs,
but they are sufficient to build many packages.
since musl
libc, our preferred target, didn't provide a libintl
in the past,
(and it's also part of GNU gettext
) we also ship a no-op libintl providing
a header and a library.
it comes in two flavours:
- nop: gettext functions just return the input string as translation
- musl: a compat library providing a few compatibility symbols meant to be used together with the libintl built-in into recent musl versions. the compatibility symbols help to get past configure scripts that insist on using only the GNU gettext suite. additionally, it can be entirely disabled.
make LIBINTL=FLAVOR
make LIBINTL=FLAVOR DESTDIR=pkgdir prefix=/ install
where FLAVOR can be one of NONE, MUSL, NOOP (as detailed above).
you can override any variables used in the Makefile (such as CFLAGS
) by
appending them to the make
invocation, or by saving them into a file called
config.mak
before running make
.