Skip to content

Another approach to simplify the creation of GNU Make-based makefiles.

License

Notifications You must be signed in to change notification settings

Zorkator/makeIt

Repository files navigation

makeIt

makeIt is another approach to simplify the creation of GNU Make-based makefiles. It contains a collection of modular make definitions and functions that could be included in project makefiles. These, mostly very generic, definitions try to handle the typical build steps and can be customized by setting variables or passing arguments. The goal of makeIt is reducing your makefile to the absolute minimum by including these definitions and redefine the default settings if needed by your own variables.

makeIt contains and uses the really nice GNU Make Standard Library of John Graham-Cumming (http://gmsl.sourceforge.net/)

After cloning makeIt to some directory the easiest is to set an environment variable (e.g. MAKEIT_DIR) to this directory. This environment variable can than be used in your project makefiles to include the definitions you need, e.g. for a C/C++ project:

> cd my_project
> cat makefile
include $(MAKEIT_DIR)/mk.c++

Actually this is already suitable for building an easy C/C++-project by calling:

> make built

To customize your makefile you should consult the built-in help page (the default target):

> make help

== KNOWN CONFIGURATIONS ==
debug      shortcut target for building with debug options. Equivalent to: "make built CFG=debug"
release    shortcut target for building with optimization and without debug options. Equivalent to: "make built CFG=release"

== OTHER TARGETS ==
built      target for starting build process
clean      clear build directory [.work/debug.64.gcc.exe] by removing object files
cpp,*      preprocess file to stdout. Directories have to be separated by \\, e.g. make cpp,src\\main.cpp
dist-*     meta target for starting make on distribution configurations: {64-}{{release-}{exe,shared,static}}
echo,*     evaluate value of make variable
eval,*     evaluate a make variable by calling with argument, e.g. make eval._mkFunc,arg. Separate directories by \\.
grep,*     grep pattern in source files: make grep,PATTERN[,GREP-OPTS]; default: GREP-OPTS: -iw
help       print overview over supported parameters and targets
log        show the logged command output via less
rescan     trigger rescan of source files and recreation of build dependencies
value,*    show value of make variable
vartab,*   print overview over known variables with given prefix, e.g. make vartab,mk_

== CURRENT PARAMETERS ==
ARCH             default       architecture id: {64,32}                                      64
BUILD_DIR        default       working directory for building object files.                  .work/debug.64.gcc.exe
BUILD_MODE       default       mode for building object files: {exe,shared,static}           exe
CC               file          used c/c++ compiler: {gcc}                                    gcc
CC_CFLAGS        default       c/c++ compile flags, applied to any file                      -ggdb
CC_FLAGS         default       flags, applied to any c/c++ compile and link command          -m64
CC_INCLUDE_DIRS  default       c/c++ include directories
CC_LFLAGS        default       c/c++ link flags                                              -Wl,-rpath,$ORIGIN
CC_LIBRARIES     default       list of c/c++ linked libraries
CC_LIBRARY_DIRS  default       list of library directories (c/c++-link only!)
CC_LINK_OTHER    default       list of other c/c++ link input files
CC_PP_DEFINES    default       list of c-preprocessor defines
CFG              default       current build configuration: {debug,release}                  debug
LOG              default       switch to enable/disable logging: {on,off}                    on
LOG_FILE         default       file for logging build messages.                              .work/debug.64.gcc.exe/_log.txt
OUT_DIR          default       output directory for effective output file(s)                 .work/debug.64.gcc.exe
OUT_FILE         default       path and file name of the final result                        .work/debug.64.gcc.exe/outname.debug.64.gcc
OUT_FILE_NAME    default       the file name of the final result                             outname.debug.64.gcc
OUT_NAME         default       the base name of the final result                             outname.debug.64.gcc
OUT_TYPE         file          type of built binary: {exe,shared,static}                     exe
OUT_UMASK        default       the umask to set for the final output file
SUBPACKAGES      default       directory list of project prerequisites
TAG              default       string for tagging build directory.                           debug.64.gcc
  • The first column of section CURRENT PARAMETERS lists the most important variables that can be configured in your makefile or by command line argument.
  • The second column specifies the origin of the current variable setting.
  • The third column gives a short description of these variables and, for some of them, a list of supported values.
  • The last column reports the currently effective settings.

Before changing the makefile the effect of certain settings can easily be tested on the command line:

> make OUT_TYPE=shared CFG=release

... what gives an updated overview page and the effective settings at the last column of CURRENT PARAMETERS. To start building with these settings, don't forget to provide the target built:

> make OUT_TYPE=shared CFG=release built

The variable names listed in the first column of CURRENT PARAMETERS are the variables you use for setting your values. From variables specified by your makefile and command line arguments makeIt derives the effective settings and lists them in the last column. These effective settings can be queried by the internally defined counterpart of the variables, prefixed by mk_.

To get the effective content of a certain variable you can use one of the targets echo, or eval,. The following example shows the difference between the variables and their mk_-counterparts:

> make -s eval,mk_OUT_FILE   #< gives the derived setting. Note that the flag -s suppresses info messages!
outname.debug.64.gcc
> make -s eval,OUT_FILE      #< gives the content of OUT_FILE

> make -s eval,OUT_FILE OUT_FILE=file.out
file.out

A simple makefile for building a simple c++ program:

> ls -R
.:
class.cpp  include  main.cpp  makefile

./include:
class.hpp
>
> cat makefile
CC_INCLUDE_DIRS := include
include $(MAKEIT_DIR)/mk.c++

makeIt works quite well for C/C++ and Fortran projects. However, there are many things that can be improved:

  • improve documentation, give more examples
  • there's always the need for cleaning up ;-)
  • adding support for other languages
  • ...

Copyright (c) 2018 Josef Scheuer. All rights reserved.

See the file "LICENSE" for information on the terms & conditions for usage, and a DISCLAIMER OF ALL WARRANTIES.

About

Another approach to simplify the creation of GNU Make-based makefiles.

Resources

License

Stars

Watchers

Forks

Packages

No packages published