googlefonts / googlefonts/fontmake
Latin languagesystem breaks variable font build
- Dominant language
- Python
- Stars
- 888
- Forks
- 97
- Avg merge
- 4d 52m
- Merged PRs (30d)
- 1
Description
It took me a long time to narrow it down, but I'm hitting an issue where having a Latin language system declaration in the features for a variable font causes the process for generating with fontmake to fail.
For example, if the features start with just the default language system, the font generates fine, as expected:
```
languagesystem DFLT dflt;
```
But if I have the default plus Latin, like so:
```
languagesystem DFLT dflt;
languagesystem latn dflt;
```
… then fontmake chokes and throws the following tracebacks (which are a bit cryptic):
```
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontmake/font_project.py", line 1127, in run_from_designspace
self._run_from_designspace_interpolatable(
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontmake/font_project.py", line 1223, in _run_from_designspace_interpolatable
self.build_variable_fonts(
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontmake/font_project.py", line 420, in build_variable_fonts
fonts = ufo2ft.compileVariableTTFs(
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/ufo2ft/__init__.py", line 633, in compileVariableTTFs
vfNameToTTFont = varLib.build_many(
^^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/__init__.py", line 1012, in build_many
vf = build(
^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/__init__.py", line 1092, in build
_merge_OTL(vf, model, master_fonts, axisTags)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/__init__.py", line 700, in _merge_OTL
merger.mergeTables(font, master_fonts, ["GSUB", "GDEF", "GPOS"])
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 157, in mergeTables
self.mergeThings(font[tag], [m.get(tag) for m in master_ttfs])
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 1206, in mergeThings
super(VariationMerger, self).mergeThings(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 144, in mergeThings
self.mergeObjects(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 115, in mergeObjects
mergerFunc(self, value, values)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 1206, in mergeThings
super(VariationMerger, self).mergeThings(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 144, in mergeThings
self.mergeObjects(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 115, in mergeObjects
mergerFunc(self, value, values)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 1206, in mergeThings
super(VariationMerger, self).mergeThings(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 144, in mergeThings
self.mergeObjects(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 115, in mergeObjects
mergerFunc(self, value, values)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 1206, in mergeThings
super(VariationMerger, self).mergeThings(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 146, in mergeThings
self.mergeLists(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 125, in mergeLists
self.mergeThings(value, values)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 1206, in mergeThings
super(VariationMerger, self).mergeThings(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 144, in mergeThings
self.mergeObjects(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 115, in mergeObjects
mergerFunc(self, value, values)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 1206, in mergeThings
super(VariationMerger, self).mergeThings(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 144, in mergeThings
self.mergeObjects(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 115, in mergeObjects
mergerFunc(self, value, values)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 1206, in mergeThings
super(VariationMerger, self).mergeThings(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 144, in mergeThings
self.mergeObjects(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 115, in mergeObjects
mergerFunc(self, value, values)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 1206, in mergeThings
super(VariationMerger, self).mergeThings(out, lst)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/merger.py", line 149, in mergeThings
raise ShouldBeConstant(self, expected=out, got=lst)
fontTools.varLib.errors.ShouldBeConstant:
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontmake/__main__.py", line 675, in main
project.run_from_designspace(inputs.designspace_path, **args)
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontmake/font_project.py", line 1142, in run_from_designspace
raise FontmakeError(
fontmake.errors.FontmakeError:
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.11/bin/fontmake", line 8, in
sys.exit(main())
^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontmake/__main__.py", line 700, in main
sys.exit(f"fontmake: Error: {str(e)}")
^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontmake/errors.py", line 33, in __str__
cause = str(self.__cause__) if self.__cause__ is not None else None
^^^^^^^^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/errors.py", line 70, in __str__
return "\n\n" + basic + location + self.details
^^^^^^^^^^^^
File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/fontTools/varLib/errors.py", line 86, in details
good_ttf = next(
^^^^^
StopIteration
```
Changing the Latin declaration to something else like Cyrillic or Arabic results in a different error that may be related and/or may be triggered by an issue with some inconsistency between my sources:
```
fontmake: Error: In 'Fubar.designspace': Generating fonts from Designspace failed:
Couldn't merge the fonts, because some values were different, but should have
been the same. This happened while performing the following operation:
GPOS.table.ScriptList.ScriptCount
The problem is likely to be in Fubar Condensed Regular:
Expected to see .ScriptCount==3, instead saw 2
```
For what it's worth, there is only one .fea file being used for all features and language declarations in the variable font.
Contributor guide
Assessment
This issue has not been assessed yet.