AutoHell v CMake

People familiar with the GNU/Unix system would know that the standard way to install about any GNU software from code is to run the following commands

configure
make
sudo make install

These commands are from the GNU autotools environment. Knowing the GNU environment, these tools are what I used to compile most of the (relatively small) pieces of code I wrote.

Until I discovered CMake.

CMake, or Cross-platform Make is a tool that serves the same functionality as the GNU autotools (hereafter referred to as autohell). As the name suggests, CMake can be used to compile software across multiple platforms.

Why am I encouraging CMake over autohell? Well, firstly, it’s not autohell! The GNU autotools are extremely useful when compiling on Linux. That’s what they are designed for. Cross compilation is extremely easy with the --host= flag. Unfortunately, when it comes to using them on Windows, the system just becomes a pain in the neck.

People who have tried to compile a GNU package on Windows would know what I’m speaking about. You type in configure, wait for about half an hour while the script does its job in the MSYS terminal, then enter make -j4 (to speed up the process), wait for an hour while libtool compiles the bloody code, then make install (finally!).

The reason why the process is so painfully slow is that autotools, at their heart are just shell scripts. This means that while compiling for Windows, in an MSYS terminal, the shell script is parsed by sh.exe, which is a slow emulator of the Unix shell. Further, when the configure script has done its job, the Makefile takes over, which relegates all compile operations to libtool, which is another bloody shell script. More sh.exe calls! The result? A painfully slow compile and installation process. Contrast that with CMake. Now, CMake exists on all platforms. It’s simple and elegant, and allows a choice of compilers, right from MSYS Makefiles, to CodeBlocks MinGW projects, to Visual Studio project files.

To prove my point, I’d just recommend that you checkout a simple project (Library management system, my 12th grade project) in my GitHub repository, which can be compiled using autohell as well as CMake. The CMake step takes a second, while autohell takes over a minute (on Windows). Moreover, the CMakeLists.txt file is short and sweet, and was written in under a minute. By contrast, I took ages to write autohell files, what with configure.ac, Makefile.am and stuff. I switched from autohell to CMake immediately.

comments powered by Disqus