Home > build

build

Build is a project mainly written in C and C++, based on the ISC license.

Module build system

Overview

Features and Misfeatures

  • error messages report which module file(Build.mk) has the bug!
  • supported executables, static libraries and shared libraries
  • recursive make, it always knows what to build in what order.
  • 'make help' shows all modules and a short description
  • make builds just that bit and its dependencies (shared and static libraries)
  • cannot call external autoconf scripts or Makefiles, must write a Build.mk from scratch to add 3rd party stuff.
  • output binaries are separate from source code - theoretically multiple passes with different TARGET_OS or OUTDIR settings possible
  • 'make all' builds everything
  • 'make clean-all' removes each file individually, then removes each directory individually leaving a perfectly clean tree
  • use of OUTDIR allows output to be outside of the tree, anywhere on your filesystem
  • every module must be given a unique name so you can type 'make foo' and get a foo. if there are duplicates an error will be reported.
  • build system can be located anywhere, a git-submodule, a symlink, or hardcoded global directory
  • dependency generate from source files
  • C++ support - automatically use $(CXX) to link if a project has any .cpp files
  • MODULE and output file name can be independent, but default is MODULE as name.
  • using a different MODULE name for shared and static, but same OUTPUT_NAME is possible.
  • changing a Build.mk force rebuilds which propagate through the system

Bugs & Missing Features

  • no install rule - ideally each module would populate a private root filesystem so packaging becomes easy
  • cross compile support is incomplete
  • no provisions for building host-based tools like parser generators.
  • no real MacOSX support (can't build .app bundles)
  • TBD: ccache and distcc
  • going to _out/exec/yourthing to run something is annoying
  • making both a shared and static library version of something is tedious.
  • no per component namespace for temporary variables defined.
  • many sections of macros are repetively defined because of Make limitations.
  • changing global configuration or command-line options won't force rebuild

Usage

Config.mk

Optional file at the top of a project, it is included after HOST_OS is set but before defaults for TARGET_OS are set or package macros are loaded.

TARGET_PKGCONFIG command that performs the functionality of the 'pkg-config' utility

CROSS_COMPILE prefix on target build utilities

OUTDIR output directory for binaries. default is $(TOP)_out/

Variables

These can be checked in Build.mk files for conditional options:

HOST_OS or TARGET_OS Windows_NT Darwin Linux

HOST_OS_TYPE or TARGET_OS_TYPE win32 cocoa x11

Build.mk Options

LOCAL_PATH must set once per file at the top

MODULE must set for each target

OUTPUT_NAME optionally use a different output name, uses MODULE if not set

LIBVERSION - shared libraries only apply a version identifier to the library such as -soname

SRCS list of source files for target

STATIC_LIBRARIES list of static libraries (other MODULE names)

SHARED_LIBRARIES list of static libraries (other MODULE names)

CPPFLAGS preprocessor flags

CFLAGS compile flags

LDFLAGS linker flags

LDLIBS linker flags

PROVIDE_CFLAGS - libraries only dependents of this library automatically get these flags added

PROVIDE_LDFLAGS - libraries only dependents of this library automatically get these flags added

CLEAN_ALL_FILES files to remove on 'clean-all'

CLEAN_FILES files to remove on 'clean'

Targets

include $(BUILD_EXECUTABLE) create an executable

include $(BUILD_STATIC_LIBRARY) create a static library

include $(BUILD_SHARED_LIBRARY) create a shared library

Previous:boatman