Make 程序最初设计是为了维护C程序文件防止不必要的重新编译。在使用命令行编译器的时候,修改了一个工程中的头文件,如何确保包含这个头文件的所有文件都得到编译?现在10机的版本生成是使用批处理程序,编译那些文件依赖于程序的维护者,在模块之间相互引用头文件的情况下,要将所有需要重新编译的文件找出来是一件痛苦的事情;在找到这些文件之后,修改批处理进行编译。实际上这些工作可以让make程序来自动完成,make工具对于维护一些具有相互依赖关系的文件特别有用,它对文件和命令的联系(在文件改变时调用来更新其它文件的程序)提供一套编码方法。Make工具的基本概念类似于Proglog语言,你告诉 make需要做什么,提供一些规则,make来完成剩下的工作。
以下内容拷贝自GNU Make Manual
5.命令行参数
`-b'
`-m'
These options are ignored for compatibility with other versions of
`make'.
`-C DIR'
`--directory=DIR'
Change to directory DIR before reading the makefiles. If multiple
`-C' options are specified, each is interpreted relative to the
previous one: `-C / -C etc' is equivalent to `-C /etc'. This is
typically used with recursive invocations of `make' (*note
Recursive Use of `make': Recursion.).
`-d'
`--debug'
Print debugging information in addition to normal processing. The
debugging information says which files are being considered for
remaking, which file-times are being compared and with what
results, which files actually need to be remade, which implicit
rules are considered and which are applied--everything interesting
about how `make' decides what to do.
`-e'
`--environment-overrides'
Give variables taken from the environment precedence over
variables from makefiles. *Note Variables from the Environment:
Environment.
`-f FILE'
`--file=FILE'
`--makefile=FILE'
Read the file named FILE as a makefile.
`-h'
`--help'
Remind you of the options that `make' understands and then exit.
`-i'
`--ignore-errors'
Ignore all errors in commands executed to remake files.
`-I DIR'
`--include-dir=DIR'
Specifies a directory DIR to search for included makefiles. If several `-I' options are
used to specify several directories, the directories are searched
in the order specified.
`-j [JOBS]'
`--jobs=[JOBS]'
Specifies the number of jobs (commands) to run simultaneously.
With no argument, `make' runs as many jobs simultaneously as
possible. If there is more than one `-j' option, the last one is
effective.
`-k'
`--keep-going'
Continue as much as possible after an error. While the target that
failed, and those that depend on it, cannot be remade, the other
dependencies of these targets can be processed all the same.
`-l [LOAD]'
`--load-average[=LOAD]'
`--max-load[=LOAD]'
Specifies that no new jobs (commands) should be started if there
are other jobs running and the load average is at least LOAD (a
floating-point number). With no argument, removes a previous load
limit. *Note Parallel Execution: Parallel.
`-n'
`--just-print'
`--dry-run'
`--recon'
Print the commands that would be executed, but do not execute them.
`-o FILE'
`--old-file=FILE'
`--assume-old=FILE'
Do not remake the file FILE even if it is older than its
dependencies, and do not remake anything on account of changes in
FILE. Essentially the file is treated as very old and its rules
are ignored.
`-p'
`--print-data-base'
Print the data base (rules and variable values) that results from
reading the makefiles; then execute as usual or as otherwise
specified. This also prints the version information given by the
`-v' switch (see below). To print the data base without trying to
remake any files, use `make -p -f /dev/null'.
`-q'
`--question'
"Question mode". Do not run any commands, or print anything; just
return an exit status that is zero if the specified targets are
already up to date, one if any remaking is required, or two if an
error is encountered.
`-r'
`--no-builtin-rules'
Eliminate use of the built-in implicit rules.You can still define your own by writing
pattern rules. The `-r' option also clears out the default list
of suffixes for suffix rules .But you can still define your own suffixes with a
rule for `.SUFFIXES', and then define your own suffix rules.
`-s'
`--silent'
`--quiet'
Silent operation; do not print the commands as they are executed.
`-S'
`--no-keep-going'
`--stop'
Cancel the effect of the `-k' option. This is never necessary
except in a recursive `make' where `-k' might be inherited from
the top-level `make' via `MAKEFLAGS' or if you set `-k' in `MAKEFLAGS' in your
environment.
`-t'
`--touch'
Touch files (mark them up to date without really changing them)
instead of running their commands. This is used to pretend that
the commands were done, in order to fool future invocations of
`make'.
`-v'
`--version'
Print the version of the `make' program plus a copyright, a list
of authors, and a notice that there is no warranty; then exit.
`-w'
`--print-directory'
Print a message containing the working directory both before and
after executing the makefile. This may be useful for tracking
down errors from complicated nests of recursive `make' commands.
`--no-print-directory'
Disable printing of the working directory under `-w'. This option
is useful when `-w' is turned on automatically, but you do not
want to see the extra messages.
`-W FILE'
`--what-if=FILE'
`--new-file=FILE'
`--assume-new=FILE'
Pretend that the target FILE has just been modified. When used
with the `-n' flag, this shows you what would happen if you were
to modify that file. Without `-n', it is almost the same as
running a `touch' command on the given file before running `make',
except that the modification time is changed only in the
imagination of `make'.
`--warn-undefined-variables'
Issue a warning message whenever `make' sees a reference to an
undefined variable. This can be helpful when you are trying to
debug makefiles which use variables in complex ways.
`ifdef VARIABLE'
`ifndef VARIABLE'
`ifeq (A,B)'
`ifeq "A" "B"'
`ifeq 'A' 'B''
`ifneq (A,B)'
`ifneq "A" "B"'
`ifneq 'A' 'B''
`else'
`endif'
Conditionally evaluate part of the makefile.
`include FILE'
Include another makefile.
`override VARIABLE = VALUE'
`override VARIABLE := VALUE'
`override VARIABLE += VALUE'
`override define VARIABLE'
`endef'
Define a variable, overriding any previous definition, even one
from the command line.
`export'
Tell `make' to export all variables to child processes by default.
`export VARIABLE'
`export VARIABLE = VALUE'
`export VARIABLE := VALUE'
`export VARIABLE += VALUE'
`unexport VARIABLE'
Tell `make' whether or not to export a particular variable to child
processes.
`vpath PATTERN PATH'
Specify a search path for files matching a `%' pattern.
*Note The `vpath' Directive: Selective Search.
`vpath PATTERN'
Remove all search paths previously specified for PATTERN.
`vpath'
Remove all search paths previously specified in any `vpath'
directive.
6.2.函数
`$(subst FROM,TO,TEXT)'
Replace FROM with TO in TEXT.
`$(patsubst PATTERN,REPLACEMENT,TEXT)'
Replace words matching PATTERN with REPLACEMENT in TEXT.
`$(strip STRING)'
Remove excess whitespace characters from STRING.
`$(findstring FIND,TEXT)'
Locate FIND in TEXT.
`$(filter PATTERN...,TEXT)'
Select words in TEXT that match one of the PATTERN words.
`$(filter-out PATTERN...,TEXT)'
Select words in TEXT that *do not* match any of the PATTERN words.
`$(sort LIST)'
Sort the words in LIST lexicographically, removing duplicates.
`$(dir NAMES...)'
Extract the directory part of each file name.
`$(notdir NAMES...)'
Extract the non-directory part of each file name.
`$(suffix NAMES...)'
Extract the suffix (the last `.' and following characters) of each
file name.
`$(basename NAMES...)'
Extract the base name (name without suffix) of each file name.
`$(addsuffix SUFFIX,NAMES...)'
Append SUFFIX to each word in NAMES.
`$(addprefix PREFIX,NAMES...)'
Prepend PREFIX to each word in NAMES.
`$(join LIST1,LIST2)'
Join two parallel lists of words.
`$(word N,TEXT)'
Extract the Nth word (one-origin) of TEXT.
`$(words TEXT)'
Count the number of words in TEXT.
`$(firstword NAMES...)'
Extract the first word of NAMES.
`$(wildcard PATTERN...)'
Find file names matching a shell file name pattern (*not* a `%'
pattern).
`$(shell COMMAND)'
Execute a shell command and return its output.
`$(origin VARIABLE)'
Return a string describing how the `make' variable VARIABLE was
defined.
`$(foreach VAR,WORDS,TEXT)'
Evaluate TEXT with VAR bound to each word in WORDS, and
concatenate the results.
6.3.自动变量
`$@'
The file name of the target.
`$%'
The target member name, when the target is an archive member.
`$<'
The name of the first dependency.
`$?'
The names of all the dependencies that are newer than the target,
with spaces between them. For dependencies which are archive
members, only the member named is used
with spaces between them. For dependencies which are archive
members, only the member named is used
`$^'
`$+'
The names of all the dependencies, with spaces between them. For
dependencies which are archive members, only the member named is
used. The value of `$^' omits duplicate
dependencies, while `$+' retains them and preserves their order.
`$*'
The stem with which an implicit rule matches
`$(@D)'
`$(@F)'
The directory part and the file-within-directory part of `$@'.
`$(*D)'
`$(*F)'
The directory part and the file-within-directory part of `$*'.
`$(%D)'
`$(%F)'
The directory part and the file-within-directory part of `$%'
`$(<D)'
`$(<F)'
The directory part and the file-within-directory part of `$<'
`$(^D)'
`$(^F)'
The directory part and the file-within-directory part of `$^'
`$(+D)'
`$(+F)'
The directory part and the file-within-directory part of `$+'
`$(?D)'
`$(?F)'
The directory part and the file-within-directory part of `$?'
6.4.特殊变量
`MAKEFILES'
Makefiles to be read on every invocation of `make'.
`VPATH'
Directory search path for files not found in the current directory.
`SHELL'
The name of the system default command interpreter, usually
`/bin/sh'. You can set `SHELL' in the makefile to change the
shell used to run commands.
`MAKE'
The name with which `make' was invoked. Using this variable in
commands has special meaning.
`MAKELEVEL'
The number of levels of recursion (sub-`make's).
`MAKEFLAGS'
The flags given to `make'. You can set this in the environment or
a makefile to set flags.
`SUFFIXES'
The default list of suffixes before `make' reads any makefiles.