diff options
Diffstat (limited to 'devdocs/gnu_make/complex-makefile.html')
| -rw-r--r-- | devdocs/gnu_make/complex-makefile.html | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/devdocs/gnu_make/complex-makefile.html b/devdocs/gnu_make/complex-makefile.html new file mode 100644 index 00000000..72b60426 --- /dev/null +++ b/devdocs/gnu_make/complex-makefile.html @@ -0,0 +1,230 @@ + <h1 class="appendix"> Complex Makefile Example</h1> <p>Here is the makefile for the GNU <code>tar</code> program. This is a moderately complex makefile. The first line uses a <code>#!</code> setting to allow the makefile to be executed directly. </p> <p>Because it is the first target, the default goal is ‘<samp>all</samp>’. An interesting feature of this makefile is that <samp>testpad.h</samp> is a source file automatically created by the <code>testpad</code> program, itself compiled from <samp>testpad.c</samp>. </p> <p>If you type ‘<samp>make</samp>’ or ‘<samp>make all</samp>’, then <code>make</code> creates the <samp>tar</samp> executable, the <samp>rmt</samp> daemon that provides remote tape access, and the <samp>tar.info</samp> Info file. </p> <p>If you type ‘<samp>make install</samp>’, then <code>make</code> not only creates <samp>tar</samp>, <samp>rmt</samp>, and <samp>tar.info</samp>, but also installs them. </p> <p>If you type ‘<samp>make clean</samp>’, then <code>make</code> removes the ‘<samp>.o</samp>’ files, and the <samp>tar</samp>, <samp>rmt</samp>, <samp>testpad</samp>, <samp>testpad.h</samp>, and <samp>core</samp> files. </p> <p>If you type ‘<samp>make distclean</samp>’, then <code>make</code> not only removes the same files as does ‘<samp>make clean</samp>’ but also the <samp>TAGS</samp>, <samp>Makefile</samp>, and <samp>config.status</samp> files. (Although it is not evident, this makefile (and <samp>config.status</samp>) is generated by the user with the <code>configure</code> program, which is provided in the <code>tar</code> distribution, but is not shown here.) </p> <p>If you type ‘<samp>make realclean</samp>’, then <code>make</code> removes the same files as does ‘<samp>make distclean</samp>’ and also removes the Info files generated from <samp>tar.texinfo</samp>. </p> <p>In addition, there are targets <code>shar</code> and <code>dist</code> that create distribution kits. </p> <div class="example"> <pre class="example">#!/usr/bin/make -f +# Generated automatically from Makefile.in by configure. +# Un*x Makefile for GNU tar program. +# Copyright (C) 1991 Free Software Foundation, Inc. +</pre> + +<pre class="example"># This program is free software; you can redistribute +# it and/or modify it under the terms of the GNU +# General Public License … +… +… +</pre> +<pre class="example"> + +SHELL = /bin/sh + +#### Start of system configuration section. #### + +srcdir = . + +</pre> +<pre class="example"># If you use gcc, you should either run the +# fixincludes script that comes with it or else use +# gcc with the -traditional option. Otherwise ioctl +# calls will be compiled incorrectly on some systems. +CC = gcc -O +YACC = bison -y +INSTALL = /usr/local/bin/install -c +INSTALLDATA = /usr/local/bin/install -c -m 644 +</pre> +<pre class="example"> + +# Things you might add to DEFS: +# -DSTDC_HEADERS If you have ANSI C headers and +# libraries. +# -DPOSIX If you have POSIX.1 headers and +# libraries. +# -DBSD42 If you have sys/dir.h (unless +# you use -DPOSIX), sys/file.h, +# and st_blocks in `struct stat'. +# -DUSG If you have System V/ANSI C +# string and memory functions +# and headers, sys/sysmacros.h, +# fcntl.h, getcwd, no valloc, +# and ndir.h (unless +# you use -DDIRENT). +# -DNO_MEMORY_H If USG or STDC_HEADERS but do not +# include memory.h. +# -DDIRENT If USG and you have dirent.h +# instead of ndir.h. +# -DSIGTYPE=int If your signal handlers +# return int, not void. +# -DNO_MTIO If you lack sys/mtio.h +# (magtape ioctls). +# -DNO_REMOTE If you do not have a remote shell +# or rexec. +# -DUSE_REXEC To use rexec for remote tape +# operations instead of +# forking rsh or remsh. +# -DVPRINTF_MISSING If you lack vprintf function +# (but have _doprnt). +# -DDOPRNT_MISSING If you lack _doprnt function. +# Also need to define +# -DVPRINTF_MISSING. +# -DFTIME_MISSING If you lack ftime system call. +# -DSTRSTR_MISSING If you lack strstr function. +# -DVALLOC_MISSING If you lack valloc function. +# -DMKDIR_MISSING If you lack mkdir and +# rmdir system calls. +# -DRENAME_MISSING If you lack rename system call. +# -DFTRUNCATE_MISSING If you lack ftruncate +# system call. +# -DV7 On Version 7 Unix (not +# tested in a long time). +# -DEMUL_OPEN3 If you lack a 3-argument version +# of open, and want to emulate it +# with system calls you do have. +# -DNO_OPEN3 If you lack the 3-argument open +# and want to disable the tar -k +# option instead of emulating open. +# -DXENIX If you have sys/inode.h +# and need it 94 to be included. + +DEFS = -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \ + -DVPRINTF_MISSING -DBSD42 +# Set this to rtapelib.o unless you defined NO_REMOTE, +# in which case make it empty. +RTAPELIB = rtapelib.o +LIBS = +DEF_AR_FILE = /dev/rmt8 +DEFBLOCKING = 20 + +</pre> +<pre class="example">CDEBUG = -g +CFLAGS = $(CDEBUG) -I. -I$(srcdir) $(DEFS) \ + -DDEF_AR_FILE=\"$(DEF_AR_FILE)\" \ + -DDEFBLOCKING=$(DEFBLOCKING) +LDFLAGS = -g +</pre> + +<pre class="example">prefix = /usr/local +# Prefix for each installed program, +# normally empty or `g'. +binprefix = + +# The directory to install tar in. +bindir = $(prefix)/bin + +# The directory to install the info files in. +infodir = $(prefix)/info +</pre> +<pre class="example"> + +#### End of system configuration section. #### + +</pre> +<pre class="example">SRCS_C = tar.c create.c extract.c buffer.c \ + getoldopt.c update.c gnu.c mangle.c \ + version.c list.c names.c diffarch.c \ + port.c wildmat.c getopt.c getopt1.c \ + regex.c +SRCS_Y = getdate.y +SRCS = $(SRCS_C) $(SRCS_Y) +OBJS = $(SRCS_C:.c=.o) $(SRCS_Y:.y=.o) $(RTAPELIB) +</pre> +<pre class="example">AUX = README COPYING ChangeLog Makefile.in \ + makefile.pc configure configure.in \ + tar.texinfo tar.info* texinfo.tex \ + tar.h port.h open3.h getopt.h regex.h \ + rmt.h rmt.c rtapelib.c alloca.c \ + msd_dir.h msd_dir.c tcexparg.c \ + level-0 level-1 backup-specs testpad.c +</pre> +<pre class="example"> + +.PHONY: all +all: tar rmt tar.info + +</pre> +<pre class="example">tar: $(OBJS) + $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) +</pre> + +<pre class="example">rmt: rmt.c + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ rmt.c +</pre> + +<pre class="example">tar.info: tar.texinfo + makeinfo tar.texinfo +</pre> + +<pre class="example">.PHONY: install +install: all + $(INSTALL) tar $(bindir)/$(binprefix)tar + -test ! -f rmt || $(INSTALL) rmt /etc/rmt + $(INSTALLDATA) $(srcdir)/tar.info* $(infodir) +</pre> + +<pre class="example">$(OBJS): tar.h port.h testpad.h +regex.o buffer.o tar.o: regex.h +# getdate.y has 8 shift/reduce conflicts. +</pre> + +<pre class="example">testpad.h: testpad + ./testpad +</pre> + +<pre class="example">testpad: testpad.o + $(CC) -o $@ testpad.o +</pre> + +<pre class="example">TAGS: $(SRCS) + etags $(SRCS) +</pre> + +<pre class="example">.PHONY: clean +clean: + rm -f *.o tar rmt testpad testpad.h core +</pre> + +<pre class="example">.PHONY: distclean +distclean: clean + rm -f TAGS Makefile config.status +</pre> + +<pre class="example">.PHONY: realclean +realclean: distclean + rm -f tar.info* +</pre> + +<pre class="example">.PHONY: shar +shar: $(SRCS) $(AUX) + shar $(SRCS) $(AUX) | compress \ + > tar-`sed -e '/version_string/!d' \ + -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ + -e q + version.c`.shar.Z +</pre> + +<pre class="example">.PHONY: dist +dist: $(SRCS) $(AUX) + echo tar-`sed \ + -e '/version_string/!d' \ + -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ + -e q + version.c` > .fname + -rm -rf `cat .fname` + mkdir `cat .fname` + ln $(SRCS) $(AUX) `cat .fname` + tar chZf `cat .fname`.tar.Z `cat .fname` + -rm -rf `cat .fname` .fname +</pre> + +<pre class="example">tar.zoo: $(SRCS) $(AUX) + -rm -rf tmp.dir + -mkdir tmp.dir + -rm tar.zoo + for X in $(SRCS) $(AUX) ; do \ + echo $$X ; \ + sed 's/$$/^M/' $$X \ + > tmp.dir/$$X ; done + cd tmp.dir ; zoo aM ../tar.zoo * + -rm -rf tmp.dir +</pre> +</div><div class="_attribution"> + <p class="_attribution-p"> + Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc. <br>Licensed under the GNU Free Documentation License.<br> + <a href="https://www.gnu.org/software/make/manual/html_node/Complex-Makefile.html" class="_attribution-link">https://www.gnu.org/software/make/manual/html_node/Complex-Makefile.html</a> + </p> +</div> |
