Linux: When Vivado’s GUI doesn’t start with an error on locale
Trying to running Vivado 2017.3 with GUI and all on a remote host with X forwarding, i.e.
$ ssh -X mycomputer
setting the environment with
$ . /path/to/Vivado/2017.3/settings64.sh
it failed with
$ vivado & terminate called after throwing an instance of 'std::runtime_error' what(): locale::facet::_S_create_c_locale name not valid
Now here’s the odd thing: The error message is actually helpful! It is a locale problem:
$ locale locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory LANG=en_IL LC_CTYPE="en_IL" LC_NUMERIC="en_IL" LC_TIME="en_IL" LC_COLLATE="en_IL" LC_MONETARY="en_IL" LC_MESSAGES="en_IL" LC_PAPER="en_IL" LC_NAME="en_IL" LC_ADDRESS="en_IL" LC_TELEPHONE="en_IL" LC_MEASUREMENT="en_IL" LC_IDENTIFICATION="en_IL" LC_ALL=
Checking on a non-ssh terminal, all read “en_US.UTF-8″ instead. The problem seems to be that the SSH is from a newer Linux distro to an older one. “en_IL” is indeed the locale on the newer machine, which is OK there. And SSH changed the locale (which I believe one can avoid, but it’s not worth the effort given the simple workaround below).
So the fix is surprisingly simple:
$ export LC_ALL=en_US.UTF-8
and then check again:
$ locale LANG=en_IL LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=en_US.UTF-8
OK, so LANG is still rubbish, but after this Vivado 2017.3′s GUI is up and running.
I should mention that there was no problem starting Vivado 2014.4′s GUI, but instead it crashed somewhere in the middle of the implementation. Once again, the fixing the locale solved this.