summaryrefslogtreecommitdiff
path: root/devdocs/gnu_make/complex-makefile.html
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2024-04-07 13:41:34 -0500
committerCraig Jennings <c@cjennings.net>2024-04-07 13:41:34 -0500
commit754bbf7a25a8dda49b5d08ef0d0443bbf5af0e36 (patch)
treef1190704f78f04a2b0b4c977d20fe96a828377f1 /devdocs/gnu_make/complex-makefile.html
new repository
Diffstat (limited to 'devdocs/gnu_make/complex-makefile.html')
-rw-r--r--devdocs/gnu_make/complex-makefile.html230
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 \
+ &gt; 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` &gt; .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 \
+ &gt; 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>