123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- .\" Copyright (c) 1993, 1994, 1998 The Open Group
- .\"
- .\" Permission to use, copy, modify, distribute, and sell this software and its
- .\" documentation for any purpose is hereby granted without fee, provided that
- .\" the above copyright notice appear in all copies and that both that
- .\" copyright notice and this permission notice appear in supporting
- .\" documentation.
- .\"
- .\" The above copyright notice and this permission notice shall be included in
- .\" all copies or substantial portions of the Software.
- .\"
- .\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- .\" IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- .\" FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- .\" THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- .\" WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- .\" OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- .\" SOFTWARE.
- .\"
- .\" Except as contained in this notice, the name of The Open Group shall not
- .\" be used in advertising or otherwise to promote the sale, use or other
- .\" dealing in this Software without prior written authorization from The
- .\" Open Group.
- .\"
- .\"
- .TH MAKEDEPEND 1 __xorgversion__
- .UC 4
- .SH NAME
- makedepend \- create dependencies in makefiles
- .SH SYNOPSIS
- .B makedepend
- [
- .BI \-D name\fB=\fPdef
- ] [
- .BI \-D name
- ] [
- .BI \-I includedir
- ] [
- .BI \-Y includedir
- ] [
- .B \-a
- ] [
- .BI \-f makefile
- ] [
- .BI \-include \ file
- ] [
- .BI \-o objsuffix
- ] [
- .BI \-p objprefix
- ] [
- .BI \-s string
- ] [
- .BI \-w width
- ] [
- .B \-v
- ] [
- .B \-m
- ] [
- \-\^\-
- .I otheroptions
- \-\^\-
- ]
- .I sourcefile
- \&.\|.\|.
- .br
- .SH DESCRIPTION
- The
- .B makedepend
- program reads each
- .I sourcefile
- in sequence and parses it like a C-preprocessor,
- processing all
- .I #include,
- .I #define,
- .I #undef,
- .I #ifdef,
- .I #ifndef,
- .I #endif,
- .I #if,
- .I #elif
- and
- .I #else
- directives so that it can correctly tell which
- .I #include,
- directives would be used in a compilation.
- Any
- .I #include,
- directives can reference files having other
- .I #include
- directives, and parsing will occur in these files as well.
- .PP
- Every file that a
- .I sourcefile
- includes,
- directly or indirectly,
- is what
- .B makedepend
- calls a \fIdependency.\fP
- These dependencies are then written to a
- .I makefile
- in such a way that
- .B make(1)
- will know which object files must be recompiled when a dependency has changed.
- .PP
- By default,
- .B makedepend
- places its output in the file named
- .I makefile
- if it exists, otherwise
- .I Makefile.
- An alternate makefile may be specified with the
- .B \-f
- option.
- It first searches the makefile for
- the line
- .sp
- \& # DO NOT DELETE THIS LINE \-\^\- make depend depends on it.
- .sp
- or one provided with the
- .B \-s
- option,
- as a delimiter for the dependency output.
- If it finds it, it will delete everything
- following this to the end of the makefile
- and put the output after this line.
- If it doesn't find it, the program
- will append the string to the end of the makefile
- and place the output following that.
- For each
- .I sourcefile
- appearing on the command line,
- .B makedepend
- puts lines in the makefile of the form
- .sp
- sourcefile.o:\0dfile .\|.\|.
- .sp
- Where \fIsourcefile.o\fP is the name from the command
- line with its suffix replaced with ``.o'',
- and \fIdfile\fP is a dependency discovered in a
- .I #include
- directive while parsing
- .I sourcefile
- or one of the files it included.
- .SH EXAMPLE
- Normally,
- .B makedepend
- will be used in a makefile target so that typing ``make depend'' will
- bring the dependencies up to date for the makefile.
- For example,
- .nf
- SRCS\0=\0file1.c\0file2.c\0.\|.\|.
- CFLAGS\0=\0\-O\0\-DHACK\0\-I\^.\^.\^/foobar\0\-xyz
- depend:
- makedepend\0\-\^\-\0$(CFLAGS)\0\-\^\-\0$(SRCS)
- .fi
- .SH OPTIONS
- The program
- will ignore any option that it does not understand so that you may use
- the same arguments that you would for
- .B cc(1).
- .TP 5
- .B \-D\fIname\fP=\fIdef\fP \fRor\fP \-D\fIname\fP
- Define.
- This places a definition for
- .I name
- in
- .B makedepend's
- symbol table.
- Without
- .I =def\|
- the symbol becomes defined as ``1''.
- .TP 5
- .B \-I\fIincludedir\fP
- Include directory.
- This option tells
- .B makedepend
- to prepend
- .I includedir
- to its list of directories to search when it encounters
- a
- .I #include
- directive.
- By default,
- .B makedepend
- only searches the standard include directories (usually /usr/include
- and possibly a compiler-dependent directory).
- .TP 5
- .B \-Y\fIincludedir\fP
- Replace all of the standard include directories with the single specified
- include directory; you can omit the
- .I includedir
- to simply prevent searching the standard include directories.
- .TP 5
- .B \-a
- Append the dependencies to the end of the file instead of replacing them.
- .TP 5
- .B \-f\fImakefile\fP
- Filename.
- This allows you to specify an alternate makefile in which
- .B makedepend
- can place its output.
- Specifying ``\-'' as the file name (i.e., \fB\-f\-\fP) sends the
- output to standard output instead of modifying an existing file.
- .TP 5
- .B \-include \fIfile\fP
- Process file as input, and include all the resulting output
- before processing the regular input file. This has the same
- affect as if the specified file is an include statement that
- appears before the very first line of the regular input file.
- .TP 5
- .B \-o\fIobjsuffix\fP
- Object file suffix.
- Some systems may have object files whose suffix is something other
- than ``.o''.
- This option allows you to specify another suffix, such as
- ``.b'' with
- .I \-o.b
- or ``:obj''
- with
- .I \-o:obj
- and so forth.
- .TP 5
- .B \-p\fIobjprefix\fP
- Object file prefix.
- The prefix is prepended to the name of the object file. This is
- usually used to designate a different directory for the object file.
- The default is the empty string.
- .TP 5
- .B \-s\fIstring\fP
- Starting string delimiter.
- This option permits you to specify
- a different string for
- .B makedepend
- to look for in the makefile.
- .TP 5
- .B \-w\fIwidth\fP
- Line width.
- Normally,
- .B makedepend
- will ensure that every output line that it writes will be no wider than
- 78 characters for the sake of readability.
- This option enables you to change this width.
- .TP 5
- .B \-v
- Verbose operation.
- This option causes
- .B makedepend
- to emit the list of files included by each input file.
- .TP 5
- .B \-m
- Warn about multiple inclusion.
- This option causes
- .B makedepend
- to produce a warning if any input file includes another file more than
- once. In previous versions of
- .B makedepend
- this was the default behavior; the default has been changed to better
- match the behavior of the C compiler, which does not consider multiple
- inclusion to be an error. This option is provided for backward
- compatibility, and to aid in debugging problems related to multiple
- inclusion.
- .TP 5
- .B "\-\^\- \fIoptions\fP \-\^\-"
- If
- .B makedepend
- encounters a double hyphen (\-\^\-) in the argument list,
- then any unrecognized argument following it
- will be silently ignored; a second double hyphen terminates this
- special treatment.
- In this way,
- .B makedepend
- can be made to safely ignore esoteric compiler arguments that might
- normally be found in a CFLAGS
- .B make
- macro (see the
- .B EXAMPLE
- section above).
- All options that
- .B makedepend
- recognizes and appear between the pair of double hyphens
- are processed normally.
- .SH ALGORITHM
- The approach used in this program enables it to run an order of magnitude
- faster than any other ``dependency generator'' I have ever seen.
- Central to this performance are two assumptions:
- that all files compiled by a single
- makefile will be compiled with roughly the same
- .I \-I
- and
- .I \-D
- options;
- and that most files in a single directory will include largely the
- same files.
- .PP
- Given these assumptions,
- .B makedepend
- expects to be called once for each makefile, with
- all source files that are maintained by the
- makefile appearing on the command line.
- It parses each source and include
- file exactly once, maintaining an internal symbol table
- for each.
- Thus, the first file on the command line will take an amount of time
- proportional to the amount of time that a normal C preprocessor takes.
- But on subsequent files, if it encounters an include file
- that it has already parsed, it does not parse it again.
- .PP
- For example,
- imagine you are compiling two files,
- .I file1.c
- and
- .I file2.c,
- they each include the header file
- .I header.h,
- and the file
- .I header.h
- in turn includes the files
- .I def1.h
- and
- .I def2.h.
- When you run the command
- .sp
- makedepend\0file1.c\0file2.c
- .sp
- .B makedepend
- will parse
- .I file1.c
- and consequently,
- .I header.h
- and then
- .I def1.h
- and
- .I def2.h.
- It then decides that the dependencies for this file are
- .sp
- file1.o:\0header.h\0def1.h\0def2.h
- .sp
- But when the program parses
- .I file2.c
- and discovers that it, too, includes
- .I header.h,
- it does not parse the file,
- but simply adds
- .I header.h,
- .I def1.h
- and
- .I def2.h
- to the list of dependencies for
- .I file2.o.
- .SH "SEE ALSO"
- cc(1), make(1)
- .SH BUGS
- .B makedepend
- parses, but does not currently evaluate, the SVR4 #predicate(token-list)
- preprocessor expression; such expressions are simply assumed to be true.
- This may cause the wrong
- .I #include
- directives to be evaluated.
- .PP
- Imagine you are parsing two files,
- say
- .I file1.c
- and
- .I file2.c,
- each includes the file
- .I def.h.
- The list of files that
- .I def.h
- includes might truly be different when
- .I def.h
- is included by
- .I file1.c
- than when it is included by
- .I file2.c.
- But once
- .B makedepend
- arrives at a list of dependencies for a file,
- it is cast in concrete.
- .SH AUTHOR
- Todd Brunhoff, Tektronix, Inc. and MIT Project Athena
|