xref: /illumos-gate/usr/src/lib/libc/Makefile (revision e2d5066a004ea2b47d7cd687f38c43d6cfb21275)
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) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
23#
24# Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
25# Use is subject to license terms.
26# Copyright 2019 OmniOS Community Edition (OmniOSce) Association.
27# Copyright 2026 Oxide Computer Company
28#
29
30LIBBASENAME=	libc
31LIBRARY=	$(LIBBASENAME:%=%.a)
32VERS=		.1
33
34# Note that we build libc_pic.a for the benefit of building
35# ld.so.1, but we do not install it.  Only ld.so.1 needs it
36# and it must be built in the same workspace as libc.
37LIB_PIC= libc_pic.a
38
39ROOTLIB=	$(ROOT)/usr/lib
40ROOTFS_LIB=	$(ROOT)/lib
41ROOTLIB64=	$(ROOTLIB)/$(MACH64)
42ROOTFS_LIB64=	$(ROOTFS_LIB)/$(MACH64)
43
44ROOTVARIANTDIR=	$(ROOTLIB)/libc
45ROOTVARIANTDIR64=	$(ROOTLIB64)/libc
46
47# include common library definitions
48include ../Makefile.lib
49include ../Makefile.rootfs
50
51#
52# on some architectures, we build multiple libc variants
53#
54VAR1 =		hwcap1
55VAR2 =		hwcap2
56VAR3 =		hwcap3
57
58VARBLD_1=	$(MACH:sparc=sparc)
59VARBLD=		$(VARBLD_1:i386=)
60
61VARBLD64_1=	$(MACH:sparc=sparcv9)
62VARBLD64=	$(VARBLD64_1:i386=)
63
64VAR1_DYNLIB =	$(LIBRARY:%.a=%_$(VAR1).so$(VERS))
65VAR1_BLDDIR =	$(MACH)_$(VAR1)/$(VARBLD)
66VAR2_DYNLIB =	$(LIBRARY:%.a=%_$(VAR2).so$(VERS))
67VAR2_BLDDIR =	$(MACH)_$(VAR2)/$(VARBLD)
68VAR3_DYNLIB =	$(LIBRARY:%.a=%_$(VAR3).so$(VERS))
69VAR3_BLDDIR =	$(MACH)_$(VAR3)/$(VARBLD)
70
71VAR1_DYNLIB64 =	$(LIBRARY:%.a=%_$(VAR1).so$(VERS))
72VAR1_BLDDIR64 =	$(MACH)_$(VAR1)/$(VARBLD64)
73
74i386_VARIANTS=	$(VAR1) $(VAR2) $(VAR3)
75sparc_VARIANTS=
76sparcv9_VARIANTS=
77
78i386_COMP=
79sparc_COMP=	capabilities
80
81MACH_COMP=	$($(MACH)_COMP)
82
83i386_ETC=	$(MACH)/etc
84sparc_ETC=
85
86VARIANTS=	$($(MACH)_VARIANTS)
87VARIANT_SUBDIRS	= $(VARIANTS:%=$(MACH)_%/$(VARBLD))
88
89VARIANTS64=	$($(MACH64)_VARIANTS)
90VARIANT_SUBDIRS64	= $(VARIANTS64:%=$(MACH)_%/$(VARBLD64))
91
92SUBDIRS=	$(MACH_CAP) $(MACH) $(MACH_ETC) $(VARIANT_SUBDIRS)
93$(BUILD64)SUBDIRS += $(MACH64) $(VARIANT_SUBDIRS64)
94
95LIBS =		$(DYNLIB)
96
97ROOTLIBS64=	$(ROOTLIB64)/$(DYNLIB)
98MACHLIBS64=	$(MACH64)/$(DYNLIB)
99VARIANTLIBS=	$(VARIANTS:%=$(MACH)_%/$(VARBLD)/$(LIBBASENAME)_%.so.1)
100VARIANTLIBS64=	$(VARIANTS64:%=$(MACH)_%/$(VARBLD64)/$(LIBBASENAME)_%.so.1)
101ROOTVARIANTLIBS= $(VARIANTS:%=$(ROOTVARIANTDIR)/$(LIBBASENAME)_%.so.1)
102ROOTVARIANTLIBS64= $(VARIANTS64:%=$(ROOTVARIANTDIR64)/$(LIBBASENAME)_%.so.1)
103
104# definitions for install_h target
105BASEHDRS=	getxby_door.h
106CHECKHDRS=	$(BASEHDRS:%.h=port/gen/%.check)
107HDRS=		$(BASEHDRS)
108
109TYPECHECK_LIB =	libc.so.1
110TYPELIST = \
111	kfile_attr_t \
112	kspawn_sched_t \
113	spawn_args_t \
114	spawn_attr_t \
115	spawn_param_t
116
117CLOBBERFILES += THIRDPARTYLICENSE extract-copyright
118
119# install rules for install_h target
120$(ROOTHDRDIR)/%: port/gen/%
121	$(INS.file)
122
123$(ROOTLIB)/$(DYNLIB)	:=	FILEMODE = 755
124$(ROOTLIB64)/$(DYNLIB) :=	FILEMODE = 755
125$(ROOTFS_LIBDIR)/$(DYNLIB)	:=	FILEMODE = 755
126$(ROOTFS_LIBDIR64)/$(DYNLIB)	:=	FILEMODE = 755
127
128$(ROOTVARIANTDIR)			:= FILEMODE= 755
129$(ROOTVARIANTDIR)/$(VAR1_DYNLIB)	:= FILEMODE= 755
130$(ROOTVARIANTDIR)/$(VAR2_DYNLIB)	:= FILEMODE= 755
131$(ROOTVARIANTDIR)/$(VAR3_DYNLIB)	:= FILEMODE= 755
132
133$(ROOTVARIANTDIR64)			:= FILEMODE= 755
134$(ROOTVARIANTDIR64)/$(VAR1_DYNLIB64)	:= FILEMODE= 755
135
136.KEEP_STATE:
137
138all:	all_h lib32 $(BUILD64) .WAIT lib64 .WAIT etc THIRDPARTYLICENSE
139
140THIRDPARTYLICENSE: extract-copyright
141	$(RM) $@
142	./extract-copyright . > $@
143
144etc:	$($(MACH)_ETC)
145
146lib32:	$(MACH_COMP) $(MACHLIBS) $(MACH)/$(LIB_PIC) $(VARIANTLIBS)
147	@if $(ELFDUMP) -r $(MACH)/$(DYNLIB) | $(GREP) -w environ ; then \
148		$(ECHO) "Error: Invalid reference to environ" ; \
149		$(ECHO) "Error: See comments in port/gen/env_data.c" ; \
150		exit 1; \
151	fi
152
153lib64:	$(MACH_COMP) $(MACHLIBS64) $(MACH64)/$(LIB_PIC) $(VARIANTLIBS64)
154	@if $(ELFDUMP) -r $(MACH64)/$(DYNLIB) | $(GREP) -w environ ; then \
155		$(ECHO) "Error: Invalid reference to environ" ; \
156		$(ECHO) "Error: See comments in port/gen/env_data.c" ; \
157		exit 1; \
158	fi
159
160$(MACH)/assym.h $(MACH64)/assym.h:
161	@cd $(@D); $(MAKE) assym.h
162
163$(VARIANTLIBS): FRC
164	@cd $(@D); pwd; VERSION='$(VERSION)' $(MAKE) $(@F)
165
166$(VARIANTLIBS64): FRC
167	@cd $(@D); pwd; VERSION='$(VERSION)' $(MAKE) $(@F)
168
169$($(MACH)_ETC): FRC
170	@cd $(@); pwd; $(MAKE) $(TARGET)
171
172$($(MACH)_COMP): FRC
173	@cd $(@); pwd; $(MAKE) $(TARGET)
174
175install:	all			\
176		etc			\
177		inslib32		\
178		$(ROOTCOMPATLINKS)
179
180$(BUILD64)install: inslib64 $(ROOTCOMPATLINKS64)
181
182inslib32:	$(ROOTFS_LIBS) $(ROOTFS_LINKS) $(ROOTVARIANTLIBS)
183
184inslib64:	$(ROOTFS_LIBS64) $(ROOTFS_LINKS64) $(ROOTVARIANTLIBS64)
185
186install_h: all_h $(ROOTHDRS)
187
188all_h:	$(MACH)/assym.h $(MACH64)/assym.h
189
190$(TYPECHECK): $(TYPECHECK_LIB32) $(TYPECHECK_LIB64)
191	$(TYPECHECK.lib)
192
193check:	$(CHECKHDRS) $(TYPECHECK)
194
195$(ROOTVARIANTDIR): $(ROOTLIB)
196	$(INS.dir)
197$(ROOTVARIANTDIR)/%: $(ROOTVARIANTDIR) $(VAR1_BLDDIR)/%
198	$(INS.file)
199$(ROOTVARIANTDIR)/%: $(ROOTVARIANTDIR) $(VAR2_BLDDIR)/%
200	$(INS.file)
201$(ROOTVARIANTDIR)/%: $(ROOTVARIANTDIR) $(VAR3_BLDDIR)/%
202	$(INS.file)
203
204$(ROOTVARIANTDIR64): $(ROOTLIB64)
205	$(INS.dir)
206$(ROOTVARIANTDIR64)/%: $(ROOTVARIANTDIR64) $(VAR1_BLDDIR64)/%
207	$(INS.file)
208
209$(MACH)/$(LIB_PIC): FRC
210	@cd $(MACH); pwd; VERSION='$(VERSION)' $(MAKE) $(LIB_PIC)
211$(MACH64)/$(LIB_PIC): FRC
212	@cd $(MACH64); pwd; VERSION='$(VERSION)' $(MAKE) $(LIB_PIC)
213
214all	:=	TARGET= all
215install	:=	TARGET= install
216clean	:=	TARGET= clean
217clobber	:=	TARGET= clobber
218
219.PARALLEL:	$(SUBDIRS)
220
221$(SUBDIRS): FRC
222	@cd $@; pwd; VERSION='$(VERSION)' $(MAKE) $(TARGET)
223
224clean: $(SUBDIRS)
225clobber: $(SUBDIRS) etc clobber_local
226clobber_local:
227	$(RM) $(CLOBBERFILES)
228
229FRC:
230
231_msg:	$(MSGDOMAIN) catalog
232
233catalog:
234	sh ./makelibccatalog.sh $(MSGDOMAIN)
235
236$(MSGDOMAIN):
237	$(INS.dir)
238
239include ../../Makefile.xref
240
241# include MACH-specific library targets
242include ../Makefile.mach
243