Manage 3rd party libraries installation C++

120 views Asked by At

I am wondering how to intelligently manage the building and installation for some of our 3rd party C++ dependencies on Linux(Ubuntu). The way I currently have it set up is a git-lfs with all the necessary compressed 3rd party sources. I then use a shell script I wrote to install all the necessary system dependencies and then unzip and build the desired library. This shell script also takes care setting up all the paths so that our source code can easily link to the 3rd party libraries.

Example commands for our script are ./install opencv or ./install everything

However, over the months the script has gotten quite large and breaks sometimes when certain libraries are already installed or other minor issues. Thus I would like to replace it with something a bit more intelligent and useful. I have currently been looking into writing some kind of python script, but just changing the language from shell to python is not that big of an advantage. So I am looking if there are any specific python libraries that can help me with managing these libraries.

I have looked into things like chef and other automated builds stuff, but that is overkill for the small project I am working on.

I was wondering what other people used for this 3rd party management stuff, as sadly C++ does not have anything like pip.

1

There are 1 answers

0
jcupitt On

I use jhbuild for this kind of thing (if I understand what you are doing correctly). It came out of the GNOME project (they use it to build the whole desktop from source), but it's easy to customize for any set of projects. The jhbuild packaged in recent Ubuntus works fine.

You write a little XML to describe each project: where to download the sources, what patches to apply, what configure flags to use, what projects it depends on, and so on; then when you enter jhbuild build mything it works out what to build and in what order and gets on with it. It's reasonably smart about changes, so if you edit a source file in one of the projects that makes up your stack, it'll only rebuild the affected parts.

For example, I have this for fftw3, the excellent fast Fourier transform library:

  <autotools id="fftw3" 
    autogen-sh="configure"
    autogenargs="--disable-static --enable-shared --disable-threads"
    >
    <branch
      repo="fftw"
      module="fftw-3.3.4.tar.gz"
    />
    <dependencies>
      <dep package="libiconv"/>
    </dependencies>
  </autotools>

With probably obvious meanings. That's building from a release tarball, but it can build from git as well. It's happy with cmake projects. jhbuild is written in Python, so it's simple to customize. Thanks to GNOME, many common libraries are included.

I actually use it to build Windows binaries. You can set it up to build everything with a cross-compiler, then put it inside Docker. It makes it a one-liner for anyone to be able to build a large and complex application on (almost) any platform. You can use it to do automated nightly builds as well, of course.

There are probably better things around, but it has worked well for me.