Name |
Date |
Size |
#Lines |
LOC |
||
---|---|---|---|---|---|---|
.. | - | - | ||||
abi/ | H | - | - | 2,077 | 1,184 | |
auditd_plugins/ | H | - | - | 7,105 | 4,301 | |
brand/ | H | - | - | 15,964 | 8,249 | |
c_synonyms/ | H | - | - | 1,731 | 1,394 | |
cfgadm_plugins/ | H | - | - | 45,038 | 30,350 | |
common/ | H | - | - | 1,962 | 673 | |
crypt_modules/ | H | - | - | 4,098 | 2,203 | |
efcode/ | H | - | - | 21,298 | 15,290 | |
extendedFILE/ | H | - | - | 313 | 124 | |
fm/ | H | - | - | 94,771 | 61,459 | |
gss_mechs/ | H | - | - | 101,210 | 65,393 | |
hal/ | H | - | - | 8,200 | 5,182 | |
hbaapi/ | H | - | - | 6,152 | 4,746 | |
krb5/ | H | - | - | 74,574 | 50,598 | |
libadm/ | H | - | - | 14,352 | 7,774 | |
libadt_jni/ | H | - | - | 2,280 | 1,466 | |
libadutils/ | H | - | - | 5,096 | 3,404 | |
libaio/ | H | - | - | 346 | 159 | |
libast/ | H | - | - | 256,750 | 202,136 | |
libavl/ | H | - | - | 399 | 164 | |
libbc/ | H | - | - | 70,885 | 40,931 | |
libbe/ | H | - | - | 14,804 | 8,870 | |
libbrand/ | H | - | - | 2,318 | 1,086 | |
libbsdmalloc/ | H | - | - | 767 | 402 | |
libbsm/ | H | - | - | 25,765 | 17,817 | |
libc/ | H | - | - | 198,485 | 121,840 | |
libc_db/ | H | - | - | 3,485 | 2,445 | |
libcfgadm/ | H | - | - | 3,839 | 2,464 | |
libcmd/ | H | - | - | 18,464 | 15,418 | |
libcmdutils/ | H | - | - | 1,403 | 736 | |
libcommputil/ | H | - | - | 3,913 | 2,951 | |
libcontract/ | H | - | - | 2,264 | 1,485 | |
libcpc/ | H | - | - | 5,523 | 3,802 | |
libcrypt/ | H | - | - | 1,997 | 1,124 | |
libcryptoutil/ | H | - | - | 4,334 | 2,970 | |
libctf/ | H | - | - | 1,029 | 567 | |
libcurses/ | H | - | - | 40,799 | 17,878 | |
libdevice/ | H | - | - | 1,938 | 1,157 | |
libdevid/ | H | - | - | 852 | 439 | |
libdevinfo/ | H | - | - | 18,238 | 12,292 | |
libdhcpagent/ | H | - | - | 2,822 | 1,464 | |
libdhcpdu/ | H | - | - | 1,181 | 743 | |
libdhcpsvc/ | H | - | - | 13,846 | 8,103 | |
libdhcputil/ | H | - | - | 3,917 | 2,365 | |
libdiagcode/amd64/ | H | - | - | 37 | 5 | |
libdisasm/ | H | - | - | 6,084 | 4,002 | |
libdiskmgt/ | H | - | - | 13,139 | 9,203 | |
libdladm/ | H | - | - | 26,663 | 19,407 | |
libdll/ | H | - | - | 3,495 | 2,689 | |
libdlpi/ | H | - | - | 2,547 | 1,532 | |
libdns_sd/ | H | - | - | 9,080 | 4,309 | |
libdoor/ | H | - | - | 309 | 128 | |
libds/ | H | - | - | 1,101 | 696 | |
libdscfg/ | H | - | - | 7,778 | 5,276 | |
libdscp/ | H | - | - | 1,281 | 696 | |
libdtrace/ | H | - | - | 42,786 | 29,699 | |
libdtrace_jni/ | H | - | - | 24,941 | 13,625 | |
libefi/ | H | - | - | 1,602 | 1,042 | |
libelfsign/ | H | - | - | 2,667 | 1,859 | |
libeti/ | H | - | - | 13,489 | 8,154 | |
libexacct/ | H | - | - | 2,568 | 1,684 | |
libfcoe/ | H | - | - | 1,462 | 1,018 | |
libfdisk/ | H | - | - | 1,988 | 1,260 | |
libfru/ | H | - | - | 27,064 | 22,335 | |
libfruutils/ | H | - | - | 857 | 538 | |
libfsmgt/ | H | - | - | 5,792 | 3,089 | |
libfstyp/ | H | - | - | 937 | 581 | |
libgen/ | H | - | - | 3,433 | 2,097 | |
libgrubmgmt/ | H | - | - | 2,857 | 1,803 | |
libgss/ | H | - | - | 9,796 | 5,994 | |
libhotplug/ | H | - | - | 1,888 | 1,116 | |
libidmap/ | H | - | - | 7,358 | 4,638 | |
libilb/ | H | - | - | 2,922 | 1,859 | |
libima/ | H | - | - | 11,561 | 8,015 | |
libinetsvc/ | H | - | - | 2,419 | 1,549 | |
libinetutil/ | H | - | - | 3,207 | 1,610 | |
libinstzones/ | H | - | - | 8,264 | 3,750 | |
libintl/ | H | - | - | 309 | 125 | |
libipadm/ | H | - | - | 11,103 | 7,476 | |
libipmi/ | H | - | - | 7,817 | 5,106 | |
libipmp/ | H | - | - | 2,521 | 1,424 | |
libipp/ | H | - | - | 1,316 | 699 | |
libipsecutil/ | H | - | - | 6,389 | 4,325 | |
libiscsit/ | H | - | - | 2,958 | 1,463 | |
libkmf/ | H | - | - | 38,503 | 27,610 | |
libkmsagent/ | H | - | - | 66,418 | 50,991 | |
libkrb5/ | H | - | - | 616 | 425 | |
libkstat/ | H | - | - | 825 | 449 | |
libkvm/ | H | - | - | 1,826 | 1,190 | |
libldap4/ | H | - | - | 29,079 | 20,550 | |
libldap5/ | H | - | - | 40,796 | 27,713 | |
liblgrp/ | H | - | - | 1,553 | 802 | |
liblm/ | H | - | - | 351 | 117 | |
libmail/ | H | - | - | 2,494 | 1,221 | |
libmalloc/ | H | - | - | 1,792 | 949 | |
libmapid/ | H | - | - | 1,712 | 883 | |
libmapmalloc/ | H | - | - | 812 | 408 | |
libmd/ | H | - | - | 1,271 | 427 | |
libmd5/ | H | - | - | 297 | 114 | |
libmp/ | H | - | - | 1,893 | 1,295 | |
libmtmalloc/ | H | - | - | 2,630 | 1,376 | |
libndmp/ | H | - | - | 2,493 | 1,656 | |
libnisdb/ | H | - | - | 53,588 | 36,107 | |
libnls/ | H | - | - | 780 | 300 | |
libnsctl/ | H | - | - | 1,331 | 754 | |
libnsl/ | H | - | - | 68,089 | 43,784 | |
libntfs/ | H | - | - | 32,480 | 19,233 | |
libnvpair/ | H | - | - | 2,078 | 1,377 | |
libnwam/ | H | - | - | 12,042 | 8,721 | |
libpam/ | H | - | - | 4,106 | 2,707 | |
libparted/ | H | - | - | 62,581 | 44,128 | |
libpcp/ | H | - | - | 2,329 | 1,263 | |
libpctx/ | H | - | - | 1,448 | 946 | |
libpicl/ | H | - | - | 1,882 | 1,164 | |
libpicltree/ | H | - | - | 4,529 | 3,139 | |
libpkg/ | H | - | - | 25,739 | 15,544 | |
libplot/ | H | - | - | 8,170 | 3,441 | |
libpool/ | H | - | - | 15,617 | 10,273 | |
libpp/ | H | - | - | 22,180 | 19,189 | |
libpri/ | H | - | - | 520 | 219 | |
libproc/ | H | - | - | 25,227 | 17,019 | |
libproject/ | H | - | - | 1,736 | 1,040 | |
libprtdiag/ | H | - | - | 8,096 | 5,245 | |
libprtdiag_psr/ | H | - | - | 38,451 | 26,435 | |
libpthread/ | H | - | - | 517 | 330 | |
libraidcfg/ | H | - | - | 5,453 | 4,130 | |
librcm/ | H | - | - | 2,770 | 1,776 | |
librdc/ | H | - | - | 3,939 | 2,833 | |
libreparse/ | H | - | - | 854 | 453 | |
libresolv/ | H | - | - | 3,613 | 2,468 | |
libresolv2/ | H | - | - | 47,587 | 32,874 | |
librestart/ | H | - | - | 4,746 | 3,178 | |
librpcsvc/ | H | - | - | 1,344 | 733 | |
librsc/ | H | - | - | 1,098 | 538 | |
librsm/ | H | - | - | 6,221 | 4,249 | |
librstp/ | H | - | - | 7,569 | 5,278 | |
librt/ | H | - | - | 414 | 224 | |
libsasl/ | H | - | - | 18,095 | 11,433 | |
libscf/ | H | - | - | 23,112 | 15,819 | |
libsched/ | H | - | - | 293 | 111 | |
libsctp/ | H | - | - | 687 | 391 | |
libsec/ | H | - | - | 5,073 | 3,777 | |
libsecdb/ | H | - | - | 13,064 | 5,346 | |
libsendfile/ | H | - | - | 443 | 206 | |
libshare/ | H | - | - | 22,039 | 14,117 | |
libshell/ | H | - | - | 117,904 | 98,633 | |
libsip/ | H | - | - | 21,907 | 15,923 | |
libsldap/ | H | - | - | 31,399 | 22,282 | |
libslp/ | H | - | - | 47,809 | 23,989 | |
libsmbfs/ | H | - | - | 19,903 | 11,290 | |
libsmbios/ | H | - | - | 796 | 433 | |
libsmedia/ | H | - | - | 5,190 | 3,157 | |
libsocket/ | H | - | - | 7,475 | 4,641 | |
libsqlite/ | H | - | - | 77,704 | 60,349 | |
libsrpt/ | H | - | - | 981 | 420 | |
libstmf/ | H | - | - | 13,276 | 9,235 | |
libstmfproxy/ | H | - | - | 555 | 270 | |
libsum/ | H | - | - | 4,496 | 3,056 | |
libsun_ima/ | H | - | - | 3,812 | 2,926 | |
libsys/ | H | - | - | 1,156 | 911 | |
libsysevent/ | H | - | - | 4,423 | 2,880 | |
libtecla/ | H | - | - | 29,806 | 12,127 | |
libthread/ | H | - | - | 610 | 415 | |
libtnf/ | H | - | - | 3,747 | 1,931 | |
libtnfctl/ | H | - | - | 10,004 | 6,113 | |
libtnfprobe/ | H | - | - | 4,085 | 2,208 | |
libtsalarm/ | H | - | - | 583 | 307 | |
libtsnet/ | H | - | - | 2,392 | 1,513 | |
libtsol/ | H | - | - | 5,141 | 2,773 | |
libumem/ | H | - | - | 10,083 | 6,032 | |
libunistat/ | H | - | - | 1,450 | 1,073 | |
libuuid/ | H | - | - | 1,512 | 728 | |
libuutil/ | H | - | - | 3,759 | 2,366 | |
libv12n/ | H | - | - | 1,239 | 724 | |
libvolmgt/ | H | - | - | 2,375 | 966 | |
libvrrpadm/ | H | - | - | 1,563 | 933 | |
libvscan/ | H | - | - | 2,194 | 1,278 | |
libw/ | H | - | - | 345 | 165 | |
libwanboot/ | H | - | - | 1,183 | 665 | |
libwanbootutil/ | H | - | - | 1,194 | 535 | |
libwrap/ | H | - | - | 4,038 | 2,332 | |
libxcurses/ | H | - | - | 38,663 | 23,528 | |
libxcurses2/ | H | - | - | 25,730 | 13,949 | |
libxnet/ | H | - | - | 427 | 242 | |
libzfs/ | H | - | - | 20,213 | 13,918 | |
libzfs_jni/ | H | - | - | 5,763 | 3,542 | |
libzonecfg/ | H | - | - | 9,757 | 6,908 | |
libzoneinfo/ | H | - | - | 1,760 | 1,226 | |
libzonestat/ | H | - | - | 5,096 | 3,979 | |
libzpool/ | H | - | - | 2,375 | 1,537 | |
lvm/ | H | - | - | 86,127 | 55,637 | |
madv/ | H | - | - | 1,061 | 645 | |
mpapi/ | H | - | - | 15,291 | 7,214 | |
mpss/ | H | - | - | 750 | 415 | |
nametoaddr/ | H | - | - | 922 | 422 | |
ncad_addr/ | H | - | - | 578 | 285 | |
nsswitch/ | H | - | - | 27,539 | 16,995 | |
pam_modules/ | H | - | - | 20,374 | 11,056 | |
passwdutil/ | H | - | - | 5,561 | 3,627 | |
pkcs11/ | H | - | - | 116,519 | 73,055 | |
policykit/ | H | - | - | 728 | 378 | |
print/ | H | - | - | 30,339 | 19,229 | |
pylibbe/ | H | - | - | 1,316 | 769 | |
pysolaris/ | H | - | - | 388 | 187 | |
pyzfs/ | H | - | - | 2,021 | 1,341 | |
raidcfg_plugins/ | H | - | - | 53 | 15 | |
rpcsec_gss/ | H | - | - | 3,694 | 2,306 | |
sasl_plugins/ | H | - | - | 9,695 | 7,210 | |
scsi/ | H | - | - | 20,178 | 12,687 | |
smbsrv/ | H | - | - | 73,306 | 45,568 | |
smhba/ | H | - | - | 6,726 | 5,201 | |
storage/ | H | - | - | 21,113 | 13,801 | |
sun_fc/ | H | - | - | 14,805 | 7,976 | |
sun_sas/ | H | - | - | 7,158 | 4,618 | |
udapl/ | H | - | - | 46,471 | 24,564 | |
watchmalloc/ | H | - | - | 1,899 | 1,203 | |
Makefile | H A D | 16-Aug-2010 | 13.4 KiB | 697 | 593 | |
Makefile.asthdr | H A D | 27-Dec-2008 | 3.7 KiB | 86 | 33 | |
Makefile.astmsg | H A D | 27-Dec-2008 | 3.1 KiB | 96 | 41 | |
Makefile.filter.com | H A D | 07-May-2009 | 2.9 KiB | 83 | 5 | |
Makefile.filter.targ | H A D | 07-May-2009 | 1.4 KiB | 49 | 37 | |
Makefile.lib | H A D | 28-Jun-2010 | 8.7 KiB | 261 | 118 | |
Makefile.lib.64 | H A D | 09-Aug-2006 | 1.1 KiB | 37 | 34 | |
Makefile.mach | H A D | 14-Jun-2005 | 1.7 KiB | 60 | 15 | |
Makefile.rootfs | H A D | 14-Jun-2005 | 1.1 KiB | 33 | 2 | |
Makefile.targ | H A D | 28-Jun-2010 | 2.8 KiB | 113 | 59 | |
README.Makefiles | H A D | 09-Aug-2006 | 21.9 KiB | 648 | 452 | |
README.mapfiles | H A D | 25-Jun-2010 | 18.7 KiB | 488 | 386 | |
inc.flg | H A D | 14-Jun-2005 | 1.3 KiB | 38 | 3 | |
req.flg | H A D | 17-May-2007 | 1.2 KiB | 37 | 8 |
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