Name
Date
Size
#Lines
LOC

..--

abi/H--2,0771,184

auditd_plugins/H--7,1054,301

brand/H--15,9648,249

c_synonyms/H--1,7311,394

cfgadm_plugins/H--45,03830,350

common/H--1,962673

crypt_modules/H--4,0982,203

efcode/H--21,29815,290

extendedFILE/H--313124

fm/H--94,77161,459

gss_mechs/H--101,21065,393

hal/H--8,2005,182

hbaapi/H--6,1524,746

krb5/H--74,57450,598

libadm/H--14,3527,774

libadt_jni/H--2,2801,466

libadutils/H--5,0963,404

libaio/H--346159

libast/H--256,750202,136

libavl/H--399164

libbc/H--70,88540,931

libbe/H--14,8048,870

libbrand/H--2,3181,086

libbsdmalloc/H--767402

libbsm/H--25,76517,817

libc/H--198,485121,840

libc_db/H--3,4852,445

libcfgadm/H--3,8392,464

libcmd/H--18,46415,418

libcmdutils/H--1,403736

libcommputil/H--3,9132,951

libcontract/H--2,2641,485

libcpc/H--5,5233,802

libcrypt/H--1,9971,124

libcryptoutil/H--4,3342,970

libctf/H--1,029567

libcurses/H--40,79917,878

libdevice/H--1,9381,157

libdevid/H--852439

libdevinfo/H--18,23812,292

libdhcpagent/H--2,8221,464

libdhcpdu/H--1,181743

libdhcpsvc/H--13,8468,103

libdhcputil/H--3,9172,365

libdiagcode/amd64/H--375

libdisasm/H--6,0844,002

libdiskmgt/H--13,1399,203

libdladm/H--26,66319,407

libdll/H--3,4952,689

libdlpi/H--2,5471,532

libdns_sd/H--9,0804,309

libdoor/H--309128

libds/H--1,101696

libdscfg/H--7,7785,276

libdscp/H--1,281696

libdtrace/H--42,78629,699

libdtrace_jni/H--24,94113,625

libefi/H--1,6021,042

libelfsign/H--2,6671,859

libeti/H--13,4898,154

libexacct/H--2,5681,684

libfcoe/H--1,4621,018

libfdisk/H--1,9881,260

libfru/H--27,06422,335

libfruutils/H--857538

libfsmgt/H--5,7923,089

libfstyp/H--937581

libgen/H--3,4332,097

libgrubmgmt/H--2,8571,803

libgss/H--9,7965,994

libhotplug/H--1,8881,116

libidmap/H--7,3584,638

libilb/H--2,9221,859

libima/H--11,5618,015

libinetsvc/H--2,4191,549

libinetutil/H--3,2071,610

libinstzones/H--8,2643,750

libintl/H--309125

libipadm/H--11,1037,476

libipmi/H--7,8175,106

libipmp/H--2,5211,424

libipp/H--1,316699

libipsecutil/H--6,3894,325

libiscsit/H--2,9581,463

libkmf/H--38,50327,610

libkmsagent/H--66,41850,991

libkrb5/H--616425

libkstat/H--825449

libkvm/H--1,8261,190

libldap4/H--29,07920,550

libldap5/H--40,79627,713

liblgrp/H--1,553802

liblm/H--351117

libmail/H--2,4941,221

libmalloc/H--1,792949

libmapid/H--1,712883

libmapmalloc/H--812408

libmd/H--1,271427

libmd5/H--297114

libmp/H--1,8931,295

libmtmalloc/H--2,6301,376

libndmp/H--2,4931,656

libnisdb/H--53,58836,107

libnls/H--780300

libnsctl/H--1,331754

libnsl/H--68,08943,784

libntfs/H--32,48019,233

libnvpair/H--2,0781,377

libnwam/H--12,0428,721

libpam/H--4,1062,707

libparted/H--62,58144,128

libpcp/H--2,3291,263

libpctx/H--1,448946

libpicl/H--1,8821,164

libpicltree/H--4,5293,139

libpkg/H--25,73915,544

libplot/H--8,1703,441

libpool/H--15,61710,273

libpp/H--22,18019,189

libpri/H--520219

libproc/H--25,22717,019

libproject/H--1,7361,040

libprtdiag/H--8,0965,245

libprtdiag_psr/H--38,45126,435

libpthread/H--517330

libraidcfg/H--5,4534,130

librcm/H--2,7701,776

librdc/H--3,9392,833

libreparse/H--854453

libresolv/H--3,6132,468

libresolv2/H--47,58732,874

librestart/H--4,7463,178

librpcsvc/H--1,344733

librsc/H--1,098538

librsm/H--6,2214,249

librstp/H--7,5695,278

librt/H--414224

libsasl/H--18,09511,433

libscf/H--23,11215,819

libsched/H--293111

libsctp/H--687391

libsec/H--5,0733,777

libsecdb/H--13,0645,346

libsendfile/H--443206

libshare/H--22,03914,117

libshell/H--117,90498,633

libsip/H--21,90715,923

libsldap/H--31,39922,282

libslp/H--47,80923,989

libsmbfs/H--19,90311,290

libsmbios/H--796433

libsmedia/H--5,1903,157

libsocket/H--7,4754,641

libsqlite/H--77,70460,349

libsrpt/H--981420

libstmf/H--13,2769,235

libstmfproxy/H--555270

libsum/H--4,4963,056

libsun_ima/H--3,8122,926

libsys/H--1,156911

libsysevent/H--4,4232,880

libtecla/H--29,80612,127

libthread/H--610415

libtnf/H--3,7471,931

libtnfctl/H--10,0046,113

libtnfprobe/H--4,0852,208

libtsalarm/H--583307

libtsnet/H--2,3921,513

libtsol/H--5,1412,773

libumem/H--10,0836,032

libunistat/H--1,4501,073

libuuid/H--1,512728

libuutil/H--3,7592,366

libv12n/H--1,239724

libvolmgt/H--2,375966

libvrrpadm/H--1,563933

libvscan/H--2,1941,278

libw/H--345165

libwanboot/H--1,183665

libwanbootutil/H--1,194535

libwrap/H--4,0382,332

libxcurses/H--38,66323,528

libxcurses2/H--25,73013,949

libxnet/H--427242

libzfs/H--20,21313,918

libzfs_jni/H--5,7633,542

libzonecfg/H--9,7576,908

libzoneinfo/H--1,7601,226

libzonestat/H--5,0963,979

libzpool/H--2,3751,537

lvm/H--86,12755,637

madv/H--1,061645

mpapi/H--15,2917,214

mpss/H--750415

nametoaddr/H--922422

ncad_addr/H--578285

nsswitch/H--27,53916,995

pam_modules/H--20,37411,056

passwdutil/H--5,5613,627

pkcs11/H--116,51973,055

policykit/H--728378

print/H--30,33919,229

pylibbe/H--1,316769

pysolaris/H--388187

pyzfs/H--2,0211,341

raidcfg_plugins/H--5315

rpcsec_gss/H--3,6942,306

sasl_plugins/H--9,6957,210

scsi/H--20,17812,687

smbsrv/H--73,30645,568

smhba/H--6,7265,201

storage/H--21,11313,801

sun_fc/H--14,8057,976

sun_sas/H--7,1584,618

udapl/H--46,47124,564

watchmalloc/H--1,8991,203

MakefileH A D16-Aug-201013.4 KiB697593

Makefile.asthdrH A D27-Dec-20083.7 KiB8633

Makefile.astmsgH A D27-Dec-20083.1 KiB9641

Makefile.filter.comH A D07-May-20092.9 KiB835

Makefile.filter.targH A D07-May-20091.4 KiB4937

Makefile.libH A D28-Jun-20108.7 KiB261118

Makefile.lib.64H A D09-Aug-20061.1 KiB3734

Makefile.machH A D14-Jun-20051.7 KiB6015

Makefile.rootfsH A D14-Jun-20051.1 KiB332

Makefile.targH A D28-Jun-20102.8 KiB11359

README.MakefilesH A D09-Aug-200621.9 KiB648452

README.mapfilesH A D25-Jun-201018.7 KiB488386

inc.flgH A D14-Jun-20051.3 KiB383

req.flgH A D17-May-20071.2 KiB378

README.Makefiles

1#
2# CDDL HEADER START
3#
4# The contents of this file are subject to the terms of the
5# Common Development and Distribution License (the "License").
6# You may not use this file except in compliance with the License.
7#
8# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9# or http://www.opensolaris.org/os/licensing.
10# See the License for the specific language governing permissions
11# and limitations under the License.
12#
13# When distributing Covered Code, include this CDDL HEADER in each
14# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15# If applicable, add the following below this CDDL HEADER, with the
16# fields enclosed by brackets "[]" replaced with your own identifying
17# information: Portions Copyright [yyyy] [name of copyright owner]
18#
19# CDDL HEADER END
20#
21#
22# Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23# Use is subject to license terms.
24#
25# ident	"%Z%%M%	%I%	%E% SMI"
26#
27
28Writing Library Makefiles in ON
29===============================
30
31Introduction
32------------
33
34This document guides you through the gnarly process of writing library
35Makefiles for the ON consolidation.  It assumes that you're comfortable with
36make(1) and are somewhat familiar with the ON Makefile standards outlined in
37/shared/ON/general_docs/make_std.txt.
38
39Makefile Overview
40-----------------
41
42Your library should consist of a hierarchical collection of Makefiles:
43
44	lib/<library>/Makefile:
45
46	  This is your library's top-level Makefile.  It should contain rules
47	  for building any ISA-independent targets, such as installing header
48	  files and building message catalogs, but should defer all other
49	  targets to ISA-specific Makefiles.
50
51	lib/<library>/Makefile.com
52
53	  This is your library's common Makefile.  It should contain rules
54	  and macros which are common to all ISAs. This Makefile should never
55	  be built explicitly, but instead should be included (using the make
56	  include mechanism) by all of your ISA-specific Makefiles.
57
58	lib/<library>/<isa>/Makefile
59
60	  These are your library's ISA-specific Makefiles, one per ISA
61	  (usually sparc and i386, and often sparcv9 and amd64).  These
62	  Makefiles should include your common Makefile and then provide any
63	  needed ISA-specific rules and definitions, perhaps overriding those
64	  provided in your common Makefile.
65
66To simplify their maintenance and construction, $(SRC)/lib has a handful of
67provided Makefiles that yours must include; the examples provided throughout
68the document will show how to use them.  Please be sure to consult these
69Makefiles before introducing your own custom build macros or rules.
70
71	lib/Makefile.lib:
72
73	  This contains the bulk of the macros for building shared objects.
74
75	lib/Makefile.lib.64
76
77	  This contains macros for building 64-bit objects, and should be
78	  included in Makefiles for 64-bit native ISAs.
79
80	lib/Makefile.rootfs
81
82	  This contains macro overrides for libraries that install into /lib
83	  (rather than /usr/lib).
84
85	lib/Makefile.targ
86
87	  This contains rules for building shared objects.
88
89The remainder of this document discusses how to write each of your Makefiles
90in detail, and provides examples from the libinetutil library.
91
92The Library Top-level Makefile
93------------------------------
94
95As described above, your top-level library Makefile should contain
96rules for building ISA-independent targets, but should defer the
97building of all other targets to ISA-specific Makefiles.  The
98ISA-independent targets usually consist of:
99
100	install_h
101
102	  Install all library header files into the proto area.
103	  Can be omitted if your library has no header files.
104
105	check
106
107	  Check all library header files for hdrchk compliance.
108	  Can be omitted if your library has no header files.
109
110	_msg
111
112	  Build and install a message catalog.
113	  Can be omitted if your library has no message catalog.
114
115Of course, other targets (such as `cstyle') are fine as well, as long as
116they are ISA-independent.
117
118The ROOTHDRS and CHECKHDRS targets are provided in lib/Makefile.lib to make
119it easy for you to install and check your library's header files.  To use
120these targets, your Makefile must set the HDRS to the list of your library's
121header files to install and HDRDIR to the their location in the source tree.
122In addition, if your header files need to be installed in a location other
123than $(ROOT)/usr/include, your Makefile must also set ROOTHDRDIR to the
124appropriate location in the proto area.  Once HDRS, HDRDIR and (optionally)
125ROOTHDRDIR have been set, your Makefile need only contain
126
127	  install_h: $(ROOTHDRS)
128
129	  check: $(CHECKHDRS)
130
131to bind the provided targets to the standard `install_h' and `check' rules.
132
133Similar rules are provided (in $(SRC)/Makefile.msg.targ) to make it easy for
134you to build and install message catalogs from your library's source files.
135
136To install a catalog into the catalog directory in the proto area, define the
137POFILE macro to be the name of your catalog, and specify that the _msg target
138depends on $(MSGDOMAINPOFILE).  The examples below should clarify this.
139
140To build a message catalog from arbitrarily many message source files, use
141the BUILDPO.msgfiles macro.
142
143	  include ../Makefile.lib
144
145	  POFILE =	  libfoo.po
146	  MSGFILES =	  $(OBJECTS:%.o=%.i)
147
148	  # ...
149
150	  $(POFILE): $(MSGFILES)
151		$(BUILDPO.msgfiles)
152
153	  _msg: $(MSGDOMAINPOFILE)
154
155	  include $(SRC)/Makefile.msg.targ
156
157Note that this example doesn't use grep to find message files, since that can
158mask unreferenced files, and potentially lead to the inclusion of unwanted
159messages or omission of intended messages in the catalogs.  As such, MSGFILES
160should be derived from a known list of objects or sources.
161
162It is usually preferable to run the source through the C preprocessor prior
163to extracting messages.  To do this, use the ".i" suffix, as shown in the
164above example.  If you need to skip the C preprocessor, just use the native
165(.[ch]) suffix.
166
167The only time you shouldn't use BUILDPO.msgfiles as the preferred means of
168extracting messages is when you're extracting them from shell scripts; in
169that case, you can use the BUILDPO.pofiles macro as explained below.
170
171To build a message catalog from other message catalogs, or from source files
172that include shell scripts, use the BUILDPO.pofiles macro:
173
174	  include ../Makefile.lib
175
176	  SUBDIRS =	  $(MACH)
177
178	  POFILE =	  libfoo.po
179	  POFILES =	  $(SUBDIRS:%=%/_%.po)
180
181	  _msg :=	  TARGET = _msg
182
183	  # ...
184
185	  $(POFILE): $(POFILES)
186		$(BUILDPO.pofiles)
187
188	  _msg: $(MSGDOMAINPOFILE)
189
190	  include $(SRC)/Makefile.msg.targ
191
192The Makefile above would work in conjunction with the following in its
193subdirectories' Makefiles:
194
195	  POFILE =	  _thissubdir.po
196	  MSGFILES =	  $(OBJECTS:%.o=%.i)
197
198	  $(POFILE):	  $(MSGFILES)
199		  $(BUILDPO.msgfiles)
200
201	  _msg:		  $(POFILE)
202
203	  include $(SRC)/Makefile.msg.targ
204
205Since this POFILE will be combined with those in other subdirectories by the
206parent Makefile and that merged file will be installed into the proto area
207via MSGDOMAINPOFILE, there is no need to use MSGDOMAINPOFILE in this Makefile
208(in fact, using it would lead to duplicate messages in the catalog).
209
210When using any of these targets, keep in mind that other macros, like
211XGETFLAGS and TEXT_DOMAIN may also be set in your Makefile to override or
212augment the defaults provided in higher-level Makefiles.
213
214As previously mentioned, you should defer all ISA-specific targets to your
215ISA-specific Makefiles.  You can do this by:
216
217	1. Setting SUBDIRS to the list of directories to descend into:
218
219		SUBDIRS = $(MACH)
220
221	   Note that if your library is also built 64-bit, then you should
222	   also specify
223
224		$(BUILD64)SUBDIRS += $(MACH64)
225
226	   so that SUBDIRS contains $(MACH64) if and only if you're compiling
227	   on a 64-bit ISA.
228
229	2. Providing a common "descend into SUBDIRS" rule:
230
231		$(SUBDIRS): FRC
232			@cd $@; pwd; $(MAKE) $(TARGET)
233
234		FRC:
235
236	3. Providing a collection of conditional assignments that set TARGET
237	   appropriately:
238
239		all	:= TARGET= all
240		clean	:= TARGET= clean
241		clobber := TARGET= clobber
242		install := TARGET= install
243		lint	:= TARGET= lint
244
245	   The order doesn't matter, but alphabetical is preferable.
246
247	4. Having the aforementioned targets depend on SUBDIRS:
248
249		all clean clobber install lint: $(SUBDIRS)
250
251	   The `all' target must be listed first so that make uses it as the
252	   default target; the others might as well be listed alphabetically.
253
254As an example of how all of this goes together, here's libinetutil's
255top-level library Makefile (license notice and copyright omitted):
256
257	include ../Makefile.lib
258
259	HDRS =		libinetutil.h
260	HDRDIR =	common
261	SUBDIRS =	$(MACH)
262	$(BUILD64)SUBDIRS += $(MACH64)
263
264	all :=		TARGET = all
265	clean :=	TARGET = clean
266	clobber :=	TARGET = clobber
267	install :=	TARGET = install
268	lint :=		TARGET = lint
269
270	.KEEP_STATE:
271
272	all clean clobber install lint: $(SUBDIRS)
273
274	install_h:	$(ROOTHDRS)
275
276	check:		$(CHECKHDRS)
277
278	$(SUBDIRS): FRC
279		@cd $@; pwd; $(MAKE) $(TARGET)
280
281	FRC:
282
283	include ../Makefile.targ
284
285The Common Makefile
286-------------------
287
288In concept, your common Makefile should contain all of the rules and
289definitions that are the same on all ISAs.  However, for reasons of
290maintainability and cleanliness, you're encouraged to place even
291ISA-dependent rules and definitions, as long you express them in an
292ISA-independent way (e.g., by using $(MACH), $(TARGETMACH), and their kin).
293(TARGETMACH is the same as MACH for 32-bit targets, and the same as MACH64
294for 64-bit targets).
295
296The common Makefile can be conceptually split up into four sections:
297
298	1. A copyright and comments section.  Please see the prototype
299	   files in usr/src/prototypes for examples of how to format the
300	   copyright message properly.  For brevity and clarity, this
301	   section has been omitted from the examples shown here.
302
303	2. A list of macros that must be defined prior to the inclusion of
304	   Makefile.lib.  This section is conceptually terminated by the
305	   inclusion of Makefile.lib, followed, if necessary, by the
306	   inclusion of Makefile.rootfs (only if the library is to be
307	   installed in /lib rather than the default /usr/lib).
308
309	3. A list of macros that need not be defined prior to the inclusion
310	   of Makefile.lib (or which must be defined following the inclusion
311	   of Makefile.lib, to override or augment its definitions).  This
312	   section is conceptually terminated by the .KEEP_STATE directive.
313
314	4. A list of targets.
315
316The first section is self-explanatory.  The second typically consists of the
317following macros:
318
319	LIBRARY
320
321	  Set to the name of the static version of your library, such
322	  as `libinetutil.a'.  You should always specify the `.a' suffix,
323	  since pattern-matching rules in higher-level Makefiles rely on it,
324	  even though static libraries are not normally built in ON, and
325	  are never installed in the proto area.  Note that the LIBS macro
326	  (described below) controls the types of libraries that are built
327	  when building your library.
328
329	  If you are building a loadable module (i.e., a shared object that
330	  is only linked at runtime with dlopen(3dl)), specify the name of
331	  the loadable module with a `.a' suffix, such as `devfsadm_mod.a'.
332
333	VERS
334
335	  Set to the version of your shared library, such as `.1'.  You
336	  actually do not need to set this prior to the inclusion of
337	  Makefile.lib, but it is good practice to do so since VERS and
338	  LIBRARY are so closely related.
339
340	OBJECTS
341
342	  Set to the list of object files contained in your library, such as
343	  `a.o b.o'.  Usually, this will be the same as your library's source
344	  files (except with .o extensions), but if your library compiles
345	  source files outside of the library directory itself, it will
346	  differ.  We'll see an example of this with libinetutil.
347
348The third section typically consists of the following macros:
349
350	LIBS
351
352	  Set to the list of the types of libraries to build when building
353	  your library.  For dynamic libraries, you should set this to
354	  `$(DYNLIB) $(LINTLIB)' so that a dynamic library and lint library
355	  are built.  For loadable modules, you should just list DYNLIB,
356	  since there's no point in building a lint library for libraries
357	  that are never linked at compile-time.
358
359	  If your library needs to be built as a static library (typically
360	  to be used in other parts of the build), you should set LIBS to
361	  `$(LIBRARY)'.  However, you should do this only when absolutely
362	  necessary, and you must *never* ship static libraries to customers.
363
364	ROOTLIBDIR (if your library installs to a nonstandard directory)
365
366	  Set to the directory your 32-bit shared objects will install into
367	  with the standard $(ROOTxxx) macros.  Since this defaults to
368	  $(ROOT)/usr/lib ($(ROOT)/lib if you included Makefile.rootfs),
369	  you usually do not need to set this.
370
371	ROOTLIBDIR64 (if your library installs to a nonstandard directory)
372
373	  Set to the directory your 64-bit shared objects will install into
374	  with the standard $(ROOTxxx64) macros.  Since this defaults to
375	  $(ROOT)/usr/lib/$(MACH64) ($(ROOT)/lib/$(MACH64) if you included
376	  Makefile.rootfs), you usually do not need to set this.
377
378	SRCDIR
379
380	  Set to the directory containing your library's source files, such
381	  as `../common'.  Because this Makefile is actually included from
382	  your ISA-specific Makefiles, make sure you specify the directory
383	  relative to your library's <isa> directory.
384
385	SRCS (if necessary)
386
387	  Set to the list of source files required to build your library.
388	  This defaults to $(OBJECTS:%.o=$(SRCDIR)/%.c) in Makefile.lib, so
389	  you only need to set this when source files from directories other
390	  than SRCDIR are needed.  Keep in mind that SRCS should be set to a
391	  list of source file *pathnames*, not just a list of filenames.
392
393	LINTLIB-specific SRCS (required if building a lint library)
394
395	  Set to a special "lint stubs" file to use when constructing your
396	  library's lint library.  The lint stubs file must be used to
397	  guarantee that programs that link against your library will be able
398	  to lint clean.  To do this, you must conditionally set SRCS to use
399	  your stubs file by specifying `LINTLIB := SRCS= $(SRCDIR)/$(LINTSRC)'
400	  in your Makefile.  Of course, you do not need to set this if your
401	  library does not build a lint library.
402
403	LDLIBS
404
405	  Appended with the list of libraries and library directories needed
406	  to build your library; minimally "-lc".  Note that this should
407	  *never* be set, since that will inadvertently clear the library
408	  search path, causing the linker to look in the wrong place for
409	  the libraries.
410
411	  Since lint targets also make use of LDLIBS, LDLIBS *must* only
412	  contain -l and -L directives; all other link-related directives
413	  should be put in DYNFLAGS (if they apply only to shared object
414	  construction) or LDFLAGS (if they apply in general).
415
416	MAPFILES (if necessary)
417
418	  Set to the list of mapfiles used to link each ISA-specific version
419	  of your library.  This defaults to `$(SRCDIR)/mapfile-vers' in
420	  Makefile.lib, so you only need to change this if you have additional
421	  mapfiles or your mapfile doesn't follow the standard naming
422	  convention.  If you have supplemental ISA-dependent mapfiles that
423	  reside in the respective <isa> directories, you can augment
424	  MAPFILES like this:
425
426		MAPFILES += mapfile-vers
427
428	CPPFLAGS (if necessary)
429
430	   Appended with any flags that need to be passed to the C
431	   preprocessor (typically -D and -I flags).  Since lint macros use
432	   CPPFLAGS, CPPFLAGS *must* only contain directives known to the C
433	   preprocessor.  When compiling MT-safe code, CPPFLAGS *must*
434	   include -D_REENTRANT.  When compiling large file aware code,
435	   CPPFLAGS *must* include -D_FILE_OFFSET_BITS=64.
436
437	CFLAGS
438
439	   Appended with any flags that need to be passed to the C compiler.
440	   Minimally, append `$(CCVERBOSE)'.  Keep in mind that you should
441	   add any C preprocessor flags to CPPFLAGS, not CFLAGS.
442
443	CFLAGS64 (if necessary)
444
445	   Appended with any flags that need to be passed to the C compiler
446	   when compiling 64-bit code.  Since all 64-bit code is compiled
447	   $(CCVERBOSE), you usually do not need to modify CFLAGS64.
448
449 	COPTFLAG (if necessary)
450
451	   Set to control the optimization level used by the C compiler when
452	   compiling 32-bit code.  You should only set this if absolutely
453	   necessary, and it should only contain optimization-related
454	   settings (or -g).
455
456 	COPTFLAG64 (if necessary)
457
458	   Set to control the optimization level used by the C compiler when
459	   compiling 64-bit code.  You should only set this if absolutely
460	   necessary, and it should only contain optimization-related
461	   settings (or -g).
462
463	LINTFLAGS (if necessary)
464
465	   Appended with any flags that need to be passed to lint when
466	   linting 32-bit code.  You should only modify LINTFLAGS in
467	   rare instances where your code cannot (or should not) be fixed.
468
469	LINTFLAGS64 (if necessary)
470
471	   Appended with any flags that need to be passed to lint when
472	   linting 64-bit code.  You should only modify LINTFLAGS64 in
473	   rare instances where your code cannot (or should not) be fixed.
474
475Of course, you may use other macros as necessary.
476
477The fourth section typically consists of the following targets:
478
479	all
480
481	  Build all of the types of the libraries named by LIBS.  Must always
482	  be the first real target in common Makefile.  Since the
483	  higher-level Makefiles already contain rules to build all of the
484	  different types of libraries, you can usually just specify
485
486		all: $(LIBS)
487
488	  though it should be listed as an empty target if LIBS is set by your
489	  ISA-specific Makefiles (see above).
490
491	lint
492
493	  Use the `lintcheck' rule provided by lib/Makefile.targ to lint the
494	  actual library sources.  Historically, this target has also been
495	  used to build the lint library (using LINTLIB), but that usage is
496	  now discouraged.  Thus, this rule should be specified as
497
498		lint: lintcheck
499
500Conspicuously absent from this section are the `clean' and `clobber' targets.
501These targets are already provided by lib/Makefile.targ and thus should not
502be provided by your common Makefile.  Instead, your common Makefile should
503list any additional files to remove during a `clean' and `clobber' by
504appending to the CLEANFILES and CLOBBERFILES macros.
505
506Once again, here's libinetutil's common Makefile, which shows how many of
507these directives go together.  Note that Makefile.rootfs is included to
508cause libinetutil.so.1 to be installed in /lib rather than /usr/lib:
509
510	LIBRARY =	libinetutil.a
511	VERS =		.1
512	OBJECTS =	octet.o inetutil4.o ifspec.o ifaddrlist.o eh.o tq.o
513
514	include ../../Makefile.lib
515	include ../../Makefile.rootfs
516
517	LIBS =		$(DYNLIB) $(LINTLIB)
518
519	SRCDIR =	../common
520	COMDIR =	$(SRC)/common/net/dhcp
521	SRCS =		$(COMDIR)/octet.c $(SRCDIR)/inetutil4.c \
522			$(SRCDIR)/ifspec.c $(SRCDIR)/eh.c $(SRCDIR)/tq.c \
523			$(SRCDIR)/ifaddrlist.c
524
525	$(LINTLIB):=	SRCS = $(SRCDIR)/$(LINTSRC)
526	LDLIBS +=	-lsocket -lc
527
528	CFLAGS +=	$(CCVERBOSE)
529	CPPFLAGS +=	-I$(SRCDIR)
530
531	.KEEP_STATE:
532
533	all: $(LIBS)
534
535	lint: lintcheck
536
537	pics/%.o: $(COMDIR)/%.c
538		$(COMPILE.c) -o $@ $<
539		$(POST_PROCESS_O)
540
541	include ../../Makefile.targ
542
543The mapfile for libinetutil is named `mapfile-vers' and resides in $(SRCDIR),
544so the MAPFILES definition is omitted, defaulting to $(SRCDIR)/mapfile-vers.
545
546Note that for libinetutil, not all of the object files come from SRCDIR.  To
547support this, an alternate source file directory named COMDIR is defined, and
548the source files listed in SRCS are specified using both COMDIR and SRCDIR.
549Additionally, a special build rule is provided to build object files from the
550sources in COMDIR; the rule uses COMPILE.c and POST_PROCESS_O so that any
551changes to the compilation and object-post-processing phases will be
552automatically picked up.
553
554The ISA-Specific Makefiles
555--------------------------
556
557As the name implies, your ISA-specific Makefiles should contain macros and
558rules that cannot be expressed in an ISA-independent way.  Usually, the only
559rule you will need to put here is `install', which has different dependencies
560for 32-bit and 64-bit libraries.  For instance, here are the ISA-specific
561Makefiles for libinetutil:
562
563	sparc/Makefile:
564
565		include ../Makefile.com
566
567		install: all $(ROOTLIBS) $(ROOTLINKS) $(ROOTLINT)
568
569	sparcv9/Makefile:
570
571		include ../Makefile.com
572		include ../../Makefile.lib.64
573
574		install: all $(ROOTLIBS64) $(ROOTLINKS64)
575
576	i386/Makefile:
577
578		include ../Makefile.com
579
580		install: all $(ROOTLIBS) $(ROOTLINKS) $(ROOTLINT)
581
582	amd64/Makefile:
583
584		include ../Makefile.com
585		include ../../Makefile.lib.64
586
587		install: all $(ROOTLIBS64) $(ROOTLINKS64)
588
589Observe that there is no .KEEP_STATE directive in these Makefiles, since all
590of these Makefiles include libinetutil/Makefile.com, and it already has a
591.KEEP_STATE directive.  Also, note that the 64-bit Makefiles also include
592Makefile.lib.64, which overrides some of the definitions contained in the
593higher level Makefiles included by the common Makefile so that 64-bit
594compiles work correctly.
595
596CTF Data in Libraries
597---------------------
598
599By default, all position-independent objects are built with CTF data using
600ctfconvert, which is then merged together using ctfmerge when the shared
601object is built.  All C-source objects processed via ctfmerge need to be
602processed via ctfconvert or the build will fail.  Objects built from non-C
603sources (such as assembly or C++) are silently ignored for CTF processing.
604
605Filter libraries that have no source files will need to explicitly disable
606CTF by setting CTFMERGE_LIB to ":"; see libw/Makefile.com for an example.
607
608More Information
609----------------
610
611Other issues and questions will undoubtedly arise while you work on your
612library's Makefiles.  To help in this regard, a number of libraries of
613varying complexity have been updated to follow the guidelines and practices
614outlined in this document:
615
616	lib/libdhcputil
617
618	  Example of a simple 32-bit only library.
619
620	lib/libdhcpagent
621
622	  Example of a simple 32-bit only library that obtains its sources
623	  from multiple directories.
624
625	lib/ncad_addr
626
627	  Example of a simple loadable module.
628
629	lib/libipmp
630
631	  Example of a simple library that builds a message catalog.
632
633	lib/libdhcpsvc
634
635	  Example of a Makefile hierarchy for a library and a collection
636	  of related pluggable modules.
637
638	lib/lvm
639
640	  Example of a Makefile hierarchy for a collection of related
641	  libraries and pluggable modules.
642
643	  Also an example of a Makefile hierarchy that supports the
644	  _dc target for domain and category specific messages.
645
646Of course, if you still have questions, please do not hesitate to send email
647to the ON gatekeepers.
648

README.mapfiles

1#
2# CDDL HEADER START
3#
4# The contents of this file are subject to the terms of the
5# Common Development and Distribution License (the "License").
6# You may not use this file except in compliance with the License.
7#
8# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9# or http://www.opensolaris.org/os/licensing.
10# See the License for the specific language governing permissions
11# and limitations under the License.
12#
13# When distributing Covered Code, include this CDDL HEADER in each
14# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15# If applicable, add the following below this CDDL HEADER, with the
16# fields enclosed by brackets "[]" replaced with your own identifying
17# information: Portions Copyright [yyyy] [name of copyright owner]
18#
19# CDDL HEADER END
20#
21#
22# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
23#
24
25Mapfiles and versioning in ON
26=============================
27
281.0 Objective of this README
29
30This README describes the engineering practices of creating and updating
31visible library interfaces.  It describes various kinds of actions that
32typically occur as libraries are evolved, and shows how interface
33specifications are affected or updated in accordance.  It tells you what
34you must do as a shared library developer if you:
35
36	1. Make interface additions to an existing library
37		- add a Public interface
38		- add a Private interface
39	2. Update an interface in an existing library
40		- remove an existing interface
41		- promote a Private interface to Public
42		- scope a Private interface to local
43		- move an interface from one library to another
44		- copy interfaces which are part of the standard to a new or
45		  existing library
46	3. Introduce a new library
47		- source directory hierarchy
48		- creation of the "mapfile-vers" file
49		- Makefiles
50	4. Make an entire library obsolete before end-of-life
51		- introduce SUNWobsolete to the "mapfile-vers" file
52
53-------------------------------------------------------------------------------
54
552.0 What's a mapfile?
56
57Mapfiles are used to tell the link-editor ("ld") all sorts of things about
58how to generate an executable file or a shared object from a collection of
59relocatable objects, such as generated by a compiler.  For all the gory
60details, see the Solaris Linker and Libraries Guide, which can be found
61under http://docs.sun.com.
62
63There are two versions of the mapfile language accepted by the link-editor.
64Version 1 derives from AT&T System V Release 4 Unix. Version 2 is a newer
65syntax specific to Solaris. All mapfiles in the OSnet (ON consolidation) are
66required to use version 2 syntax. Note that every mapfile using version 2
67syntax must start with the line:
68
69        $mapfile_version 2
70
71Here, we are only concerned with specifying externally-visible interfaces
72for shared libraries (shared objects) and with specifying their versions
73for ABI (Application Binary Interface) purposes.  For these purposes, we
74only need to deal with a subset of the mapfile language.
75
76There should be a "mapfile-vers" file associated with every shared library
77and it should reside in the common source directory for that library, most
78often in a "common" directory.  This is the usual layout of a library's
79top-level directory (usr/src/lib/libwombat):
80	Makefile       amd64/         i386/          sparcv9/
81	Makefile.com   common/        sparc/
82
83The "common" directory contains the source files and other common files
84for the library:
85	bat.c              libwombat_impl.h   mapfile-vers       wom.c
86	libwombat.h        llib-lwombat       util.c             wombat.c
87
88The mapfile's name is, by convention, "mapfile-vers" because it is used
89for only two purposes: to specify externally-visible interface names while
90suppressing visibility of all other names, and to specify their respective
91unique version names.
92
93-------------------------------------------------------------------------------
94
953.0 Contents of mapfile-vers
96
97The structure of mapfile-vers is best explained by an example
98(the license notification and copyright notice is omitted here
99for brevity):
100
101$mapfile_version 2
102
103SYMBOL_VERSION SUNW_1.2 {	# update to libwombat, Solaris 10
104    global:
105	wb_readv;
106	wb_stat;
107	wb_writev;
108} SUNW_1.1;
109
110SYMBOL_VERSION SUNW_1.1 {	# first release of libwombat, Solaris 9
111    global:
112	wb_read;
113	wb_write;
114};
115
116SYMBOL_VERSION SUNWprivate {	# private libwombat symbols
117    global:
118	wb_add;
119	wb_delete;
120	wb_search;
121    local:
122	*;
123};
124
125The SUNW_1.* names are the Public version names for the library.
126There should be at most one version name for each release of Solaris,
127with the minor number incremented by one over the previous version.
128
129If no update to the Public-visible names in the library is made
130in a given Solaris release, no new version name should be generated
131for that release.  If multiple updates are made to the library at
132different points in the development of a given release of Solaris,
133only one version should be used for the entire release.
134
135So, for example, if an update to libwombat is made in Solaris 11,
136you would add "SUNW_1.3" at the start of the mapfile:
137
138SYMBOL_VERSION SUNW_1.3 {	# update to libwombat, Solaris 11
139    global:
140	wb_lseek;
141} SUNW_1.2;
142
143Each version must inherit all symbols from its preceding version,
144specified at the ending "}" for each version.  SUNW_1.1 does not
145inherit any symbols.  SUNWprivate, if present, stands alone.
146
147The two lines in SUNWprivate:
148    local:
149	*;
150ensure that no symbols other than those listed in the mapfile are
151visible to clients of the library.  If there is no SUNWprivate,
152these two lines should appear in SUNW_1.1.
153
154For maintainability, the list of names in each version block should
155be sorted in dictionary order (sort -d).  Please comply.
156
157The version 2 mapfile language supports a simple mechanism for conditional
158input, in which lines in the mapfile apply only to a specific platform or
159ELFCLASS (32/64-bit). This mechanism works very much like the #if/#endif
160feature of the C preprocessor. For instance, the following mapfile declares
161a version SUNW_1.1 that always exports a symbol foo, and also exports
162the symbol bar on 32-bit sparc platforms:
163
164$mapfile_version
165SYMBOL_VERSION SUNW_1.1 {
166        foo;
167$if _sparc && _ELF32
168	bar;
169$endif
170};
171
172Conditional input can be used if there are ISA-specific library interfaces
173not common to all instances of the library. It is the preferred method for
174expressing platform specific items, as long as the differences are simple
175(which is almost always the case).  For example, see libproc, or, if you
176are masochistic, libc or libnsl.
177
178In addition to conditional input, there is a second heavier weight mechanism
179for expressing ISA-specific differences. In addition to the common mapfile:
180	common/mapfile-vers
181some libraries may have ISA-specific supplemental mapfiles, one in each
182of the ISA directories:
183	amd64/mapfile-vers
184	i386/mapfile-vers
185	sparc/mapfile-vers
186	sparcv9/mapfile-vers
187The ISA-specific mapfiles look like the common mapfile, except that only
188the ISA-specific names appear.  The version names are the same as those
189in the common mapfile, but only non-empty version instances are present
190and no inheritance specification is present. The link-editor reads the
191information from the common and ISA-specific mapfiles and merges them
192in memory into a single description used to create the resulting object.
193
194ISA-specific mapfiles were used with the version 1 mapfile language, which
195lacked conditional input. Their use is rare now, as conditional input is
196generally preferred. However, it is important to use conditional input
197carefully, or the resulting mapfile can be extremly difficult to read.
198
199-------------------------------------------------------------------------------
200
2014.0 Making interface additions to an existing library
202
2034.1 Adding a Public interface
204
205The first engineer to update the existing mapfile-vers file in a release needs
206to identify the current highest version name and properly increment the minor
207version number by 1 to be the new version name.  If this is the first Public
208interface in the shared object, a new SUNW_1.1 version name must be introduced.
209
210The major revision number is incremented whenever an incompatible change is
211made to an interface.  This could be the case if an API changes so dramatically
212as to invalidate dependencies.  This rarely occurs in practice.  It also
213requires changing the suffix of the shared object from, say, .so.1 to .so.2
214and introducing code to continue to ship the .so.1 version of the library.
215
216The minor revision number is incremented whenever one or more new interfaces
217is added to a library.  Note that the minor number is not incremented on every
218putback that makes an interface addition to the library.  Rather, it is
219incremented at most once per (external to Sun) release of the library.
220
2214.2 Adding a Private interface
222
223Private interfaces are the non-ABI interfaces of the library.  Unlike
224introducing a Public interface, a new entry is simply added to the
225SUNWprivate version.  No minor number increment is necessary.
226
227If this interface happens to be the first Private interface introduced
228into the library, the SUNWprivate version must be created (no major.minor
229version numbers).  It inherits nothing and nothing inherits from it.
230
231If the library already has Private interfaces, they may have numbered version
232names like SUNWprivate_m.n (due to errors of the past).  If so, just use the
233highest numbered private version name to version the new interface.  There
234is no need to introduce a new private version name.  Be careful not to use
235a lower numbered private version name; doing so can cause runtime errors
236(as opposed to load time errors) when running an application with older
237versions of the library.
238
239There are libraries in the OSnet consolidation that contain only private
240interfaces. In such libraries, the SUNWprivate_m.n may be incremented
241to ensure that the programs that depend on them are built and delivered as a
242integrated unit. A notable example of this is libld.so (usr/src/cmd/sgs/libld),
243which contains the implementation of the link-editor, the public interface to
244which is provided by the ld command. When making a modification to the interface
245of such a library, you should follow the convention already in place.
246
2474.3 Adding new public interfaces in an update release
248
249Adding new public interfaces in an update release requires careful
250coordination with the next marketing release currently under development.
251Multiple updates ship during the period before the next marketing release
252ships, and since it is generally impossible to know the full set of new
253interfaces in the next marketing release until late in its development
254(after multiple updates have shipped) it must be assumed that not all
255interfaces added to the next marketing release will be added to an update.
256
257Consequently, the new version number for an update cannot be a minor
258increment, but must be a micro increment.  For example, if Release N
259has version number SUNW_1.3 and Release N+1 will have SUNW_1.4, then
260interfaces added to an update of Release N must have micro numbers such
261as SUNW_1.3.1, SUNW_1.3.2, etc.  (note that the micro number is not
262directly tied to the update number: SUNW_1.3.1 may appear in Update 2).
263The micro versions form an inheritance chain that is inserted between
264two successive minor versions.  For example, the mapfile-vers file for
265minor release "N+1" to reflect its inclusion of micro releases will
266look like the following:
267
268$mapfile_version 2
269
270SYMBOL_VERSION SUNW_1.4 {	# release N+1
271    global:
272	...
273} SUNW_1.3.2;
274
275SYMBOL_VERSION SUNW_1.3.2 {	# micro release 2 (e.g., release NU3)
276    global:
277	...
278} SUNW_1.3.1;
279
280SYMBOL_VERSION SUNW_1.3.1 {	# micro release 1 (e.g., release NU2)
281    global:
282	...
283} SUNW_1.3;
284
285SYMBOL_VERSION SUNW_1.3 {	# release N
286    global:
287	...
288} SUNW_1.2;
289
290SYMBOL_VERSION SUNW_1.2 {	# release N-1
291    global:
292	...
293} SUNW_1.1;
294
295SYMBOL_VERSION SUNW_1.1 {	# first release
296    global:
297	...
298};
299
300SYMBOL_VERSION SUNW_private {	# same in all releases
301    global:
302	...
303    local:
304	*;
305};
306
307The corresponding update/patch mapfile-vers file will be identical
308except for the exclusion of SUNW_1.4.
309
310Those interfaces which are only present in Release N+1 are always put
311into the next minor version set, SUNW_1.4.
312
313Thus when adding a new public interface to an update, both the mapfiles
314of the update release and next marketing release must be modified to be
315consistent.  The update versions should not be added to the marketing
316release until the putback to the update release has occurred, to avoid
317timing problems with the update releases (it's all too easy for projects
318to slip out of updates, or to change ordering).
319
320-------------------------------------------------------------------------------
321
3225.0 How to update an interface in an existing library
323
3245.1 Removing an existing interface
325
3265.1.1 Moving a Public interface
327
328No Public interfaces should ever be removed from any mapfile.
329
330To move an interface from one library to (say) libc, the code has to be
331deleted from the library and added to libc, then the mapfile for the
332library has to have the interface's entry changed from:
333	getfoobar;
334to:
335	getfoobar       { TYPE = FUNCTION; FILTER = libc.so.1 };
336See, for example, libnsl's common/mapfile-vers file.
337
338Follow the rules for adding a new interface for the necessary changes
339to libc's mapfile to accommodate the moved interface.  In particular,
340the new interface must be added to the current highest libc version.
341
342To move an entire library into libc, look at what has already been done
343for libthread, libaio, and librt.
344
3455.1.2 Removing a Private interface
346
347Deletion of Private interfaces is allowed, but caution should be taken;
348it should first be established that the interface is not being used.
349To remove a Private interface, simply delete the corresponding entry
350for that symbol from the mapfile's SUNWprivate section.
351
352Do not forget to delete these Public or Private interfaces from the library's
353header files as well as from the code that implements the interfaces.
354
3555.2 Promoting a Private interface to Public
356
357This is similar to what's done when adding a Public interface.  Promoting an
358existing Private interface to a Public one only requires a change to the
359existing interface definition.  Private interfaces have the symbol version name
360"SUNWprivate" associated with them.  To make the interface a Public one, the
361interface must be put into a set associated with the current Public release
362level of the library.
363
364As an example, if we were modifying libwombat.so.1 and its version in the
365last release of Solaris was SUNW_1.23, any new ABI introduced in the next
366release would be put into a version called SUNW_1.24.  Therefore, whether
367you wish to promote an existing Private interface to Public, or to introduce
368a new Public interface, this (next successive minor numbered version level)
369would be the version that it would be associated with.
370
3715.3 Scoping a Private interface local
372
373Any interfaces not present in the mapfile-vers file will be scoped local
374due to the presence of the
375    local:
376	*;
377lines discussed earlier. This ensures that such interfaces will not be visible
378outside the library.  To move an interface from Private to local scope, simply
379remove the Private interface from the mapfile-vers file and the header file
380to prevent it from being exported.  This may require moving the Private
381interface into a library-private header file.  Scope reduction of Public
382interfaces is not allowed without specific ARC review and approval.
383
384For the interface to be used in more than one file within the library, it
385should be in a header file that can be included by each file in the library
386that uses the interface.  For example:
387
388	#include "libprivate.h"
389
3905.4 How to copy interfaces which are part of a standard to a new or existing
391    library
392
393SYSVABI and SISCD are reserved version names for interfaces listed in the
394System V Interface Definition and the Sparc Compliance Definition.  Avoid using
395these version names when copying the implementation of standard interfaces to
396another library.  Instead, use SUNW_1.1 for a new library, and SUNW_m.n for
397an existing library (where m.n is the next release version; i.e., if the
398last version was SUNW_1.18, then you should version the interfaces with
399SUNW_1.19).
400
401-------------------------------------------------------------------------------
402
4036.0 Introducing a new library
404
4056.1 Directories
406
407The normal discipline for introducing a new library in OS/Net is to create a
408new subdirectory of /usr/src/lib.  The interface definition discipline is to
409create a common/mapfile-vers file for the new library.  If we were introducing
410a new foo library, libfoo, we'd create /usr/src/lib/libfoo containing:
411	Makefile       amd64/         i386/          sparcv9/
412	Makefile.com   common/        sparc/
413The common subdirectory would contain the normal source files plus the
414mapfile-vers file.  See usr/src/lib/README.Makefiles for directions on
415how to organize the Makefiles.
416
4176.2 The mapfile
418
419The new common/mapfile-vers file would contain:
420
421$mapfile_version 2
422
423SYMBOL_VERSION SUNW_1.1 {	# first release of libfoo
424    global:
425	...
426};
427
428SYMBOL_VERSION SUNWprivate {
429    global:
430	...
431    local:
432	*;
433};
434
435If there are no Public interfaces, the SUNW_1.1 section would be omitted.
436If there are no Private interfaces, the SUNWprivate section would be
437omitted and the two lines:
438    local:
439	*;
440would be moved into SUNW_1.1
441
442To decide which interfaces are Public (part of the ABI) and which are Private
443(unstable interfaces not intended to be used by third party applications or
444unbundled products), the heuristic which works to a first approximation is
445that if it has a man page then it's Public.  Also, it is really the ARC case
446for the new interfaces that prescribes which interfaces are Public and
447which are not (hence, which interfaces have man pages and which do not).
448
449For maintainability, the list of names in each version block should
450be sorted in dictionary order (sort -d).  Please comply.
451
452-------------------------------------------------------------------------------
453
4547.0 Make an entire library obsolete
455
4567.1 Introduce SUNWobsolete version
457
458Use this version name not for specific interfaces but for marking an entire
459library as obsolete.  The existing public/private version names are left
460unchanged, but a new SUNWobsolete version is created with no symbols in it.
461This becomes a tag by which the obsolescence of the library can be recognized.
462There is no numbering of this version name.
463
464$mapfile_version 2
465
466SYMBOL_VERSION SUNWobsolete {
467    global:
468	SUNWobsolete;	# This is the only way to do it.
469} SUNW_1.2;
470
471SYMBOL_VERSION SUNW_1.2 {
472...
473
474-------------------------------------------------------------------------------
475
4768.0 Documentation
477
478For further information, please refer to the following documents:
479
480	"Solaris Linker and Libraries Guide", http://docs.sun.com
481	/shared/ON/general_docs/scoping-rules.fm.ps
482
483For information on the now-obsolete spec files, used in Solaris releases
4847 through 10, see:
485	/shared/ON/general_docs/README.spec
486	/shared/ON/general_docs/libspec-rules.ps
487	/shared/ON/general_docs/spectrans/*
488