Neither one nor Many
Software engineering blog about my projects, geometry, visualization and music.
I use CLion in this blog post, but it should be the same for any of the other editors. (PyCharm, PhpStorm, Intellij, etc.).
It took me a while to get a setup that works reasonably well for me at work, for what I expect not a very uncommon setup. That's why I'm sharing this in a blog post.
The project I'm working on is quite big, 10yr under development; large codebase and a complex build process. The debug build results in a 1.2 GiB executable, all intermediate files generated by the compiler/linker are many, and big. During build a lot of files are removed/(re)created/generated, so in general a lot of I/O happens.
Our build machines are extremely powerful, so it doesn't make sense to work on a local machine because of the build times. That's why compiling happens on remote machines. I have worked remotely at a lot of companies, and usually I would simply use vim + a lot of plugins. However, nowadays I'm accustomed to the power IDE's can provide, primarily navigation-wise (jumping to classes, files, finding usages, etc.) and simply don't want to work without a proper IDE.
I use an NFS
mount (sshfs
would suffice as well) where I mount from the remote to local, not the other way around, or compiling will be extremely slow.
In my opinion using file synchronization in these kinds of setups is too error prone and difficult to get right.
As a side-note; I've seen synchronization work moderately okay within a PHP project. But so far not in a C++ project where intermediate/build-files/libraries are first of all large and scattered throughout the project folder.
In my previous blog post we fixed fsnotifier such as in the previous image, but this also causes a new problem.
During compiling I noticed my IDE would hang, the only cause could be that it's somehow flooded by the enourmous lines of input it now receives from fsnotifier. Perhaps when we're working with the project files on a local disk the IDE wouldn't hang, because simple I/O (even just checking file stats) doesn't have network overhead.
Here I made the fsnotifier script--that was at first just a simple proxy (calling the real fsnotifier via ssh)--more intelligent. It now filters out intermediate files generated by the compiler (.o, .d, and some other patterns).
function custom_filter
{
typeset -n return_val=$1
typeset cmd=$2 # i.e., DELETE/CREATE/CHANGE/...
typeset file=$3 # i.e., /full/path/to/file
# Ignore some files that are not interesting to my IDE
if [[ $file =~ (cmd|mm)\.log$ ]] || \
[[ $file =~ deps.*\.d$ ]] || \
[[ $file =~ \.o$ ]] || \
[[ $file =~ \.o\. ]] || \
[[ $file =~ \.html$ ]] || \
[[ $file =~ core\.*([0-9])$ ]];
then
return_val=false
return
fi
return_val=true
return
}
Download all source code from GitHub: https://github.com/rayburgemeestre/fsnotifier-remote/.
The fsnotifier script outputs it's process id to /tmp/fsnotifier.pid
and hooks two signals, so you can enable/disable it with a signal. Disabling will simply pause outputting all updates from the real fsnotifier (that is invoked via ssh).
kill -SIGINT $(cat /tmp/fsnotifier.pid) - pause all activity
kill -SIGHUP $(cat /tmp/fsnotifier.pid) - continue all activity
Another extension you may find useful would be to make the buildscript touch a file like, i.e. /path/to/project/DISABLE_FSNOTIFIER
and make the fsnotifier script pause itself (or behave differently) during the build until it sees for example the ENABLE_FSNOTIFIER
file.
Simply disabling fsnotifier again doesn't fix the problem, CLion would keep nagging occasionally about conflicts with files that have changed both on disk and in memory. And when auto-generated files are being re-generated by the build, I want my IDE to reflect them immediately.
The filter is just a bash/ksh function, so you can easily extend it with patterns appropriate to your project. The fun thing is you can "killall -9 fsnotifier", and Jetbrains will simply restart it. So no need to restart Jetbrains (and with that having it re-index your project). Debug the filters by tailing: /tmp/fsnotifier-included.log
and /tmp/fsnotifier-filtered.log
.
No longer do I need to filter out *.o
files etc. to get a better responsive IDE nowadays. The network improved (and perhaps it's something that improved in newer CLion versions).
Another change I did make to the script is based on the ROOTS
that get registered (for monitoring the project path) use fsnotifier
over ssh
or not. (for local projects it would try to login via ssh
otherwise, finding nothing and the IDE would hang at that point).
https://github.com/rayburgemeestre/fsnotifier-remote/commit/414e2e1f937a59a9ab11eede6b999c8170e30af0
yena
2020-08-16 09:54:06
It seems to work without fsnotifier scripts or any remote copying, pretty fast. It wasn't the case a while ago.
I need to do Resync with remote host to get the system libraries like /usr/lib and /usr/include to get the completion working when I first set it up though.