'''[http://en.wikipedia.org/wiki/Make_%28software%29%|%make]''' is a classic [Unix] program to automate the building of software and documentation based on the specification of dependencies among files, on general rules for producing one type of file from another, and on specific rules for a particular piece of software or documentation. There are a number of implementations (with some differences), with the probably most widely-used one being [http://www.gnu.org/software/make/make.html%|%GNU make] ('''gmake'''). ** Non-Tcl Alternatives ** [Boost Build]: uses a variant of Perforce's Jam [Cmake]: [Electric Cloud, Inc.%|%Electric Cloud]'s emake: by a company founded by [JO] [http://www.openoffice.org/tools/dmake/%|%OpenOffice Dmake]: irregular syntax, but is available for various platforms [http://www.perforce.com/jam/jam.html%|%Jam]: Also [http://www.freetype.org/jam/%|%FT-Ja], a 100% compatible alternative. [http://makepp.sourceforge.net/%|%makepp - Make++]: a GNU-Make compatible replacement written in Perl [http://rake.rubyforge.org/%|%Rake]: written in [Ruby], provides a [domain-specific language] intended as an alternative for ''make'' [http://www.scons.org/%|%SCons]: [Python] based, powerful but complex [https://github.com/winterbe/nake/%|%nake]: Nake is a simplified version of Make (Cake, Jake, Rake) for the Java 8 Nashorn Javascript Engine. [ant]: popular in the [Java] community [https://ninja-build.org/%|%ninja]: A small build system designed to have its input files generated by a higher-level build system and to run builds as fast as possible. ** Tcl Alternatives ** '''top 3''': [bras]: [smake]: [tmk]: '''full list''': [Rivet]'s Aardvark: [A Little Make Replacement]: [another make replacement]: [bras]: [make library]: [oommf]'s [http://math.nist.gov/oommf/doc/userguide12a3/userguide/Platform-Independent_Make_p.html%|%pimake]: stands for '''Platform-Independent Make'''. [smake]: aims to be a high-level build system similar to autotools, [cmake], qmake, scons, or jam [tabs]: [tclmake]: [tcmake - yet another make replacement]: [tmk]: [[Should we mention Ant, either on the basis of dwelton's connections, or because of Tcl/Java?]] [[Only if someone out there is really using Ant with Tcl and has some info online some place regarding the use of the app]]: [http://github.com/mildred/TBuild%|%TBuild]: A small [Tcl] extension https://github.com/hkoba/dependency-tcl%|%dependency-tcl%|%: [Silvercat]: [http://git.ghostscript.com/?p=ghostpdl.git;a=blob_plain;f=toolbin/tmake.tcl;hb=HEAD%|%tmake.tcl]: a drop-in replacement for a large and useful subset of 'make'. It compiles makefiles into Tcl scripts and then executes the scripts. http://www.p-code.org/ttask%|%ttask%|%: Primarily for FPGA simulation/implementation. For GCC C/C++ projects, supports automatic dependencies and parallel compile of source files. [http://www.rtda.com/product/flowtracer/%|%FlowTracer]: A commercial product for designing and diagramming build processes, and workflow in general. It can analyze and diagram an existing make-based workflow, or it can be used to design workflows via its Tcl-based [DSL] called "Flow Description Language". It also has a Tk-based GUI for workflow visualization. [http://m.eet.com/media/1097291/rtda_graph.gif] ** See Also ** [gnu]: [MaMa]: [Mkdepend]: [PADE]: [PVM]: [tmk]: [UltraMake]: ** Tools ** [http://bashdb.sourceforge.net/remake]: a debugger for `make`. [TEA3]: leverages ''make'' ** Reading ** [http://web.archive.org/web/20070702131752/http://www.ddj.com/dept/debug/197003338%|%Debugging Makefiles], John Graham Cumming, 2007-02-05: valuable tips on coercing Make to introspect. [https://web.archive.org/web/20080609172425/http://www.unixreview.com/documents/s=9900/ur0510m/%|%Regular Expressions: Getting Started with SCons], Miki Tebeka and [Cameron Laird], 2005-10: includes a critique of ''make'' [http://www.onlamp.com/pub/a/onlamp/2004/11/18/gnumake_3e.html%|%make: The Evolution and Alternatives], Andy Oram, 2004-11-18: ** Description ** '''make''' scripts describe '''targets''': files that make should keep up-to-date '''dependencies''': files that the various '''targets''' depend on. '''recipes''': each recipe is a sequence of actions to take to ''make'' a target Make uses a target's file timestamp and its dependency information to determine when it should be made or re-made. Traditionally, on [Unix], the [make] command is used to combine pieces of source, transform it into a state suitable for installation, and then actually installing the resulting files into the final destination directories. Where programs are deployed in source form (as opposed to executables), the issue of how to build either the applications themselves, or the tools needed to build the application becomes a '''[deployment]''' issue. Sometimes you need something simple to ''bootstrap'' your application stack, or you rely on a relatively standard ''tool chain'' that will let you build your tools. Sometimes that means following a ''least common denominator'' notion of tools, often making the assumption about a [Unix]-like operating system with [C] compiler. ** Tips ** `override` allows `+=` to append to a variable even if it is passed in on the command line: ======none override CPPFLAGS += -I. ====== <> Application | Dev. Tools