xref: /illumos-gate/usr/src/lib/Makefile.lib (revision 856f710c)
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*856f710cSAndy Fiddaman# Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
22ee637354SGary Mills# Copyright 2015 Gary Mills
237b07063dSIgor Kozhukhov# Copyright 2015 Igor Kozhukhov <ikozhukhov@gmail.com>
24b83ec4edSjmcp# Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
25bc1f688bSRobert Mustacchi# Copyright (c) 2015, Joyent, Inc.
267c478bd9Sstevel@tonic-gate#
277c478bd9Sstevel@tonic-gate#
287c478bd9Sstevel@tonic-gate# Definitions common to libraries.
297c478bd9Sstevel@tonic-gate#
307c478bd9Sstevel@tonic-gate# include global definitions; SRC should be defined in the shell.
317c478bd9Sstevel@tonic-gate# SRC is needed until RFE 1026993 is implemented.
327c478bd9Sstevel@tonic-gate
337c478bd9Sstevel@tonic-gateinclude		$(SRC)/Makefile.master
347c478bd9Sstevel@tonic-gate
357c478bd9Sstevel@tonic-gateLORDER=		lorder
367c478bd9Sstevel@tonic-gateTSORT=		tsort
377c478bd9Sstevel@tonic-gate
38f808c858Sraf#
39f808c858Sraf# By default, we define the source directory for libraries to be
40f808c858Sraf# one level up from the ISA-specific directory, where the code is
41f808c858Sraf# actually built.  Many libraries define a 'common' directory to
42f808c858Sraf# contain the source.  These libraries must redefine SRCDIR as:
43f808c858Sraf#	SRCDIR = ../common
44f808c858Sraf# Other variations are possible (../port, ../src, etc).
45f808c858Sraf#
46f808c858SrafSRCDIR =	..
47f808c858Sraf
48f808c858Sraf#
492a8d6ebaSRod Evans# We define MAPFILES here for the benefit of most libraries, those that
502a8d6ebaSRod Evans# follow the convention of having source files and other common files
512a8d6ebaSRod Evans# in the $(SRCDIR) directory.  Libraries that do not follow this
522a8d6ebaSRod Evans# convention must define MAPFILES, or MAPFILEDIR for themselves.
53f808c858Sraf# Libraries that do follow this convention but that need supplemental
54f808c858Sraf# ISA-specific mapfiles can augment MAPFILES like this:
55f808c858Sraf#	MAPFILES += mapfile-vers
56f808c858Sraf#
572a8d6ebaSRod EvansMAPFILEDIR =	$(SRCDIR)
582a8d6ebaSRod EvansMAPFILES =	$(MAPFILEDIR)/mapfile-vers
59f808c858Sraf
607c478bd9Sstevel@tonic-gate#
617c478bd9Sstevel@tonic-gate# If HDRDIR is left unset, then it's possible for the $(ROOTHDRDIR)/%
627c478bd9Sstevel@tonic-gate# install rule in lib/Makefile.targ to generate false matches if there
637c478bd9Sstevel@tonic-gate# are any common directory names between / and /usr/include (`xfn' is
647c478bd9Sstevel@tonic-gate# one common example).  To prevent this, we set HDRDIR to a directory
657c478bd9Sstevel@tonic-gate# name that will almost surely not exist on the build machine.
667c478bd9Sstevel@tonic-gate#
677c478bd9Sstevel@tonic-gateHDRDIR=		/__nonexistent_directory__
68f808c858Sraf
697c478bd9Sstevel@tonic-gate#
707c478bd9Sstevel@tonic-gate# We don't build archive (*.a) libraries by default anymore.
717c478bd9Sstevel@tonic-gate# If a component of the build needs to build an archive library
727c478bd9Sstevel@tonic-gate# for its own internal purposes, it can define LIBS for itself
737c478bd9Sstevel@tonic-gate# after including Makefile.lib, like this:
74*856f710cSAndy Fiddaman#	LIBS = $(LIBRARY)
757c478bd9Sstevel@tonic-gate# or:
76*856f710cSAndy Fiddaman#	LIBS = $(LIBRARYCCC)
777c478bd9Sstevel@tonic-gate# Archive libraries must not be installed in the proto area.
787c478bd9Sstevel@tonic-gate#
797c478bd9Sstevel@tonic-gateLIBS=
807c478bd9Sstevel@tonic-gateMACHLIBS=	$(LIBS:%=$(MACH)/%)
817c478bd9Sstevel@tonic-gateMACHLIBS64=	$(LIBS:%=$(MACH64)/%)
827c478bd9Sstevel@tonic-gateDYNLIB=		$(LIBRARY:.a=.so$(VERS))
837c478bd9Sstevel@tonic-gateDYNLIBPSR=	$(LIBRARY:.a=_psr.so$(VERS))
847c478bd9Sstevel@tonic-gateDYNLIBCCC=	$(LIBRARYCCC:.a=.so$(VERS))
857c478bd9Sstevel@tonic-gateLIBLINKS=	$(LIBRARY:.a=.so)
867c478bd9Sstevel@tonic-gateLIBLINKSCCC=	$(LIBRARYCCC:.a=.so)
877c478bd9Sstevel@tonic-gateLIBNAME=	$(LIBRARY:lib%.a=%)
887c478bd9Sstevel@tonic-gateLIBLINKPATH=
897c478bd9Sstevel@tonic-gateLIBNULL=	null.a
907c478bd9Sstevel@tonic-gateROOTHDRDIR=	$(ROOT)/usr/include
917c478bd9Sstevel@tonic-gateROOTLIBDIR=	$(ROOT)/usr/lib
927c478bd9Sstevel@tonic-gateROOTLIBDIR64=	$(ROOT)/usr/lib/$(MACH64)
937c478bd9Sstevel@tonic-gateROOTFS_LIBDIR=	$(ROOT)/lib
947c478bd9Sstevel@tonic-gateROOTFS_LIBDIR64=	$(ROOT)/lib/$(MACH64)
957c478bd9Sstevel@tonic-gateROOTHDRS=	$(HDRS:%=$(ROOTHDRDIR)/%)
967c478bd9Sstevel@tonic-gateHDRSRCS=	$(HDRS:%=$(HDRDIR)/%)
977c478bd9Sstevel@tonic-gateCHECKHDRS=	$(HDRSRCS:%.h=%.check)
987c478bd9Sstevel@tonic-gateROOTLIBS=	$(LIBS:%=$(ROOTLIBDIR)/%)
997c478bd9Sstevel@tonic-gateROOTLIBS64=	$(LIBS:%=$(ROOTLIBDIR64)/%)
1007c478bd9Sstevel@tonic-gateROOTFS_LIBS=	$(DYNLIB:%=$(ROOTFS_LIBDIR)/%)
1017c478bd9Sstevel@tonic-gateROOTFS_LIBS64=	$(DYNLIB:%=$(ROOTFS_LIBDIR64)/%)
1027c478bd9Sstevel@tonic-gateROOTLINKS=	$(ROOTLIBDIR)/$(LIBLINKS)
1037c478bd9Sstevel@tonic-gateROOTLINKS64=	$(ROOTLIBDIR64)/$(LIBLINKS)
1047c478bd9Sstevel@tonic-gateROOTFS_LINKS=	$(ROOTFS_LIBDIR)/$(LIBLINKS)
1057c478bd9Sstevel@tonic-gateROOTFS_LINKS64=	$(ROOTFS_LIBDIR64)/$(LIBLINKS)
1067c478bd9Sstevel@tonic-gateROOTLINKSCCC=	$(ROOTLIBDIR)/$(LIBLINKSCCC)
1077c478bd9Sstevel@tonic-gateROOTLINKSCCC64=	$(ROOTLIBDIR64)/$(LIBLINKSCCC)
1087c478bd9Sstevel@tonic-gateROOTFS_LINKSCCC=	$(ROOTFS_LIBDIR)/$(LIBLINKSCCC)
1097c478bd9Sstevel@tonic-gateROOTFS_LINKSCCC64=	$(ROOTFS_LIBDIR64)/$(LIBLINKSCCC)
1107c478bd9Sstevel@tonic-gate
111da2e3ebdSchin# Demo rules
112da2e3ebdSchinDEMOFILES=
113da2e3ebdSchinDEMOFILESRCDIR=		common
114da2e3ebdSchinROOTDEMODIRBASE=	__nonexistent_directory__
115da2e3ebdSchinROOTDEMODIRS=
116da2e3ebdSchinROOTDEMOFILES=	$(DEMOFILES:%=$(ROOTDEMODIRBASE)/%)
117da2e3ebdSchin$(ROOTDEMODIRS) :=	DIRMODE =	755
118da2e3ebdSchin
1197c478bd9Sstevel@tonic-gateARFLAGS=	r
1207c478bd9Sstevel@tonic-gateSONAME=		$(DYNLIB)
1217c478bd9Sstevel@tonic-gate# For most libraries, we should be able to resolve all symbols at link time,
1227c478bd9Sstevel@tonic-gate# either within the library or as dependencies, all text should be pure, and
1237c478bd9Sstevel@tonic-gate# combining relocations into one relocation table reduces startup costs.
1247c478bd9Sstevel@tonic-gate# All options are tunable to allow overload/omission from lower makefiles.
1257c478bd9Sstevel@tonic-gate
1267c478bd9Sstevel@tonic-gate
1277c478bd9Sstevel@tonic-gateHSONAME=	-h$(SONAME)
12867e3a03eSrieDYNFLAGS=	$(HSONAME) $(ZTEXT) $(ZDEFS) $(BDIRECT) \
12924da5b34Srie		$(MAPFILES:%=-M%) $(MAPFILE.PGA:%=-M%) $(MAPFILE.NED:%=-M%)
1307c478bd9Sstevel@tonic-gate
1317c478bd9Sstevel@tonic-gateLDLIBS=		$(LDLIBS.lib)
1327c478bd9Sstevel@tonic-gate
1337c478bd9Sstevel@tonic-gateOBJS=		$(OBJECTS:%=objs/%)
1347c478bd9Sstevel@tonic-gatePICS=		$(OBJECTS:%=pics/%)
1357c478bd9Sstevel@tonic-gate
1367c478bd9Sstevel@tonic-gate# Declare that all library .o's can all be made in parallel.
1377c478bd9Sstevel@tonic-gate# The DUMMY target is for those instances where OBJS and PICS
1387c478bd9Sstevel@tonic-gate# are empty (to avoid an unconditional .PARALLEL declaration).
1397c478bd9Sstevel@tonic-gate.PARALLEL:	$(OBJS) $(PICS) DUMMY
1407c478bd9Sstevel@tonic-gate
1417c478bd9Sstevel@tonic-gate# default value for "portable" source
1427c478bd9Sstevel@tonic-gateSRCS=		$(OBJECTS:%.o=$(SRCDIR)/%.c)
1437c478bd9Sstevel@tonic-gate
1447c478bd9Sstevel@tonic-gate# default build of an archive and a shared object,
1457c478bd9Sstevel@tonic-gate# overridden locally when extra processing is needed
1467c478bd9Sstevel@tonic-gateBUILD.AR=	$(AR) $(ARFLAGS) $@ $(AROBJS)
147ee637354SGary MillsBUILD.SO=	$(CC) $(CFLAGS) -o $@ $(GSHARED) $(DYNFLAGS) \
148ee637354SGary Mills		$(PICS) $(EXTPICS) $(LDLIBS)
149ee637354SGary MillsBUILDCCC.SO=	$(CCC) $(CCFLAGS) -o $@ $(GSHARED) $(DYNFLAGS) \
150ee637354SGary Mills		$(PICS) $(EXTPICS) $(LDLIBS)
1517c478bd9Sstevel@tonic-gate
1527c478bd9Sstevel@tonic-gate# default dynamic library symlink
1537c478bd9Sstevel@tonic-gateINS.liblink=	-$(RM) $@; $(SYMLINK) $(LIBLINKPATH)$(LIBLINKS)$(VERS) $@
1547c478bd9Sstevel@tonic-gateINS.liblinkccc=	-$(RM) $@; $(SYMLINK) $(LIBLINKPATH)$(LIBLINKSCCC)$(VERS) $@
1557c478bd9Sstevel@tonic-gate
1567c478bd9Sstevel@tonic-gate# default 64-bit dynamic library symlink
1577c478bd9Sstevel@tonic-gateINS.liblink64=	-$(RM) $@; $(SYMLINK) $(LIBLINKPATH)$(LIBLINKS)$(VERS) $@
1587c478bd9Sstevel@tonic-gateINS.liblinkccc64= -$(RM) $@; $(SYMLINK) $(LIBLINKPATH)$(LIBLINKSCCC)$(VERS) $@
1597c478bd9Sstevel@tonic-gate
1607c478bd9Sstevel@tonic-gate#
1617c478bd9Sstevel@tonic-gate# If appropriate, augment POST_PROCESS_O and POST_PROCESS_SO to do CTF
1627c478bd9Sstevel@tonic-gate# processing.  We'd like to just conditionally append to POST_PROCESS_O and
1637c478bd9Sstevel@tonic-gate# POST_PROCESS_SO, but ParallelMake has a bug which causes the same value to
1647c478bd9Sstevel@tonic-gate# sometimes get appended more than once, which will cause ctfconvert to fail.
1657c478bd9Sstevel@tonic-gate# So, instead we introduce CTFCONVERT_POST and CTFMERGE_POST, which are always
1667c478bd9Sstevel@tonic-gate# appended to POST_PROCESS_O and POST_PROCESS_SO but are no-ops unless CTF
1677c478bd9Sstevel@tonic-gate# processing should be done.
1687c478bd9Sstevel@tonic-gate#
1697c478bd9Sstevel@tonic-gateCTFCONVERT_POST = :
1707c478bd9Sstevel@tonic-gateCTFMERGE_POST	= :
1717c478bd9Sstevel@tonic-gatePOST_PROCESS_O += ; $(CTFCONVERT_POST)
1727c478bd9Sstevel@tonic-gatePOST_PROCESS_SO += ; $(CTFMERGE_POST)
1737c478bd9Sstevel@tonic-gate
174d69cdb36SRichard LoweCTFMERGE_LIB	= $(CTFMERGE) $(CTFMRGFLAGS) -t -f -L VERSION -o $@ $(PICS)
1757c478bd9Sstevel@tonic-gate
1767c478bd9Sstevel@tonic-gate# conditional assignments
1777c478bd9Sstevel@tonic-gate
1787c478bd9Sstevel@tonic-gate$(OBJS)  :=	sparc_CFLAGS += -xregs=no%appl
1797c478bd9Sstevel@tonic-gate
1807c478bd9Sstevel@tonic-gate$(PICS)  :=	sparc_CFLAGS += -xregs=no%appl $(sparc_C_PICFLAGS)
1817c478bd9Sstevel@tonic-gate$(PICS)  :=	sparcv9_CFLAGS += -xregs=no%appl $(sparcv9_C_PICFLAGS)
1827c478bd9Sstevel@tonic-gate$(PICS)  :=	i386_CFLAGS += $(i386_C_PICFLAGS)
1837c478bd9Sstevel@tonic-gate$(PICS)  :=	amd64_CFLAGS += $(amd64_C_PICFLAGS)
1847c478bd9Sstevel@tonic-gate$(PICS)  :=	CCFLAGS += $(CC_PICFLAGS)
1857c478bd9Sstevel@tonic-gate$(PICS)  :=	CPPFLAGS += -DPIC -D_REENTRANT
1867c478bd9Sstevel@tonic-gate$(PICS)  :=	sparcv9_CCFLAGS += -xregs=no%appl $(sparcv9_CC_PICFLAGS)
1877c478bd9Sstevel@tonic-gate$(PICS)  :=	amd64_CCFLAGS += $(amd64_CC_PICFLAGS)
1887c478bd9Sstevel@tonic-gate$(PICS)  :=	CFLAGS += $(CTF_FLAGS)
1897c478bd9Sstevel@tonic-gate$(PICS)	 :=	CFLAGS64 += $(CTF_FLAGS)
1907c478bd9Sstevel@tonic-gate$(PICS)  :=	CTFCONVERT_POST = $(CTFCONVERT_O)
1917c478bd9Sstevel@tonic-gate$(DYNLIB) :=	CTFMERGE_POST = $(CTFMERGE_LIB)
1927c478bd9Sstevel@tonic-gate
1937c478bd9Sstevel@tonic-gate$(LIBRARY):=	AROBJS = $(OBJS)
1947c478bd9Sstevel@tonic-gate$(LIBRARY):=	DIR = objs
1957c478bd9Sstevel@tonic-gate$(DYNLIB):=	DIR = pics
1967c478bd9Sstevel@tonic-gate$(DYNLIBCCC):=	DIR = pics
1977c478bd9Sstevel@tonic-gate
1987c478bd9Sstevel@tonic-gateSONAMECCC=	$(DYNLIBCCC)
1997c478bd9Sstevel@tonic-gateHSONAMECCC=	-h $(SONAMECCC)
2007c478bd9Sstevel@tonic-gate#
2017c478bd9Sstevel@tonic-gate# Keep in sync with the standard DYNFLAGS
2027c478bd9Sstevel@tonic-gate#
20367e3a03eSrie$(DYNLIBCCC):=	DYNFLAGS = $(HSONAMECCC) $(ZTEXT) $(ZDEFS) \
20424da5b34Srie		$(MAPFILES:%=-M%) $(MAPFILE.PGA:%=-M%) $(MAPFILE.NED:%=-M%) \
205f6acbf7cSrie		$(BDIRECT) $(NORUNPATH)
2067c478bd9Sstevel@tonic-gate
2077c478bd9Sstevel@tonic-gate
208*856f710cSAndy Fiddaman# build rule for "portable" source
2097c478bd9Sstevel@tonic-gateobjs/%.o pics/%.o: %.c
2107c478bd9Sstevel@tonic-gate	$(COMPILE.c) -o $@ $<
2117c478bd9Sstevel@tonic-gate	$(POST_PROCESS_O)
2127c478bd9Sstevel@tonic-gate
2137c478bd9Sstevel@tonic-gateobjs/%.o pics/%.o: %.cc
2147c478bd9Sstevel@tonic-gate	$(COMPILE.cc) -o $@ $<
2157c478bd9Sstevel@tonic-gate	$(POST_PROCESS_O)
2167c478bd9Sstevel@tonic-gate
2177c478bd9Sstevel@tonic-gate.PRECIOUS: $(LIBS)
2187c478bd9Sstevel@tonic-gate
2197c478bd9Sstevel@tonic-gate# Define the majority text domain in this directory.
2207c478bd9Sstevel@tonic-gateTEXT_DOMAIN= SUNW_OST_OSLIB
2217c478bd9Sstevel@tonic-gate
2227c478bd9Sstevel@tonic-gate#
223f808c858Sraf# Target Architecture
2247c478bd9Sstevel@tonic-gate#
225f808c858SrafTARGETMACH=	$(MACH)
2267c478bd9Sstevel@tonic-gate
2277c478bd9Sstevel@tonic-gate#
2287c478bd9Sstevel@tonic-gate# Allow people to define their own clobber rules.  Normal makefiles
2297c478bd9Sstevel@tonic-gate# shouldn't override this - they should override $(CLOBBERFILES) instead.
2307c478bd9Sstevel@tonic-gate#
231f808c858SrafCLOBBERTARGFILES= $(LIBS) $(DYNLIB) $(CLOBBERFILES)
232bc1f688bSRobert Mustacchi
233bc1f688bSRobert Mustacchi#
234bc1f688bSRobert Mustacchi# Define the default ctfdiff invocation used to check a list of types
235bc1f688bSRobert Mustacchi# supplied by a user of a library. The goal is to validate that a given
236bc1f688bSRobert Mustacchi# series of types is the same in both a 32-bit and 64-bit artifact. This
237bc1f688bSRobert Mustacchi# is only defined if we have a 64-bit build to do.
238bc1f688bSRobert Mustacchi#
239bc1f688bSRobert MustacchiTYPECHECK_LIB32 =		$(TYPECHECK_LIB:%=$(MACH)/%)
240bc1f688bSRobert MustacchiTYPECHECK_LIB64 =		$(TYPECHECK_LIB:%=$(MACH64)/%)
241bc1f688bSRobert MustacchiTYPECHECK_LIST=			$(TYPELIST:%=-T %)
242bc1f688bSRobert Mustacchi$(BUILD64)TYPECHECK.lib =	$(CTFDIFF) -t -I $(TYPECHECK_LIST) $(TYPECHECK_LIB32) $(TYPECHECK_LIB64)
243bc1f688bSRobert MustacchiTYPECHECK =			$(TYPECHECK_LIB:%=%.typecheck)
244