I&#x27;ll tell you how we do these things in the libguestfs&#x2F;virt-tools project [1].  The project is written in a mix of C, Perl and OCaml.  Mainly C is used for the low-level&#x2F;library bits, and OCaml is used for the higher-level tools.<p>- QA: We have some unit tests, but mainly we use a huge test suite that does end to end testing of tools.  It uses automake&#x27;s test framework, so it works across all the languages in the project.<p>- Builds and releases: We use autotools and tarballs.  It&#x27;s automated using a thing called &#x27;goaljobs&#x27; which is like a generalized make.<p>- The pain points for us all derive from autotools itself, which is both crap and better than all the other build systems[2].  It is at least well understood.<p>I&#x27;d also say the killer advantages of OCaml for me are: Easy calling into C, and compiles to a native binary.<p>[1] <a href="http:&#x2F;&#x2F;libguestfs.org" rel="nofollow">http:&#x2F;&#x2F;libguestfs.org</a> <a href="https:&#x2F;&#x2F;github.com&#x2F;libguestfs&#x2F;libguestfs" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;libguestfs&#x2F;libguestfs</a><p>[2] I use the term &quot;build system&quot; in a rather narrow sense of something that (a) runs on Linux (b) lets the end user download a tarball and (c) builds using .&#x2F;configure &amp;&amp; make