---
name: "zmk.Program"
section: "5"
platform: "linux"
package: "zmk-doc"
version: "0.5.1-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/zmk.Program"
---

# zmk.Program(5)

template for compiling C/C++/ObjC programs

## NAME

**Program** – template for compiling C/C++/ObjC programs

## SYNOPSIS

```
include z.mk
# programName is any valid identifier.
programName.Sources = hello.c
$(eval $(call ZMK.Expand,Program,programName))
```

## DESCRIPTION

The template **Program** once *expanded* with a *program* *name* to creates rules for compiling, cleaning, installing and removing a single program written in C, C++ or Objective C.

Source files are compiled to object files prefixed with *$(programName)-*, so that a single source file can be compiled separately with distinct preprocessor, compiler and linker options.

When cross-compiling for *Windows* or *DOS*, the *$(exe)* variable expands to *.exe*

## TARGETS

This module provides the following targets.

### $(programName)$(exe)

This target represents the program executable.

### all

This *phony* target depends on *$(programName)$(exe)*

### clean

This *phony* target removes *$(programName)$(exe)* as well as constituent *object* *files* and *dependency* *files*.

### install

This *phony* target copies *$(programName)* to *$(programName.InstallDir)*, with the name *$(programName.InstallName)* and mode *$(programName.InstallMode)*. The target directory is automatically created if required.

The variables **Configure.ProgramPrefix**, **Configure.ProgramSuffix** and **Configure.ProgramTransformName** automatically impact the installed names of all the programs.

### uninstall

This *phony* target removes *$(programName)$(exe)* as installed by the *install* target.

## VARIABLES

This module provides the following variables.

### $(programName).Sources

List of source files to compile.

There is no default value. This variable must be set before *expanding* the template.

### $(programName).Objects

List of object files to link.

The default value is all the elements of *$(programName).Sources* with the added prefix *$(programName)-* and with the extension replaced by *.o*.

### $(programName).Linker

Linker required to link object files together.

The default value depends on the type of source files used, ensuring that C++ sources are linked with the C++ linker.

### $(programName).InstallDir

The directory *$(programName)$(exe)* is installed to.

The default value is *$(bindir)* but *$(sbindir)* or *$(libexecdir)* are commonly used as well. The special value *noinst* disables the rules related to installation and uninstallation.

### $(programName).InstallName

The name of the program after installation.

The default value is *$(programName)*

### $(programName).InstallMode

The UNIX mode *$(programName)$(exe)* is installed with.

The default value is *0755*.

### DESTDIR

Path added to all installation targets.

This variable is normally set externally, to install a compiled program into a staging area during construction of a compiled binary package.

### CFLAGS, CXXFLAGS, OBJCFLAGS

Options for the C, C++ and the Objective C compiler, respectively.

### CPPFLAGS

Options for the preprocessor.

## IMPLEMENTATION NOTES

**Program** uses **InstallUninstall** to handle installation and removal. The **exe** variable is automatically set to *.exe* where appropriate.

## EXAMPLES

With the following *true\_false.c* file:

```
#include <stdlib.h>
int main(void) {
	return EXIT_CODE;
}
```

The following *Makefile* builds the classic programs *true* and *false*.

```
include z.mk
true.Sources = true_false.c
$(eval $(call ZMK.Expand,Program,true))
true$(exe): CPPFLAGS += -DEXIT_CODE=EXIT_SUCCESS
false.Sources = true_false.c
$(eval $(call ZMK.Expand,Program,false))
false$(exe): CPPFLAGS += -DEXIT_CODE=EXIT_FAILURE
```

## HISTORY

The **Program** template first appeared in zmk 0.1

## AUTHORS

Zygmunt Krynicki ⟨*me@zygoon.pl*⟩
