xref: /freebsd/contrib/bmake/mk/mk-files.txt (revision b1f9167f94059fd55c630891d359bcff987bd7eb)
1mk-files
2********
3
4The term ``mk-files`` refers to a collection of ``*.mk`` files.
5
6You need bmake_ or a *recent* NetBSD_ make.
7If in doubt use bmake_.
8
9Introduction
10============
11
12Many years ago, when building large software projects, I used GNU make
13(or my own patched version of it), and had developed a set of macros
14to simplify developing complex build trees.
15
16Since the early 90's my main development machines, run BSD
17(NetBSD_ to be precise), and the BSD source tree is good example of a
18large software project.   It quickly became clear that
19``/usr/share/mk/*.mk`` were a great model, but were quite tightly
20linked to building the BSD tree.
21
22Much as I liked using NetBSD, my customers were more likely to be
23using SunOS, HP-UX etc, so I started on bmake_ and a portable collection
24of mk-files (mk.tar.gz_).  NetBSD provided much of the original structure.
25
26Since then I've added a lot of features to NetBSD's make and hence to
27bmake which is kept closely in sync.  The mk-files however have
28diverged quite a bit, though ideas are still picked up from NetBSD.
29
30Basics
31------
32
33The BSD build model is very simple.  A directory produces one
34component, which is generally either a library or a program.
35Library makefiles include ``lib.mk`` and programs include ``prog.mk``
36and they *do the right thing*.
37
38A simple library makefile might look like::
39
40	LIB = sig
41
42	SRCS = \
43		sigaction.c \
44		sigcompat.c \
45		sighdl.c
46
47	.include <lib.mk>
48
49a simple program makefile::
50
51	PROG = cat
52
53	SRCS = cat.c
54
55	.include <prog.mk>
56
57in such cases even the ``SRCS`` line is unnecessary as ``prog.mk``
58will default it to ``${PROG}.c``.
59
60It is the sensible use of defaults and the plethora of macro modifiers
61provided by bmake_ that allow simple makefiles such as the above
62*just work* on many different systems.
63
64
65mk-files
66========
67
68This section provides a brief description of some of the ``*.mk``
69files.
70
71sys.mk
72------
73
74When bmake starts, it looks for ``sys.mk`` and reads it before doing
75anything else.  Thus, this is the place to setup the environment for
76everyone else.
77
78In this distribution, sys.mk avoids doing anything platform dependent.
79It is quite short, and includes a number of other files (which may or
80may not exists)
81
82sys.env.mk
83	If it exists, is expected to do things like conditioning the
84	environment.  Since it will only be included by the initial
85	instance of bmake, it should ``.export`` anything that
86	sub-makes might need.
87
88examples/sys.clean-env.mk
89	An example of how to clean the environment.
90	See the file for all the details::
91
92		.if ${MAKE_VERSION} >= 20100606 && ${.MAKE.LEVEL} == 0
93		# we save any env var that starts with these
94		MAKE_SAVE_ENV_PREFIX += SB MK MAKE MACHINE NEED_ CCACHE DISTCC USE_ SSH
95		MAKE_SAVE_ENV_VARS += \
96			PATH HOME USER LOGNAME \
97			SRCTOP OBJTOP OBJROOT \
98			${_env_vars}
99
100		_env_vars != env | egrep '^(${MAKE_SAVE_ENV_PREFIX:ts|})' | sed 's,=.*,,'; echo
101		_export_list =
102		.for v in ${MAKE_SAVE_ENV_VARS:O:u}
103		.if !empty($v)
104		_export_list += $v
105		$v := ${$v}
106		.endif
107		.endfor
108		# now clobber the environment
109		.unexport-env
110
111		# list of vars that we handle specially below
112		_tricky_env_vars = MAKEOBJDIR
113		# export our selection - sans tricky ones
114		.export ${_export_list:${_tricky_env_vars:${M_ListToSkip}}}
115
116		# this next bit may need tweaking
117		.if defined(MAKEOBJDIR)
118		srctop := ${SRCTOP:U${SB_SRC:U${SB}/src}}
119		objroot := ${OBJROOT:U${SB_OBJROOT:U${SB}/${SB_OBJPREFIX}}}
120		# we'll take care of MACHINE below
121		objtop := ${OBJTOP:U${objroot}${MACHINE}}
122		.if !empty(objtop)
123		# we would normally want something like (/bin/sh):
124		# MAKEOBJDIR="\${.CURDIR:S,${SRCTOP},${OBJROOT}\${MACHINE},}"
125		# the $$ below is how we achieve the same result here.
126		# since everything saved from the environment above
127		# has run through := we need to compensate for ${MACHINE}
128		MAKEOBJDIR = $${.CURDIR:S,${srctop},${objtop:S,${MACHINE},\${MACHINE},},}
129
130		# export these as-is, and do not track...
131		.export-env ${_tricky_env_vars}
132		# now evaluate for ourselves
133		.for v in ${_tricky_env_vars}
134		$v := ${$v}
135		.endfor
136
137		.endif
138		.endif
139		.endif
140
141
142host-target.mk
143	Is used to set macros like ``HOST_TARGET``, ``HOST_OS`` and
144	``host_os`` which are used to find the next step.
145
146sys/\*.mk
147	Platform specific additions, such as ``Darwin.mk`` or ``SunOS.mk``
148	set things like ``HOST_LIBEXT = .dylib`` for Darwin or
149	``SHLIB_FULLVERSION = ${SHLIB_MAJOR}`` for SunOS 5.
150	If there is no OS specific file, ``sys/Generic.mk`` is used.
151
152local.sys.mk
153	Any ``local.*.mk`` file is not part of the distribution.
154	This provides a hook for sites to do extra setup without
155	having to edit the distributed files.
156
157
158The above arrangement makes it easy for the mk files to be part of a
159src tree on an NFS volume and to allow building on multiple platforms.
160
161lib.mk
162------
163
164This file is used to build a number of different libraries from the
165same SRCS.
166
167lib${LIB}.a
168	An archive lib of ``.o`` files, this is the default
169
170lib${LIB}_p.a
171	A profiled lib of ``.po`` files.
172	Still an archive lib, but all the objects are built with
173	profiling in mind - hence the different extension.
174	It is skipped if ``MKPROFILE`` is "no".
175
176lib${LIB}_pic.a
177	An archive of ``.so`` objects compiled for relocation.
178	On NetBSD this is the input to ``lib${LIB}.${LD_so}``, it is
179	skipped if ``MKPICLIB`` is "no".
180
181lib${LIB}.${LD_so}
182	A shared library.  The value of ``LD_so`` is very platform
183	specific.  For example::
184
185		# SunOS 5 and most other ELF systems
186		libsslfd.so.1
187
188		# Darwin
189		libsslfd.1.dylib
190
191	This library will only be built if ``SHLIB_MAJOR`` has
192	a value, and ``MKPIC`` is not set to "no".
193
194There is a lot of platform specific tweaking in ``lib.mk``, largely the
195result of the original distributions trying to avoid interfering with
196the system's ``sys.mk``.
197
198libnames.mk
199-----------
200
201This is included by both ``prog.mk`` and ``lib.mk`` and tries to
202include ``*.libnames.mk`` of which:
203
204local.libnames.mk
205	does not exist unless you create it.  It is a handy way for you
206	to customize without touching the distributed files.
207	For example, on a test machine I needed to build openssl but
208	not install it, so put the following in ``local.libnames.mk``::
209
210		.if ${host_os} == "sunos"
211		LIBCRYPTO = ${OBJTOP}/openssl/lib/crypto/libcrypto${DLIBEXT}
212		LIBSSL = ${OBJTOP}/openssl/lib/ssl/libssl${DLIBEXT}
213		INCLUDES_libcrypto = -I${OBJ_libcrypto}
214		.endif
215
216	The makefile created an openssl dir in ``${OBJ_libcrypto}`` to
217	gather all the headers. dpadd.mk_ did the rest.
218
219sjg.libnames.mk
220	not part of the mk-files distribution.
221
222host.libnames.mk
223	contains logic to find any libs named in ``HOST_LIBS`` in
224	``HOST_LIBDIRS``.
225
226Each file above gets an opportunity to define things like::
227
228	LIBSSLFD	?= ${OBJTOP}/ssl/lib/sslfd/libsslfd${DLIBEXT}
229	INCLUDES_libsslfd = -I${SRC_libsslfd}/h -I${OBJ_libslfd}
230
231these are used by dpadd.mk_ and will be explained below.
232
233dpadd.mk
234--------
235
236This file looks like line noise, and is best considered read-only.
237However it provides some very useful functionality, which simplifies the build.
238
239Makefiles can use the LIB* macros defined via libnames.mk_ or anywhere
240else in various ways::
241
242	# indicate that we need to include headers from LIBCRYPTO
243	# this would result in ${INCLUDES_libcrypto} being added to CFLAGS.
244	SRC_LIBS += ${LIBCRYPTO}
245
246	# indicate that libsslfd must be built already.
247	# it also has the same effect as SRC_LIBS
248	DPADD += ${LIBSSLFD}
249
250	# indicate that not only must libsslfd be built,
251	# but that we need to link with it.
252	# this is almost exactly equivalent to
253	# DPADD += ${LIBSSLFD}
254	# LDADD += -L${LIBSSLFD:H} -lsslfd
255	# and mostly serves to ensure that DPADD and LDADD are in sync.
256	DPLIBS += ${LIBSSLFD}
257
258Any library (referenced by its full path) in any of the above, is
259added to ``DPMAGIC_LIBS`` with the following results, for each lib *foo*.
260
261SRC_libfoo
262	Is set to indicate where the src for libfoo is.
263	By default it is derived from ``LIBFOO`` by replacing
264	``${OBJTOP}`` with ``${SRCTOP}``.
265
266OBJ_libfoo
267	Not very exciting, is just the dir where libfoo lives.
268
269INCLUDES_libfoo
270	What to add to ``CFLAGS`` to find the public headers.
271	The default varies.  If ``${SRC_libfoo}/h`` exists, it is assumed
272	to be the home of all public headers and thus the default is
273	``-I${SRC_libfoo}/h``
274
275	Otherwise we make no assumptions and the default is
276	``-I${SRC_libfoo} -I${OBJ_libfoo}``
277
278LDADD_libfoo
279	This only applies to libs reference via ``DPLIBS``.
280	The default is ``-lfoo``, ``LDADD_*`` provides a hook to
281	instantiate other linker flags at the appropriate point
282	without losing the benfits of ``DPLIBS``.
283
284prog.mk
285-------
286
287Compiles the specified SRCS and links them and the nominated libraries
288into a program.  Prog makefiles usually need to list the libraries
289that need to be linked.   We prefer use of ``DPLIBS`` but the more
290traditional ``DPADD`` and ``LDADD`` work just as well.
291That is::
292
293	DPLIBS += ${LIBCRYPTO}
294
295is equivalent to::
296
297	DPADD += ${LIBCRYPTO}
298	LDADD += -lcrypto
299
300obj.mk
301------
302
303One of the cool aspects of BSD make, is its support for separating
304object files from the src tree.  This is also the source of much
305confusion to some.
306
307Traditionally one had to do a separate ``make obj`` pass through the
308tree.  If ``MKOBJDIRS`` is "auto", we include auto.obj.mk_.
309
310auto.obj.mk
311-----------
312
313This leverages the ``.OBJDIR`` target introduced some years ago to
314NetBSD make, to automatically create the desired object dir.
315
316subdir.mk
317---------
318
319This is the traditional means of walking the tree.  A makefile sets
320``SUBDIR`` to the list of sub-dirs to visit.
321
322If ``SUBDIR_MUST_EXIST`` is set, missing directories cause an error,
323otherwise a warning is issued.  If you don't even want the warning,
324set ``MISSING_DIR=continue``.
325
326Traditionally, ``subdir.mk`` prints clue as it visits each subdir::
327
328	===> ssl
329	===> ssl/lib
330	===> ssl/lib/sslfd
331
332you can suppress that - or enhance it by setting ``ECHO_DIR``::
333
334	# suppress subdir noise
335	ECHO_DIR=:
336	# print time stamps
337	ECHO_DIR=echo @ `date "+%s [%Y-%m-%d %T] "`
338
339links.mk
340--------
341
342Provides rules for processing lists of ``LINKS`` and ``SYMLINKS``.
343Each is expected to be a list of ``link`` and ``target`` pairs
344(``link`` -> ``target``).
345
346The logic is generally in a ``_*_SCRIPT`` which is referenced in a
347``_*_USE`` (``.USE``) target.
348
349The ``_BUILD_*`` forms are identical, but do not use ``${DESTDIR}``
350and so are useful for creating symlinks during the build phase.
351For example::
352
353	SYMLINKS += ${.CURDIR}/${MACHINE_ARCH}/include machine
354	header_links: _BUILD_SYMLINKS_USE
355
356	md.o: header_links
357
358would create a symlink called ``machine`` in ``${.OBJDIR}`` pointing to
359``${.CURDIR}/${MACHINE_ARCH}/include`` before compiling ``md.o``
360
361
362autoconf.mk
363-----------
364
365Deals with running (or generating) GNU autoconf ``configure`` scripts.
366
367dep.mk
368------
369
370Deals with collecting dependencies.  Another useful feature of BSD
371make is the separation of this sort of information into a ``.depend``
372file.  ``MKDEP`` needs to point to a suitable tool (like mkdeps.sh_)
373
374If ``USE_AUTODEP_MK`` is "yes" includes autodep.mk_
375
376autodep.mk
377----------
378
379Leverages the ``-MD`` feature of recent GCC to collect dependency
380information as a side effect of compilation.  With this GCC puts
381dependency info into a ``.d`` file.
382
383Unfortunately GCC bases the name of the ``.d`` file on the name of the
384input rather than the output file, which causes problems when the same
385source is compiled different ways.  The latest GCC supports ``-MF`` to
386name the ``.d`` file and ``-MT`` to control the name to put as the
387dependent.
388
389Recent bmake allows dependencies for the ``.END`` target (run at the
390end if everything was successful), and ``autodep.mk`` uses this to
391post process the ``.d`` files into ``.depend``.
392
393auto.dep.mk
394-----------
395
396A much simpler implementation than autodep.mk_ it uses
397``-MF ${.TARGET:T}.d``
398to avoid possible conflicts during parallel builds.
399This precludes the use of suffix rules to drive ``make depend``, so
400dep.mk_ handles that if specifically requested.
401
402own.mk
403------
404
405Normally included by ``init.mk`` (included by ``lib.mk`` and
406``prog.mk`` etc), sets macros for default ownership  etc.
407
408It includes ``${MAKECONF}`` if it is defined and exists.
409
410man.mk
411------
412
413Deals with man pages.
414
415warnings.mk
416-----------
417
418This provides a means of fine grained control over warnings on a per
419``${MACHINE}`` or even file basis.
420
421A makefile sets ``WARNINGS_SET`` to name a list of warnings
422and individual ``W_*`` macros can be used to tweak them.
423For example::
424
425	WARNINGS_SET = HIGH
426	W_unused_sparc = -Wno-unused
427
428would add all the warnings in ``${HIGH_WARNINGS}`` to CFLAGS, but
429on sparc, ``-Wno-unused`` would replace ``-Wunused``.
430
431You should never need to edit ``warnings.mk``, it will include
432``warnings-sets.mk`` if it exists and you use that to make any local
433customizations.
434
435Meta mode
436=========
437
438The 20110505 and later versions of ``mk-files`` include a number of
439makefile contributed by Juniper Networks, Inc.
440These allow the latest version of bmake_ to run in `meta mode`_.
441
442.. _`meta mode`: bmake-meta-mode.htm
443
444Install
445=======
446
447You can use the content of mk.tar.gz_ without installing at all.
448
449The script ``install-mk`` takes care of copying ``*.mk`` into a
450destination directory, and unless told not to, create ``bsd.*.mk`` links
451for ``lib.mk`` etc.
452
453If you just want to create the ``bsd.*.mk`` links in the directory
454where you unpacked the tar file, you can::
455
456	./mk/install-mk ./mk
457
458------
459
460.. _bmake: bmake.htm
461.. _NetBSD: http://www.netbsd.org/
462.. _mkdeps.sh: http://www.crufty.net/ftp/pub/sjg/mkdeps.sh
463.. _mk.tar.gz: http://www.crufty.net/ftp/pub/sjg/mk.tar.gz
464
465:Author: sjg@crufty.net
466:Revision: $Id: mk-files.txt,v 1.15 2011/06/08 07:06:18 sjg Exp $
467:Copyright: Crufty.NET
468