]> git.saurik.com Git - apple/coreosmakefiles.git/blob - ReleaseControl/BSDCommon.make
d1af115a51317f46d76537a14f515914eee327d9
[apple/coreosmakefiles.git] / ReleaseControl / BSDCommon.make
1 ##
2 # Makefile for Apple Release Control (Apple projects)
3 #
4 # Copyright (c) 2007 Apple Inc. All rights reserved.
5 #
6 # @APPLE_LICENSE_HEADER_START@
7 #
8 # This file contains Original Code and/or Modifications of Original Code
9 # as defined in and that are subject to the Apple Public Source License
10 # Version 2.0 (the 'License'). You may not use this file except in
11 # compliance with the License. Please obtain a copy of the License at
12 # http://www.opensource.apple.com/apsl/ and read it before using this
13 # file.
14 #
15 # The Original Code and all software distributed under the License are
16 # distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 # EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 # INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 # FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 # Please see the License for the specific language governing rights and
21 # limitations under the License.
22 #
23 # @APPLE_LICENSE_HEADER_END@
24 ##
25
26 include $(MAKEFILEPATH)/CoreOS/ReleaseControl/Common.make
27
28 ### ###
29 ### Variables ###
30 ### ###
31
32 Library_Prefix ?= lib
33
34 ProductType ?= tool
35 ifeq ($(ProductType),tool)
36 ProductName ?= $(Project)
37 Install_Dir ?= /usr/bin
38 else
39 ifeq ($(ProductType),dylib)
40 Library_Suffix ?= .dylib
41 ProductName ?= $(Library_Prefix)$(Project)$(if $(Library_Version),.$(Library_Version),)$(Library_Suffix)
42 ProductNameNoVersion ?= $(Library_Prefix)$(Project)$(Library_Suffix)
43 Install_Dir ?= /usr/lib
44 else
45 ifeq ($(ProductType),staticlib)
46 Library_Suffix ?= .a
47 ProductName ?= $(Library_Prefix)$(Project)$(Library_Suffix)
48 Install_Dir ?= /usr/local/lib
49 else
50 $(error Unknown ProductType: $(ProductType))
51 endif
52 endif
53 endif
54
55 ALL_FILES = $(CFILES) $(MFILES) $(CXXFILES) $(USERDEFS) $(SERVERDEFS) $(MANPAGES)
56 ALL_SRCFILES = $(CFILES) $(MFILES) $(CXXFILES)
57
58 ## MIG ##
59
60 MIGFLAGS=$(Extra_MIG_Flags)
61 ifneq ($(USERDEFS),)
62 CFILES += $(foreach FILE, $(USERDEFS:.defs=_user.c), $(OBJROOT)/$(Project)/$(notdir $(FILE)))
63 endif
64 ifneq ($(SERVERDEFS),)
65 CFILES += $(foreach FILE, $(SERVERDEFS:.defs=_server.c), $(OBJROOT)/$(Project)/$(notdir $(FILE)))
66 endif
67 ifneq ($(USERDEFS) $(SERVERDEFS),)
68 Extra_CC_Flags += -I$(OBJROOT)/$(Project)
69 endif
70
71 ## RPC ##
72
73 RPCFLAGS=$(Extra_RPC_Flags)
74 ifneq ($(RPCFILES),)
75 CFILES += $(foreach FILE, $(RPCFILES:.x=_xdr.c), $(OBJROOT)/$(Project)/$(notdir $(FILE)))
76 endif
77 ifneq ($(RPCSVCFILES),)
78 CFILES += $(foreach FILE, $(RPCFILES:.x=_svc.c), $(OBJROOT)/$(Project)/$(notdir $(FILE)))
79 endif
80
81 ## Yacc ##
82
83 YFLAGS=$(Extra_Y_Flags)
84 ifneq ($(YFILES),)
85 CFILES += $(foreach FILE, $(YFILES:.y=.c), $(OBJROOT)/$(Project)/$(notdir $(FILE)))
86 endif
87
88 ## SDK Support ##
89
90 ifneq ($(SDKROOT),)
91 Extra_CC_Flags += -isysroot $(SDKROOT)
92 Extra_LD_Flags += -Wl,-syslibroot,$(SDKROOT)
93 endif
94
95 ifneq ($(RC_TARGET_CONFIG),)
96 ifeq ($(shell tconf --product),)
97 $(error undefined Target Config: $(RC_TARGET_CONFIG))
98 endif
99 endif
100
101 ## Dylib Support ##
102
103 ifeq ($(Library_Compatibility_Version),)
104 Library_Compatibility_Version = 1
105 endif
106 ifeq ($(Library_Current_Version),)
107 Library_Current_Version = $(if $(RC_ProjectSourceVersion), $(RC_ProjectSourceVersion), 1)
108 endif
109
110 ALL_OFILES = $(foreach OFILE, \
111 $(CFILES:.c=.o) \
112 $(MFILES:.m=.o) \
113 $(CXXFILES:.%=.o) \
114 $(OTHER_OFILES), \
115 $(OBJROOT)/$(Project)/$(notdir $(OFILE)))
116
117 ### ###
118 ### Targets ###
119 ### ###
120
121 .PHONY: configure almostclean
122
123 Install_Headers_Directory ?= /usr/include
124 Install_Private_Headers_Directory ?= /usr/local/include
125
126 installhdrs::
127 ifneq ($(Install_Headers),)
128 @echo "Installing headers for $(Project)..."
129 $(INSTALL_DIRECTORY) $(DSTROOT)/$(Install_Headers_Directory)
130 @for HFILE in $(Install_Headers); do \
131 CMD="$(INSTALL_FILE) $${HFILE} $(DSTROOT)/$(Install_Headers_Directory)" ; \
132 echo $${CMD} ; $${CMD} || exit 1 ; \
133 done
134 endif
135 ifneq ($(Install_Private_Headers),)
136 @echo "Installing private headers for $(Project)..."
137 $(INSTALL_DIRECTORY) $(DSTROOT)/$(Install_Private_Headers_Directory)
138 @for HFILE in $(Install_Private_Headers); do \
139 CMD="$(INSTALL_FILE) $${HFILE} $(DSTROOT)/$(Install_Private_Headers_Directory)" ; \
140 echo $${CMD} ; $${CMD} || exit 1 ; \
141 done
142 endif
143
144 install:: build installhdrs
145 @echo "Installing $(Project)..."
146 ifneq ($(SubProjects),)
147 make recurse TARGET=install RC_ARCHS="$(RC_ARCHS)"
148 else
149 $(INSTALL_DIRECTORY) $(DSTROOT)/$(Install_Dir)
150 ifneq ($(ALL_OFILES),)
151 ifeq ($(ProductType),tool)
152 $(INSTALL_PROGRAM) $(SYMROOT)/$(ProductName) $(DSTROOT)/$(Install_Dir)
153 else
154 ifeq ($(ProductType),dylib)
155 $(INSTALL_DYLIB) $(SYMROOT)/$(ProductName) $(DSTROOT)/$(Install_Dir)
156 $(STRIP) -S $(DSTROOT)/$(Install_Dir)/$(ProductName)
157 ifneq ($(ProductName),$(ProductNameNoVersion))
158 $(LN) -sf $(ProductName) $(DSTROOT)/$(Install_Dir)/$(ProductNameNoVersion)
159 endif
160 else
161 ifeq ($(ProductType),staticlib)
162 $(INSTALL_LIBRARY) $(SYMROOT)/$(ProductName) $(DSTROOT)/$(Install_Dir)
163 endif
164 endif
165 endif
166 endif
167 endif
168 ifneq ($(MANPAGES),)
169 @make install-man-pages
170 endif
171 ifneq ($(LAUNCHD_PLISTS),)
172 @make install-launchd-plists
173 endif
174 @make after_install
175 @$(MAKE) compress_man_pages
176
177 migdefs::
178 @$(MKDIR) $(OBJROOT)/$(Project)
179 @for DEF in $(USERDEFS); do \
180 CMD="$(MIG) $(MIGFLAGS) \
181 -user $(OBJROOT)/$(Project)/$$(basename $${DEF/%.defs/_user.c}) \
182 -header $(OBJROOT)/$(Project)/$$(basename $${DEF/%.defs/.h}) \
183 -server /dev/null \
184 -sheader /dev/null \
185 $${DEF}" ; \
186 echo $${CMD} ; $${CMD} || exit 1 ; \
187 done
188 @for DEF in $(SERVERDEFS); do \
189 CMD="$(MIG) $(MIGFLAGS) \
190 -user /dev/null \
191 -header /dev/null \
192 -server $(OBJROOT)/$(Project)/$$(basename $${DEF/%.defs/_server.c}) \
193 -sheader $(OBJROOT)/$(Project)/$$(basename $${DEF/%.defs/_server.h}) \
194 $${DEF}" ; \
195 echo $${CMD} ; $${CMD} || exit 1 ; \
196 done
197
198 rpcfiles:
199 @$(MKDIR) $(OBJROOT)/$(Project)
200 @for FILE in $(RPCFILES); do \
201 OUT=`basename $${FILE} .x` ; \
202 CMD="$(RPCGEN) $(RPCFLAGS) -h \
203 -o $(OBJROOT)/$(Project)/$${OUT}.h $${FILE}"; \
204 echo $${CMD} ; $${CMD} || exit 1 ; \
205 CMD="$(RPCGEN) $(RPCFLAGS) -c \
206 -o $(OBJROOT)/$(Project)/$${OUT}_xdr.c $${FILE}"; \
207 echo $${CMD} ; $${CMD} || exit 1 ; \
208 done
209 @for FILE in $(RPCSVCFILES); do \
210 OUT=`basename $${FILE} .x` ; \
211 CMD="$(RPCGEN) $(RPCFLAGS) -m \
212 -o $(OBJROOT)/$(Project)/$${OUT}_svc.c $${FILE}"; \
213 echo $${CMD} ; $${CMD} || exit 1; \
214 done
215
216 yfiles:
217 @$(MKDIR) $(OBJROOT)/$(Project)
218 @for FILE in $(YFILES); do \
219 OUT=`basename $${FILE} .y` ; \
220 CMD="$(YACC) $(YFLAGS) -d \
221 -o $(OBJROOT)/$(Project)/$${OUT}.c $${FILE}"; \
222 echo $${CMD} ; $${CMD} || exit 1 ; \
223 done
224
225 build:: migdefs rpcfiles yfiles $(ALL_FILES)
226 @echo "Building $(Project)..."
227 @$(MKDIR) $(OBJROOT)/$(Project)
228 @$(MKDIR) $(SYMROOT)
229
230 @for CFILE in $(ALL_SRCFILES); do \
231 OFILE=$$(echo $$(basename $${CFILE}) | sed -e 's,\.[^.]*$$,.o,') ; \
232 CMD="$(CC) $(CFLAGS) -c -o $(OBJROOT)/$(Project)/$${OFILE} $${CFILE}" ; \
233 echo $$CMD ; $$CMD || exit 1 ; \
234 done
235
236 ifneq ($(ALL_OFILES),)
237 ifeq ($(ProductType),tool)
238 $(CC) $(LDFLAGS) -o $(SYMROOT)/$(ProductName) $(ALL_OFILES)
239 else
240 ifeq ($(ProductType),dylib)
241 $(CC) -dynamiclib $(LDFLAGS) \
242 -dynamic \
243 -compatibility_version $(Library_Compatibility_Version) \
244 -current_version $(Library_Current_Version) \
245 -install_name `echo $(Install_Dir)/$(ProductName) | sed 's,//,/,g'` \
246 -o $(SYMROOT)/$(ProductName) \
247 $(ALL_OFILES)
248 else
249 ifeq ($(ProductType),staticlib)
250 $(LIBTOOL) -static -o $(SYMROOT)/$(ProductName) $(ALL_OFILES)
251 endif
252 endif
253 endif
254 ifneq ($(ProductType),staticlib)
255 dsymutil --out $(SYMROOT)/$(ProductName).dSYM $(SYMROOT)/$(ProductName) || true
256 endif
257 endif
258
259 install-man-pages::
260 @echo "Installing man pages for $(Project)..."
261 @for MANPAGE in $(MANPAGES); do \
262 SECTION=$${MANPAGE/*./} ; \
263 MANDIR=$(DSTROOT)/usr/share/man/man$${SECTION} ; \
264 $(INSTALL_DIRECTORY) $${MANDIR} || exit 1 ; \
265 CMD="$(INSTALL_FILE) $${MANPAGE} $${MANDIR}" ; \
266 echo $$CMD ; $$CMD || exit 1 ; \
267 done
268
269 install-launchd-plists::
270 @echo "Installing launchd plists for $(Project)..."
271 @for PLIST in $(LAUNCHD_PLISTS); do \
272 PLIST_DIR=$(DSTROOT)/System/Library/LaunchDaemons ; \
273 $(INSTALL_DIRECTORY) $${PLIST_DIR} || exit 1 ; \
274 CMD="$(INSTALL_FILE) $${PLIST} $${PLIST_DIR}" ; \
275 echo $$CMD ; $$CMD || exit 1 ; \
276 done
277
278 after_install:
279
280 almostclean::
281 @echo "Cleaning $(Project)..."
282 $(_v) $(MAKE) -C $(BuildDirectory) clean