Here's FontMerge. It's command line is:

FontMerge <source> [<destination>]

<source> is the directory of fonts to merge into <destination>.
<destination> is optional, in which case the third-from-last element of
Font$Path is used. This may seem a bit strange, but consider what Font$Path
will look like:

Font$Path(Macro) : SCSI::JRoach_A.$.!boot.Resources.!Fonts.,<Font$Prefix>.,Resources:$.Fonts.

The last element is in Resources - impossible to merge into here.
The next-to-last element in <Font$Prefix> for old style compatibility - not
  a good idea to try merging here.
The third-from-last element is the interesting one.

Once <destination> has been worked out FontMerge will merge the fonts from
source into it. FontMerge will automatically overflow into a brand new font
directory related to <destination> if necessary, thus removing the need for
the user to worry about this.

The auto-overflow works as follows. Suppose <destination> is
"SCSI::JRoach_A.$.!boot.Resources.!Fonts.", then FontMerge will overflow
into "SCSI::JRoach_A.$.!boot.Resources.!Fonts1." and, if that gets full,
it'll overflow into "SCSI::JRoach_A.$.!boot.Resources.!Fonts2." and so on.
Before it starts FontMerge will check for such overflow directories and
start merging into the highest numbered one from the start.

When merging into a directory FontMerge will automatically process font
messages files. Messages files for all languages given in the <source> and
<destination> will be generated.

FontMerge is a directory and should be left like this. This is to enable
FontMerge to be localised for a particular country simply by replacing the
messages file inside the fontmerge directory. Even though FontMerge is
a directory and not a file, using it is just like using any other command
line program.

FontMerge is really designed to be run from other desktop applications. It
initialises itself as a wimp task to generate wimp error boxes if it has an
error, and does Hourglass_Percentage calls as it processes the merge.

--Jonathan
