---
name: "mk-configure"
section: "7"
platform: "linux"
package: "mk-configure"
version: "0.40.3-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/mk-configure"
---

# mk-configure(7)

lightweight replacement for GNU autotools

## NAME

mk-configure - lightweight replacement for GNU autotools

## DESCRIPTION

**mk-configure** is a collection of include files for bmake (portable version of NetBSD make) and a number of executables. It is intended to simplify crossplatform development and software building.

There are only a few top-level makefiles: **mkc.init.mk**, **mkc.mk**, **mkc.configure.mk**, **mkc.minitest.mk**. Everything else (**mkc\_imp.\*.mk** files) is included implicitely. Do not use **mkc\_imp.\*.mk** files directly! If you do, I cannot guarantee backward compatibility. **mkc.configure.mk** is included automatically by **mkc.mk**, but can be included explicitely. **mkc.minitest.mk** provides a trivial support for regression tests and should be included explicitely. Usually mk-c makefiles consist of variables assignments and inclusion of **mkc.mk** in the and. One can also use **mkc.prog.mk**, **mkc.lib.mk**, **mkc.files.mk**, **mkc.subdir.mk** and **mkc.subprj.mk** instead of **mkc.mk**. The latter activates **mkc.lib.mk** if variable LIB is set, **mkc.prog.mk** if variables PROG or PROGS are set, **mkc.subprj.mk** if variable SUBPRJ is set, **mkc.subdir.mk** if variable SUBDIR is set, and **mkc.files.mk** otherwise.

**To get system-wide configuration parameters,** **mkc.init.mk** loads "${MAKECONF}" file if it exists. Otherwise, it loads /etc/mkcmake.conf if it exists. If neither ${MAKECONF} nor /etc/mkcmake.conf exist, it tries to load /etc/mk.conf file. If "${SRCTOP}/Makefile.common" file exists it is also included by all subprojects. Unless SRCTOP variable is set, "../Makefile.inc" is also included if exists. These files may define any of the variables described below. Compiler-specific defaults are also loaded from "~/.mkcmake" or system directories. This compiler-specific defaults are determined at build time or with the help of **mkc\_compiler\_settings** utility.

Below in square brackets the default value for variables are specified. In triangle brackets -- typical way of use, where *I* means "Initialized by mk-configure", *Iu* means "Initialized by mk-configure but may be overriden by user", *Im* means "Initialized by mk-configure but may be set in Makefile", *U* means "Usually set by user", *M* means "May be set or changed in project's Makefile" and *Mu* means "May be set in project's Makefile but may be initialized or overriden by user".

Variable *MKCMAKE* is always 1 in **mkcmake**.

### Targets

Mk-configure provides the following targets:

- all

  build everything.

- clean

  clean temporary files and directories with the help of ${CLEANFILES\_CMD} and ${CLEANDIRS\_CMD} commands.

- cleandir

  remove all of the files removed by the target clean, as well as cache files created by **mkc.configure.mk**.

- installdirs

  create target directories.

- install

  install programs, libraries, files, include files, manual pages etc. to the target directories with the help of ${INSTALL} program.

- uninstall

  remove installed files with the help of ${UNINSTALL} command.

- configure

  check for MKC\_ERR\_MSG variable and fails if it set printing an error message

- depend

  create .depend\_${.CURDIR:T} file containing list of dependencies (see [mkdep(1)](/mkdep/1.md)).

- filelist

  output a list of destination files of the project, one per line, e.g.

  ```
    /usr/local/bin/hello
    /usr/local/man/man1/hello.1
  ```

- obj

  if MKOBJDIR is "yes", creates object directories (${.OBJDIR}) according to MAKEOBJDIR and MAKEOBJPREFIX variables. Current umask is used for this.

- mkgen

  See **mkc\_imp.foreign\_autotools.mk**.

- bin\_tar, bin\_targz, bin\_tarbz2, bin\_zip, bin\_deb

  build software, install it to a temporary directory (using DESTDIR) and create .tar/.tar.gz/.tar.bz2/.zip/.deb archive containing all installed files. The target *bin\_deb* expects debian control files in DEBIAN subdirectory, see examples/files for the sample.

**NOTE:** Commands associated with targets *all*, *install*, *clean*, *cleandir*, *depend*, *test*, *installdirs*, *uninstall*, *configure* and *filelist* in Makefile override the standard behaviour.

**NOTE:** All targets in this list have  *pre\_\**, *do\_\** and *post\_\** counterparts. See ALLTARGETS for details.

### mkc.init.mk

This file is included by **mkc.mk** and **mkc.configure.mk** automatically but can be used by users directly. **mkc.init.mk** uses the following variables.

- AFLAGS

  Options to ${CC} when compiling or linking .s or .S assembly source files.  \[\]

- AR

  Create, modify, and extract from archives. \<*Iu*\> \[*ar*\]

- ARFLAGS

  Options to ${AR}. \<*Iu*\> \[*rl*\]

- AS

  Assembler. \<*Iu*\> \[*as*\]

- BINDIR

  Target directory for utilities. \<*Iu Mu*\> \[*${PREFIX}/bin*\]

- BMAKE\_REQD

  Minimal required version of **bmake**. If it is older, **mkcmake** exits with error. \<*Im*\>

- BZIP2

  bzip2 copression tool. \<*Iu*\> \[*bzip2*\]

- CC

  C compiler. \<*Iu*\> \[*cc*\]

- CC\_PREFIX

  Prefix command for ${CC}, for example, distcc or ccache. \<*Iu*\> \[\]

- CC\_TYPE

  C compiler type. This variable is set by **mk-configure** and can be overriden by user. It can get the following values:

  ```
  Value     Description
  ----------------------
  gcc       GNU C/C++ compiler
  pcc       Portable C compiler
  icc       Intel C/C++ compiler
  msc       Microsoft C/C++ compiler
  armcc     ARM C/C++ compiler
  hpc       HP-UX C/C++ compiler
  sunpro    SUNWspro C/C++ compiler
  ibmc      IBM C/C++ compiler (Visual Age for C/C++?)
  bcc       Borland C/C++ compiler
  watcom    Watcom C/C++ compiler
  como      COMO C/C++ compiler
  decc      DEC C
  mipspro   MIPSpro C compiler
  ```

  \<*Iu*\> \[*no*\]

- CC\_VERSION

  C compiler version. \<*I*\>

- CCSTD

  Add C language standard command line option to the compiler. Supported options: *c89*, *gnu89* (C89 with GNU extensions), *c99*, *gnu99* (C99 with GNU extensions), *c11*, *gnu11* (C89 with GNU extensions), *c17*, *gnu17* (C17 with GNU extensions). If compiler is not known for mk-configure or does not support appropriate option, no additional options are applied. \<*M*\> \[\]

- CFLAGS

  Additional flags to the compiler when creating C objects. \<*IM*\>

- CFLAGS0

  The same as CFLAGS but CFLAGS0 is passed to the compiler before CFLAGS. Normally, CFLAGS0 should be modified in makefiles and should not be set from environment by user. \<*M*\>

- CFLAGS.check

  Same as CFLAGS but every option is checked whether it is a valid one for C compiler. Double underline in the flag is considered as a single space character. \<*M*\> \[*unset*\]

- CFLAGS.dflt, CXXFLAGS.dflt

  Additional flags passed to C or C++ compilers. \<*Iu*\>

- CFLAGS.pic, CXXFLAGS.pic

  Options for C and C++ compilers for generating position independent code.  On some platforms it makes sense to override these variables (initialized by mk-configure) for better performance, for example, one may use -fpic instead of -fPIC with GNU C/C++ compilers. See SHLIB\_MAJOR, MKPIE etc. variables for more information. \<*Iu*\>

- CFLAGS.pie, CXXFLAGS.pie

  Options for C and C++ compilers for generating position independent executables.  On some platforms it makes sense to override these variables (initialized by mk-configure) for better performance, for example, one may use -fpic instead of -fPIC with GNU C/C++ compilers. See MKPIE variable for more information. \<*Iu*\>

- CFLAGS.ssp, CXXFLAGS.ssp

  Options for C and C++ compilers for generating stack protection code. See USE\_SSP variable for more information. \<*Iu*\>

- CFLAGS.warns.\<warn-level\>, CXXFLAGS.warns.\<warn-level\>

  These variables are set by mk-configure and enable warnings for C or C++ compilers according to warning level (WARNS). \<*Iu*\>

- CFLAGS\_\<project\>

  Similar to CFLAGS but for project ${PROJECTNAME}. \<*U*\>

- CFLAGS\_\<source\>

  Similar to CFLAGS but for the specified source file. Basename of the source file is used. \<*Mu*\>

- CLEANDIRS\_CMD

  Command for removing directories used by targets "clean" and "cleandir". \<*Iu*\> \[*${RM} -rf*\]

- CLEANFILES\_CMD

  Command for removing files used by targets "clean" and "cleandir". \<*Iu*\> \[*${RM} -f*\]

- COPTS

  Additional flags to the compiler when creating C objects. \<*U*\>

- COPTS\_\<project\>

  Similar to COPTS but for project ${PROJECTNAME}. \<*U*\>

- CPP

  C Pre-Processor. \<*Iu*\> \[*cpp*\]

- CPPFLAGS

  Additional flags to the C/C++ pre-processor. \<*Iu*\>

- CPPFLAGS0

  The same as CPPFLAGS but CPPFLAGS0 is passed to the compiler before CPPFLAGS. Normally, CPPFLAGS0 should be modified in makefiles and should not be set from environment by user. \<*M*\>

- CPPFLAGS\_\<project\>

  Similar to CPPFLAGS but for project ${PROJECTNAME}. \<*U*\>

- CPPFLAGS\_\<source\>

  Similar to CPPFLAGS but for the specified source file. Basename of the source file is used. \<*Mu*\>

- CXX

  C++ compiler. \<*Iu*\> \[*c++*\]

- CXX\_PREFIX

  Prefix command for ${CXX}, for example, distcc or ccache. \<*Iu*\> \[\]

- CXX\_TYPE

  C++ compiler type. This variable is set by **mk-configure** and can be overriden by user. It can get the same values as CC\_TYPE variable. \<*Iu*\>

- CXX\_VERSION

  C++ compiler version. \<*I*\>

- CXXFLAGS

  Additional flags to the compiler when creating C++ objects. \<*Iu*\> \[\]

- CXXFLAGS0

  The same as CXXFLAGS but CXXFLAGS0 is passed to the compiler before CXXFLAGS. Normally, CXXFLAGS0 should be modified in makefiles and should not be set from environment by user. \<*M*\>

- CXXFLAGS.check

  Same as CXXFLAGS but every option is checked whether it is a valid one for C++ compiler. \<*M*\> \[*unset*\]

- CXXFLAGS\_\<project\>

  Similar to CXXFLAGS but for project ${PROJECTNAME}. \<*U*\>

- CXXFLAGS\_\<source\>

  Similar to CXXFLAGS but for the specified source file. Basename of the source file is used. \<*Mu*\>

- CXXOPTS

  Additional flags to the compiler when creating C++ objects. \<*U*\>

- CXXOPTS\_\<project\>

  Similar to CXXOPTS but for project ${PROJECTNAME}. \<*U*\>

- CXXSTD

  Add C++ language standard command line option to the compiler and linker. Supported options: *c++98*, *gnu++98* (C++98 with GNU extensions),  *c++11*, *gnu++11* (C++11 with GNU extensions),  *c++14*, *gnu++14* (C++14 with GNU extensions),  *c++17*, *gnu++17* (C++17 with GNU extensions) If compiler is not known for mk-configure or does not support appropriate option, no additional options are applied. \<*M*\> \[\]

- DATADIR

  Target directory for architecture-independent text files. \<*Iu*\> \[*${PREFIX}/share*\]

- DESTDIR

  Installation prefix. \<*U*\> \[\]

- GZIP

  gzip copression tool. \<*Iu*\> \[*gzip*\]

- INCSDIR

  Target directory for header files. \<*Iu*\> \[*${PREFIX}/include*\]

- INFODIR

  Target directory for .info files. \<*Iu*\> \[*${PREFIX}/info*\]

- INSTALL

  [install(1)](/install/1.md) command. \<*Iu*\> \[*install* or *mkc\_install*\]

- INSTALL\_FLAGS

  Flags passed to ${INSTALL} program. \<*Iu*\> \[*-c*\]

- LD

  Linker. \<*Iu*\> \[*ld*\]

- LD\_TYPE

  Linker type. This variable is set by **mk-configure** and can be overriden by user. It can get the following values:

  ```
  Value        Description
  ----------------------
  aixld        AIX linker
  darwinld     Darwin linker (MacOS-X)
  gnuld        GNU linker
  hpld         HP-UX linker
  interixld    Interix linker
  scold        SCO linker
  sunld        SunOS linker
  osf1ld       OSF1 linker (Tru64)
  irixld       IRIX linker
  ```

  \<*Iu*\>

- LEX

  Lexical analyzer. \<*Iu*\> \[*lex*\]

- LEXLIB

  Object file for lex. \<*Iu*\> \[*-ll*\]

- LFLAGS

  Options to ${LEX}. \<*Iu*\> \[\]

- LIBDIR

  Target directory for libraries. \<*Iu*\> \[*${PREFIX}/lib*\]

- LIBEXECDIR

  Target directory for system utilities. \<*Iu*\> \[*${PREFIX}/libexec*\]

- LN

  [ln(1)](/ln/1.md) tool. \<*Iu*\> \[*ln*\]

- LN\_S

  Tool equivalent to ln -s. \<*Iu*\> \[*${LN} -s*\]

- LORDER

  List dependencies for object files. \<*Iu*\> \[*lorder*\]

- LPREFIX

  Symbol prefix for ${LEX} (see -P option in [lex(1)](/lex/1.md)). \<*Iu*\> \[*yy*\] \<*Iu*\> \[*yy*\]

- MAKE

  [bmake(1)](/bmake/1.md). \[*bmake* or *make* on NetBSD\]

- MAKEDEPEND

  [makedepend(1)](/makedepend/1.md) tool. \<*Iu*\>

- MKC\_ERR\_MSG

  If set, keep an error message. \<*I M*\> \[\]

- MKC\_REQD

  Minimal required version of **mk-configure**. If required version is not found, *mkcmake* fails. This variable should be set before **mkc.init.mk** is included, directly or indirectly. \<*M*\>

- MKC\_VERSION

  Version of *mk-configure*. This variable is always set to non-empty value when mkc.\*.mk include files are used, so you can use it to initialize mk-c variables in mk.conf. For example:

  ```
  /etc/mk.conf:
     ...
     .ifdef MKC_VERSION
     COPTS?=      -O2 -Werror
     SHRTOUT=    yes
     .endif # MKC_VERSION
  ```

  \<*I*\>

- MKCOMPILERSETTINGS

  At build time mk-configure detects some compilers capabilities and saves them to system-wide *mkc\_imp.cc\_${CC\_TYPE}-${CC\_VERSION}-${CC\_TRIPLET}.mk* (for C compiler) and *mkc\_imp.cxx\_${CXX\_TYPE}-${CXX\_VERSION}-${CXX\_TRIPLET}.mk* (for C++ compiler) files. At run time mk-configure loads these files when necessary. If they are absent, that is, if you use compilers unknown to mk-configure, it exits with error. In order to fix this, you have to run **mkc\_compiler\_setting(1)** utility manually. This utility generates similar files in *${HOME}/.mkcmake* directory. However, if **MKCOMPILERSETTINGS** variable is set to *yes*, **mkc\_compiler\_setting(1)** is run automaticlly and mk-configure loads the generated files. If **MKCOMPILERSETTINGS** is *force*, compiler configuration file is always regenerated. Triplet component of the compiler configuration file name may absent for some compilers. \<*Iu*\> \[*no*\]

- MKDEP

  [mkdep(1)](/mkdep/1.md) tool. \<*Iu*\>

- MKDEPEND

  If this variable is set to *yes* and compiler supports -MMD or -MD options, these option are applied and .d dependency files are generated. These .d files are automatically loaded by **mkcmake**. Thus, continuous development is possible without explicit call of **depend** target. \<*U*\> \[\]

- MKDIR

  [mkdir(1)](/mkdir/1.md) tool. \<*Iu*\> \[*mkdir*\]

- MKINSTALL

  If not "yes", build everything but do not install. This option is useful for e.g. internal libraries. \<*Mu*\> \[*yes*\]

- MKINSTALLDIRS

  If "yes", install target directories (target *installdirs*) before installing files (target  *install*). \<*Iu*\> \[*yes*\]

- MKOBJDIR

  If "yes", the target "obj" creates object directories, if "auto", object directories are created automatically. Otherwise object directories are not created. \<*Iu*\> \[*auto*\]

- NM

  List symbols from object files. \<*Iu*\> \[*nm*\]

- OBJCOPY

  Copy and translate object files. \<*Iu*\> \[*objcopy*\]

- OBJDUMP

  Display information from object files. \<*Iu*\> \[*objdump*\]

- OBJTOP

  Top-level object directory which defaults to ${.OBJDIR} if ${.MAKE.LEVEL} is 0. \<*I*\>

- PREFIX

  Target directory. \<*U*\> \[*/usr/local*\]

- PROJECTNAME

  The name of a project. By default it is set to ${PROG}, ${LIB} or ${.CURDIR:T}. For a top-level project using either mkc.subdir.mk or mkc.subprj.mk it makes sense to set this variable explicitely in project's Makefile. This variable is initialized before including mk.conf, so you can use it to change build options, e.g. during development process.

  ```
  /etc/mk.conf:
     ...
     .ifdef MKC_VERSION
     ...
     .if ${PROJECTNAME} == "foo"
     SHRTOUT=    yes
     PROG.gcc=   /usr/bin/gcc
     CC_TYPE=    gcc
     COPTS=      -O0 -g
     .endif
     .endif # MKC_VERSION
  ```

  \<*Im*\>

- RANLIB

  Generate index to archive. \<*Iu*\> \[*ranlib*\]

- RM

  [rm(1)](/rm/1.md) tool. \<*Iu*\> \[*rm*\]

- SBINDIR

  Target directory for administration utilities. \<*Iu*\> \[*${PREFIX}/sbin*\]

- SHAREDSTATEDIR

  Target directory for modifiable architecture-independent data files. \<*Iu*\> \[*${PREFIX}/com*\]

- SHRTOUT

  If not "no", output messages about compiling, linking and creating libraries are shortened and formatted. \<*Iu*\> \[*no*\]

- SIZE

  List section sizes and total size. \<*Iu*\> \[*size*\]

- SRC\_PATHADD

  List of directories added to *.PATH*. \<*Im*\> \[\]

- SRCTOP

  Top-level project's directory which defaults to ${.CURDIR} if ${.MAKE.LEVEL} is 0. If set, "../Makefile.inc" is not included. Also, the following command\
  \
      mkcmake -C subproject target\
   will be translated to\
  \
      cd ${SRCTOP}; mkcmake target-subproject \<*Iu*\>

- STRIP

  Discard symbols from object files. \<*Iu*\> \[*strip*\]

- STRIPFLAG

  The flag passed to the install program to cause the binary to be stripped. \<*Iu*\>

- SYSCONFDIR

  Target directory for configuration files. \<*Iu*\> \[*${PREFIX}/etc*\]

- TAR

  tar archiver. \<*Iu*\> \[*tar*\]

- TSORT

  Topological sort of a directed graph. \<*Iu*\> \[*tsort -q*\]

- UNINSTALL

  Command for removing files used by target "uninstall". \<*Iu*\> \[*${RM} -f*\]

- USE\_SSP

  If "yes", enables stack protection code, which detects stack overflows and aborts the program. This enhances security but imposes some performance penalty. \<*U*\>

- VARDIR

  Target directory for modifiable single-machine data files. \<*Iu*\> \[*${PREFIX}/var*\]

- WARNERR

  If "yes", force warnings to be reported as errors. At the moment this is supported for GCC, clang, Intel C/C++ and Sun's C/C++ compilers. \<*Iu*\> \[*yes* if WARNS=4, *no* otherwise \]

- WARNS

  Crank up warning options; the distinct levels are (the higher the more strict):

  ```
      WARNS=0
      WARNS=1
      WARNS=2
      WARNS=3
      WARNS=4
  ```

  At the moment WARNS is supported for GCC and HP-UX C/C++ only. WARNS=0 means disabling all warnings if such feature is provided by compiler and mk-configure. \<*Mu*\> \[*0*\]

- YACC

  LALR(1) parser generator. \<*Iu*\> \[*yacc*\]

- YFLAGS

  Options to ${YACC}. \<*Iu*\> \[\]

- YHEADER

  If defined, add "-d" to YFLAGS, and add dependencies from \<file\>.y to \<file\>.h and \<file\>.c, and add \<foo\>.h to CLEANFILES.

- YPREFIX

  If defined, add "-p ${YPREFIX}" to YFLAGS.

- ZIP

  zip copression tool. \<*Iu*\> \[*zip*\]

### mkc.files.mk

The include file **mkc.files.mk** handles the FILES variable and is included from **mkc.lib.mk** and **mkc.prog.mk**. List of supported variables:

- CLEANDIRDIRS

  Additional directories to remove (recursively) for the *cleandir* target. \<*I M*\>

- CLEANDIRFILES

  Additional files to remove for the *cleandir* target. \<*I M*\>

- CLEANDIRS

  Additional directories to remove (recursively) for the *clean* and *cleandir* targets. \<*I M*\>

- CLEANFILES

  Additional files to remove for the *clean* and *cleandir* targets. \<*I M*\>

- FILES

  The list of files to install. \<*M*\>

- FILESDIR

  The location to install the files. \<*Mu*\> \[*${PREFIX}/bin*\]

- FILESDIR\_\<fn\>

  The location to install the specific file \<fn\>. \<*Mu*\>

- FILESGRP

  File group. If **bmake** is run with root privileges, it defaults to \<*Mu*\>

- FILESGRP\_\<fn\>

  File group of the specific file \<fn\>. \<*Mu*\> *${BINGRP}* or to *\`id -g\`* otherwise. \<*Mu*\>

- FILESMODE

  File mode. \<*Mu*\> \[*${NONBINMODE}*\]

- FILESMODE\_\<fn\>

  File mode of the specific file \<fn\>. \<*Mu*\>

- FILESNAME

  Optional name to install each file as. \<*Mu*\>

- FILESNAME\_\<fn\>

  Optional name to install \<fn\> as. \<*Mu*\>

- FILESOWN

  File owner. If **bmake** is run with root privileges, it defaults to *${BINOWN}* or to *\`id -u\`* otherwise. \<*Mu*\>

- FILESOWN\_\<fn\>

  File owner of the specific file \<fn\>. \<*Mu*\>

### mkc.prog.mk

The include file **mkc.prog.mk** handles building program from one or more source files, along with their manual pages.  It has a limited number of suffixes. List of supported variables:

- DPINCDIRS

  See LIBDEPS in section **mk.subprj.mk**.

- DPLDADD

  See LIBDEPS in section **mk.subprj.mk**.

- DPLIBDIRS

  See LIBDEPS in section **mk.subprj.mk**.

- EXPORT\_DYNAMIC

  If "yes", add all symbols to the dynamic symbol table, that is make all symbols visible from dynamic objects at run time (e.g. dlopen-ed objects), otherwise only symbols referenced by some object file will be exported. \<*M*\> \[*no*\]

- LDADD

  Additional objects.  Usually used for libraries. For example, to link with the compatibility and utility libraries, use:

  ```
      LDADD+=  -lutil -lcompat
  ```

  \<*U*\>

- LDADD0

  The same as LDADD but LDFLAGS0 and LDADD0 are passed to the linker before LDFLAGS and LDADD. \<*M*\>

- LDADD\_\<project\>

  Similar to LDADD but for project ${PROJECTNAME}.

- LDFLAGS

  Additional linker flags. Often used for specifying library directories.

  ```
      LDFLAGS+=  -L/opt/company/software/lib
  ```

  \<*Mu I*\>

- LDFLAGS0

  The same as LDFLAGS but LDFLAGS0 and LDADD0 are passed to the linker before LDFLAGS and LDADD. Normally, LDFLAGS0 and LDADD0 should be modified in makefiles and should not be set from environment by user. \<*M*\>

- LDFLAGS\_\<project\>

  Similar to LDFLAGS but for project ${PROJECTNAME}.

- MKPIE

  If "yes", create Position Independent Executable (PIE), otherwise create a regular executable. \<*Mu*\> \[*no*\]

- MKSHARE

  If "no", act as "MKHTML=no MKINFO=no MKCATPAGES=no MKMAN=no". I.e, don't build catman pages, man pages, info documentation,... \<*Iu*\> \[*yes*\]

- PROG

  The name of the program to build.

- PROGNAME

  The name that the above program will be installed as, if different from ${PROG}. \<*M*\>

- PROGS

  The names of the programs to build.  If neither PROG nor PROGS is not supplied, nothing is built. \<*M*\>

- SRCS

  List of source files to build the program.  If SRCS is not\
    defined, it's assumed to be ${PROG}.c. \<*M*\>

- SRCS.\<prog\>

  List of source files to build the program *prog* listed in *PROGS*. If SRCS.\<prog\> is not defined, it's assumed to be prog.c. \<*M*\>

- USE\_RELRO

  If "yes", enables a technique to harden the data sections of an ELF binary/process.  For security reasons it makes sense to set it to YES, it may slow down application startup, though. \<*Iu*\> \[*no*\]

**mkc.prog.mk** includes **mkc.files.mk** and therefore supports all variables supported by it.

The order of options passed to the C compiler: **CPPFLAGS0**, **CPPFLAGS**, **CPPFLAGS\_\<project\>**, **CFLAGS.ssp**, **CFLAGS.pie**, **CFLAGS.warns**, **CFLAGS**, **CFLAGS\_\<project\>**, **CFLAGS.pic** (for shared objects), **COPTS**, **COPTS\_\<project\>**

The order of options passed to the C++ compiler: **CPPFLAGS0**, **CPPFLAGS**, **CPPFLAGS\_\<project\>**, **CXXFLAGS.ssp**, **CXXFLAGS.pie**, **CXXFLAGS.warns**, **CXXFLAGS**, **CXXFLAGS\_\<project\>**, **CXXFLAGS.pic** (for shared objects), **COPTS**, **COPTS\_\<project\>**

### mkc.lib.mk

The include file **mkc.lib.mk** has support for building a static and dynanic library or DLL. **mkc.lib.mk** uses the following variables:

- DPINCDIRS

  See LIBDEPS in section **mk.subprj.mk**.

- DPLDADD

  See LIBDEPS in section **mk.subprj.mk**.

- DPLIBDIRS

  See LIBDEPS in section **mk.subprj.mk**.

- EXPORT\_SYMBOLS

  Only symbols listed in a specified file (one symbol per line) are exported. Empty lines and comments started with # symbol are ignored. This variable has no effect on some platforms.  By default all symbols are exported. \<*M*\> \[\]

- LDADD LDADD\_\<project\>

  Additional objects. See **mkc.prog.mk**

- LDFLAGS LDFLAGS\_\<project\>

  Additional linker flags. See **mkc.prog.mk**

- LIB

  The name of the library to build. \<*M*\>

- LIBDIR

  See *Common variables* and *mkc.files.mk* sections.

- LIBGRP

  Library group. If **bmake** is run by an unprivileged user, it defaults to *\`id -g\`*. \<*Iu*\>

- LIBMODE

  Library mode. \<*Iu*\> \[*${NONBINMODE}*\]

- LIBOWN

  Library owner. If **bmake** is run by an unprivileged user, it defaults to *\`id -u\`*. \<*Iu*\>

- MAN

  The manual pages to be installed (use a .1 - .9 suffix). \<*M*\>

- MKDLL

  If "yes", build and install the dynamically loaded library (\<lib\>.so) instead of shared library. If "only", do not make static library. \<*M*\> \[*no*\]

- MKSHLIB

  If not "no", build and install shared library provided that SHLIB\_MAJOR is defined. \<*IMu*\> \[*yes*\] (for MACHINE\_ARCHs that support it)

- MKSTATICLIB

  If not "no", build and install static library. \<*IMu*\> \[*yes*\]

- MKPICLIB

  If not "no", build and install \*\_pic.a library. \<*IMu*\> \[*no*\]

- MKPROFILELIB

  If "no", don't build or install the profiling (\*\_p.a) libraries. \<*Iu*\> \[*no*\]

- SHLIBMODE

  Shared library mode. \<*Iu*\>

- SHLIB\_MAJOR

  Major shared library number. If unset, shared library is not built. \<*M*\>

- SHLIB\_MINOR

  Minor shared library number. \<*M*\> \[*0*\]

- SHLIB\_TEENY

  Minor shared library number. \<*M*\> \[\]

- SRCS

  List of source files to build the library.  Suffix types\
    .s, .c, and .f are supported.  Note, .s files are preferred\
    to .c files of the same name. \<*M*\>

Static libraries are **ranlib**'d when made. **mkc.lib.mk** includes **mkc.files.mk** and therefore supports all its variables as well. After creaion of libraries *${.CURDIR:T}.done* file is created and used for handling inter-project (See **LIBDEPS** variable) dependencies.

The order of options passed to the C and C++ compilers are the same as in **mkc.prog.mk**.

### mkc.subprj.mk

The include file **mkc.subprj.mk** handles subprojects (subdirectories) organized as a dependency graph. It provides all targets provided by **mkc.prog.mk**. Variable SUBPRJ contains a list of pairs *depdir:dir* which mean that subproject *dir* depends on *depdir.* **mkcmake all** command will build all subprojects listed in SUBPRJ in a correct order (starting with subprojects having no dependencies and so on). There is also a target which allows the command *bmake \<subdir\>* where \<subdir\> is any directory listed in the variable SUBPRJ. The following targets are also provided: \<target\>-\<subdir\> where \<target\> is either of the following: all, clean, cleandir, depend, installdirs, install, uninstall and filelist. Also provided are: targets nodeps-\<target\>-\<subdir\> and subdir-\<target\>-\<subdir\>. Difference between \<target\>-\<subdir\> and nodeps-\<target\>-\<subdir\> is that  **mkcmake \<target\>-\<subdir\>** runs the specified \<target\> for \<subdir\> and all its dependencies while  **mkcmake nodeps-\<target\>-\<subdir\>** -- only for \<subdir\>. A target subdir-\<target\>-\<subdir\> is a synonym for nodeps-\<target\>-\<subdir\> See *examples/hello\_dictd* subdirectory for the sample of use.

**mkc.subprj.mk** provides the following variables:

- ALLTARGETS

  A list of targets for which pre\_\*, do\_\* and post\_\* counterparts exist, for example, pre\_all, do\_all and post\_all. pre\_\* target runs before do\_\* target which in turn runs before post\_\*. Unless action is provided for do\_\* targets they implement the standard behaviour of **mk-configure**. No action is provided for targets pre\_\* and post\_\*, so they are for user's extensions. The standard behaviour for ${ALLTARGETS} may also be extended by adding new prerequisites to targets do\_\*.

- COMPATLIB

  Subproject's basename for compatibility library. If this variable is set, MKC\_SOURCE\_FUNCLIBS and FEATURES do not change SRCS for subprojects other than ${COMPATLIB}. \<*M*\> \[\]

- EXPORT\_VARNAMES

  List of variables to export before running make for subdirectories. \<*Mu*\> \[*MKC\_CACHEDIR*SRCTOP*OBJTOP*STATICLIBS*COMPATLIB*\]

- INTERNALLIBS

  A list of subprojects (basenames) with internal libraries. These libraries are static and not installed by target "install". \<*M*\> \[\]

- LIBDEPS

  A list of library dependencies. Each token is a colon-separated pair. Its first component is a library subproject (dependency), the second one is the subproject for library or executable. The value of this variable is automatically added to SUBPRJ. Library dependencies listed in LIBDEPS automatically change CPPFLAGS0, LDFLAGS0 and LDADD0 of approptiate subprojects. \<*M*\> Suppose, we have \<library:program\> pair in LIBDEPS, also suppose that variable **library** is set to "library" subdirectory and variable **program** is set to "program" subdirectory. ${SRCDIR\_library}/linkme.mk file is automatically included from ${SRCDIR\_program}/Makefile if it exists. In this file DPLDADD \[*${library:T:S/^lib//}*\], DPLIBDIRS \[*${OBJDIR\_${library:S,/,\_,g}}*\] and DPINCDIRS \[*${SRCDIR\_${library:S,/,\_,g}} ${OBJDIR\_${library:S,/,\_,g}}*\], may be set to non-default values. These three variables then changes LDADD0, LDFLAGS0 and CPPFLAGS0 respectively in subproject "program". The dependency graph specified by variable LIBDEPS is available to all subproject via environment.

- MKRELOBJDIR

  If "yes", object directories ${OBJTOP}/*dir* are used. Unlike MAKEOBJDIRPREFIX object directories do not contain top-level ${.CURDIR} in paths. \<*Iu*\> \[*no*\]

- NODEPS

  This variable specifies a list of patterns that describes edges from dependency graph in *targdep-prjdep*:*targ-prj* or *targ-prj*:*targ* formats to be excluded from dependency graph. \<*M*\> \[\]

- NOEXPORT\_VARNAMES

  List of variables excluded from EXPORT\_VARNAMES. \<*Mu*\> \[\]

- NOSUBDIR

  If for some reason you want to exclude some subdirectories from build, list them in this variable. \<*U*\> \[\]

- OBJDIR\_\<dir\>

  Value of ${.OBJDIR} inside  *dir* subdirectory. Slash symbols inside \<dir\> are replaced with underlines. In addition, OBJDIR\_\<dir:T\> variable is set to ${OBJDIR\_\<dir\>} if ${SHORTPRJNAME} is "yes".

- SHORTPRJNAME

  If "yes", special targets with last component of the subprojects are provided. \<*Im*\> \[*yes*\]

- SRCDIR\_\<dir\>

  Value of ${.CURDIR} inside  *dir* subdirectory. Slash symbols inside \<dir\> are replaced with underlines. In addition, SRCDIR\_\<dir:T\> variable is set to ${SRCDIR\_\<dir\>} if ${SHORTPRJNAME} is "yes".

- STATICLIBS

  A list of subprojects (basenames) with static libraries. If dependency is mentioned in this variable, the suffix \_pic is automatically added for PIE-executables or shared libraries that depend on this library. This variable is automatically passed to subprojects via environment. \<*Mu*\> \[\]

- SUBPRJ

  List of subprojects (subdirectories) and dependencies. If the subdirectory doesn't exist the subproject becomes "virtual" and may be used to group several subprojects into a new virtual one. \<*M*\>

- SUBPRJ\_DFLT

  List of projects built and installed by default. The default is all projects listed in SUBPRJ. \<*IMu*\>

- SUBPRJSRCTOP

  This variables contains ${.CURDIR} directory and is passed to subprojects. \<*I*\> \[*${.CURDIR}*\]

- TARGETS

  A list of recursive targets. "Recursive" means that the target will be called for all subproject recursively (See  **mkc.subprj.mk** and **mkc.subdir.mk**). \<*Im*\> \[*all*, *install*, *installdirs*, *uninstall*, *clean*,  *cleandir*, *depends*, *test*, *configure*, *filelist*, *obj*\] By setting this variable in the Makefile one can add new targets for special purposes, for example, static code analysis, partial builds etc.

**mkc.subprj.mk** provides the following targets:

- \<subdir\> and \<subdir:T\>

  \<subdir\> is a subdirectory listed in SUBDIR or SUBPRJ. This target is equivalent to all-\<subdir\>. \<subdir:T\> means the last component of the directory and is created if ${SHORTPRJNAME} is "yes".

- \<target\>-\<subdir\>

  Runs the specified \<target\> for the specified \<subdir\>. The target \<target\>-\<subdir:T\> is provided if ${SHORTPRJNAME} is "yes".

- subdir-\<target\>-\<subdir\> and nodeps-\<target\>-\<subdir\>

  Runs the specified \<target\> for the specified \<subdir\> without dependencies. Targets subdir-\<target\>-\<subdir:T\> and nodeps-\<target\>-\<subdir:T\> are provided if ${SHORTPRJNAME} is "yes".

- print\_deps

  Outputs the dependency graph on targets in [tsort(1)](/tsort/1.md) format taking NODEPS and NOSUBDIR variables into account.

### mkc.subdir.mk

The include file **mkc.subdir.mk** contains the default targets for building subdirectories. It provides the same targets as **mkc.prog.mk**. For all of the directories listed in the variable SUBDIR, the specified directory  will be visited and the target made.  There is also a default target which allows the command *bmake \<subdir\>* where *\<subdir\>*\
  is any directory listed in the variable SUBDIR. As a special case, the use of a token .WAIT as an entry in SUBDIR acts as a synchronization barrier when multiple make jobs are run; subdirs before the .WAIT must complete before any subdirs after .WAIT are started.  See **[bmake(1)](/bmake/1.md)** for some caveats on use of .WAIT and other special sources. SUBDIR variable is provided as well as all variables provided by mkc.subprj.mk except SUBPRJ.

- SUBDIR

  List of subdirectories \<*M*\> **mkc.subprj.mk**

### mkc.configure.mk

**mkc.configure.mk** is an auxiliary include file for checking platform's features like headers, function or variable declarations, function implementation in a particular libraries, data types sizes etc. This include file is included by **mkc.prog.mk** and **mkc.lib.mk** automatically but in some cases it makes sense to include it explicitly. **mkc.configure.mk** itself includes **mkc.init.mk**, then **mkc.conf.mk** , and finally internal include file which updates **CPPFLAGS**, **CFLAGS**, **LDADD** and **SRCS**. **mkc.configure.mk** supports the following variables.

- MKCHECKS

  If "no", none of the checks are performed. It is set to "yes" unless target is "clean" and "cleandir".

- MKC\_CACHEDIR

  Directory where intermediate and cache files are created. It defaults to ${.OBJDIR}. By default MKC\_CACHEDIR variable is exported for subprojects. As a result cache files for subprojects are created in the top-level directory. If cache directory doesn't exist, it is created automatically.

- MKC\_CHECK\_BUILTINS

  **mk-configure** provides a number of built-in custom checks, that is, source files to compile or scripts to run in order to check for something. Checks listed in MKC\_CHECK\_BUILTINS will be run.

  Avalable values:

  - **prog\_flex**, **prog\_bison**, **prog\_gawk**, **prog\_gm4**, **prog\_gmake**

    Find flex, bison, GNU awk, GNU m4 or GNU make respectively by analysing program's help and/or version messages. If found, BUILTIN.prog\_\<progname\> is set to the path, otherwise it is set to empty string. Note that *gawk* may be found as *awk*, *bison* as *yacc*, *gm4* as *m4*, *flex* as *lex* and *gmake* as *make*.

  - **prog\_mkdep**, **prog\_nbmkdep**

    Find traditional BSD [mkdep(1)](/mkdep/1.md) or recent NetBSD version of it respectively.

  - **endianness**

    BUILTIN.endianness variable is set to either *little*, *big* or *unknown* depending on a hardware.

- MKC\_CHECK\_CC\_OPTS

  A list of C compiler options to check. If ${CC} -c support the specified option, variable HAVE\_CC\_OPT.\<option:S/=/\_/g\> is set to 1 and 0 otherwise. Double underline in the option is considered as a single space character.

  ```
  Ex.
    MKC_CHECK_CC_OPTS = -Wall -errwarn=%all --param__ssp-buffer-size=1
  Res.
   HAVE_CC_OPT.-Wall=1
   HAVE_CC_OPT.-errwarn_%all=0
   HAVE_CC_OPT.--param__ssp-buffer-size_1=1
  ```

- MKC\_CHECK\_CCLD\_OPTS

  Same as MKC\_CHECK\_CC\_OPTS except that option "-c" is not passed to the compiler, so, executable is created. As a result HAVE\_CCLD\_OPT.\<option:S/=/\_/g\> is set to 1 or 0.

- MKC\_CHECK\_CUSTOM

  A list of custom checks (list of names). MKC\_CUSTOM\_FN.\<custom\_check\_name\> is a "C" or "C++" source filename or an executable program for your custom check, e.g., filename.c, filename.cc, subdir/filename.cxx, filename.C, filename.cpp, filename.c++ or subdir/executable\_script. **mk-configure** tries to compile or run the specified file and sets CUSTOM.\<custom\_check\_name\> variable to 1, 0 or other value. If MKC\_CUSTOM\_FN.\<custom\_check\_name\> is unset, it defaults to custom\_check\_name.c. Also -DCUSTOM\_\<CUSTOM\_CHECK\_NAME\>=1 is added to CPPFLAGS if the specified check succeeded unless MKC\_NOAUTO is set to 1 and MKC\_CUSTOM\_NOAUTO.\<custom\_check\_name\> is set to "yes". Here \<CUSTOM\_CHECK\_NAME\> is uppercase for \<custom\_check\_name\>. If MKC\_CUSTOM\_LINK.\<custom\_check\_name\> is "yes", then C or C++ source file is compiled and linked into executable. Also, CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS, LDADD, MKC\_CUSTOM\_CPPFLAGS.\<custom\_check\_name\>, MKC\_CUSTOM\_CFLAGS.\<custom\_check\_name\>, MKC\_CUSTOM\_CXXFLAGS.\<custom\_check\_name\>, MKC\_CUSTOM\_LDFLAGS.\<custom\_check\_name\> and MKC\_CUSTOM\_LDADD.\<custom\_check\_name\> flags are passed to the compiler. Normally cache file name contains \<custom\_check\_name\> unless MKC\_CUSTOM\_CACHE.\<custom\_check\_name\> is set to something else.

  ```
   Ex.  MKC_CHECK_CUSTOM+=               nested_funcs
        MKC_CUSTOM_FN.nested_funcs=      nested_funcs.c
        MKC_CUSTOM_FN.script_check=      checks/script_check
   Res. CUSTOM.nested_funcs=        1
        CUSTOM.script_check=        0
        CPPFLAGS+= -DCUSTOM_NESTED_FUNCS=1
  ```

  Note that script for the check should be an executable file.

- MKC\_CHECK\_CXX\_OPTS

  Same as MKC\_CHECK\_CC\_OPTS but for C++ compiler. As a result HAVE\_CXX\_OPT.\<option:S/=/\_/g\> is set to 1 or 0.

- MKC\_CHECK\_CXXLD\_OPTS

  Same as MKC\_CHECK\_CCLD\_OPTS but for C++ compiler. As a result HAVE\_CXXLD\_OPT.\<option:S/=/\_/g\> is set to 1 or 0.

- MKC\_CHECK\_DEFINES

  List of define:header to check. \<header\> part is optional.

  As a result of the check bmake's variable HAVE\_DEFINE.\<define\>.\<header\> (or HAVE\_DEFINE.\<define\>) is set to either 0 or 1.\
   \<header\>: tr\|./\|\_\_\|g\
   Also -DHAVE\_DEFINE\_\<DEFINE\>\_\<HEADER\>=1 or   -DHAVE\_DEFINE\_\<DEFINE\>=1 is added to CPPFLAGS if the specified define was detected unless MKC\_NOAUTO is set to 1.\
   \<HEADER\>: tr\|a-z./\|A-Z\_\_\|g\
   \<DEFINE\>: tr\|a-z\|A-Z\|g

  ```
   Ex:  MKC_CHECK_DEFINES += RTLD_LAZY:dlfcn.h __GNUC__ _MSC_VER_
   Res: HAVE_DEFINE.RTLD_LAZY.dlfcn_h = 1
        HAVE_DEFINE.__GNUC__          = 1
        HAVE_DEFINE._MSC_VER_         = 0
        CPPFLAGS += -DHAVE_DEFINE_RTLD_LAZY_DLFCN_H=1 \
                    -DHAVE_DEFINE___GNUC__=1
  ```

- MKC\_CHECK\_FUNCLIBS

  List of \<function\>:\<library\> pairs to check, \<library\> part is optional. If \<library\> is present, presense of \<function\> in libc is also checked automatically.

  As a result of the check bmake's variable HAVE\_FUNCLIB.\<function\>.\<library\> (or HAVE\_FUNCLIB.\<function\>) is set to either 0 or 1.

  If \<function\> is found in \<library\> but not in libc or \<function\> is "main" and is found in \<library\>, "-l\<library\>" is automatically added to LDADD unless \<function\>:\<library\> is listed in MKC\_NOAUTO\_FUNCLIBS or MKC\_NOAUTO\_FUNCLIBS is equal to 1 or MKC\_NOAUTO is set to 1

  ```
   Ex:  MKC_CHECK_FUNCLIBS  += strlcat fgetln getline getopt_long
        MKC_CHECK_FUNCLIBS  += crypt:crypt dlopen:dl nanosleep:rt
        MKC_CHECK_FUNCLIBS  += ftime:compat gettimeofday
        MKC_NOAUTO_FUNCLIBS += ftime:compat
   Res: HAVE_FUNCLIB.strlcat      = 1
        HAVE_FUNCLIB.fgetln       = 1
        HAVE_FUNCLIB.getline      = 0
        HAVE_FUNCLIB.getopt_long  = 1
        HAVE_FUNCLIB.crypt        = 0
        HAVE_FUNCLIB.crypt.crypt  = 1
        HAVE_FUNCLIB.dlopen       = 1
        HAVE_FUNCLIB.dlopen.dl    = 0
        HAVE_FUNCLIB.nanosleep    = 1
        HAVE_FUNCLIB.nanosleep.rt = 1
        HAVE_FUNCLIB.ftime        = 0
        HAVE_FUNCLIB.ftime.compat = 1
        HAVE_FUNCLIB.gettimeofday = 1
        LDADD += -lcrypt
  ```

- MKC\_CHECK\_FUNCS\<N\>

  List of \<func\>:\<header\> to check. \<header\> part is optional. Here \<N\> means the number of arguments. As a result of the check bmake's variable HAVE\_FUNC\<N\>.\<func\>.\<header\> (or HAVE\_FUNC\<N\>.\<func\>) is set to either 0 or 1.\
   \<header\>: tr\|./\|\_\_\|g\
   Also -DHAVE\_FUNC\<N\>\_\<FUNC\>\_\<HEADER\>=(0 or 1) (or   -DHAVE\_FUNC\<N\>\_\<FUNC\>=(0 or 1)) is added to CPPFLAGS if the specified function was detected unless MKC\_NOAUTO is set to 1. If MKC\_FUNC\_OR\_DEFINE.\<func\> is "yes", equivalent define leads to the same results.\
   \<HEADER\>: tr\|a-z./\|A-Z\_\_\|g

  ```
   Ex:  MKC_CHECK_FUNCS2 += fgetln:stdio.h
        MKC_CHECK_FUNCS6 += pselect:sys/select.h
        MKC_CHECK_FUNCS1 += htobe32:sys/endian.h
        MKC_FUNC_OR_DEFINE.htobe32 += yes
   Res: HAVE_FUNC2.fgetln.stdio_h = 1
        HAVE_FUNC6.pselect.sys_select_h = 1
        HAVE_FUNC1.htobe32.sys_endian_h=1
        CPPFLAGS += -DHAVE_FUNC2_FGETLN_STDIO_H=1 \
                 += -DHAVE_FUNC6_PSELECT_SYS_SELECT_H=1 \
  	       += -DHAVE_FUNC1_HTOBE32_SYS_ENDIAN_H
  ```

- MKC\_CHECK\_HEADER\_FILES

  Same as **MKC\_CHECK\_HEADERS** but *$CC -E* is used for checking instead of *$CC -c*. Also, HAVE\_HEADER\_FILE.\<header\> variables and HAVE\_HEADER\_FILE\<HEADER\> defines are set.

- MKC\_CHECK\_HEADERS

  List of headers to check with the help of *$CC -c*. As a result of the check bmake's variable **HAVE\_HEADER.\<header\>** is set to either 0 or 1.\
   \<header\>: tr\|./\|\_\_\|g\
   Also -DHAVE\_HEADER\_\<HEADER\>=(0 or 1) is added to CPPFLAGS unless MKC\_NOAUTO is set to 1.\
   \<HEADER\>: tr\|a-z./\|A-Z\_\_\|g

  ```
   Ex:  MKC_CHECK_HEADERS += sys/time.h fcntl.h execinfo.h
   Res: HAVE_HEADER.sys_time_h = 1
        HAVE_HEADER.fcntl_h    = 1
        HAVE_HEADER.execinfo_h = 1
        CPPFLAGS += -DHAVE_HEADER_SYS_TIME_H=1 -DHAVE_HEADER_FCNTL=1
  ```

- MKC\_CHECK\_MEMBERS

  List of \<type\>.\<member\>:\<header\> to check. \<header\> part is optional.

  As a result of the check bmake's variable HAVE\_MEMBER.\<type\>\_\<member\>.\<header\> (or HAVE\_MEMBER.\<type\>\_\<member\>) is set to either 0 or 1 depending on the result.\
   \<header\>: tr\|./\|\_\_\|g\
   Also -DHAVE\_MEMBER\_\<TYPE\>\_\<MEMBER\>\_\<HEADER\>=1 (or   -DHAVE\_MEMBER\_\<TYPE\>\_\<MEMBER\>=1) is added to CPPFLAGS if the specified member was found in appropriate type unless MKC\_NOAUTO is set to 1.\
   \<HEADER\>: tr\|a-z./\|A-Z\_\_\|g\
   \<TYPE\>:   tr\|a-z./\|A-Z\_\_\|g\
   \<MEMBER\>: tr\|a-z./\|A-Z\_\_\|g

  ```
     Ex:  MKC_CHECK_VARS += struct-ifreq.ifr_ifrn.ifrn_name:net/if.h
          MKC_CHECK_VARS += struct-tm.tm_isdst:time.h
     Res: HAVE_MEMBER.struct_ifreq_ifr_ifrn_ifrn_name.net_if_h=1
          HAVE_MEMBER.struct_tm_tm_isdst.time_h=1
          CPPFLAGS += -DHAVE_MEMBER_STRUCT_IFREQ_IFR_IFRN_IFRN_NAME_NET_IF_H=1
          CPPFLAGS += -DHAVE_MEMBER_STRUCT_TM_TM_ISDST_TIME_H=1
  ```

- MKC\_CHECK\_PROGS

  List of \<progname\>s to check. As a result of the check bmake's variable HAVE\_PROG.\<progname\> is set to either 1 (true) or 0 (false). Also PROG.\<progname\> is set to a full path of a program or to an empty string.

  ```
   Ex:  MKC_CHECK_PROGS += lua ruby gawk runawk
   Res: HAVE_PROG.lua             = 1
        PROG.lua                  = /usr/pkg/bin/lua
        HAVE_PROG.ruby            = 0
        HAVE_PROG.gawk            = 1
        PROG.gawk                 = /usr/bin/gawk
        HAVE_PROG.runawk          = 1
        PROG.runawk               = /usr/pkg/bin/runawk
  ```

  If MKC\_PROG.id.\<progname\> is set to, e.g, \<prog\_id\>, then HAVE\_PROG.\<prog\_id\> and PROG.\<prog\_id\> are set. MKC\_PROG.id.\<progname\> also changes cache file names.

- MKC\_CHECK\_PROTOTYPES

  A list of checks (list of names) for C function prototypes. MKC\_PROTOTYPE\_FUNC.\<name\> is a C function prototype. MKC\_PROTOTYPE\_HEADERS.\<name\> is a list of headers separated by space or comma. mk-configure verifies that the specified prototype is correct and if so, HAVE\_PROTOTYPE.\<name\> bmake variable is set to 1 and -DHAVE\_PROTOTYPE\_\<NAME\>=1 is added to CPPFLAGS unless MKC\_NOAUTO is set to 1. Otherwise, HAVE\_PROTOTYPE.\<name\> variable is set to 0.

  ```
  Ex.
    MKC_CHECK_PROTOTYPES = posix_iconv const_iconv
    MKC_PROTOTYPE_FUNC.posix_iconv =
      size_t iconv(iconv_t,char**,size_t*,char**,size_t*)
    MKC_PROTOTYPE_FUNC.const_iconv =
      size_t iconv(iconv_t,const char**,size_t*,char**,size_t*)
    MKC_PROTOTYPE_HEADERS.posix_iconv = iconv.h
    MKC_PROTOTYPE_HEADERS.const_iconv = iconv.h
  Res.
   HAVE_PROTOTYPE.posix_iconv=0
   HAVE_PROTOTYPE.const_iconv=1
   CPPFLAGS += -DHAVE_PROTOTYPE_CONST_ICONV=1
  ```

- MKC\_CHECK\_SIZEOF

  List of \<type\>:\<header\> to check. \<header\> part is optional.

  As a result of the check bmake's variable SIZEOF.\<type\>.\<header\> (or SIZEOF.\<type\>) is set to the data type size or string "failed".\
   \<type\>: tr\|\*-\|P\_\|g\
   \<header\>: tr\|/.\|\_\_\|g\
   Also -DSIZEOF\_\<TYPE\>\_\<HEADER\>=\<failed\|1\|2\|...\> (or -DSIZEOF\_\<TYPE\>=\<failed\|1\|2\|...\>) is added to CPPFLAGS if sizeof() check was successful unless MKC\_NOAUTO is set to 1\
   \<TYPE\>: tr\|a-z\*-\|A-ZP\_\|g\
   \<HEADER\>: tr\|a-z/.\|A-Z\_\_\|g\

  ```
   Ex:  MKC_CHECK_SIZEOF += void*
        MKC_CHECK_SIZEOF += long-long off_t:sys/types.h
   Res: SIZEOF.voidP             = 4
        SIZEOF.long_long         = 4
        SIZEOF.off_t.sys_types_h = 8
        CPPFLAGS += -DSIZEOF_VOIDP=4 \
                    -DSIZEOF_LONG_LONG=4 \
                    -DSIZEOF_OFF_T_SYS_TYPES_H=8
  ```

- MKC\_CHECK\_TYPES

  List of type:header to check. \<header\> part is optional.

  As a result of the check bmake's variable HAVE\_TYPE.\<type\>.\<header\> (or HAVE\_TYPE.\<type\>) is set to either 0 or 1.\
   \<header\>: tr\|./\|\_\_\|g

  Also -DHAVE\_TYPE\_\<TYPE\>\_\<HEADER\>=1 (or   -DHAVE\_TYPE\_\<TYPE\>=1) is added to CPPFLAGS if the specified type was detected unless MKC\_NOAUTO is set to 1.\
   \<HEADER\>: tr\|a-z./\|A-Z\_\_\|g\
   \<TYPE\>:   tr\|a-z\|A-Z\|g

  ```
   Ex:  MKC_CHECK_TYPES += size_t:string.h
   Res: HAVE_TYPE.size_t.string_h = 1
        CPPFLAGS += -DHAVE_TYPE_SIZE_T_STRING_H=1
  ```

- MKC\_CHECK\_VARS

  List of variable:header to check. \<header\> part is optional.

  As a result of the check bmake's variable HAVE\_DEFINE.\<variable\>.\<header\> (or HAVE\_DEFINE.\<variable\>) is set to either 0 or 1\
   \<header\>: tr\|./\|\_\_\|g\
   Also -DHAVE\_DEFINE\_\<VARIABLE\>\_\<HEADER\>=1 (or -DHAVE\_DEFINE\_\<VARIABLE\>=1) is added to CPPFLAGS if the specified variable was detected unless MKC\_NOAUTO is set to 1.\
   \<HEADER\>: tr\|a-z./\|A-Z\_\_\|g

  ```
   Ex:  MKC_CHECK_VARS += sys_errlist:errno.h
   Res: HAVE_VAR.sys_errlist.errno_h = 1
        CPPFLAGS += -DHAVE_VAR_SYS_ERRLIST_ERRNO_H
  ```

- MKC\_COMMON\_DEFINES

  List of defines always passed to compiler in MKC\_CHECK\_{DEFINES,VARS,FUNCS\<N\>,SIZEOF} checks.

  ```
     Ex: MKC_COMMON_DEFINES += -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 # Linux
         MKC_COMMON_DEFINES += -D_ALL_SOURCE # Interix
  ```

- MKC\_COMMON\_DEFINES.\<OPSYS\>

  The same as MKC\_COMMON\_DEFINES but only for OPSYS (uname -s).

  ```
     Ex: MKC_COMMON_DEFINES.Linux   += -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64
         MKC_COMMON_DEFINES.Interix += -D_ALL_SOURCE
  ```

- MKC\_COMMON\_HEADERS

  List of header files always #include'd to the test .c file in MKC\_CHECK\_{DEFINES,VARS,FUNCS\<N\>,SIZEOF} checks. The default value is an empty list.

  ```
    Ex: MKC_COMMON_HEADERS += unistd.h stdlib stdio.h string.h
        MKC_CHECK_SIZEOF   += offs_t size_t ssize_t
  ```

- MKC\_CUSTOM\_DIR

  Directory with custom checks source files. See MKC\_CHECK\_CUSTOM. It defaults to ${.CURDIR}.

- MKC\_DELETE\_TMPFILES

  If set to 1, temporary files are removed.

- MKC\_FEATURES

  This is a list of "features" required by project. In general, a feature is something that has problems with portability. This may be a function name or header missing on some platforms, for example. What developer needs to do is to add FEATURENAME to MKC\_FEATURES variable and add #include \<mkc\_FEATURENAME.h\> where it is needed. Internally, system requiremets are checked in the automatically included mkc\_imp.f\_FEATURENAME.mk file and all required actions (includes, define checks etc.) are made in mkc\_FEATURENAME.h header file. Currently the following features are provided:

  - **arc4random**

    This feature provides [arc4random(3)](/arc4random/3.md), [arc4random\_buf(3)](/arc4random_buf/3.md) and [arc4random\_uniform(3)](/arc4random_uniform/3.md) functions available in BSDs. If these functions are absent on your system, install libbsd library.

  - **bswap**

    This feature provides bswap16(3), bswap32(3) and bswap64(3) functions available in \*BSD.

  - **dprintf**

    This feature provides [dprintf(3)](/dprintf/3.md).

  - **efun**

    This feature provides esetfunc(3), efopen(3), [ecalloc(3)](/ecalloc/3.md), [emalloc(3)](/emalloc/3.md), [erealloc(3)](/erealloc/3.md), ereallocarr(3), [estrdup(3)](/estrdup/3.md), estrndup(3), estrlcpy(3), estrlcat(3), easprintf(3), estrtoi(3), estrtou(3) and evasprintf(3) functions from NetBSD.

  - **err**

    This feature provides [err(3)](/err/3.md), [errx(3)](/errx/3.md), [verr(3)](/verr/3.md) and [verrx(3)](/verrx/3.md) BSD-isms.

  - **errc**

    This feature provides [errc(3)](/errc/3.md) and [verrc(3)](/verrc/3.md) BSD-isms.

  - **fgetln**

    This feature provides [fgetln(3)](/fgetln/3.md) BSD-ism.

  - **fparseln**

    This feature provides [fparseln(3)](/fparseln/3.md) BSD-ism.

  - **fts**

    This feature provides [fts\_open(3)](/fts_open/3.md), [fts\_read(3)](/fts_read/3.md) etc. functions available on BSDs and Linux. If it is absent on your system, you have to install libfts (both headers and library). libfts is a part of musl project.

  - **getdelim**

    This feature provides [getdelim(3)](/getdelim/3.md) from POSIX.

  - **getline**

    This feature corresponds to [getline(3)](/getline/3.md) function which is a part of POSIX2008 unavailable on some systems. mkc\_imp.f\_getline.mk checks whether getline declaration is available in stdio.h and implementation is available in libc. If not, getline.c provided by mk-configure is added to SRCS and declaration is provided in mkc\_getline.h header.

  - **humanize\_number**

    This feature provides [humanize\_number(3)](/humanize_number/3.md) function from NetBSD.

  - **libdl**

    This feature checks whether libdl library is available and [dlopen(3)](/dlopen/3.md) is declared in dlfcn.h.  If yes, -ldl is added to LDADD. mkc\_libdl.h provides declarations for [dlopen(3)](/dlopen/3.md), [dlsym(3)](/dlsym/3.md), [dlclose(3)](/dlclose/3.md) etc.

  - **libl**

    Adds -ll or -lfl to LDADD depending on which one is available. One can use this feature instead of LIBLEX variable.

  - **libm**

    This feature checks whether libm is available and if yes, adds -lm to LDADD.  Most UNIX-like systems have libm but Haiku, for example, does not. mkc\_imp.f\_libm.mk checks whether libm library is available and if yes, -lm is added to LDADD.

  - **macro**

    This feature provides the following macro stolen from NetBSD.

    - **\_\_aligned(x)**

      defined as *\_\_attribute\_\_((aligned(x)))* if supported by compiler,\

    - **\_\_always\_inline**

      defined as *\_\_attribute\_\_((always\_inline))* if supported by compiler,\

    - **\_\_arraycount(a)**

      defined as *(sizeof(\_\_a)/sizeof(\_\_a\[0\])) ,*\

    - **\_\_constfunc**

      defined as *\_\_attribute\_\_((const))* if supported by compiler,

    - **\_\_dead**

      defined as *\_\_attribute\_\_((noreturn))* if supported by compiler,

    - **MIN(a,b)** and **MAX(a,b),**

      *\_\_pure* defined as *\_\_attribute\_\_((pure))* if supported by compiler,

    - **\_\_printflike(n,m)**

      defined as *\_\_attribute\_\_((format (printf, n, m)))* if supported by compiler.

    - **\_\_UNCONST(a)**

      defined as *((void \*) ((const char \*)(p) - (const char \*)0))*

  - **posix\_getopt**

    It is well-known that glibc [getopt(3)](/getopt/3.md) does not conform to POSIX by default. This feature provides POSIX-ly correct getopt.

  - **progname**

    This feature provides [getprogname(3)](/getprogname/3.md) and [setprogname(3)](/setprogname/3.md) functions available in \*BSD.

  - **pwdgrp**

    This feature provides [user\_from\_uid(3)](/user_from_uid/3.md), [uid\_from\_user(3)](/uid_from_user/3.md), [group\_from\_gid(3)](/group_from_gid/3.md), [gid\_from\_group(3)](/gid_from_group/3.md) functions from \*BSD.

  - **raise\_default\_signal**

    This feature provides function raise\_default\_signal(3) from NetBSD.

  - **RB SPLAY**

    BSD systems provide sys/tree.h header where RB\_\* and SPLAY\_\* macroses are defined for red-black tree and splay. These features check whether sys/tree.h and appropriate macroses are available. If yes, mkc\_RB.h and mkc\_SPLAY.h include system-wide sys/tree.h, otherwise NetBSD version of sys/tree.h provided by mk-configure is included.

  - **reallocarr**

    This feature provides reallocarr(3) function from NetBSD.

  - **reallocarray**

    This feature provides [reallocarray(3)](/reallocarray/3.md) function from OpenBSD.

  - **shquote**

    This feature provides shquote(3) function from NetBSD.

  - **SLIST SIMPLEQ STAILQ LIST TAILQ CIRCLEQ**

    BSD systems provide sys/queue.h header where SLIST\_\* etc. macroses are defined for lists and queues. These features check whether sys/queue.h and appropriate macroses are available. If yes, mkc\_SLIST.h and others include system-wide sys/queue.h, otherwise NetBSD version of sys/queue.h provided by mk-configure is included.

  - **strlcat**

    This feature corresponds to [strlcat(3)](/strlcat/3.md) function available on almost all systems except glibc-based Linux-es. mkc\_imp.f\_strlcat.mk checks whether strlcat declaration is available in string.h and implementation is available in libc. If not, strlcat.c provided by mk-configure is added to SRCS and declaration is provided in mkc\_strlcat.h header.

  - **strlcpy**

    Similar to strlcat.

  - **strndup**

    This feature provides [strndup(3)](/strndup/3.md) from POSIX.

  - **strsep**

    This features provides [strsep(3)](/strsep/3.md) and stresep(3) functions.

  - **strtoi**

    This feature provides strtoi(3) function introduced in NetBSD.

  - **strtou**

    This feature provides strtoi(3) function introduced in NetBSD.

  - **vis**

    This feature provides [vis(3)](/vis/3.md), [nvis(3)](/nvis/3.md), [svis(3)](/svis/3.md), [snvis(3)](/snvis/3.md), [strvis(3)](/strvis/3.md), [strnvis(3)](/strnvis/3.md), [strsvis(3)](/strsvis/3.md), [strsnvis(3)](/strsnvis/3.md), [strvisx(3)](/strvisx/3.md), [strnvisx(3)](/strnvisx/3.md), [strenvisx(3)](/strenvisx/3.md), [strsvisx(3)](/strsvisx/3.md), [strsnvisx(3)](/strsnvisx/3.md), [strsenvisx(3)](/strsenvisx/3.md), [strunvis(3)](/strunvis/3.md), [strnunvis(3)](/strnunvis/3.md), [strunvisx(3)](/strunvisx/3.md), [strnunvisx(3)](/strnunvisx/3.md) and [unvis(3)](/unvis/3.md) from NetBSD.

  - **warn**

    This feature provides [warn(3)](/warn/3.md), [warnx(3)](/warnx/3.md), [vwarn(3)](/vwarn/3.md) and [vwarnx(3)](/vwarnx/3.md) BSD-isms.

- MKC\_NOAUTO

  See MKC\_CHECK\_{HEADERS,FUNCLIBS,FUNCS,VARS,DEFINES,SIZEOF}.

- MKC\_NOAUTO\_FUNCLIBS

  See MKC\_CHECK\_FUNCLIBS

- MKC\_NOCACHE

  All results are cached unless MKC\_NOCACHE variable is set non-empty value

- MKC\_REQUIRE\_BUILTINS

  The same as MKC\_CHECK\_BUILTINS, but failure is treated as a fatal error (See **configure** target).

- MKC\_REQUIRE\_CUSTOM

  The same as MKC\_CHECK\_CUSTOM, but failure is treated as a fatal error (See **configure** target). 0 and empty value of CUSTOM.xxx means failure.

- MKC\_REQUIRE\_DEFINES

  The same as MKC\_CHECK\_DEFINES, but absense of the define is treated as a fatal error (See **configure** target).

- MKC\_REQUIRE\_FUNCLIBS

  The same as MKC\_CHECK\_FUNCLIBS, but absense of funclib is treated as a fatal error (See **configure** target).

- MKC\_REQUIRE\_FUNCS\<N\>

  The same as MKC\_CHECK\_FUNCS\<N\>, but absense of the function declaration is treated as a fatal error (See **configure** target).

- MKC\_REQUIRE\_HEADER\_FILES

  The same as MKC\_CHECK\_HEADER\_FILES, but absense of header is treated as a fatal error (See **configure** target).

- MKC\_REQUIRE\_HEADERS

  The same as MKC\_CHECK\_HEADERS, but absense of header is treated as a fatal error (See **configure** target).

- MKC\_REQUIRE\_MEMBERS

  The same as MKC\_CHECK\_MEMBERS, but absense of the member is treated as a fatal error (See **configure** target).

- MKC\_REQUIRE\_PROGS

  The same as MKC\_CHECK\_PROGS, but absense of program is treated as a fatal error (See **configure** target).

- MKC\_REQUIRE\_PROTOTYPES

  The same as MKC\_CHECK\_PROTOTYPES, but incorrect prototype is treated as a fatal error (See **configure** target).

- MKC\_REQUIRE\_TYPES

  The same as MKC\_CHECK\_TYPES, but absense of the type declaration is treated as a fatal error (See **configure** target).

- MKC\_REQUIRE\_VARS

  The same as MKC\_CHECK\_VARS, but absense of the variable declaration is treated as a fatal error (See **configure** target).

- MKC\_SHOW\_CACHED

  Setting it to 0 will hide

  ```
     Checking ... (cached) ...
  ```

  messages, that is, messages about fetching results from cache files.

- MKC\_SOURCE\_DIR, MKC\_SOURCE\_DIR.\<source\>

  Directory with sources for MKC\_SOURCE\_FUNCLIBS. If MKC\_SOURCE\_DIR.\<source\> is unset, MKC\_SOURCE\_DIR is used that defaults to ${.CURDIR}.

  ```
   Ex:  MKC_SOURCE_FUNCLIBS += getline
        MKC_SOURCE_DIR.getline.c = ${.CURDIR}/../missing
   Res: SRCS+= ${.CURDIR}/../missing/getline.c
        HAVE_FUNCLIB.getline= 0
  ```

- MKC\_SOURCE\_FUNCLIBS

  The same as MKC\_CHECK\_FUNCLIBS, but if \<function\> is absent both in the specified \<library\> and in libc, function.c is added to SRCS unless MKC\_NOAUTO=1.

  ```
   Ex:  MKC_SOURCE_FUNCLIBS+= getline
   Res: SRCS+= getline.c
        HAVE_FUNCLIB.getline= 0
  ```

### mkc.conf.mk

The same as **mkc.configure.mk** but **mkc.init.mk** is not included by **mkc.conf.mk** in the beginning, and **CFLAGS**, **CPPFLAGS**, **LDADD** and **SRCS** varibales are not modified. Instead, internal variables **MKC\_CFLAGS**, **MKC\_CPPFLAGS**, **MKC\_LDADD** and **MKC\_SRCS** contain all changes and will be applied later. One can use this module for implementing your own "features" similar to **MKC\_FEATURES**.

### mkc\_imp.scripts.mk

It is internal include file which is included from **mkc.prog.mk**, **mkc.lib.mk** and **mkc.files.mk**. Do not use it directly! It provides installing and uninstalling the scripts. The following variables are provided:

- SCRIPTS

  A list of interpreter scripts (written in shell, awk, lua etc). These are installed like programs. \<*M*\>

- SCRIPTSDIR

  Target directory for scripts. \<*Iu*\> \[*${BINDIR}*\]

- SCRIPTSDIR\_\<script\>

  Optional directory to install \<script\> to. If \<script\> has a form \<subdir\>/\<filename\>, SCRIPTSDIR\_\<subdir\>\_\<filename\> is used. \<*Mu*\>

- SCRIPTSGRP

  Script file group. \<*Iu*\> \[*${BINGRP}*\]

- SCRIPTSMODE

  Script file mode. \<*Iu*\> \[*${BINMODE}*\]

- SCRIPTSNAME

  The name that the above program will be installed as, if different from ${SCRIPTS}. \<*Mu*\>

- SCRIPTSNAME\_\<script\>

  Optional name to install \<script\> as. If \<script\> has a form \<subdir\>/\<filename\>, SCRIPTSNAME\_\<subdir\>\_\<filename\> is used. \<*Mu*\>

- SCRIPTSOWN

  Script files owner. \<*Iu*\> \[*${BINOWN}*\]

### mkc\_imp.lua.mk

**mkc\_imp.lua.mk** is internal include file which is included from **mkc.prog.mk** and **mkc.lib.mk**. Do not use it directly. It provides support for Lua programming language, i.e. building and installing Lua- and/or C-based modules. The following variables are provided:

- LUA\_CMODDIR

  Directory for compiled Lua modules written in, e.g., C or C++. It is assigned with the help of *pkg-config --variable=INSTALL\_CMOD lua* command and can be overriden by user. \<*Iu*\>

- LUA\_CMODULE

  Compiled Lua module written in, e.g., C or C++. Dot in the module name separates a dirname from basename. That is, actual .c file names are made of LUA\_MODULES with dots replaced with undeline symbol. At installation time dots are replaced with slash. For example, if LUA\_CMODULES=socket.foo, then socket\_foo.c will be used for compiling a module and will be installed to ${LUA\_CMODDIR}/socket/foo.so. \<*M*\>

- LUA\_LMODDIR

  Directory for Lua modules written in Lua. It is assigned with the help of *pkg-config --variable=INSTALL\_LMOD lua* command and can be overriden by user. \<*Iu*\>

- LUA\_LMODULES

  Deprecated. Filenames of Lua modules. Use *LUA\_MODULES* instead. \<*M*\>

- LUA\_MODULES

  List of Lua modules to build and install. Dot in the module name separates a dirname from basename. That is, actual .lua file names are made of LUA\_MODULES with dots replaced with undeline symbol. At installation time dots are replaced with slash. For example, if LUA\_MODULES=socket.foo, then socket\_foo.lua will be installed to ${LUA\_LMODDIR}/socket/foo.lua \<*M*\>

- SRCS

  List of source files to build the LUA\_CMODULE.  SRCS defaults to  *${LUA\_CMODULE:S\|.\|\_\|g}.c*. \<*M*\>

### mkc\_imp.intexts.mk

**mkc\_imp.intexts.mk** is internal include file which is included from **mkc.prog.mk**, **mkc.lib.mk** and **mkc.files.mk**. Do not use it directly. It provides conversion of \<fn\>.in files to \<fn\> by expanding the following @@ patterns:

```
 Pattern       Result
----------------------
@prefix@       ${PREFIX}
@bindir@       ${BINDIR}
@mandir@       ${MANDIR}
@sbindir@      ${SBINDIR}
@libdir@       ${LIBDIR}
@libexecdir@   ${LIBEXECDIR}
@datadir@      ${DATADIR}
@sysconfdir@   ${SYSCONFDIR}
@incsdir@      ${INCSDIR}
@vardir@       ${VARDIR}
@sharedstate@  ${SHAREDSTATEDIR}
```

The following variables are provided:

- INFILES

  List of files to generate. \<*M*\>

- INSCRIPTS

  List of scripts to generate. \<*M*\>

- INTEXTS\_REPLS

  List of Pattern/Replacement pairs separated by space, e.g.

  ```
      INTEXTS_REPLS+=   version ${VERSION}
      INTEXTS_REPLS+=   author_email ${AUTHOR_EMAIL}
  ```

  \<*M*\>

- INTEXTS\_SED

  List of additional **[sed(1)](/sed/1.md)** expressions for expanding, e.g.

  ```
      INTEXTS_SED+=   -e 's,0.40.3,${VERSION},g'
  ```

  \<*M*\>

### mkc\_imp.info.mk

**mkc\_imp.info.mk** is internal include file which is included from **mkc.prog.mk**, **mkc.lib.mk** and **mkc.files.mk**. Do not use it directly! This module provides creation of .info files from .txi, .texi and .texinfo sources and provides the following variables:

- INFOFLAGS

  Flags to pass to makeinfo. \[\] \<*Iu*\>

- MKINFO

  If "no", don't build or install Info documentation from Texinfo source files. \<*Iu*\> \[*yes*\]

- TEXINFO

  List of Texinfo source files.  Info documentation will consist of single files with the extension replaced by .info. \<*M*\>

### mkc\_imp.man.mk

**mkc\_imp.man.mk** is internal include file which is included from **mkc.prog.mk**, **mkc.lib.mk** and **mkc.files.mk**. Do not use it directly! This module provides installation of manual pages and creation of catpages and HTML pages and provides the following variables:

- HTMLDIR

  Target directory for html pages generated from man pages. \<*Iu*\> \[*${MANDIR}*\]

- MAN

  Manual pages (usually end in .1 - .9). \<*M*\>

- MANDIR

  Target directory for man pages. \<*Iu*\> \[*${PREFIX}/man*\]

- MANZ

  If not "no", compress manual pages at installation time. \<*Iu*\> \[*no*\]

- MKCATPAGES

  If "no", don't build or install the catman pages. \<*Iu*\> \[*no*\]

- MKHTML

  If "no", don't build or install the HTML man pages. \<*Iu*\> \[*no*\]

- MKMAN

  If "no", don't build or install the man pages, and also acts as "MKCATPAGES=no MKHTML=no". \<*Iu*\> \[*yes*\]

- MLINKS

  List of manual page links (using a .1 - .9 suffix).  The linked-to file must come first, the linked file second, and there may be multiple pairs.  The files are hard-linked. \<*M*\>

- USETBL

  If not "no", preprocess man pages using **[tbl(1)](/tbl/1.md)** while generating cat pages. \<*IM*\> \[*no*\]

### mkc\_imp.links.mk

**mkc\_imp.links.mk** is internal include file which is included from **mkc.prog.mk**, **mkc.lib.mk** and **mkc.files.mk**. Do not use it directly! This module provides creation of hard and symbolic links and provides the following variables:

- LINKS

  The list of binary links; should be full pathnames, the linked-to file coming first, followed by the linked file.  The files are hard-linked.  For example, to link ${BINDIR}/gzip and ${BINDIR}/gunzip, use:

  ```
      LINKS=   ${BINDIR}/gzip ${BINDIR}/gunzip
  ```

  \<*M*\>

- SYMLINKS

  The list of symbolic links; should be full pathnames. Syntax is identical to LINKS. Note that DESTDIR is not automatically included in the link. \<*M*\>

### mkc\_imp.inc.mk

**mkc\_imp.inc.mk** is internal include file which is included from **mkc.prog.mk**, **mkc.lib.mk** and **mkc.files.mk**. Do not use it directly! This module provides installation of header files and provides the following variables:

- INCS

  The list of include files. \<*M*\>

- INCSDIR

  See **mkc.init.mk**.

- INCSNAME

  Target name of the include file, if only one; same as FILESNAME, but for include files. \<*M*\>

- INCSNAME\_\<file\>

  The name file \<file\> should be installed as, if not \<file\>, same as FILESNAME\_\<file\>, but for include files. \<*Mu*\>

- INCSSRCDIR

  Source directory for include files. This variable have an influence on CPPFLAGS (-I${INCSSRCDIR} is added) and on an installation of include files (paths in ${INCS} are relative to ${INCSSRCDIR}). \<*M*\> \[*.*\]

### mkc.minitest.mk

**mkc.minitest.mk** is an auxiliary include file that implement simple framework for unit tests.  Idea: application provides the target test\_output and expect.out file that contains ideal output. **mkcmake test** runs **mkcmake test\_output** and compare generated output with *expect.out*.

- MKC\_DIFF

  [diff(1)](/diff/1.md) command for comparing expected and actual results. \<*Iu*\> \[*diff*\]

- TEST\_PREREQS

  Prerequisites for target "test". \<*Iu*\> \[*all*\]

### mkc\_imp.pkg-config.mk

**mkc\_imp.pkg-config.mk** is internal include file which is included from **mkc.prog.mk** and **mkc.lib.mk**. Do not use it directly! This module supports dependencies controlled by **pkg-config** program. As a result CPPFLAGS and LDADD variables are modified according to "pkg-config --cflags ..." and "pkg-config --libs ...". The following variables are provided:

- MKC\_CHECK\_PKGCONFIG

  List of libraries to check, for example, glib-2.0\>=2.1. Spaces around \<=, \>=, =, \< and \> are not allowed. As a result of the check bmake's variable PKG\_CONFIG.exists.\<lib\> is set to 1 for success or 0 for failure. Unless MKC\_NOAUTO is set to 1 -DHAVE\_PKGCONFIG\_\<LIB\>=1 is also added to CPPFLAGS if \<lib\> was found. \<LIB\> is tr/a-z+.-/A-ZP\_\_/ of \<lib\>. \<*M*\>

- MKC\_REQUIRE\_PKGCONFIG

  The same as MKC\_REQUIRE\_PKGCONFIG, but absense of library is treated as a fatal error (See **configure** target).

- PCNAME.\<lib\>

  On some systems several versions of the same library may be installed to differet directories (for example liblua for Lua 5.1 and 5.2). In order to avoid conflicts between them pc name is changed (for example, lua5.1 and lua5.2 instead of lua). This variable is a map from library name to pc name. \<*Iu*\> \[*${lib}*\]

- PKG\_CONFIG.exists.\<lib\>

  If "1", \<lib\> exists, "0" otherwise. Inside \<lib\> \<=, \>=, =, \< and \> and replaced with \_le\_, \_ge\_, \_eq\_, \_lt\_ and \_gt\_ respectively. \<*Iu*\>

- PKG\_CONFIG.var.\<lib\>.\<var\>

  Variable value (pkg-config --variable=\<var\> \<lib\>). \<*Iu*\>

- PKG\_CONFIG\_VARS.\<lib\>

  List of variables to check for library \<lib\>. \<*M*\>

### mkc\_imp.pod.mk

**mkc\_imp.pod.mk** is internal include file which is included from **mkc.prog.mk** and **mkc.lib.mk**. Do not use it directly! It provides support for POD (Plain Old Documentation) markup language, i.e. convertion of POD documents to MAN pages (suffix rules: .pod.1, ... , .pod.9) and HTMLs (.pod.html). The following variables are provided:

- POD2HTML

  Path to POD to HTML conversion utility \<*Iu*\> \[*pod2html*\].

- POD2HTML\_FLAGS

  Flags passed to ${POD2HTML} \<*Iu*\> \[\].

- POD2MAN

  Path to POD to MAN conversion utility \<*Iu*\> \[*pod2man*\].

- POD2MAN\_FLAGS

  Flags passed to ${POD2MAN} \<*Iu*\> \[*-r '' -n '${.TARGET:T:R}' -c ''*\].

### mkc\_imp.dep.mk

**mkc\_imp.dep.mk** is internal include file which is included from **mkc.prog.mk** and **mkc.lib.mk**. Do not use it directly!  This include file contains the default targets for building .depend\_${.CURDIR:T} files.  It creates .d files from entries in SRCS and DPSRCS that are C, C++, or Objective C source files, and builds .depend\_${PROJECTNAME} from the .d files.  All other files in SRCS and all of DPSRCS will be used as dependencies for the .d files. The following variables are provided:

- DPSRCS

  List of source files which are needed for generating dependencies, but are not needed in ${SRCS}.

- MKDEP\_CC

  Compiler passed to [mkdep(1)](/mkdep/1.md). \<*Iu*\> \[*${CC}*\].

- SRCS

  The same as in **mkc.prog.mk** and **mkc.lib.mk**.

### mkc\_imp.foreign\_autotools.mk

This module is activated if variable FOREIGN is set to "autotools" and provides support for building external projects using autotools. It also provides a recursive target **mkgen** for generating "configure" script, "Makefile.in" file etc. using **[autoreconf(1)](/autoreconf/1.md)** utility. The following variables are provided:

- AT\_AUTORECONF\_ARGS

  Arguments passed to **[autoreconf(1)](/autoreconf/1.md)**. \<*U*\> \[*-sif*\].

- AT\_CONFIGURE\_ARGS

  Extra arguments passed to "configure" script set in addition to standard ones (--prefix, --bindir etc.). \<*Mu*\> \[\].

- AT\_CONFIGURE\_ENV

  Environment variables for "configure" script set in addition to standard ones (CC, CFLAGS etc.). \<*Mu*\> \[\].

- AT\_MAKE

  Make(1)-like utility for the project. \<*Imu*\> \[*${MAKE}*\].

- AT\_USE\_AUTOMAKE

  If "yes", **[automake(1)](/automake/1.md)** is used. \<*M*\> \[*yes*\].

- FSRCDIR

  Relative (to ${.CURDIR}) or absolute directory to autotools-based sources.

### mkc\_imp.help.mk

This mk file implements targets **help**, **help\_subprj** and **help\_use.**

- help\_use

  Outputs the configuring options available for the project and descriptions for their values. Configuring options should be specified in USE\_VARIABLES variable described below.

- help\_subprj

  Outputs the list of subprojects (mkc.subprj.mk) and their descriptions. Subprojects are mentioned in SUBPRJ and SUBPRJ\_DFLT variables. Description are specified in HELP\_MSG.\<subproject\> variable.

- USE\_VARIABLES

  A list of configuring variables. Let's assume that the only configuring variable is *USESOMETHING* and the valid values for it are: *no* (the default) and *yes*. Then developer may provide the following assignments in Makefile:

  ```
      USE_VARIABLES  += USESOMETHING
      USESOMETHING.descr  = "Configuring parameter SOMETHING"
      USESOMETHING.0  = "no: disable feature SOMETHING"
      USESOMETHING.1  = "yes: enable feature SOMETHING"
  ```

  \<*M*\> \[*unset*\]

- HELP\_MSG.\<subproject\>

  Description for project \<subproject\>. \<*M*\> \[*unset*\]

## CROSS COMPILATION

The following variables are used for compiling software using cross-tools.

- MACHINE\_GNU\_PLATFORM

  See TOOLCHAIN\_PREFIX.

- OPSYS\_TARGET

  OPSYS for target OS.

- SYSROOT

  Root directory for headers and libraries. If set, the following variables are set to ${TOOLCHAIN\_DIR}/${TOOLCHAIN\_PREFIX}\<toolname\>: AR, AS, CXX, CPP, CC, INSTALL, LD, NM, OBJCOPY, OBJDUMP, RANLIB, SIZE and STRIP. \<*U*\> \[\].

- TOOLDIR

  See TOOLCHAIN\_DIR.

- TOOLCHAIN\_DIR

  Directory that contains cross-toolchain. \<*U*\> \[*${TOOLDIR}/bin*\].

- TOOLCHAIN\_PREFIX

  See SYSROOT. \<*U*\> \[*${MACHINE\_GNU\_PLATFORM}-*\].

## ENVIRONMENT VARIABLES

- MAKECONF

  Path to mk.conf file included by mkc.\*.mk files

## FILES

- /etc/mkcmake.conf

  included by mkc.init.mk if exists

- /etc/mk.conf

  included by mkc.init.mk if exists

## BUGS

Target *configure* (*configure*) doesn't support parallel builds. In order to build project in parallel, run it like the following

```
   mkcmake configure
   mkcmake -j4 all
```

## SEE ALSO

[**mkc\_check\_header**(1)](/mkc_check_header/1.md), [**mkc\_check\_prog**(1)](/mkc_check_prog/1.md), [**mkc\_check\_decl**(1)](/mkc_check_decl/1.md), [**mkc\_check\_funclib**(1)](/mkc_check_funclib/1.md), [**mkc\_check\_sizeof**(1)](/mkc_check_sizeof/1.md), [**mkc\_check\_custom**(1)](/mkc_check_custom/1.md), [**bmake**(1)](/bmake/1.md), [**mkdep**(1)](/mkdep/1.md),

## AUTHOR

Aleksey Cheusov \<vle@gmx.net\>
