+-------------+-----------------+-----------------+--------------------------+------------------------+
| [image:     | [image:         | [image: Chat on | Linux + OS X: [image:    | Windows: [image:       |
| License:    | Documentation   | Gitter][image]  | Linux+OSX build          | Windows build          |
| MIT][image] | status][image]  |                 | status][image]           | status][image]         |
+-------------+-----------------+-----------------+--------------------------+------------------------+


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" "$ | "$ cmany b"                     |
| cmake .." "$ cmake --build ."   |                                 |
+---------------------------------+---------------------------------+


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.


More info
=========

* Project home

* Installing

* Getting started


Support
=======

* Gitter room: https://gitter.im/cmany_/community.

* send bug reports to https://github.com/biojppm/cmany/issues.

* send pull requests to https://github.com/biojppm/cmany/pulls.


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.
