6

Zesty ships with multiple versions of Clang. The clang Install clang package depends on both clang-3.9 Install clang-3.9 and clang-4.0 Install clang-4.0. It appears that Clang 4 is used by default:

$ clang --version
clang version 4.0.0-1ubuntu1 (tags/RELEASE_400/rc1)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

However, I need Clang 3.9 to be the default version. I am unable to compile UnrealEngine because of this:

UnrealBuildTool Exception: ERROR: This version of the Unreal Engine can only be
    compiled with clang 3.9, 3.8, 3.7, 3.6 and 3.5. clang 4.0.0 may not build it -
    please use a different version.

How can I go about this?

2
  • Looking through the source code, it just defaults to whatever is in your PATH and CPATH and then does a check on the first version found there. Are you okay temporarily changing those paths to build this? – Grayson Kent Apr 22 '17 at 22:05
  • 1
    @GraysonKent I found an answer and posted it below, but changing the PATH would have worked as well, I'm sure. – Nathan Osman Apr 22 '17 at 22:11
11

To build on the accepted answer, If you have multiple versions of clang, it may be in your best interest to make clang++ dependent on clang so that all you need to do is update clang to a different version and the version of clang++ follows suit.

You can do this using the --slave option of update-alternatives. So something like this:

sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.9 100 \
   --slave /usr/bin/clang++ clang++ /usr/bin/clang++-3.9

You can of course do it for other versions:

sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-4.0 100 \
   --slave /usr/bin/clang++ clang++ /usr/bin/clang++-4.0

sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-5.0 100 \
   --slave /usr/bin/clang++ clang++ /usr/bin/clang++-5.0

To switch versions, you just type:

sudo update-alternatives --config clang

Enter a selection and both clang and clang++ will be automatically switched to the same versions.

The same idea applies to GCC if you also have multiple versions of that, you can use this method to configure gcc and g++.

Errors:

update-alternatives: error: alternative clang++ can't be slave of clang: it is a master alternative

You may get this error when you try to run the above commands. No worries, it just means that you already configured clang++ on it's own as an alternative, so you will need to remove that alternative before the above will work. You can do so with the command:

sudo update-alternatives --remove clang++ /usr/bin/clang++-3.9

Do this for each version of clang++, then after removing them all, try again.

Sources:

8

This answer pointed me in the right direction:

sudo update-alternatives --install \
    /usr/bin/clang++ clang++ /usr/lib/llvm-3.9/bin/clang++ 100
sudo update-alternatives --install \
    /usr/bin/clang clang /usr/lib/llvm-3.9/bin/clang 100

After running those two commands, the build was able to continue.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.