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
28 Writing Library Makefiles in ON
29 ===============================
30
31 Introduction
32 ------------
33
34 This document guides you through the gnarly process of writing library
35 Makefiles for the ON consolidation. It assumes that you're comfortable with
36 make(1) and are somewhat familiar with the ON Makefile standards outlined in
37 /shared/ON/general_docs/make_std.txt.
38
39 Makefile Overview
40 -----------------
41
42 Your 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
66 To simplify their maintenance and construction, $(SRC)/lib has a handful of
67 provided Makefiles that yours must include; the examples provided throughout
68 the document will show how to use them. Please be sure to consult these
69 Makefiles 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
89 The remainder of this document discusses how to write each of your Makefiles
90 in detail, and provides examples from the libinetutil library.
91
92 The Library Top-level Makefile
93 ------------------------------
94
95 As described above, your top-level library Makefile should contain
96 rules for building ISA-independent targets, but should defer the
97 building of all other targets to ISA-specific Makefiles. The
98 ISA-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
115 Of course, other targets (such as `cstyle') are fine as well, as long as
116 they are ISA-independent.
117
118 The ROOTHDRS and CHECKHDRS targets are provided in lib/Makefile.lib to make
119 it easy for you to install and check your library's header files. To use
120 these targets, your Makefile must set the HDRS to the list of your library's
121 header files to install and HDRDIR to the their location in the source tree.
122 In addition, if your header files need to be installed in a location other
123 than $(ROOT)/usr/include, your Makefile must also set ROOTHDRDIR to the
124 appropriate location in the proto area. Once HDRS, HDRDIR and (optionally)
125 ROOTHDRDIR have been set, your Makefile need only contain
126
127 install_h: $(ROOTHDRS)
128
129 check: $(CHECKHDRS)
130
131 to bind the provided targets to the standard `install_h' and `check' rules.
132
133 Similar rules are provided (in $(SRC)/Makefile.msg.targ) to make it easy for
134 you to build and install message catalogs from your library's source files.
135
136 To install a catalog into the catalog directory in the proto area, define the
137 POFILE macro to be the name of your catalog, and specify that the _msg target
138 depends on $(MSGDOMAINPOFILE). The examples below should clarify this.
139
140 To build a message catalog from arbitrarily many message source files, use
141 the 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
157 Note that this example doesn't use grep to find message files, since that can
158 mask unreferenced files, and potentially lead to the inclusion of unwanted
159 messages or omission of intended messages in the catalogs. As such, MSGFILES
160 should be derived from a known list of objects or sources.
161
162 It is usually preferable to run the source through the C preprocessor prior
163 to extracting messages. To do this, use the ".i" suffix, as shown in the
164 above example. If you need to skip the C preprocessor, just use the native
165 (.[ch]) suffix.
166
167 The only time you shouldn't use BUILDPO.msgfiles as the preferred means of
168 extracting messages is when you're extracting them from shell scripts; in
169 that case, you can use the BUILDPO.pofiles macro as explained below.
170
171 To build a message catalog from other message catalogs, or from source files
172 that 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
192 The Makefile above would work in conjunction with the following in its
193 subdirectories' 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
205 Since this POFILE will be combined with those in other subdirectories by the
206 parent Makefile and that merged file will be installed into the proto area
207 via 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
210 When using any of these targets, keep in mind that other macros, like
211 XGETFLAGS and TEXT_DOMAIN may also be set in your Makefile to override or
212 augment the defaults provided in higher-level Makefiles.
213
214 As previously mentioned, you should defer all ISA-specific targets to your
215 ISA-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
254 As an example of how all of this goes together, here's libinetutil's
255 top-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
285 The Common Makefile
286 -------------------
287
288 In concept, your common Makefile should contain all of the rules and
289 definitions that are the same on all ISAs. However, for reasons of
290 maintainability and cleanliness, you're encouraged to place even
291 ISA-dependent rules and definitions, as long you express them in an
292 ISA-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
294 for 64-bit targets).
295
296 The 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
316 The first section is self-explanatory. The second typically consists of the
317 following 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
348 The 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
475 Of course, you may use other macros as necessary.
476
477 The 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
500 Conspicuously absent from this section are the `clean' and `clobber' targets.
501 These targets are already provided by lib/Makefile.targ and thus should not
502 be provided by your common Makefile. Instead, your common Makefile should
503 list any additional files to remove during a `clean' and `clobber' by
504 appending to the CLEANFILES and CLOBBERFILES macros.
505
506 Once again, here's libinetutil's common Makefile, which shows how many of
507 these directives go together. Note that Makefile.rootfs is included to
508 cause 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
543 The mapfile for libinetutil is named `mapfile-vers' and resides in $(SRCDIR),
544 so the MAPFILES definition is omitted, defaulting to $(SRCDIR)/mapfile-vers.
545
546 Note that for libinetutil, not all of the object files come from SRCDIR. To
547 support this, an alternate source file directory named COMDIR is defined, and
548 the source files listed in SRCS are specified using both COMDIR and SRCDIR.
549 Additionally, a special build rule is provided to build object files from the
550 sources in COMDIR; the rule uses COMPILE.c and POST_PROCESS_O so that any
551 changes to the compilation and object-post-processing phases will be
552 automatically picked up.
553
554 The ISA-Specific Makefiles
555 --------------------------
556
557 As the name implies, your ISA-specific Makefiles should contain macros and
558 rules that cannot be expressed in an ISA-independent way. Usually, the only
559 rule you will need to put here is `install', which has different dependencies
560 for 32-bit and 64-bit libraries. For instance, here are the ISA-specific
561 Makefiles 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
589 Observe that there is no .KEEP_STATE directive in these Makefiles, since all
590 of these Makefiles include libinetutil/Makefile.com, and it already has a
591 .KEEP_STATE directive. Also, note that the 64-bit Makefiles also include
592 Makefile.lib.64, which overrides some of the definitions contained in the
593 higher level Makefiles included by the common Makefile so that 64-bit
594 compiles work correctly.
595
596 CTF Data in Libraries
597 ---------------------
598
599 By default, all position-independent objects are built with CTF data using
600 ctfconvert, which is then merged together using ctfmerge when the shared
601 object is built. All C-source objects processed via ctfmerge need to be
602 processed via ctfconvert or the build will fail. Objects built from non-C
603 sources (such as assembly or C++) are silently ignored for CTF processing.
604
605 Filter libraries that have no source files will need to explicitly disable
606 CTF by setting CTFMERGE_LIB to ":"; see libw/Makefile.com for an example.
607
608 More Information
609 ----------------
610
611 Other issues and questions will undoubtedly arise while you work on your
612 library's Makefiles. To help in this regard, a number of libraries of
613 varying complexity have been updated to follow the guidelines and practices
614 outlined 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
646 Of course, if you still have questions, please do not hesitate to send email
647 to 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
25 Mapfiles and versioning in ON
26 =============================
27
28 1.0 Objective of this README
29
30 This README describes the engineering practices of creating and updating
31 visible library interfaces. It describes various kinds of actions that
32 typically occur as libraries are evolved, and shows how interface
33 specifications are affected or updated in accordance. It tells you what
34 you 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
55 2.0 What's a mapfile?
56
57 Mapfiles are used to tell the link-editor ("ld") all sorts of things about
58 how to generate an executable file or a shared object from a collection of
59 relocatable objects, such as generated by a compiler. For all the gory
60 details, see the Solaris Linker and Libraries Guide, which can be found
61 under http://docs.sun.com.
62
63 There are two versions of the mapfile language accepted by the link-editor.
64 Version 1 derives from AT&T System V Release 4 Unix. Version 2 is a newer
65 syntax specific to Solaris. All mapfiles in the OSnet (ON consolidation) are
66 required to use version 2 syntax. Note that every mapfile using version 2
67 syntax must start with the line:
68
69 $mapfile_version 2
70
71 Here, we are only concerned with specifying externally-visible interfaces
72 for shared libraries (shared objects) and with specifying their versions
73 for ABI (Application Binary Interface) purposes. For these purposes, we
74 only need to deal with a subset of the mapfile language.
75
76 There should be a "mapfile-vers" file associated with every shared library
77 and it should reside in the common source directory for that library, most
78 often in a "common" directory. This is the usual layout of a library's
79 top-level directory (usr/src/lib/libwombat):
80 Makefile amd64/ i386/ sparcv9/
81 Makefile.com common/ sparc/
82
83 The "common" directory contains the source files and other common files
84 for the library:
85 bat.c libwombat_impl.h mapfile-vers wom.c
86 libwombat.h llib-lwombat util.c wombat.c
87
88 The mapfile's name is, by convention, "mapfile-vers" because it is used
89 for only two purposes: to specify externally-visible interface names while
90 suppressing visibility of all other names, and to specify their respective
91 unique version names.
92
93 -------------------------------------------------------------------------------
94
95 3.0 Contents of mapfile-vers
96
97 The structure of mapfile-vers is best explained by an example
98 (the license notification and copyright notice is omitted here
99 for brevity):
100
101 $mapfile_version 2
102
103 SYMBOL_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
110 SYMBOL_VERSION SUNW_1.1 { # first release of libwombat, Solaris 9
111 global:
112 wb_read;
113 wb_write;
114 };
115
116 SYMBOL_VERSION SUNWprivate { # private libwombat symbols
117 global:
118 wb_add;
119 wb_delete;
120 wb_search;
121 local:
122 *;
123 };
124
125 The SUNW_1.* names are the Public version names for the library.
126 There should be at most one version name for each release of Solaris,
127 with the minor number incremented by one over the previous version.
128
129 If no update to the Public-visible names in the library is made
130 in a given Solaris release, no new version name should be generated
131 for that release. If multiple updates are made to the library at
132 different points in the development of a given release of Solaris,
133 only one version should be used for the entire release.
134
135 So, for example, if an update to libwombat is made in Solaris 11,
136 you would add "SUNW_1.3" at the start of the mapfile:
137
138 SYMBOL_VERSION SUNW_1.3 { # update to libwombat, Solaris 11
139 global:
140 wb_lseek;
141 } SUNW_1.2;
142
143 Each version must inherit all symbols from its preceding version,
144 specified at the ending "}" for each version. SUNW_1.1 does not
145 inherit any symbols. SUNWprivate, if present, stands alone.
146
147 The two lines in SUNWprivate:
148 local:
149 *;
150 ensure that no symbols other than those listed in the mapfile are
151 visible to clients of the library. If there is no SUNWprivate,
152 these two lines should appear in SUNW_1.1.
153
154 For maintainability, the list of names in each version block should
155 be sorted in dictionary order (sort -d). Please comply.
156
157 The version 2 mapfile language supports a simple mechanism for conditional
158 input, in which lines in the mapfile apply only to a specific platform or
159 ELFCLASS (32/64-bit). This mechanism works very much like the #if/#endif
160 feature of the C preprocessor. For instance, the following mapfile declares
161 a version SUNW_1.1 that always exports a symbol foo, and also exports
162 the symbol bar on 32-bit sparc platforms:
163
164 $mapfile_version
165 SYMBOL_VERSION SUNW_1.1 {
166 foo;
167 $if _sparc && _ELF32
168 bar;
169 $endif
170 };
171
172 Conditional input can be used if there are ISA-specific library interfaces
173 not common to all instances of the library. It is the preferred method for
174 expressing platform specific items, as long as the differences are simple
175 (which is almost always the case). For example, see libproc, or, if you
176 are masochistic, libc or libnsl.
177
178 In addition to conditional input, there is a second heavier weight mechanism
179 for expressing ISA-specific differences. In addition to the common mapfile:
180 common/mapfile-vers
181 some libraries may have ISA-specific supplemental mapfiles, one in each
182 of the ISA directories:
183 amd64/mapfile-vers
184 i386/mapfile-vers
185 sparc/mapfile-vers
186 sparcv9/mapfile-vers
187 The ISA-specific mapfiles look like the common mapfile, except that only
188 the ISA-specific names appear. The version names are the same as those
189 in the common mapfile, but only non-empty version instances are present
190 and no inheritance specification is present. The link-editor reads the
191 information from the common and ISA-specific mapfiles and merges them
192 in memory into a single description used to create the resulting object.
193
194 ISA-specific mapfiles were used with the version 1 mapfile language, which
195 lacked conditional input. Their use is rare now, as conditional input is
196 generally preferred. However, it is important to use conditional input
197 carefully, or the resulting mapfile can be extremly difficult to read.
198
199 -------------------------------------------------------------------------------
200
201 4.0 Making interface additions to an existing library
202
203 4.1 Adding a Public interface
204
205 The first engineer to update the existing mapfile-vers file in a release needs
206 to identify the current highest version name and properly increment the minor
207 version number by 1 to be the new version name. If this is the first Public
208 interface in the shared object, a new SUNW_1.1 version name must be introduced.
209
210 The major revision number is incremented whenever an incompatible change is
211 made to an interface. This could be the case if an API changes so dramatically
212 as to invalidate dependencies. This rarely occurs in practice. It also
213 requires changing the suffix of the shared object from, say, .so.1 to .so.2
214 and introducing code to continue to ship the .so.1 version of the library.
215
216 The minor revision number is incremented whenever one or more new interfaces
217 is added to a library. Note that the minor number is not incremented on every
218 putback that makes an interface addition to the library. Rather, it is
219 incremented at most once per (external to Sun) release of the library.
220
221 4.2 Adding a Private interface
222
223 Private interfaces are the non-ABI interfaces of the library. Unlike
224 introducing a Public interface, a new entry is simply added to the
225 SUNWprivate version. No minor number increment is necessary.
226
227 If this interface happens to be the first Private interface introduced
228 into the library, the SUNWprivate version must be created (no major.minor
229 version numbers). It inherits nothing and nothing inherits from it.
230
231 If the library already has Private interfaces, they may have numbered version
232 names like SUNWprivate_m.n (due to errors of the past). If so, just use the
233 highest numbered private version name to version the new interface. There
234 is no need to introduce a new private version name. Be careful not to use
235 a lower numbered private version name; doing so can cause runtime errors
236 (as opposed to load time errors) when running an application with older
237 versions of the library.
238
239 There are libraries in the OSnet consolidation that contain only private
240 interfaces. In such libraries, the SUNWprivate_m.n may be incremented
241 to ensure that the programs that depend on them are built and delivered as a
242 integrated unit. A notable example of this is libld.so (usr/src/cmd/sgs/libld),
243 which contains the implementation of the link-editor, the public interface to
244 which is provided by the ld command. When making a modification to the interface
245 of such a library, you should follow the convention already in place.
246
247 4.3 Adding new public interfaces in an update release
248
249 Adding new public interfaces in an update release requires careful
250 coordination with the next marketing release currently under development.
251 Multiple updates ship during the period before the next marketing release
252 ships, and since it is generally impossible to know the full set of new
253 interfaces in the next marketing release until late in its development
254 (after multiple updates have shipped) it must be assumed that not all
255 interfaces added to the next marketing release will be added to an update.
256
257 Consequently, the new version number for an update cannot be a minor
258 increment, but must be a micro increment. For example, if Release N
259 has version number SUNW_1.3 and Release N+1 will have SUNW_1.4, then
260 interfaces added to an update of Release N must have micro numbers such
261 as SUNW_1.3.1, SUNW_1.3.2, etc. (note that the micro number is not
262 directly tied to the update number: SUNW_1.3.1 may appear in Update 2).
263 The micro versions form an inheritance chain that is inserted between
264 two successive minor versions. For example, the mapfile-vers file for
265 minor release "N+1" to reflect its inclusion of micro releases will
266 look like the following:
267
268 $mapfile_version 2
269
270 SYMBOL_VERSION SUNW_1.4 { # release N+1
271 global:
272 ...
273 } SUNW_1.3.2;
274
275 SYMBOL_VERSION SUNW_1.3.2 { # micro release 2 (e.g., release NU3)
276 global:
277 ...
278 } SUNW_1.3.1;
279
280 SYMBOL_VERSION SUNW_1.3.1 { # micro release 1 (e.g., release NU2)
281 global:
282 ...
283 } SUNW_1.3;
284
285 SYMBOL_VERSION SUNW_1.3 { # release N
286 global:
287 ...
288 } SUNW_1.2;
289
290 SYMBOL_VERSION SUNW_1.2 { # release N-1
291 global:
292 ...
293 } SUNW_1.1;
294
295 SYMBOL_VERSION SUNW_1.1 { # first release
296 global:
297 ...
298 };
299
300 SYMBOL_VERSION SUNW_private { # same in all releases
301 global:
302 ...
303 local:
304 *;
305 };
306
307 The corresponding update/patch mapfile-vers file will be identical
308 except for the exclusion of SUNW_1.4.
309
310 Those interfaces which are only present in Release N+1 are always put
311 into the next minor version set, SUNW_1.4.
312
313 Thus when adding a new public interface to an update, both the mapfiles
314 of the update release and next marketing release must be modified to be
315 consistent. The update versions should not be added to the marketing
316 release until the putback to the update release has occurred, to avoid
317 timing problems with the update releases (it's all too easy for projects
318 to slip out of updates, or to change ordering).
319
320 -------------------------------------------------------------------------------
321
322 5.0 How to update an interface in an existing library
323
324 5.1 Removing an existing interface
325
326 5.1.1 Moving a Public interface
327
328 No Public interfaces should ever be removed from any mapfile.
329
330 To move an interface from one library to (say) libc, the code has to be
331 deleted from the library and added to libc, then the mapfile for the
332 library has to have the interface's entry changed from:
333 getfoobar;
334 to:
335 getfoobar { TYPE = FUNCTION; FILTER = libc.so.1 };
336 See, for example, libnsl's common/mapfile-vers file.
337
338 Follow the rules for adding a new interface for the necessary changes
339 to libc's mapfile to accommodate the moved interface. In particular,
340 the new interface must be added to the current highest libc version.
341
342 To move an entire library into libc, look at what has already been done
343 for libthread, libaio, and librt.
344
345 5.1.2 Removing a Private interface
346
347 Deletion of Private interfaces is allowed, but caution should be taken;
348 it should first be established that the interface is not being used.
349 To remove a Private interface, simply delete the corresponding entry
350 for that symbol from the mapfile's SUNWprivate section.
351
352 Do not forget to delete these Public or Private interfaces from the library's
353 header files as well as from the code that implements the interfaces.
354
355 5.2 Promoting a Private interface to Public
356
357 This is similar to what's done when adding a Public interface. Promoting an
358 existing Private interface to a Public one only requires a change to the
359 existing interface definition. Private interfaces have the symbol version name
360 "SUNWprivate" associated with them. To make the interface a Public one, the
361 interface must be put into a set associated with the current Public release
362 level of the library.
363
364 As an example, if we were modifying libwombat.so.1 and its version in the
365 last release of Solaris was SUNW_1.23, any new ABI introduced in the next
366 release would be put into a version called SUNW_1.24. Therefore, whether
367 you wish to promote an existing Private interface to Public, or to introduce
368 a new Public interface, this (next successive minor numbered version level)
369 would be the version that it would be associated with.
370
371 5.3 Scoping a Private interface local
372
373 Any interfaces not present in the mapfile-vers file will be scoped local
374 due to the presence of the
375 local:
376 *;
377 lines discussed earlier. This ensures that such interfaces will not be visible
378 outside the library. To move an interface from Private to local scope, simply
379 remove the Private interface from the mapfile-vers file and the header file
380 to prevent it from being exported. This may require moving the Private
381 interface into a library-private header file. Scope reduction of Public
382 interfaces is not allowed without specific ARC review and approval.
383
384 For the interface to be used in more than one file within the library, it
385 should be in a header file that can be included by each file in the library
386 that uses the interface. For example:
387
388 #include "libprivate.h"
389
390 5.4 How to copy interfaces which are part of a standard to a new or existing
391 library
392
393 SYSVABI and SISCD are reserved version names for interfaces listed in the
394 System V Interface Definition and the Sparc Compliance Definition. Avoid using
395 these version names when copying the implementation of standard interfaces to
396 another library. Instead, use SUNW_1.1 for a new library, and SUNW_m.n for
397 an existing library (where m.n is the next release version; i.e., if the
398 last version was SUNW_1.18, then you should version the interfaces with
399 SUNW_1.19).
400
401 -------------------------------------------------------------------------------
402
403 6.0 Introducing a new library
404
405 6.1 Directories
406
407 The normal discipline for introducing a new library in OS/Net is to create a
408 new subdirectory of /usr/src/lib. The interface definition discipline is to
409 create a common/mapfile-vers file for the new library. If we were introducing
410 a new foo library, libfoo, we'd create /usr/src/lib/libfoo containing:
411 Makefile amd64/ i386/ sparcv9/
412 Makefile.com common/ sparc/
413 The common subdirectory would contain the normal source files plus the
414 mapfile-vers file. See usr/src/lib/README.Makefiles for directions on
415 how to organize the Makefiles.
416
417 6.2 The mapfile
418
419 The new common/mapfile-vers file would contain:
420
421 $mapfile_version 2
422
423 SYMBOL_VERSION SUNW_1.1 { # first release of libfoo
424 global:
425 ...
426 };
427
428 SYMBOL_VERSION SUNWprivate {
429 global:
430 ...
431 local:
432 *;
433 };
434
435 If there are no Public interfaces, the SUNW_1.1 section would be omitted.
436 If there are no Private interfaces, the SUNWprivate section would be
437 omitted and the two lines:
438 local:
439 *;
440 would be moved into SUNW_1.1
441
442 To 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
444 unbundled products), the heuristic which works to a first approximation is
445 that if it has a man page then it's Public. Also, it is really the ARC case
446 for the new interfaces that prescribes which interfaces are Public and
447 which are not (hence, which interfaces have man pages and which do not).
448
449 For maintainability, the list of names in each version block should
450 be sorted in dictionary order (sort -d). Please comply.
451
452 -------------------------------------------------------------------------------
453
454 7.0 Make an entire library obsolete
455
456 7.1 Introduce SUNWobsolete version
457
458 Use this version name not for specific interfaces but for marking an entire
459 library as obsolete. The existing public/private version names are left
460 unchanged, but a new SUNWobsolete version is created with no symbols in it.
461 This becomes a tag by which the obsolescence of the library can be recognized.
462 There is no numbering of this version name.
463
464 $mapfile_version 2
465
466 SYMBOL_VERSION SUNWobsolete {
467 global:
468 SUNWobsolete; # This is the only way to do it.
469 } SUNW_1.2;
470
471 SYMBOL_VERSION SUNW_1.2 {
472 ...
473
474 -------------------------------------------------------------------------------
475
476 8.0 Documentation
477
478 For 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
483 For information on the now-obsolete spec files, used in Solaris releases
484 7 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