GNU Make

From Colettapedia
Jump to: navigation, search

Intro

  • Each target signifies a file to be updated.
  • If a target is included as a command-line argument, that target is updated.
  • The default goal, first target in the file
  • other goal if specified at command line
hello: hello.c
        gcc hello.c -o hello
target1 target2 target3 : prerequisite1 prerequisite2
        command1
        command2
        command3
  • This "chaining" of targets to prerequisites to targets to prerequisites is typical of how make analyzes a makefile to decide the commands to be performed.
  • The -l option to gcc indicates a system library that must be linked into the application. GNU make includes special support for this syntax. When a prerequisite of the form -l<NAME> is seen, make searches for a file of the form libNAME.so; if no match is found, it then searches for libNAME.a.
  • Each command must begin with a tab character. This (obscure) syntax tells make that the characters that follow the tab are to be passed to a subshell for execution.
  • A # indicates comment
  • When asked to update a target, make will execute the command script of the rule if any of the prerequisite files has been modified more recently than the target.
  • the following two snippets are equivalent
target1 target2: prereq1 prereq2 prereq3
target1: prereq1 prereq2 prereq3
target2: prereq1 prereq2 prereq3

Phony targets

  • a label representing a command script- shell scripts embedded in a makefile.
  • Any target can be declared phony by including it as a prerequisite of .PHONY:
.PHONY: clean
  • Phony targets are always out of date
  • Standard phony targets:
    • all = Perform all tasks to build the application
    • install = Create an installation of the application from the compiled binaries
    • clean = Delete the binary files generated from sources
    • distclean = Delete all the generated files that were not in the original source distribution
    • TAGS = Create a tags table for use by editors
    • check = Run any tests associated with this application

Rules

Explicit rules

  • indicate a specific target to be updated if it is out of date with respect to any of its prerequisites.

Pattern rules

  • replaces the obsolete "suffix" rules
  • use wildcards instead of explicit filenames. This allows make to apply the rule any time a target file matching the pattern needs to updated.
  • identical to the Bourne shell's
    • ~, *, ?, [...], and [^...].
    • A question mark represents any single character, ** [...] represents a character class
    • (negated) character class use [^...]
  • Wildcard in target or prerequisite = expansion by make
  • However, when the pattern appears in a command, the expansion is performed by the subshell.
  • Percent character in a pattern rule is roughly equivalent to * in a Unix shell
  • The three built-in rules
%.o: %.c
        $(COMPILE.c) $(OUTPUT_OPTION) $< 
%.c: %.l
        @$(RM) $@
        $(LEX.l) $< > $@ 
%: %.c
        $(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@ 

Implicit rules

  • Rules database built-in to make

Static pattern rules

  • like regular pattern rules except they apply only to a specific list of target files.

command line options

  • —just-print, -n = tells make to display the commands it would execute for a particular target without actually executing them
  • —print-data-base = look at make's default set of rules (and variables)

Make Variables

  • syntax = $(variable-name)
  • COMPILE.c = variable containing the C compile command
  • VPATH = A list of directories to search when make needs a file.
    • Searched for targets as well as prerequisites, but not for files mentioned in command scripts.
    • Separated by spaces.
  • lowercase vpath used to specify places for certain types of files
vpath %.c src

vpath %.h include

Automatic Variables

  • Single character variable name does not require the parentheses
  • $@ = The filename representing the target.
  • $% = The filename element of an archive member specification.
  • $< = The filename of the first prerequisite.
  • $? = The names of all prerequisites that are newer than the target, separated by spaces.
  • $^ = The filenames of all the prerequisites, separated by spaces, duplicates removed.
  • $+ = Same as $^, but includes duplicates.
  • $* = The stem of the target filename, typically a filename without its suffix.