xref: /illumos-gate/usr/src/lib/Makefile.lib (revision ee637354)
17c478bd9Sstevel@tonic-gate#
27c478bd9Sstevel@tonic-gate# CDDL HEADER START
37c478bd9Sstevel@tonic-gate#
47c478bd9Sstevel@tonic-gate# The contents of this file are subject to the terms of the
5f808c858Sraf# Common Development and Distribution License (the "License").
6f808c858Sraf# You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate#
87c478bd9Sstevel@tonic-gate# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate# or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate# See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate# and limitations under the License.
127c478bd9Sstevel@tonic-gate#
137c478bd9Sstevel@tonic-gate# When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate# If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate# fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate# information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate#
197c478bd9Sstevel@tonic-gate# CDDL HEADER END
207c478bd9Sstevel@tonic-gate#
21*ee637354SGary Mills# Copyright 2015 Gary Mills
22b83ec4edSjmcp# Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
237c478bd9Sstevel@tonic-gate#
247c478bd9Sstevel@tonic-gate#
257c478bd9Sstevel@tonic-gate# Definitions common to libraries.
267c478bd9Sstevel@tonic-gate#
277c478bd9Sstevel@tonic-gate# include global definitions; SRC should be defined in the shell.
287c478bd9Sstevel@tonic-gate# SRC is needed until RFE 1026993 is implemented.
297c478bd9Sstevel@tonic-gate
307c478bd9Sstevel@tonic-gateinclude		$(SRC)/Makefile.master
317c478bd9Sstevel@tonic-gate
327c478bd9Sstevel@tonic-gateLORDER=		lorder
337c478bd9Sstevel@tonic-gateTSORT=		tsort
347c478bd9Sstevel@tonic-gateAWK=		awk
357c478bd9Sstevel@tonic-gate
36f808c858Sraf#
37f808c858Sraf# By default, we define the source directory for libraries to be
38f808c858Sraf# one level up from the ISA-specific directory, where the code is
39f808c858Sraf# actually built.  Many libraries define a 'common' directory to
40f808c858Sraf# contain the source.  These libraries must redefine SRCDIR as:
41f808c858Sraf#	SRCDIR = ../common
42f808c858Sraf# Other variations are possible (../port, ../src, etc).
43f808c858Sraf#
44f808c858SrafSRCDIR =	..
45f808c858Sraf
46f808c858Sraf#
472a8d6ebaSRod Evans# We define MAPFILES here for the benefit of most libraries, those that
482a8d6ebaSRod Evans# follow the convention of having source files and other common files
492a8d6ebaSRod Evans# in the $(SRCDIR) directory.  Libraries that do not follow this
502a8d6ebaSRod Evans# convention must define MAPFILES, or MAPFILEDIR for themselves.
51f808c858Sraf# Libraries that do follow this convention but that need supplemental
52f808c858Sraf# ISA-specific mapfiles can augment MAPFILES like this:
53f808c858Sraf#	MAPFILES += mapfile-vers
54f808c858Sraf#
552a8d6ebaSRod EvansMAPFILEDIR =	$(SRCDIR)
562a8d6ebaSRod EvansMAPFILES =	$(MAPFILEDIR)/mapfile-vers
57f808c858Sraf
587c478bd9Sstevel@tonic-gate#
597c478bd9Sstevel@tonic-gate# If HDRDIR is left unset, then it's possible for the $(ROOTHDRDIR)/%
607c478bd9Sstevel@tonic-gate# install rule in lib/Makefile.targ to generate false matches if there
617c478bd9Sstevel@tonic-gate# are any common directory names between / and /usr/include (`xfn' is
627c478bd9Sstevel@tonic-gate# one common example).  To prevent this, we set HDRDIR to a directory
637c478bd9Sstevel@tonic-gate# name that will almost surely not exist on the build machine.
647c478bd9Sstevel@tonic-gate#
657c478bd9Sstevel@tonic-gateHDRDIR=		/__nonexistent_directory__
66f808c858Sraf
677c478bd9Sstevel@tonic-gate#
687c478bd9Sstevel@tonic-gate# We don't build archive (*.a) libraries by default anymore.
697c478bd9Sstevel@tonic-gate# If a component of the build needs to build an archive library
707c478bd9Sstevel@tonic-gate# for its own internal purposes, it can define LIBS for itself
717c478bd9Sstevel@tonic-gate# after including Makefile.lib, like this:
727c478bd9Sstevel@tonic-gate# 	LIBS = $(LIBRARY)
737c478bd9Sstevel@tonic-gate# or:
747c478bd9Sstevel@tonic-gate# 	LIBS = $(LIBRARYCCC)
757c478bd9Sstevel@tonic-gate# Archive libraries must not be installed in the proto area.
767c478bd9Sstevel@tonic-gate#
777c478bd9Sstevel@tonic-gateLIBS=
787c478bd9Sstevel@tonic-gateMACHLIBS=	$(LIBS:%=$(MACH)/%)
797c478bd9Sstevel@tonic-gateMACHLIBS64=	$(LIBS:%=$(MACH64)/%)
807c478bd9Sstevel@tonic-gateDYNLIB=		$(LIBRARY:.a=.so$(VERS))
817c478bd9Sstevel@tonic-gateDYNLIBPSR=	$(LIBRARY:.a=_psr.so$(VERS))
827c478bd9Sstevel@tonic-gateDYNLIBCCC=	$(LIBRARYCCC:.a=.so$(VERS))
837c478bd9Sstevel@tonic-gateLIBLINKS=	$(LIBRARY:.a=.so)
847c478bd9Sstevel@tonic-gateLIBLINKSCCC=	$(LIBRARYCCC:.a=.so)
857c478bd9Sstevel@tonic-gateLIBNAME=	$(LIBRARY:lib%.a=%)
867c478bd9Sstevel@tonic-gateLIBLINKPATH=
877c478bd9Sstevel@tonic-gateLIBNULL=	null.a
887c478bd9Sstevel@tonic-gateROOTHDRDIR=	$(ROOT)/usr/include
897c478bd9Sstevel@tonic-gateROOTLIBDIR=	$(ROOT)/usr/lib
907c478bd9Sstevel@tonic-gateROOTLIBDIR64=	$(ROOT)/usr/lib/$(MACH64)
917c478bd9Sstevel@tonic-gateROOTFS_LIBDIR=	$(ROOT)/lib
927c478bd9Sstevel@tonic-gateROOTFS_LIBDIR64=	$(ROOT)/lib/$(MACH64)
937c478bd9Sstevel@tonic-gateROOTLINTDIR=	$(ROOTLIBDIR)
947c478bd9Sstevel@tonic-gateROOTFS_LINTDIR=	$(ROOTFS_LIBDIR)
957c478bd9Sstevel@tonic-gateROOTFS_LINTDIR64=	$(ROOTFS_LIBDIR64)
967c478bd9Sstevel@tonic-gateROOTHDRS=	$(HDRS:%=$(ROOTHDRDIR)/%)
977c478bd9Sstevel@tonic-gateHDRSRCS=	$(HDRS:%=$(HDRDIR)/%)
987c478bd9Sstevel@tonic-gateCHECKHDRS=	$(HDRSRCS:%.h=%.check)
997c478bd9Sstevel@tonic-gateROOTLIBS=	$(LIBS:%=$(ROOTLIBDIR)/%)
1007c478bd9Sstevel@tonic-gateROOTLIBS64=	$(LIBS:%=$(ROOTLIBDIR64)/%)
1017c478bd9Sstevel@tonic-gateROOTFS_LIBS=	$(DYNLIB:%=$(ROOTFS_LIBDIR)/%)
1027c478bd9Sstevel@tonic-gateROOTFS_LIBS64=	$(DYNLIB:%=$(ROOTFS_LIBDIR64)/%)
1037c478bd9Sstevel@tonic-gateROOTLINKS=	$(ROOTLIBDIR)/$(LIBLINKS)
1047c478bd9Sstevel@tonic-gateROOTLINKS64=	$(ROOTLIBDIR64)/$(LIBLINKS)
1057c478bd9Sstevel@tonic-gateROOTFS_LINKS=	$(ROOTFS_LIBDIR)/$(LIBLINKS)
1067c478bd9Sstevel@tonic-gateROOTFS_LINKS64=	$(ROOTFS_LIBDIR64)/$(LIBLINKS)
1077c478bd9Sstevel@tonic-gateROOTLINKSCCC=	$(ROOTLIBDIR)/$(LIBLINKSCCC)
1087c478bd9Sstevel@tonic-gateROOTLINKSCCC64=	$(ROOTLIBDIR64)/$(LIBLINKSCCC)
1097c478bd9Sstevel@tonic-gateROOTFS_LINKSCCC=	$(ROOTFS_LIBDIR)/$(LIBLINKSCCC)
1107c478bd9Sstevel@tonic-gateROOTFS_LINKSCCC64=	$(ROOTFS_LIBDIR64)/$(LIBLINKSCCC)
1117c478bd9Sstevel@tonic-gateROOTLINT=	$(LINTSRC:%=$(ROOTLINTDIR)/%)
1127c478bd9Sstevel@tonic-gateROOTFS_LINT=	$(LINTSRC:%=$(ROOTFS_LINTDIR)/%)
1137c478bd9Sstevel@tonic-gateROOTFS_LINT64=	$(LINTSRC:%=$(ROOTFS_LINTDIR64)/%)
1147c478bd9Sstevel@tonic-gateROOTMAN3=     $(ROOT)/usr/share/man/man3
1157c478bd9Sstevel@tonic-gateROOTMAN3FILES=        $(MAN3FILES:%=$(ROOTMAN3)/%)
1167c478bd9Sstevel@tonic-gate$(ROOTMAN3FILES) := FILEMODE= 444
1177c478bd9Sstevel@tonic-gate
118da2e3ebdSchin# Demo rules
119da2e3ebdSchinDEMOFILES=
120da2e3ebdSchinDEMOFILESRCDIR=		common
121da2e3ebdSchinROOTDEMODIRBASE=	__nonexistent_directory__
122da2e3ebdSchinROOTDEMODIRS=
123da2e3ebdSchinROOTDEMOFILES=	$(DEMOFILES:%=$(ROOTDEMODIRBASE)/%)
124da2e3ebdSchin$(ROOTDEMODIRS) :=	DIRMODE =	755
125da2e3ebdSchin
1267c478bd9Sstevel@tonic-gateLINTLIB=	llib-l$(LIBNAME).ln
1277c478bd9Sstevel@tonic-gateLINTFLAGS=	-uaxm
1280bb07399SNick ToddLINTFLAGS64=	-uaxm -m64
1297c478bd9Sstevel@tonic-gateLINTSRC=	$(LINTLIB:%.ln=%)
1307c478bd9Sstevel@tonic-gateLINTOUT=	lint.out
1317c478bd9Sstevel@tonic-gateARFLAGS=	r
1327c478bd9Sstevel@tonic-gateSONAME=		$(DYNLIB)
1337c478bd9Sstevel@tonic-gate# For most libraries, we should be able to resolve all symbols at link time,
1347c478bd9Sstevel@tonic-gate# either within the library or as dependencies, all text should be pure, and
1357c478bd9Sstevel@tonic-gate# combining relocations into one relocation table reduces startup costs.
1367c478bd9Sstevel@tonic-gate# All options are tunable to allow overload/omission from lower makefiles.
1377c478bd9Sstevel@tonic-gate
1387c478bd9Sstevel@tonic-gate
1397c478bd9Sstevel@tonic-gateHSONAME=	-h$(SONAME)
14067e3a03eSrieDYNFLAGS=	$(HSONAME) $(ZTEXT) $(ZDEFS) $(BDIRECT) \
14124da5b34Srie		$(MAPFILES:%=-M%) $(MAPFILE.PGA:%=-M%) $(MAPFILE.NED:%=-M%)
1427c478bd9Sstevel@tonic-gate
1437c478bd9Sstevel@tonic-gateLDLIBS=		$(LDLIBS.lib)
1447c478bd9Sstevel@tonic-gate
1457c478bd9Sstevel@tonic-gateOBJS=		$(OBJECTS:%=objs/%)
1467c478bd9Sstevel@tonic-gatePICS=		$(OBJECTS:%=pics/%)
1477c478bd9Sstevel@tonic-gate
1487c478bd9Sstevel@tonic-gate# Declare that all library .o's can all be made in parallel.
1497c478bd9Sstevel@tonic-gate# The DUMMY target is for those instances where OBJS and PICS
1507c478bd9Sstevel@tonic-gate# are empty (to avoid an unconditional .PARALLEL declaration).
1517c478bd9Sstevel@tonic-gate.PARALLEL:	$(OBJS) $(PICS) DUMMY
1527c478bd9Sstevel@tonic-gate
1537c478bd9Sstevel@tonic-gate# default value for "portable" source
1547c478bd9Sstevel@tonic-gateSRCS=		$(OBJECTS:%.o=$(SRCDIR)/%.c)
1557c478bd9Sstevel@tonic-gate
1567c478bd9Sstevel@tonic-gate# default build of an archive and a shared object,
1577c478bd9Sstevel@tonic-gate# overridden locally when extra processing is needed
1587c478bd9Sstevel@tonic-gateBUILD.AR=	$(AR) $(ARFLAGS) $@ $(AROBJS)
159*ee637354SGary MillsBUILD.SO=	$(CC) $(CFLAGS) -o $@ $(GSHARED) $(DYNFLAGS) \
160*ee637354SGary Mills		$(PICS) $(EXTPICS) $(LDLIBS)
161*ee637354SGary MillsBUILDCCC.SO=	$(CCC) $(CCFLAGS) -o $@ $(GSHARED) $(DYNFLAGS) \
162*ee637354SGary Mills		$(PICS) $(EXTPICS) $(LDLIBS)
1637c478bd9Sstevel@tonic-gate
1647c478bd9Sstevel@tonic-gate# default dynamic library symlink
1657c478bd9Sstevel@tonic-gateINS.liblink=	-$(RM) $@; $(SYMLINK) $(LIBLINKPATH)$(LIBLINKS)$(VERS) $@
1667c478bd9Sstevel@tonic-gateINS.liblinkccc=	-$(RM) $@; $(SYMLINK) $(LIBLINKPATH)$(LIBLINKSCCC)$(VERS) $@
1677c478bd9Sstevel@tonic-gate
1687c478bd9Sstevel@tonic-gate# default 64-bit dynamic library symlink
1697c478bd9Sstevel@tonic-gateINS.liblink64=	-$(RM) $@; $(SYMLINK) $(LIBLINKPATH)$(LIBLINKS)$(VERS) $@
1707c478bd9Sstevel@tonic-gateINS.liblinkccc64= -$(RM) $@; $(SYMLINK) $(LIBLINKPATH)$(LIBLINKSCCC)$(VERS) $@
1717c478bd9Sstevel@tonic-gate
1727c478bd9Sstevel@tonic-gate#
1737c478bd9Sstevel@tonic-gate# If appropriate, augment POST_PROCESS_O and POST_PROCESS_SO to do CTF
1747c478bd9Sstevel@tonic-gate# processing.  We'd like to just conditionally append to POST_PROCESS_O and
1757c478bd9Sstevel@tonic-gate# POST_PROCESS_SO, but ParallelMake has a bug which causes the same value to
1767c478bd9Sstevel@tonic-gate# sometimes get appended more than once, which will cause ctfconvert to fail.
1777c478bd9Sstevel@tonic-gate# So, instead we introduce CTFCONVERT_POST and CTFMERGE_POST, which are always
1787c478bd9Sstevel@tonic-gate# appended to POST_PROCESS_O and POST_PROCESS_SO but are no-ops unless CTF
1797c478bd9Sstevel@tonic-gate# processing should be done.
1807c478bd9Sstevel@tonic-gate#
1817c478bd9Sstevel@tonic-gateCTFCONVERT_POST = :
1827c478bd9Sstevel@tonic-gateCTFMERGE_POST	= :
1837c478bd9Sstevel@tonic-gatePOST_PROCESS_O += ; $(CTFCONVERT_POST)
1847c478bd9Sstevel@tonic-gatePOST_PROCESS_SO += ; $(CTFMERGE_POST)
1857c478bd9Sstevel@tonic-gate
186d69cdb36SRichard LoweCTFMERGE_LIB	= $(CTFMERGE) $(CTFMRGFLAGS) -t -f -L VERSION -o $@ $(PICS)
1877c478bd9Sstevel@tonic-gate
1887c478bd9Sstevel@tonic-gate# conditional assignments
1897c478bd9Sstevel@tonic-gate
1907c478bd9Sstevel@tonic-gate$(OBJS)  :=	sparc_CFLAGS += -xregs=no%appl
1917c478bd9Sstevel@tonic-gate
1927c478bd9Sstevel@tonic-gate$(PICS)  :=	sparc_CFLAGS += -xregs=no%appl $(sparc_C_PICFLAGS)
1937c478bd9Sstevel@tonic-gate$(PICS)  :=	sparcv9_CFLAGS += -xregs=no%appl $(sparcv9_C_PICFLAGS)
1947c478bd9Sstevel@tonic-gate$(PICS)  :=	i386_CFLAGS += $(i386_C_PICFLAGS)
1957c478bd9Sstevel@tonic-gate$(PICS)  :=	amd64_CFLAGS += $(amd64_C_PICFLAGS)
1967c478bd9Sstevel@tonic-gate$(PICS)  :=	CCFLAGS += $(CC_PICFLAGS)
1977c478bd9Sstevel@tonic-gate$(PICS)  :=	CPPFLAGS += -DPIC -D_REENTRANT
1987c478bd9Sstevel@tonic-gate$(PICS)  :=	sparcv9_CCFLAGS += -xregs=no%appl $(sparcv9_CC_PICFLAGS)
1997c478bd9Sstevel@tonic-gate$(PICS)  :=	amd64_CCFLAGS += $(amd64_CC_PICFLAGS)
2007c478bd9Sstevel@tonic-gate$(PICS)  :=	CFLAGS += $(CTF_FLAGS)
2017c478bd9Sstevel@tonic-gate$(PICS)	 :=	CFLAGS64 += $(CTF_FLAGS)
2027c478bd9Sstevel@tonic-gate$(PICS)  :=	CTFCONVERT_POST = $(CTFCONVERT_O)
2037c478bd9Sstevel@tonic-gate$(DYNLIB) :=	CTFMERGE_POST = $(CTFMERGE_LIB)
2047c478bd9Sstevel@tonic-gate
2057c478bd9Sstevel@tonic-gate$(LINTLIB):=	LOG = -DLOGGING
2067c478bd9Sstevel@tonic-gate$(LIBRARY):=	AROBJS = $(OBJS)
2077c478bd9Sstevel@tonic-gate$(LIBRARY):=	DIR = objs
2087c478bd9Sstevel@tonic-gate$(DYNLIB):=	DIR = pics
2097c478bd9Sstevel@tonic-gate$(DYNLIBCCC):=	DIR = pics
2107c478bd9Sstevel@tonic-gate
2117c478bd9Sstevel@tonic-gateSONAMECCC=	$(DYNLIBCCC)
2127c478bd9Sstevel@tonic-gateHSONAMECCC=	-h $(SONAMECCC)
2137c478bd9Sstevel@tonic-gate#
2147c478bd9Sstevel@tonic-gate# Keep in sync with the standard DYNFLAGS
2157c478bd9Sstevel@tonic-gate#
21667e3a03eSrie$(DYNLIBCCC):=	DYNFLAGS = $(HSONAMECCC) $(ZTEXT) $(ZDEFS) \
21724da5b34Srie		$(MAPFILES:%=-M%) $(MAPFILE.PGA:%=-M%) $(MAPFILE.NED:%=-M%) \
218f6acbf7cSrie		$(BDIRECT) $(NORUNPATH)
2197c478bd9Sstevel@tonic-gate
2207c478bd9Sstevel@tonic-gate
2217c478bd9Sstevel@tonic-gate# build rule for "portable" source
2227c478bd9Sstevel@tonic-gateobjs/%.o pics/%.o: %.c
2237c478bd9Sstevel@tonic-gate	$(COMPILE.c) -o $@ $<
2247c478bd9Sstevel@tonic-gate	$(POST_PROCESS_O)
2257c478bd9Sstevel@tonic-gate
2267c478bd9Sstevel@tonic-gateobjs/%.o pics/%.o: %.cc
2277c478bd9Sstevel@tonic-gate	$(COMPILE.cc) -o $@ $<
2287c478bd9Sstevel@tonic-gate	$(POST_PROCESS_O)
2297c478bd9Sstevel@tonic-gate
2307c478bd9Sstevel@tonic-gate.PRECIOUS: $(LIBS)
2317c478bd9Sstevel@tonic-gate
2327c478bd9Sstevel@tonic-gate# Define the majority text domain in this directory.
2337c478bd9Sstevel@tonic-gateTEXT_DOMAIN= SUNW_OST_OSLIB
2347c478bd9Sstevel@tonic-gate
2357c478bd9Sstevel@tonic-gate$(ROOTMAN3)/%: %.sunman
2367c478bd9Sstevel@tonic-gate	$(INS.rename)
2377c478bd9Sstevel@tonic-gate
2387c478bd9Sstevel@tonic-gate#
2397c478bd9Sstevel@tonic-gate# For library source code, we expect that some symbols may not be used or
2407c478bd9Sstevel@tonic-gate# may *appear* to be able to rescoped to static; shut lint up.  Never add
2417c478bd9Sstevel@tonic-gate# a flag here unless you're *sure* that all libraries need to be linted
2427c478bd9Sstevel@tonic-gate# with it.
2437c478bd9Sstevel@tonic-gate#
2447c478bd9Sstevel@tonic-gateLINTCHECKFLAGS = -m -erroff=E_NAME_DEF_NOT_USED2
2457c478bd9Sstevel@tonic-gateLINTCHECKFLAGS += -erroff=E_NAME_DECL_NOT_USED_DEF2
2467c478bd9Sstevel@tonic-gate
2477c478bd9Sstevel@tonic-gate#
248f808c858Sraf# Target Architecture
2497c478bd9Sstevel@tonic-gate#
250f808c858SrafTARGETMACH=	$(MACH)
2517c478bd9Sstevel@tonic-gate
2527c478bd9Sstevel@tonic-gate#
2537c478bd9Sstevel@tonic-gate# Allow people to define their own clobber rules.  Normal makefiles
2547c478bd9Sstevel@tonic-gate# shouldn't override this - they should override $(CLOBBERFILES) instead.
2557c478bd9Sstevel@tonic-gate#
256f808c858SrafCLOBBERTARGFILES= $(LIBS) $(DYNLIB) $(CLOBBERFILES)
257