License: MIT Documentation status Chat on Gitter Linux + OS X: Linux+OSX build status Windows: Windows build status

cmany

Easily batch-build cmake projects!

cmany is a command line tool to easily build variations of a CMake C/C++ project. It combines different compilers, cmake build types, compilation flags, processor architectures and operating systems.

For example, to configure and build a project combining clang++ and g++ with both Debug and Release:

$ cmany build -c clang++,g++ -t Debug,Release path/to/CMakeLists.txt

The command above will result in four different build trees, placed by default under a build directory placed in the current working directory:

$ ls build/*
build/linux-x86_64-clang++3.9-Debug
build/linux-x86_64-clang++3.9-Release
build/linux-x86_64-gcc++6.1-Debug
build/linux-x86_64-gcc++6.1-Release

Each build tree is obtained by first configuring CMake with the given parameters, and then invoking cmake --build to build the project at once.

You can also use cmany just to simplify your cmake workflow! These two command sequences have the same effect:

typical cmake cmany
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .
$ cmany b

Features

  • Easily configure and build many variations of your project with one simple command.
  • Saves the tedious work of dealing with many build trees by hand.
  • Sensible defaults: cmany build will create and build a single project using CMake’s defaults.
  • Transparently pass flags (compiler flags, processor defines or cmake cache variables) to any or all of the builds.
  • Useful for build comparison and benchmarking. You can easily setup bundles of flags, aka variants.
  • Useful for validating and unit-testing your project with different compilers and flags.
  • Useful for creating distributions of your project.
  • Avoids a full rebuild when the build type is changed. Although this feature already exists in multi-configuration cmake generators like Visual Studio, it is missing from mono-configuration generators like Unix Makefiles.
  • Run arbitrary commands in every build tree or install tree.

Current status

cmany is in alpha state, under current development.

Known issues

  • cmany invokes the compilers given to it to find their name and version. So far, this successfully works with Visual Studio, gcc (also with arm-linux and mips-linux counterparts), clang, icc and zapcc. However, the current implementation for guessing the name and version is fragile and may fail in some compilers which were not tested. Please submit a bug or PR if you see such a failure.
  • Though cmany works in OS X with gcc and clang, using Xcode has not been tested at all. Get in touch if you are interested in getting cmany to work with Xcode.
  • Pure C projects (ie not C++) should work but have not yet been tested. Some bugs may be present.

License

cmany is permissively licensed under the MIT license.