2 # Makefile for Apple Release Control (Apple projects)
4 # Copyright (c) 2007 Apple Inc. All rights reserved.
6 # @APPLE_LICENSE_HEADER_START@
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
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.
23 # @APPLE_LICENSE_HEADER_END@
26 include $(MAKEFILEPATH)/CoreOS/ReleaseControl/Common.make
35 ifeq ($(ProductType),tool)
36 ProductName ?= $(Project)
37 Install_Dir ?= /usr/bin
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
45 ifeq ($(ProductType),staticlib)
47 ProductName ?= $(Library_Prefix)$(Project)$(Library_Suffix)
48 Install_Dir ?= /usr/local/lib
50 $(error Unknown ProductType: $(ProductType))
55 ALL_FILES = $(CFILES) $(MFILES) $(CXXFILES) $(USERDEFS) $(SERVERDEFS) $(MANPAGES)
56 ALL_SRCFILES = $(CFILES) $(MFILES) $(CXXFILES)
60 MIGFLAGS=$(Extra_MIG_Flags)
62 CFILES += $(foreach FILE, $(USERDEFS:.defs=_user.c), $(OBJROOT)/$(Project)/$(notdir $(FILE)))
64 ifneq ($(SERVERDEFS),)
65 CFILES += $(foreach FILE, $(SERVERDEFS:.defs=_server.c), $(OBJROOT)/$(Project)/$(notdir $(FILE)))
67 ifneq ($(USERDEFS) $(SERVERDEFS),)
68 Extra_CC_Flags += -I$(OBJROOT)/$(Project)
73 RPCFLAGS=$(Extra_RPC_Flags)
75 CFILES += $(foreach FILE, $(RPCFILES:.x=_xdr.c), $(OBJROOT)/$(Project)/$(notdir $(FILE)))
77 ifneq ($(RPCSVCFILES),)
78 CFILES += $(foreach FILE, $(RPCFILES:.x=_svc.c), $(OBJROOT)/$(Project)/$(notdir $(FILE)))
83 YFLAGS=$(Extra_Y_Flags)
85 CFILES += $(foreach FILE, $(YFILES:.y=.c), $(OBJROOT)/$(Project)/$(notdir $(FILE)))
91 Extra_CC_Flags += -isysroot $(SDKROOT)
92 Extra_LD_Flags += -Wl,-syslibroot,$(SDKROOT)
95 ifneq ($(RC_TARGET_CONFIG),)
96 ifeq ($(shell tconf --product),)
97 $(error undefined Target Config: $(RC_TARGET_CONFIG))
103 ifeq ($(Library_Compatibility_Version),)
104 Library_Compatibility_Version = 1
106 ifeq ($(Library_Current_Version),)
107 Library_Current_Version = $(if $(RC_ProjectSourceVersion), $(RC_ProjectSourceVersion), 1)
110 ALL_OFILES = $(foreach OFILE, \
115 $(OBJROOT)/$(Project)/$(notdir $(OFILE)))
121 .PHONY: configure almostclean
123 Install_Headers_Directory ?= /usr/include
124 Install_Private_Headers_Directory ?= /usr/local/include
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 ; \
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 ; \
144 install:: build installhdrs
145 @echo "Installing $(Project)..."
146 ifneq ($(SubProjects),)
147 make recurse TARGET=install RC_ARCHS="$(RC_ARCHS)"
149 $(INSTALL_DIRECTORY) $(DSTROOT)/$(Install_Dir)
150 ifneq ($(ALL_OFILES),)
151 ifeq ($(ProductType),tool)
152 $(INSTALL_PROGRAM) $(SYMROOT)/$(ProductName) $(DSTROOT)/$(Install_Dir)
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)
161 ifeq ($(ProductType),staticlib)
162 $(INSTALL_LIBRARY) $(SYMROOT)/$(ProductName) $(DSTROOT)/$(Install_Dir)
169 @make install-man-pages
171 ifneq ($(LAUNCHD_PLISTS),)
172 @make install-launchd-plists
175 @$(MAKE) compress_man_pages
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}) \
186 echo $${CMD} ; $${CMD} || exit 1 ; \
188 @for DEF in $(SERVERDEFS); do \
189 CMD="$(MIG) $(MIGFLAGS) \
192 -server $(OBJROOT)/$(Project)/$$(basename $${DEF/%.defs/_server.c}) \
193 -sheader $(OBJROOT)/$(Project)/$$(basename $${DEF/%.defs/_server.h}) \
195 echo $${CMD} ; $${CMD} || exit 1 ; \
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 ; \
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; \
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 ; \
225 build:: migdefs rpcfiles yfiles $(ALL_FILES)
226 @echo "Building $(Project)..."
227 @$(MKDIR) $(OBJROOT)/$(Project)
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 ; \
236 ifneq ($(ALL_OFILES),)
237 ifeq ($(ProductType),tool)
238 $(CC) $(LDFLAGS) -o $(SYMROOT)/$(ProductName) $(ALL_OFILES)
240 ifeq ($(ProductType),dylib)
241 $(CC) -dynamiclib $(LDFLAGS) \
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) \
249 ifeq ($(ProductType),staticlib)
250 $(LIBTOOL) -static -o $(SYMROOT)/$(ProductName) $(ALL_OFILES)
254 ifneq ($(ProductType),staticlib)
255 dsymutil --out $(SYMROOT)/$(ProductName).dSYM $(SYMROOT)/$(ProductName) || true
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 ; \
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 ; \
281 @echo "Cleaning $(Project)..."
282 $(_v) $(MAKE) -C $(BuildDirectory) clean