Jump to content
 







Main menu
   


Navigation  



Main page
Contents
Current events
Random article
About Wikipedia
Contact us
Donate
 




Contribute  



Help
Learn to edit
Community portal
Recent changes
Upload file
 








Search  

































Create account

Log in
 









Create account
 Log in
 




Pages for logged out editors learn more  



Contributions
Talk
 



















Contents

   



(Top)
 


1 Origin  





2 Variants  





3 Use  





4 Makefile  



4.1  Rules  





4.2  Macros  





4.3  Suffix rules  





4.4  Pattern rules  





4.5  Comment  





4.6  Directive  





4.7  Line continuation  







5 Examples  





6 Dependency tracking  





7 See also  





8 References  





9 External links  














Make (software)






العربية
Azərbaycanca
Català
Čeština
Dansk
Deutsch
Eesti
Español
Esperanto
فارسی
Français

Bahasa Indonesia
Íslenska
Italiano
עברית
Kreyòl ayisyen
Magyar
Nederlands

Polski
Português
Русский
Suomi
Svenska
Türkçe
Українська

 

Edit links
 









Article
Talk
 

















Read
Edit
View history
 








Tools
   


Actions  



Read
Edit
View history
 




General  



What links here
Related changes
Upload file
Special pages
Permanent link
Page information
Cite this page
Get shortened URL
Download QR code
Wikidata item
 




Print/export  



Download as PDF
Printable version
 




In other projects  



Wikibooks
 
















Appearance
   

 






From Wikipedia, the free encyclopedia
 

(Redirected from Nmake)

Make
Paradigmmacro, declarative
Designed byStuart Feldman
First appearedApril 1976; 48 years ago (1976-04)
Implementation languageC
OSUnix-like, Inferno
File formatsMakefile
Major implementations
BSD, GNU, nmake
Dialects
BSD make, GNU make, Microsoft nmake
Influenced
Ant, Rake, MSBuild, and others

Insoftware development, Make is a command-line interface (CLI) software tool that performs actions ordered by configured dependencies as defined in a configuration file called a makefile. It is commonly used for build automationtobuild executable code (such as a programorlibrary) from source code. But, not limited to building, Make can perform any operation available via the operating system shell.

Make is widely used, especially in Unix and Unix-like operating systems, even though many competing technologies and tools are available including: similar tools that perform actions based on dependencies, some compilers and interactively via an integrated development environment (IDE).

In addition to referring to the original Unix tool, Make is also a technology since multiple tools have been implemented with roughly the same functionality – including similar makefile syntax and semantics.

Origin[edit]

Stuart Feldman created Make while at Bell Labs. An early version was completed in April 1976.[1][2][3] Feldman received the 2003 ACM Software System Award for authoring Make.[4]

Feldman describes the inspiration to write Make came from a coworker's frustration with the available tooling of the time:

Make originated with a visit from Steve Johnson (author of yacc, etc.), storming into my office, cursing the Fates that had caused him to waste a morning debugging a correct program (bug had been fixed, file hadn't been compiled, cc *.o was therefore unaffected). As I had spent a part of the previous evening coping with the same disaster on a project I was working on, the idea of a tool to solve it came up. It began with an elaborate idea of a dependency analyzer, boiled down to something much simpler, and turned into Make that weekend. Use of tools that were still wet was part of the culture. Makefiles were text files, not magically encoded binaries, because that was the Unix ethos: printable, debuggable, understandable stuff.

— Stuart Feldman, The Art of Unix Programming, Eric S. Raymond 2003

Before Make, building on Unix mostly consisted of shell scripts written for each program's codebase. Make's dependency ordering and out-of-date checking makes the build process more robust and more efficient. The makefile allowed for better organization of build logic and often fewer build files.

Make is widely used in part due to its early inclusion in Unix, starting with PWB/UNIX 1.0, which featured a variety of software development tools.[3]

Variants[edit]

Make has been implemented numerous times; generally using the same makefile format and providing the same features, but some providing enhancements from the original. Examples:

POSIX includes standardization of the basic features and operation of the Make utility, and is implemented with varying degrees of compatibility with Unix-based versions of Make. In general, simple makefiles may be used between various versions of Make with reasonable success. GNU Make, Makepp and some versions of BSD Make default to looking first for files named "GNUmakefile",[35] "Makeppfile"[36] and "BSDmakefile"[37] respectively, which allows one to put makefiles which use implementation-defined behavior in separate locations.

Use[edit]

In general, based on a makefile, Make updates target files from source files if any source file has a newer timestamp than the target file or the target file does not exist. For example, this could include compiling C files (*.c) into object files, then linking the object files into an executable program. Or this could include compiling TypeScript files (*.ts) to JavaScript for use in a browser. Other examples include: convert a source image file to another format, copy a file to a content management system, and send e-mail about build status.

A makefile defines targets where each is either a file to generate or is a user-defined concept, called a phony target.

Make updates the targets passed as arguments:

make [-f makefile] [options] [targets]

If no target is specified, Make updates the first target in the makefile which is often a phony target to perform the most commonly used action.

Make skips build actions if the target file timestamp is after that of the source files.[38] Doing so optimizes the build process by skipping actions when the target file is up-to-date, but sometimes updates are skipped erroneously due to file timestamp issues including restoring an older version of a source file, or when a network filesystem is a source of files and its clock or time zone is not synchronized with the machine running Make. Also, if a source file's timestamp is in the future, make repeatedly triggers unnecessary actions, causing longer build time.

When Make starts, it uses the makefile specified on the command-line or if not specified, then uses the one found by via specific search rules. Generally, Make defaults to using the file in the working directory named Makefile. GNU Make searches for the first file matching: GNUmakefile, makefile, or Makefile.

Make processes the options of the command-line based on the loaded makefile.

Makefile[edit]

Makefile
Uniform Type Identifier (UTI)public.make-source[39]

The makefile language is partially declarative programming where end conditions are described but the order in which actions are to be taken is not.[40][41][42][43] This type of programming can be confusing to programmers used to imperative programming.

Makefiles can contain the following constructs:[44]

Rules[edit]

Each rule begins with a dependency line which consists of the rule's target name followed by a colon (:) and optionally a list of targets on which the rule's target depends, its prerequisites.[45]

target [target ...]: [component ...]
Tab ↹[command 1]
    .
    .
    .
Tab ↹[command n]

Usually a rule has a single target, rather than multiple.

A dependency line may be followed by a recipe; a series of TAB indented command lines which define how to generate the target from the components (i.e. source files). If any prerequisite has a more recent timestamp than the target file or the target does not exist as a file, the recipe is performed.

The first command may appear on the same line after the prerequisites, separated by a semicolon,

targets: prerequisites ; command

for example,

hello: ; @echo "hello"

Each command line must begin with a tab character. Even though a space is also whitespace, Make requires tab. Since this often leads to confusion and mistakes, this aspect of makefile syntax is subject to criticism; described by Eric S. Raymond as "one of the worst design botches in the history of Unix"[46] and The Unix-Haters Handbook said "using tabs as part of the syntax is like one of those pungee stick traps in The Green Berets". Feldman explains the choice as caused by a workaround for an early implementation difficulty preserved by a desire for backward compatibility with the very first users:

Why the tab in column 1? Yacc was new, Lex was brand new. I hadn't tried either, so I figured this would be a good excuse to learn. After getting myself snarled up with my first stab at Lex, I just did something simple with the pattern newline-tab. It worked, it stayed. And then a few weeks later I had a user population of about a dozen, most of them friends, and I didn't want to screw up my embedded base. The rest, sadly, is history.

— Stuart Feldman[46]

GNU Make. since version 3.82, allows the choice of any symbol (one character) as the recipe prefix using the .RECIPEPREFIX special variable, for example:

.RECIPEPREFIX := :
all:
:@echo "recipe prefix symbol is set to '$(.RECIPEPREFIX)'"

Each command is executed in a separate shell. Since operating systems use different shells this can lead to unportable makefiles. For example, GNU Make (all POSIX Makes) executes commands with /bin/sh by default, where Unix commands like cp are normally used. In contrast to that, Microsoft's nmake executes commands with cmd.exe where batch commands like copy are available but not necessarily cp.

Since a recipe is optional, the dependency line can consist solely of components that refer to other targets, for example:

realclean: clean distclean

The following example rule is evaluated when Make updates target file.txt; i.e. via make file.txt. If file.html is newer than file.txt or file.txt does not exist, then the command is run to generate file.txt from file.html.

file.txt: file.html
 lynx -dump file.html > file.txt

A command can have one or more of the following prefixes (after the tab):

Ignoring errors and silencing echo can alternatively be obtained via the special targets .IGNORE and .SILENT.[47]

Microsoft's NMAKE has predefined rules that can be omitted from these makefiles, e.g. c.obj $(CC)$(CFLAGS).

Macros[edit]

A makefile can define and use macros. Macros are usually referred to as variables when they hold simple string definitions, like CC=clang. Macros in makefiles may be overridden in the command-line arguments passed to the Make utility. Environment variables are also available as macros.

For example, the macro CC is frequently used in makefiles to refer to the location of a C compiler. If used consistently throughout the makefile, then the compiler used can be changed by changing the value of the macro rather than changing each rule command that invokes the compiler.

Macros are commonly named in all-caps:

MACRO = definition

A macro value can consist of other macro values. The value of macro is expanded on each use (lazily).

A macro is used by expanding either via $NAME or $(NAME). The latter is safer since omitting the parentheses leads to Make interpreting the next letter after the $ as the entire variable name. An equivalent form uses curly braces rather than parentheses, i.e. ${}, which is the style used in BSD.

NEW_MACRO = $(MACRO)-$(MACRO2)

Macros can be composed of shell commands by using the command substitution operator, denoted by backticks (`).

YYYYMMDD  = ` date `

The command-line syntax for overriding a macro is:

make MACRO="value" [MACRO="value" ...] TARGET [TARGET ...]

Makefiles can access predefined internal macros, with ? and @ being common.

target: component1component2 # echo components YOUNGER than TARGET
 echo $? 
 # echo TARGET name
 echo $@

A common syntax when defining macros, which works on BSD and GNU Make, is to use of +=, ?=, and != instead of the equal sign (=).[48]

Suffix rules[edit]

Suffix rules have "targets" with names in the form .FROM.TO and are used to launch actions based on file extension. In the command lines of suffix rules, POSIX specifies[49] that the internal macro $< refers to the first prerequisite and $@ refers to the target. In this example, which converts any HTML file into text, the shell redirection token > is part of the command line whereas $< is a macro referring to the HTML file:

.SUFFIXES: .txt .html

# From .html to .txt
.html.txt:
 lynx -dump $<   >   $@

When called from the command line, the example above expands.

$ make -n file.txt
lynx -dump file.html > file.txt

Pattern rules[edit]

Suffix rules cannot have any prerequisites of their own.[50] If they have any, they are treated as normal files with unusual names, not as suffix rules. GNU Make supports suffix rules for compatibility with old makefiles but otherwise encourages usage of pattern rules.[51]

A pattern rule looks like an ordinary rule, except that its target contains exactly one % character within the string. The target is considered a pattern for matching file names: the % can match any substring of zero or more characters,[52] while other characters match only themselves. The prerequisites likewise use % to show how their names relate to the target name.

The example above of a suffix rule would look like the following pattern rule:

# From %.html to %.txt
%.txt : %.html 
 lynx -dump $< > $@

Comment[edit]

Single-line comments are started with the hash symbol (#).

Directive[edit]

A directive specifies special behavior such as including another makefile.

Line continuation[edit]

Line continuation is indicated with a backslash \ character at the end of a line.

   target: component \
           component
   Tab ↹command ;          \
   Tab ↹command |          \
   Tab ↹piped-command

Examples[edit]

The following commands are in the context of the makefile that follows.

make            # updates first target, 'all'
make help       # updates target 'help' to list targets
make dist       # updates target 'dist' to build for distribution
PACKAGE  = package
VERSION  = ` date "+%Y.%m%d%" `
RELEASE_DIR  = ..
RELEASE_FILE = $(PACKAGE)-$(VERSION)

# Default target
# note: variable LOGNAME comes from the environment
all:
 echo "Hello $(LOGNAME), nothing to do by default"
 echo "Try 'make help'"

# Display targets by searching this file
help:
 egrep "^# target:" [Mm]akefile

# Make a release
dist:
 tar -cf  $(RELEASE_DIR)/$(RELEASE_FILE) && \
 gzip -9  $(RELEASE_DIR)/$(RELEASE_FILE).tar

Below is a simple makefile that by default (the "all" rule is listed first) compiles a source file called "helloworld.c" using the system's C compiler and also provides a "clean" target to remove the generated files if the user desires to start over. The $@ and $< are two of the so-called internal macros (also known as automatic variables) and stand for the target name and "implicit" source, respectively. In the example below, $^ expands to a space delimited list of the prerequisites. There are a number of other internal macros.[49][53]

CFLAGS ?= -g

all: helloworld

helloworld: helloworld.o
 $(CC) $(LDFLAGS) -o $@ $^

helloworld.o: helloworld.c
 $(CC) $(CFLAGS) -c -o $@ $<

clean:
 $(RM) helloworld helloworld.o

Many systems come with predefined Make rules and macros to specify common tasks such as compilation based on file suffix. This lets users omit the actual (often unportable) instructions of how to generate the target from the source(s). On such a system the makefile above could be modified as follows:

all: helloworld

helloworld: helloworld.o
 $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

clean:
 $(RM) helloworld helloworld.o

# suffix rule
.c.o:
 $(CC) $(CFLAGS) -c $<

.SUFFIXES: .c


That "helloworld.o" depends on "helloworld.c" is now automatically handled by Make. In such a simple example as the one illustrated here this hardly matters, but the real power of suffix rules becomes evident when the number of source files in a software project starts to grow. One only has to write a rule for the linking step and declare the object files as prerequisites. Make will then implicitly determine how to make all the object files and look for changes in all the source files.

Simple suffix rules work well as long as the source files do not depend on each other and on other files such as header files. Another route to simplify the build process is to use so-called pattern matching rules that can be combined with compiler-assisted dependency generation. As a final example requiring the gcc compiler and GNU Make, here is a generic makefile that compiles all C files in a folder to the corresponding object files and then links them to the final executable. Before compilation takes place, dependencies are gathered in makefile-friendly format into a hidden file ".depend" that is then included to the makefile. Portable programs ought to avoid constructs used below.

# Generic GNUMakefile

# snippet to fail if not GNU
ifneq (,)
This makefile requires GNU Make.
endif

PROGRAM = foo
C_FILES := $(wildcard *.c)
OBJS := $(patsubst %.c, %.o, $(C_FILES))
CC = ccCFLAGS = -Wall -pedantic
LDFLAGS =
LDLIBS = -lm

all: $(PROGRAM)

$(PROGRAM): .depend $(OBJS)
 $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) -o $(PROGRAM) $(LDLIBS)

depend: .depend

.depend: cmd = gcc -MM -MF depend $(var); cat depend >> .depend;
.depend:
 @echo "Generating dependencies..."
 @$(foreach var, $(C_FILES), $(cmd))
 @rm -f depend

-include .depend

# These are the pattern matching rules. In addition to the automatic
# variables used here, the variable $* that matches whatever % stands for
# can be useful in special cases.
%.o: %.c
 $(CC) $(CFLAGS) -c $< -o $@

%: %.o
 $(CC) $(CFLAGS) -o $@ $<

clean:
 rm -f .depend $(OBJS)

.PHONY: clean depend

Dependency tracking[edit]

Makefile consist of dependencies and a forgotten or an extra one may not be immediately obvious to the user and may result in subtle bugs in the generated software that are hard to catch. Various approaches may be used to avoid this problem and keep dependencies in source and makefiles in sync. One approach is by using compiler to keep track of dependencies changes .e.g GCC can statically analyze the source code and produce rules for the given file automatically by using -MM switch. The other approach would be makefiles or third-party tools that would generate makefiles with dependencies (e.g. Automake toolchain by the GNU Project, can do so automatically).

Another approach is to use meta-build tools like CMake, Meson etc.

See also[edit]

References[edit]

  1. ^ "V7/usr/src/cmd/make/ident.c". tuhs.org. 1 September 2013. Archived from the original on 1 September 2013. Retrieved 18 March 2018.
  • ^ Feldman, S. I. (April 1979). "Make --- A Program for Maintaining Computer Programs". Software: Practice and Experience. 9 (4): 255–265. CiteSeerX 10.1.1.39.7058. doi:10.1002/spe.4380090402. S2CID 33059412.
  • ^ a b Thompson, T. J. (November 1980). "Designer's Workbench: Providing a Production Environment". Bell System Technical Journal. 59 (9): 1811–1825. doi:10.1002/j.1538-7305.1980.tb03063.x. S2CID 27213583. In the general maintenance of DWB, we have used the Source Code Control System and make utility provided by the PWB/UNIX* interactive operating system.
  • ^ Matthew Doar (2005). Practical Development Environments. O'Reilly Media. p. 94. ISBN 978-0-596-00796-6.
  • ^ "Google Groups". arquivo.pt. Archived from the original on 22 January 2011. Retrieved 18 March 2018.{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  • ^ "OpenSolaris at Two (Jim Grisanzio)". 12 December 2013. Archived from the original on 12 December 2013. Retrieved 18 March 2018.
  • ^ Grisanzio, Jim. The OpenSolaris Story.
  • ^ a b c "Development/Gbuild - The Document Foundation Wiki". wiki.documentfoundation.org. Retrieved 18 March 2018.
  • ^ a b "Apache OpenOffice Building Guide - Apache OpenOffice Wiki". wiki.openoffice.org. Retrieved 18 March 2018.
  • ^ FreeBSD 2.0.5 Make Source Code, 1993
  • ^ a b "Bmake(1)".
  • ^ "fmake(1) General Commands Manual".
  • ^ "make". NetBSD Manual Pages. Retrieved 9 July 2020.
  • ^ "make(1) - OpenBSD manual pages". man.openbsd.org. Retrieved 18 March 2018.
  • ^ "make". FreeBSD. Retrieved 9 July 2020. Makefile inclusion, conditional structures and for loops reminiscent of the C programming language are provided in make.
  • ^ Arnold Robbins (2005), Unix in a Nutshell, Fourth Edition, O'Reilly
  • ^ "8. Functions for Transforming Text", GNU make, Free Software Foundation, 2013
  • ^ "8.5 The foreach Function", GNU make, Free Software Foundation, 2013
  • ^ "GCC 3.4 Release Series Changes, New Features, and Fixes". Free Software Foundation. 2006.
  • ^ Javier Martinez Canillas (December 26, 2012). "Kbuild: the Linux Kernel Build System". Linux Journal.
  • ^ Greg Kroah-Hartman (2006), Linux Kernel in a Nutshell, O'Reilly
  • ^ "Build Instructions".
  • ^ Rocky Bernstein. "Remake – GNU Make with comprehensible tracing and a debugger".
  • ^ Glenn Fowler (January 4, 2012). "nmake Overview". Information and Software Systems Research, AT&T Labs Research. Archived from the original on September 2, 2015. Retrieved May 26, 2014.
  • ^ "NMAKE Reference Visual Studio 2015". Microsoft. 2015.
  • ^ "Makefile Preprocessing Directives". 2014.
  • ^ "Makefile Preprocessing Operators". Microsoft. 2014.
  • ^ "Search Paths in Rules". Microsoft. 2014.
  • ^ "MAKE". CodeGear(TM). 2008.
  • ^ "Jom - Qt Wiki". Qt Project. 2021.
  • ^ McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). Bell Labs. CSTR 139.
  • ^ Hume, Andrew G.; Flandrena, Bob (2002). "Maintaining files on Plan 9 with Mk". Plan 9 Programmer’s Manual. AT&T Bell Laboratories. Archived from the original on July 11, 2015.
  • ^ "google/kati: An experimental GNU make clone". GitHub. 30 November 2020.
  • ^ Mölder, Felix; Jablonski, Kim Philipp; Letcher, Brice; Hall, Michael B.; Tomkins-Tinch, Christopher H.; Sochat, Vanessa; Forster, Jan; Lee, Soohyun; Twardziok, Sven O.; Kanitz, Alexander; Wilm, Andreas (2021-04-19). "Sustainable data analysis with Snakemake". F1000Research. 10: 33. doi:10.12688/f1000research.29032.2. ISSN 2046-1402. PMC 8114187. PMID 34035898.
  • ^ "GNU 'make'". Free Software Foundation.
  • ^ "Makepp".
  • ^ "Free BSD make".
  • ^ How to sort Linux ls command file output Archived September 13, 2016, at the Wayback Machine
  • ^ "makefile". Apple Developer Documentation: Uniform Type Identifiers. Apple Inc.
  • ^ Adams, P. and Solomon, M., 1993, An overview of the CAPITL software development environment. In International Workshop on Software Configuration Management (pp. 1-34). Berlin, Heidelberg: Springer Berlin Heidelberg.
  • ^ an overview on dsls Archived October 23, 2007, at the Wayback Machine, 2007/02/27, phoenix wiki
  • ^ Re: Choreography and REST Archived September 12, 2016, at the Wayback Machine, from Christopher B Ferris on 2002-08-09
  • ^ Target Junior Makefiles Archived January 7, 2010, at the Wayback Machine, Andrew W. Fitzgibbon and William A. Hoffman
  • ^ 3.1 What Makefiles Contain, GNU make, Free Software Foundation
  • ^ "Prerequisite Types (GNU make)". GNU.org. GNU Project. Retrieved 15 December 2020.
  • ^ a b "Chapter 15. Tools: make: Automating Your Recipes", The Art of Unix Programming, Eric S. Raymond 2003
  • ^ make – Shell and Utilities Reference, The Single UNIX Specification, Version 4 from The Open Group
  • ^ make(1) – FreeBSD General Commands Manual
  • ^ a b "make". www.opengroup.org. Retrieved 18 March 2018.
  • ^ "GNU make manual: suffix rules". Free Software Foundation.
  • ^ "GNU make manual: pattern rules". Free Software Foundation.
  • ^ See section Pattern Matching Rules in the SunPro man page Archived May 29, 2014, at the Wayback Machine
  • ^ Automatic Variables Archived April 25, 2016, at the Wayback Machine GNU `make'
  • External links[edit]



    Retrieved from "https://en.wikipedia.org/w/index.php?title=Make_(software)&oldid=1229950081#Derivatives"

    Categories: 
    Build automation
    Compiling tools
    GNU Project software
    Unix programming tools
    Unix SUS2008 utilities
    Hidden categories: 
    CS1 maint: bot: original URL status unknown
    Webarchive template wayback links
    Articles with short description
    Short description is different from Wikidata
    All articles lacking reliable references
    Articles lacking reliable references from May 2017
    All articles with unsourced statements
    Articles with unsourced statements from September 2014
    Articles with VIAF identifiers
    Articles with GND identifiers
    Articles with J9U identifiers
    Articles with LCCN identifiers
    Articles with example code
     



    This page was last edited on 19 June 2024, at 17:03 (UTC).

    Text is available under the Creative Commons Attribution-ShareAlike License 4.0; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization.



    Privacy policy

    About Wikipedia

    Disclaimers

    Contact Wikipedia

    Code of Conduct

    Developers

    Statistics

    Cookie statement

    Mobile view



    Wikimedia Foundation
    Powered by MediaWiki