A while ago I wrote a post on using Emacs as a C++ IDE. That setup seems to work really well for small to medium sized projects that don’t use certain libraries. However, I’ve found that the code completion is not always as consistent and good as I would like. After listening to a CppCast interview with Anastasia Kazakova I decided to try CLion out as an IDE. Being a loyal Emacs user I was quite skeptical initially but always longed for a really well-developed and smooth workflow, something that CLion promised.
After experimenting with CLion for maybe 30 minutes I wanted to give it a test-drive on a large project I’m working on that leverages Charm++ for parallelization. Charm++ is actually part of the reason the Emacs setup doesn’t work as well as I’d like. It adds a lot of code that Emacs tries to do code completion on and either I haven’t found the right settings or the plugins just are not quite up to the task. As it often happens when starting to use a new IDE with an existing large project, nothing worked out of the box. I quickly managed to get the code to compile. Playing around with more toy code allowed me to better understand how CLion’s CMake options worked and soon thereafter I was compiling the project with CLion. Great, right?
Unfortunately, even though CLion had no troubles compiling the
project it failed with strange “CMake Project” errors. Specifically,
charmc, the Charm++ compiler wrapper, would fail with the error
file with unrecognized extension .... This
was very puzzling since I could build the project just
fine. A Google search yielded nothing useful so I decided to solve the
problem myself. Searching through the
charmc script I found the line
that gives the error and then started experimenting with what changes
would result in successful code compilation and also successful
code completion in CLion. Ultimately I found there were two changes
charmc. Note that the funny indentation in the following is
because of the tabs in the
charmc script. First I had to replace the
lines (approximately line 1350)
This was needed for dealing with code completion and CLion not finding some of the header files. Next, to deal with the actual “file extension unrecognized” errors I changed the lines (approximately line 1380)
These changes appear to be sufficient for projects that only use
C++. However, if your project also compiles C or Fortran code you may
need to change more of the
charmc script. Hopefully the above will
guide you on your way to making those changes.
Next I had to get CLion’s code completion and analysis toolsto find
the Charm++ headers. For this you will need to explicitly add the
-I/path/to/charm/include flag to the
This can be done by adding the following to your CMake setup,
Now we are most of the way to where we want to be, but unfortunately
CLion still will not recognize C++11, even
if you have set the flag
-std=c++11 (at least using Clang on
macOS). To deal with this I added
to the CMake file. Note that if you do not have
libc++ installed on
your system you can omit the
-stdlib=libc++ flag. On macOS
is always installed.
Finally, on macOS it was also necessary to add
to the CMake file.
With these changes I was able to successfully compile the code base
and also have CLion’s code completion and code analysis tools work
correctly. At some point I may submit patches to the
back to the Charm++ project, but for now this is enough to allow me to
have the workflow I’ve always wanted.