Skip to content

cheusov/mk-configure

Repository files navigation

[toc]

Installation

See doc/INSTALL.md file for build and installation instructions.

What is mk-configure?

mk-configure is a build system, written in and for bmake (portable version of NetBSD make) and UNIX tools (shell, awk etc.). FreeBSD and OpenBSD make are not good. They are incompatible with NetBSD bmake. GNU make is not good too.

mk-configure provides a number of include files (.mk files) written in bmake and a number of standalone programs that should be installed to user's host for building a software.

mk-configure features:

  • An easy way for building standalone executables, static and shared libraries written in C, C++ and Objective C; .cat and .html files from man pages; .info pages from texinfo sources etc. LEX, YACC are also supported. Support for other languages are planned.

  • Installing and uninstalling executables, libraries, scripts, documentation files and others. DESTDIR support is also provided.

  • Integrated autoconf-like support for finding #include files, libraries and function implementation, function definitions, defines, types, struct members etc.

  • A number of built-in checks for, e.g., system endianness, GNU bison or GNU flex programs and many others.

  • Automatic dependency analysis built-in for C and C++.

  • Extensibility by writing bmake include files.

  • Support for regression tests (see mkc.minitest.mk for the sample).

  • mk-configure is small and easy. It is definitely much easier for use than GNU autotools, many people think that it is also easier than other competing projects like CMake, scons and others.

Project goals

  • No code generation! Library approach is used instead. Instead of generating tons of unreadable blobs mk-configure uses bmake include files (bmake's library) and external executables to make its job. Developers should distribute source code only, not blobs.

  • Single top level command for building a program (mkcmake). Instead of running and learning autoconf/automake/aclocal/autoreconf/config.status/autoheader and many other tools, and the way they interact with each other, you should learn only ONE tool, bmake (mkcmake is a trivial wrapper over bmake).

  • No bloat. At this time mk-configure consists of far less than 10000 lines of code (excluding examples and regression tests). Compare this number with autotools sources and you'll see a difference.

  • Simplicity for both developers and users. The only file developers should be aware of during development is 'Makefile'. Users just run

     $ mkcmake help
     $ env <variables> mkcmake all <options>
    

    to build a software. The same for developers -- for building a software, just run mkcmake.

  • Portability. At the moment the following systems and compilers are supported:

    • NetBSD. Tested on NetBSD-5.0/x86 and NetBSD-2.0/alpha and later versions with gcc, pcc and clang.

    • FreeBSD. Tested on FreeBSD-6.2/x86, 7.1/spark64, 7.1/x86 and later versions with gcc and clang.

    • OpenBSD. Tested on OpenBSD-3.8/x86, 4.5/x86 and later versions with gcc.

    • DragonFlyBSD. Tested on DragonFly-2.4.1-RELEASE/x86 and later versions with gcc.

    • MirOS BSD. Tested on MirBSD-10/x86 and later versions with gcc.

    • Linux. Tested on Linux/{x86,x86-64,ppc,armv7,aarch64} with glibc/musl, gcc, icc and SunStudio compilers.

    • Solaris. Tested on Solaris-{10,11}/{spark64,x86} with SunC-5.11, SunC-5.15 and gcc.

    • Darwin (macOS). Tested on Darwin-8.11.0/ppc (MacOS-X Tiger) and later version with native gcc and clang.

    • Interix. Tested on Interix-3.5/x86 with gcc.

    • QNX. Tested on QNX-6.3/x86 with gcc.

    • OSF1. Tested on Tru64-5.1/alpha with gcc and DEC C compiler.

    • HP-UX. Tested on HP-UX-11.0/hppa with gcc.

    • Partial support for AIX and their native compilers. Support is not complete because I have no access to "big iron" :-( .

    If you don't see your favorite system/compiler here and want to help me to improve mk-configure, feel free to contact me.

  • Declarative approach in writing Makefiles. Instead of specifying how to build your software, you should specify source files, files to build and (optionally) build options, e.g. LDCOMPILER=yes meaning that ${CC} or ${CXX} compiler should be used as a linker instead of ${LD}. Small/medium size projects may have no rules in Makefiles at all. Most useful things are already implemented in mk-configure Mk files including targets "all", "install", "uninstall" as well as support for building the shared libraries, installation to ${DESTDIR} etc. Usually, Makefile contain only variable assignments, .include-s and .if/.for directives.

  • No heavy dependencies like Python or Perl.

How to use mk-configure?

Developers:

  • Install mk-configure to your system.
  • Run mkcmake or mkcmake all for building your program. You don't need autoconf/autoheader/automake/aclocal/config.guess/ /autoreconf/config.status/config.sub and blah-blah-blah

Users and software packagers:

  • Install mk-configure to your system.

  • Run mkcmake for building a software and pass to it the building options, e.g.

     $ export CC=pcc
     $ export CFLAGS='-O0 -g'
     $ export PREFIX=$HOME/local
     $ mkcmake all install
    

What mk-configure consists of?

  • mkc.{files,lib,prog,subprj,subdir}.mk files.

    These include files are responsible for building, installing and uninstalling applications, static and shared libraries, scripts, text files, man and info pages, hard and soft links etc...

    NOTE FOR *BSD USERS: unlike well known Mk files from *BSD systems mkc.*.mk files provide the following features (this list is not complete, see mk-configure.7 for details).

    • PREFIX, BINDIR, MANDIR etc. variables default to directories under /usr/local. By default the same variables in bsd.*.mk files are set to directories under /usr. The reason is that they are used mainly for maintaining *BSD's own code while mk-configure is targeted to all UNIX-like systems, not only *BSD.

    • BINOWN, BINGRP, MANOWN etc. variables are set to 'id -u' and 'id -g' if mkcmake(1) is run under an unprivileged user. By default bsd.*.mk use root:wheel by default.

    • A target 'install' installs the target directories if needed.

    • A target 'uninstall' removes all installed files from destination directories. bsd.*.mk files do not provide this functionality.

    • A target 'test' of mkc.subdir.mk (by default) runs a "test" target for each subdirectory listed in SUBDIR. Other mkc.*.mk files provide "test" target too but does nothing by default. If you want to test your application, define your own "test" target in subprojects's Makefile.

    • "cleandir" target removes all temporary files and mk-configure's cache files.

    • support for texinfo/info files. There is no need to .include a special include files such as bsd.info.mk file.

    • mkc.subprj.mk is a powerful replacement for traditional bsd.subdir.mk.

    • Tons of other additions and improvements.

  • mkc.intexts.mk. Given a list of files in INFILES or INSCRIPTS mkc.intexts.mk generates them from appropriate *.in file replacing @prefix@, @sysconfdir@, @libdir@, @bindir@, @sbindir@, @datadir@ etc. with real ${PREFIX}, ${SYSCONFDIR} etc. See examples/ subdirectory for the samples.

  • mkc.configure.mk. It is a replacement for GNU autoconf. Its functionality is large enough to describe here. In short, it allows to check for presence of header files, function or variable declarations, presence of function in a particular library, defines, sizeof of data types and other useful things. Read the documentation in mk-configure.7 and see examples/ subdirectory for the samples of use.

  • Standalone full-functional mkc_check_{funclib,header,sizeof,decl,prog,custom,compiler} and other programs that can be used without mkcmake and without mkc.*.mk files. Read appropriate man pages.

  • This list is not complete. Have a look at mk-configure.7 for details.

Documentation

  • Subdirectory presentation/ contains a PDF file which demonstrates some basic ideas and samples of use.

  • In subdirectory examples/ you may find a lot of examples.

  • Documentation for mk include files is in mk-configure.7).

  • doc/NOTES contains a number of useful recipes.

  • Read the doc/FAQ document. It may be helpful.

  • Most of my personal projects use mk-configure. You can use them for learning.

  • Plans are here doc/TODO.

mk-configure binary packages

Binary packages for mk-configure are available in the following systems (this list may be incomplete):

  • NetBSD pkgsrc (devel/mk-configure).

  • FreeBSD ports (devel/mk-configure)

  • Debian/Ubuntu Linux

  • AltLinux

  • Arch Linux

  • OpenSuSE Linux

  • Fedora Linux (beginning with Fedora 40)

Feedback

Please register bug reports and pull requests here mk-configure home

Feel free to notify me about spelling errors in the documentation.