Quickstart guide

To use ZenMake you need ZenMake and buildconf file in the root of your project.

Let’s consider an example with this structure:

testproject
├── buildconf.py
├── prog
│   └── test.cpp
└── shlib
    ├── util.cpp
    └── util.h

For this project buildconf.py can be like that:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 tasks = {
     'util' : {
         'features' : 'shlib',
         'source'   :  { 'include' : 'shlib/**/*.cpp' },
         'includes' : '.',
     },
     'program' : {
         'features' : 'program',
         'source'   :  { 'include' : 'prog/**/*.cpp' },
         'includes' : '.',
         'use'      : 'util',
     },
 }

 buildtypes = {
     'debug' : {
         'toolchain' : 'auto-c++',
     },
     'release' : {
         'toolchain' : 'g++',
         'cxxflags'  : '-O2',
     },
     'default' : 'debug',
 }
Lines Description
1 Section with build tasks
2,7 Names of build tasks. By default they are used as target names. Resulting target names will be adjusted depending on a platform. For example, on Windows ‘program’ will result to ‘program.exe’.
3 Mark build task as a shared library.
4 Specify all *.cpp files in the directory ‘shlib’ recursively.
5,10 Specify the path for C/C++ headers relative to the project root directory. In this example, this parameter is optional as ZenMake adds the project root directory itself. But it’s an example.
8 Mark build task as an executable.
9 Specify all *.cpp files in the directory ‘prog’ recursively.
11 Specify task ‘util’ as dependency to task ‘program’.
15 Section with build types.
16,19 Names of build types. They can be almost any.
17 Specify auto detecting system C++ compiler.
20 Specify g++ compiler (from gcc).
21 Specify C++ compiler flags.
23 Special case: specify default build type that is used when no build type was specified for ZenMake command.

In case of using YAML the file buildconf.yaml with the same values as above would look like this:

tasks:
  util :
    features : shlib
    source   :  { include : 'shlib/**/*.cpp' }
    includes : '.'
  program :
    features : program
    source   :  { include : 'prog/**/*.cpp' }
    includes : '.'
    use      : util

buildtypes:
  debug :
    toolchain : auto-c++
  release :
    toolchain : g++
    cxxflags  : -O2
  default : debug

Once you have the config, run zenmake in the root of the project and ZenMake does the build:

$ zenmake
* Project name: 'testproject'
* Build type: 'debug'
Setting top to                           : /tmp/testproject
Setting out to                           : /tmp/testproject/build
Checking for 'g++'                       : /usr/bin/g++
[1/4] Compiling shlib/util.cpp
[2/4] Compiling prog/test.cpp
[3/4] Linking build/debug/libutil.so
[4/4] Linking build/debug/program
'build' finished successfully (0.433s)

Running ZenMake without any parameters in a directory with buildconf.py or buildconf.yaml is the same as running zenmake build. Otherwise it’s the same as zenmake help.

Get the list of all commands with a short description using zenmake help or zenmake --help. To get help on selected command you can use zenmake help <selected command> or zenmake <selected command> --help

For example to build release of the project above such a command can be used:

$ zenmake build -b release
* Project name: 'testproject'
* Build type: 'release'
Setting top to                           : /tmp/testproject
Setting out to                           : /tmp/testproject/build
Checking for program 'g++, c++'          : /usr/bin/g++
Checking for program 'ar'                : /usr/bin/ar
[1/4] Compiling shlib/util.cpp
[2/4] Compiling prog/test.cpp
[3/4] Linking build/release/libutil.so
[4/4] Linking build/release/program
'build' finished successfully (0.449s)

One of the effective and simple ways to learn something is to use real examples. Examples of projects can be found in the repository here.