1#
2# Install kernel header files
3#
4.PHONY: installhdrs
5
6ifeq ($(findstring Libsyscall,$(RC_ProjectName)),Libsyscall)
7installhdrs:
8	cd libsyscall ; 								\
9		sdk="$(SDKROOT)" ;							\
10		if [ $${sdk} = / ] ; then						\
11			sdk="" ;							\
12		fi;									\
13		if [ $(UNAME_S) != "Linux" ]; then					\
14			xcrun -sdk "$(SDKROOT)" xcodebuild installhdrs 			\
15				"SRCROOT=$(SRCROOT)/libsyscall" 			\
16				"OBJROOT=$(OBJROOT)" 					\
17				"SYMROOT=$(SYMROOT)" 					\
18				"DSTROOT=$(DSTROOT)"					\
19				"SDKROOT=$${sdk}"					\
20		else									\
21			# Can't build this yet, ignore					\
22		fi									
23else ifeq ($(findstring libkxld,$(RC_ProjectName)),libkxld)
24installhdrs:
25	make -C libkern/kxld/ installhdrs
26else ifeq ($(RC_ProjectName),libkmod)
27installhdrs:
28# nothing to do
29else # xnu, xnu_debug, or xnu_headers_Sim
30installhdrs: exporthdrs installhdrs_mi installhdrs_md setup
31	@echo "[ $(SRCROOT) ] make installhdrs installing Kernel.framework"
32	$(_v)kincpath=$(DSTROOT)/$(KINCDIR);					\
33	krespath=$(DSTROOT)/$(KRESDIR);					\
34	kframepath=$(DSTROOT)/$(KINCFRAME);				\
35	[ -d $$krespath ] || $(MKDIR) $$krespath;			\
36	[ -d $$kincpath ] || $(MKDIR) $$kincpath;			\
37	cd $(SRCROOT)/EXTERNAL_HEADERS;					\
38		install $(FILE_INSTALL_FLAGS) Info.plist $$krespath;	\
39		$(NEWVERS) $${krespath}/Info.plist;	\
40	cd $$kframepath/Versions;					\
41	    [ -L Current ] || $(LN) $(KINCVERS) Current;		\
42	cd $$kframepath;						\
43	    [ -L Headers ] || $(LN) Versions/Current/Headers Headers;	\
44	    [ -L Resources ] || $(LN) Versions/Current/Resources Resources;	\
45	[ -d $(DSTROOT)/$(KPINCDIR) ] || $(MKDIR) $(DSTROOT)/$(KPINCDIR);	\
46	cd $$kframepath; [ -L PrivateHeaders ] ||		 	\
47	    $(LN) Versions/Current/PrivateHeaders PrivateHeaders;
48ifeq ($(RC_ProjectName),xnu_headers_Sim)
49	@echo "[ $(SRCROOT) ] make installhdrs installing System.framework"
50	$(_v)spincpath=$(DSTROOT)/$(SPINCDIR);				\
51	sframepath=$(DSTROOT)/$(SINCFRAME);				\
52	[ -d $$spincpath ] || $(MKDIR) $$spincpath;			\
53	cd $$sframepath/Versions;					\
54	    [ -L Current ] || $(LN) $(SINCVERS) Current;		\
55	cd $$sframepath; [ -L PrivateHeaders ] ||		 	\
56	    $(LN) Versions/Current/PrivateHeaders PrivateHeaders;
57endif
58ifeq (iPhoneOS,$(PLATFORM))
59	$(_v)$(IPHONEOS_OPTIMIZE) $(DSTROOT)/$(KRESDIR)/Info.plist
60endif
61endif
62
63.PHONY: installhdrs_embedded installhdrs_devicemap
64installhdrs_embedded installhdrs_devicemap: installhdrs
65
66#
67# Install header files order
68#
69.ORDER: installhdrs_mi installhdrs_md
70.PHONY: installhdrs_mi installhdrs_md
71
72#
73# Install machine independent header files
74#
75installhdrs_mi: setup
76	$(_v)kernel_config=$(INSTALL_TYPE);				\
77	machine_config=$(MACHINE_CONFIG);				\
78	arch_config=$(INSTALL_ARCH_DEFAULT);				\
79	if [ $${arch_config} = ARM ] ; then				\
80		if [ $${machine_config} = DEFAULT ] ; then		\
81			machine_config=$(DEFAULT_ARM_MACHINE_CONFIG);	\
82		fi;							\
83	fi;								\
84	if [ $${arch_config} = L4_ARM ] ; then				\
85		if [ $${machine_config} = DEFAULT ] ; then		\
86			machine_config=$(DEFAULT_L4_ARM_MACHINE_CONFIG);	\
87		fi;							\
88	fi;								\
89	if [ $${machine_config} = DEFAULT ] ; then			\
90		installinc_dir=${OBJROOT}/$${kernel_config}_$${arch_config}/${RELATIVE_SOURCE_PATH};	\
91	else								\
92		installinc_dir=${OBJROOT}/$${kernel_config}_$${arch_config}_$${machine_config}/${RELATIVE_SOURCE_PATH};	\
93	fi;								\
94	[ -d $${installinc_dir} ] || $(MKDIR) $${installinc_dir};	\
95	${MAKE} ${MAKEJOBS} -C $${installinc_dir}			\
96		KERNEL_CONFIG=$${kernel_config}				\
97		ARCH_CONFIG=$${arch_config}				\
98		MACHINE_CONFIG=$${machine_config}			\
99		MAKEFILES=${SOURCE}/Makefile				\
100		SOURCE=${SOURCE}/					\
101		RELATIVE_SOURCE_PATH=.					\
102		TARGET=$${installinc_dir}/				\
103		build_installhdrs_mi;					\
104
105#
106# Install machine dependent kernel header files 
107# Uses hack for machine_config, which is not threaded through properly.
108#
109installhdrs_md: setup
110	$(_v)kernel_config=$(INSTALL_TYPE);				\
111	machine_config=$(MACHINE_CONFIG);				\
112	for arch_config in $(INSTALL_ARCHS);				\
113	do								\
114	if [ $${arch_config} = ARM ] ; then	\
115		if [ $${machine_config} = DEFAULT ] ; then	\
116			machine_config=$(DEFAULT_ARM_MACHINE_CONFIG);		\
117		fi;		\
118	fi;		\
119	if [ $${arch_config} = L4_ARM ] ; then	\
120		if [ $${machine_config} = DEFAULT ] ; then	\
121			machine_config=$(DEFAULT_L4_ARM_MACHINE_CONFIG);		\
122		fi;		\
123	fi;		\
124	if [ $${machine_config} = DEFAULT ] ; then	\
125		installinc_dir=${OBJROOT}/$${kernel_config}_$${arch_config}/${RELATIVE_SOURCE_PATH};	\
126	else		\
127		installinc_dir=${OBJROOT}/$${kernel_config}_$${arch_config}_$${machine_config}/${RELATIVE_SOURCE_PATH};	\
128	fi;		\
129	[ -d $${installinc_dir} ] || $(MKDIR) $${installinc_dir};	\
130	${MAKE} ${MAKEJOBS} -C $${installinc_dir}			\
131		KERNEL_CONFIG=$${kernel_config}				\
132		ARCH_CONFIG=$${arch_config}				\
133		MACHINE_CONFIG=$${machine_config}			\
134		MAKEFILES=${SOURCE}/Makefile				\
135		SOURCE=${SOURCE}/					\
136		RELATIVE_SOURCE_PATH=.					\
137		TARGET=$${installinc_dir}/				\
138		build_installhdrs_md;					\
139	done;
140
141#
142# Install machine independent kernel header files 
143#
144do_installhdrs_mi:
145
146BUILD_INSTALLHDRS_MI_SUBDIRS_TARGETS = $(addprefix build_installhdrs_mi_,$(INSTINC_SUBDIRS))
147
148.PHONY: $(BUILD_INSTALLHDRS_MI_SUBDIRS_TARGETS)
149
150$(BUILD_INSTALLHDRS_MI_SUBDIRS_TARGETS):
151	$(_v)installinc_subdir="$(patsubst build_installhdrs_mi_%,%,$@)";	\
152	[ -d $${installinc_subdir} ] || $(MKDIR) $${installinc_subdir};		\
153	${MAKE} -C $${installinc_subdir}	 				\
154		MAKEFILES=$(SOURCE)$${installinc_subdir}/Makefile		\
155		SOURCE=$(SOURCE)$${installinc_subdir}/				\
156		RELATIVE_SOURCE_PATH=$(RELATIVE_SOURCE_PATH)/$${installinc_subdir}	\
157		TARGET=$(TARGET)$${installinc_subdir}/				\
158		build_installhdrs_mi;
159
160build_installhdrs_mi: $(BUILD_INSTALLHDRS_MI_SUBDIRS_TARGETS)
161	$(_v)${MAKE} do_installhdrs_mi;
162
163#
164# Install machine dependent kernel header files 
165#
166do_installhdrs_md:
167
168BUILD_INSTALLHDRS_MD_SUBDIRS_TARGETS = $(addprefix build_installhdrs_md_,$($(addprefix INSTINC_SUBDIRS_, $(ARCH_CONFIG))))
169
170.PHONY: $(BUILD_INSTALLHDRS_MD_SUBDIRS_TARGETS)
171
172$(BUILD_INSTALLHDRS_MD_SUBDIRS_TARGETS):
173	$(_v)installinc_subdir="$(patsubst build_installhdrs_md_%,%,$@)";	\
174	[ -d $${installinc_subdir} ] || $(MKDIR) $${installinc_subdir};		\
175	${MAKE} -C $${installinc_subdir}	 				\
176		MAKEFILES=$(SOURCE)$${installinc_subdir}/Makefile		\
177		SOURCE=$(SOURCE)$${installinc_subdir}/				\
178		RELATIVE_SOURCE_PATH=$(RELATIVE_SOURCE_PATH)/$${installinc_subdir}	\
179		TARGET=$(TARGET)$${installinc_subdir}/				\
180		build_installhdrs_md;
181
182build_installhdrs_md: $(BUILD_INSTALLHDRS_MD_SUBDIRS_TARGETS)
183	$(_v)${MAKE} do_installhdrs_md;
184
185#
186# Install kernel header files
187#
188.PHONY: exporthdrs
189
190exporthdrs: exporthdrs_mi exporthdrs_md 
191
192#
193# Install header files order
194#
195.ORDER: exporthdrs_mi exporthdrs_md
196.PHONY: exporthdrs_mi exporthdrs_md
197
198#
199# Install machine independent header files
200#
201do_exporthdrs_mi:
202
203exporthdrs_mi:
204	$(_v)kernel_config=$(INSTALL_TYPE);				\
205	arch_config=$(INSTALL_ARCH_DEFAULT);				\
206	machine_config=DEFAULT;						\
207	if [ $${arch_config} = ARM ] ; then				\
208		if [ $${machine_config} = DEFAULT ] ; then		\
209			machine_config=$(DEFAULT_ARM_MACHINE_CONFIG);	\
210		fi;							\
211	fi;								\
212	if [ $${arch_config} = L4_ARM ] ; then				\
213		if [ $${machine_config} = DEFAULT ] ; then		\
214			machine_config=$(DEFAULT_L4_ARM_MACHINE_CONFIG);\
215		fi;							\
216	fi;								\
217	if [ $${machine_config} = DEFAULT ] ; then			\
218		exportinc_dir=${OBJROOT}/$${kernel_config}_$${arch_config}/${RELATIVE_SOURCE_PATH};	\
219	else								\
220		exportinc_dir=${OBJROOT}/$${kernel_config}_$${arch_config}_$${machine_config}/${RELATIVE_SOURCE_PATH};	\
221	fi;								\
222	[ -d $${exportinc_dir} ] || $(MKDIR) $${exportinc_dir};		\
223	${MAKE} ${MAKEJOBS} -C $${exportinc_dir}			\
224		KERNEL_CONFIG=$${kernel_config}				\
225		ARCH_CONFIG=$${arch_config}				\
226		MACHINE_CONFIG=$${machine_config}			\
227		MAKEFILES=${SOURCE}/Makefile				\
228		SOURCE=${SOURCE}/					\
229		RELATIVE_SOURCE_PATH=.					\
230		TARGET=$${exportinc_dir}/				\
231		build_exporthdrs_mi;					\
232
233#
234# Install machine dependent kernel header files 
235#
236# Note - installation of machine dependent kernel header files only occurs for architecture
237# defined in INSTALL_TYPE.  We use skipit variable to skip over architectures that are not
238# equal to what is in the INSTALL_TYPE variable.
239# TARGET_CONFIGS_UC variable holds sets of three configuration options.  The first item in the
240# set is the kernel configuration.  The second item in the set is the architecture and the 
241# third item is the machine configuration.  There may be multiple sets to build.
242exporthdrs_md:
243	$(_v)my_counter=1;		\
244	for my_config in $(TARGET_CONFIGS_UC);				\
245	do		\
246	if [ $${my_counter} -eq 1 ] ; then	\
247		skipit=0;			\
248		my_counter=2;		\
249		kernel_config=$${my_config};		\
250		if [ $${kernel_config} = DEFAULT ] ; then	\
251			kernel_config=$(DEFAULT_KERNEL_CONFIG);		\
252		fi;		\
253		if [ $${kernel_config} != $(INSTALL_TYPE) ] ; then	\
254			skipit=1;	\
255		fi;		\
256	elif [ $${my_counter} -eq 2 ] ; then	\
257		my_counter=3;		\
258		arch_config=$${my_config};		\
259		if [ $${arch_config} = DEFAULT ] ; then	\
260			arch_config=`arch | $(TR) a-z A-Z`;		\
261		fi;		\
262	else		\
263		my_counter=1;		\
264		machine_config=$${my_config};		\
265		if [ $${skipit} -eq 0 ] ; then	\
266			if [ $${arch_config} = ARM ] ; then	\
267				if [ $${machine_config} = DEFAULT ] ; then	\
268					machine_config=$(DEFAULT_ARM_MACHINE_CONFIG);		\
269				fi;		\
270			fi;		\
271			if [ $${arch_config} = L4_ARM ] ; then	\
272				if [ $${machine_config} = DEFAULT ] ; then	\
273					machine_config=$(DEFAULT_L4_ARM_MACHINE_CONFIG);		\
274				fi;		\
275			fi;		\
276			if [ $${machine_config} = DEFAULT ] ; then	\
277				exportinc_dir=${OBJROOT}/$${kernel_config}_$${arch_config}/${RELATIVE_SOURCE_PATH};	\
278			else		\
279				exportinc_dir=${OBJROOT}/$${kernel_config}_$${arch_config}_$${machine_config}/${RELATIVE_SOURCE_PATH};	\
280			fi;		\
281			[ -d $${exportinc_dir} ] || $(MKDIR) $${exportinc_dir};					\
282			${MAKE} ${MAKEJOBS} -C $${exportinc_dir}			\
283				KERNEL_CONFIG=$${kernel_config}				\
284				ARCH_CONFIG=$${arch_config}				\
285				MACHINE_CONFIG=$${machine_config}			\
286				MAKEFILES=${SOURCE}/Makefile				\
287				SOURCE=${SOURCE}/					\
288				RELATIVE_SOURCE_PATH=.					\
289				TARGET=$${exportinc_dir}/				\
290				build_exporthdrs_md;					\
291		fi;		\
292	fi;		\
293	done;
294
295#
296# Install machine independent kernel header files 
297#
298do_exporthdrs_mi:
299
300BUILD_EXPORTHDRS_MI_SUBDIRS_TARGETS = $(addprefix build_exporthdrs_mi_,$(EXPINC_SUBDIRS))
301
302.PHONY: $(BUILD_EXPORTHDRS_MI_SUBDIRS_TARGETS)
303
304$(BUILD_EXPORTHDRS_MI_SUBDIRS_TARGETS):
305	$(_v)exportinc_subdir="$(patsubst build_exporthdrs_mi_%,%,$@)";		\
306	[ -d $${exportinc_subdir} ] || $(MKDIR) $${exportinc_subdir};		\
307	${MAKE} -C $${exportinc_subdir}						\
308		MAKEFILES=$(SOURCE)$${exportinc_subdir}/Makefile		\
309		SOURCE=$(SOURCE)$${exportinc_subdir}/				\
310		RELATIVE_SOURCE_PATH=$(RELATIVE_SOURCE_PATH)/$${exportinc_subdir}	\
311		TARGET=$(TARGET)$${exportinc_subdir}/				\
312		build_exporthdrs_mi;
313
314build_exporthdrs_mi: $(BUILD_EXPORTHDRS_MI_SUBDIRS_TARGETS)
315	$(_v)${MAKE} do_exporthdrs_mi;
316
317#
318# Install machine dependent kernel header files 
319#
320do_exporthdrs_md:
321
322BUILD_EXPORTHDRS_MD_SUBDIRS_TARGETS = $(addprefix build_exporthdrs_md_,$($(addprefix EXPINC_SUBDIRS_, $(ARCH_CONFIG))))
323
324.PHONY: $(BUILD_EXPORTHDRS_MD_SUBDIRS_TARGETS)
325
326$(BUILD_EXPORTHDRS_MD_SUBDIRS_TARGETS):
327	$(_v)exportinc_subdir="$(patsubst build_exporthdrs_md_%,%,$@)";		\
328	[ -d $${exportinc_subdir} ] || $(MKDIR) $${exportinc_subdir};		\
329	${MAKE} -C $${exportinc_subdir}						\
330		MAKEFILES=$(SOURCE)$${exportinc_subdir}/Makefile		\
331		SOURCE=$(SOURCE)$${exportinc_subdir}/				\
332		RELATIVE_SOURCE_PATH=$(RELATIVE_SOURCE_PATH)/$${exportinc_subdir}	\
333		TARGET=$(TARGET)$${exportinc_subdir}/				\
334		build_exporthdrs_md;
335
336build_exporthdrs_md: $(BUILD_EXPORTHDRS_MD_SUBDIRS_TARGETS)
337	$(_v)${MAKE} do_exporthdrs_md;
338
339#
340# Setup pass for  all architectures for all Configuration/Architecture options
341#
342.PHONY: setup
343
344setup:
345	$(_v)kernel_config=$(INSTALL_TYPE);				\
346	arch_config=$(INSTALL_ARCH_DEFAULT);				\
347	setup_subdir=${OBJROOT}/$${RELATIVE_SOURCE_PATH}; 		\
348	[ -d $${setup_subdir} ] || $(MKDIR) $${setup_subdir};		\
349	${MAKE} ${MAKEJOBS} -C $${setup_subdir}				\
350		KERNEL_CONFIG=$${kernel_config}				\
351		ARCH_CONFIG=$${arch_config}				\
352		MACHINE_CONFIG=$${machine_config}			\
353		MAKEFILES=${SOURCE}/Makefile				\
354		SOURCE=${SOURCE}/					\
355		RELATIVE_SOURCE_PATH=.					\
356		TARGET=$${setup_subdir}/				\
357	build_setup;
358
359do_build_setup:
360
361BUILD_SETUP_SUBDIRS_TARGETS = $(addprefix build_setup_,$(SETUP_SUBDIRS) $($(addprefix SETUP_SUBDIRS_, $(ARCH_CONFIG))))
362
363.PHONY: $(BUILD_SETUP_SUBDIRS_TARGETS)
364
365$(BUILD_SETUP_SUBDIRS_TARGETS):
366	$(_v)setup_subdir="$(patsubst build_setup_%,%,$@)";	\
367	[ -d $${setup_subdir} ] || $(MKDIR) $${setup_subdir};	\
368	${MAKE} -C $${setup_subdir}				\
369		MAKEFILES=${SOURCE}/$${setup_subdir}/Makefile	\
370		SOURCE=${SOURCE}/$${setup_subdir}/		\
371		RELATIVE_SOURCE_PATH=${RELATIVE_SOURCE_PATH}/$${setup_subdir}	\
372		TARGET=${TARGET}/$${setup_subdir}/		\
373		build_setup;
374
375build_setup: $(BUILD_SETUP_SUBDIRS_TARGETS)
376	$(_v)${MAKE} do_build_setup;
377
378
379#
380# Build all architectures for all Configuration/Architecture options
381#
382# Note - TARGET_CONFIGS_UC variable holds sets of three configuration options.  The first 
383# item in the set is the kernel configuration.  The second item in the set is the architecture  
384# and the third item is the machine configuration.  There may be multiple sets to build.
385#
386.PHONY: all
387
388ifeq ($(RC_ProjectName),Libsyscall)
389all:
390	cd libsyscall ; 								\
391		sdk="$(SDKROOT)" ;							\
392		if [ $${sdk} = / ] ; then						\
393			sdk="" ;							\
394		fi;									\
395		if [ $(UNAME_S) != "Linux" ]; then					\
396			xcrun -sdk "$(SDKROOT)" xcodebuild install	 		\
397				"SRCROOT=$(SRCROOT)/libsyscall"				\
398				"OBJROOT=$(OBJROOT)" 					\
399				"SYMROOT=$(SYMROOT)" 					\
400				"DSTROOT=$(DSTROOT)"					\
401				"SDKROOT=$${sdk}"					\
402		else									\
403			# Can't build this yet, ignore					\
404		fi
405else ifeq ($(RC_ProjectName),libkxld)
406all:
407	make -C libkern/kxld/ install
408else ifeq ($(RC_ProjectName),libkxld_host)
409all:
410	make -C libkern/kxld/ install PRODUCT_TYPE=ARCHIVE
411else ifeq ($(RC_ProjectName),libkmod)
412all:
413	cd libkern/kmod ; 								\
414		sdk="$(SDKROOT)" ;							\
415		if [ $${sdk} = / ] ; then						\
416			sdk="" ;							\
417		fi;									\
418		if [ $(UNAME_S) != "Linux" ]; then					\
419			xcrun -sdk "$(SDKROOT)" xcodebuild install	 		\
420				"SRCROOT=$(SRCROOT)/libkern/kmod"			\
421				"OBJROOT=$(OBJROOT)" 					\
422				"SYMROOT=$(SYMROOT)" 					\
423				"DSTROOT=$(DSTROOT)"					\
424				"SDKROOT=$${sdk}";					\
425		else									\
426			make								\
427				TARGET=$(TARGET)					\
428				SYMROOT=$(SYMROOT)					\
429				COMPONENT=libkern					\
430				SDKROOT=$${sdk}						\
431				do_install;						\
432		fi
433else ifeq ($(findstring _headers_Sim,$(RC_ProjectName)),_headers_Sim) # Libsyscall/xnu _headers_Sim
434all: exporthdrs
435else # xnu or xnu_debug
436ifeq ($(COMPONENT), .)
437all: exporthdrs setup
438else
439all:
440endif
441	$(_v)my_counter=1;		\
442	for my_config in $(TARGET_CONFIGS_UC);				\
443	do		\
444	if [ $${my_counter} -eq 1 ] ; then	\
445		my_counter=2;		\
446		kernel_config=$${my_config};		\
447		if [ $${kernel_config} = DEFAULT ] ; then	\
448			kernel_config=$(DEFAULT_KERNEL_CONFIG);		\
449		fi;		\
450	elif [ $${my_counter} -eq 2 ] ; then	\
451		my_counter=3;		\
452		arch_config=$${my_config};		\
453		if [ $${arch_config} = DEFAULT ] ; then	\
454			arch_config=`arch | $(TR) a-z A-Z`;		\
455		fi;		\
456	else		\
457		my_counter=1;		\
458		machine_config=$${my_config};		\
459		if [ $${arch_config} = ARM ] ; then	\
460			if [ $${machine_config} = DEFAULT ] ; then	\
461				machine_config=$(DEFAULT_ARM_MACHINE_CONFIG);		\
462			fi;		\
463		fi;		\
464		if [ $${arch_config} = L4_ARM ] ; then	\
465			if [ $${machine_config} = DEFAULT ] ; then	\
466				machine_config=$(DEFAULT_L4_ARM_MACHINE_CONFIG);		\
467			fi;		\
468		fi;		\
469		if [ $${machine_config} = DEFAULT ] ; then	\
470			build_subdir=${OBJROOT}/$${kernel_config}_$${arch_config}/${RELATIVE_SOURCE_PATH}; \
471		else		\
472			build_subdir=${OBJROOT}/$${kernel_config}_$${arch_config}_$${machine_config}/${RELATIVE_SOURCE_PATH}; \
473		fi;		\
474		[ -d $${build_subdir} ] || $(MKDIR) $${build_subdir};					\
475			${MAKE} ${MAKEJOBS} -C $${build_subdir}				\
476				KERNEL_CONFIG=$${kernel_config}				\
477				ARCH_CONFIG=$${arch_config}				\
478				MACHINE_CONFIG=$${machine_config}			\
479				MAKEFILES=${SOURCE}/Makefile 				\
480				SOURCE=${SOURCE}/					\
481				RELATIVE_SOURCE_PATH=${RELATIVE_SOURCE_PATH}		\
482				build_all;						\
483	fi;		\
484	done;
485endif
486
487.PHONY: all_embedded all_devicemap
488all_embedded all_devicemap: all
489
490#
491# Build all architectures for all Configuration/Architecture options
492#
493do_build_all:
494
495BUILD_ALL_SUBDIRS_TARGETS = $(addprefix build_all_,$(COMP_SUBDIRS) $($(addprefix COMP_SUBDIRS_, $(ARCH_CONFIG))))
496
497.PHONY: $(BUILD_ALL_SUBDIRS_TARGETS)
498
499$(BUILD_ALL_SUBDIRS_TARGETS):
500	$(_v)if [ $(MACHINE_CONFIG) = DEFAULT ] ; then  \
501		TARGET=$(OBJROOT)/$(KERNEL_CONFIG)_$(ARCH_CONFIG)/$(COMPONENT);	\
502	else		\
503		TARGET="$(OBJROOT)/$(KERNEL_CONFIG)_$(ARCH_CONFIG)_$(MACHINE_CONFIG)/$(COMPONENT)";	\
504	fi;		\
505	comp_subdir="$(patsubst build_all_%,%,$@)";		\
506	[ -d $${comp_subdir} ] || $(MKDIR) $${comp_subdir};	\
507	${MAKE} -C $${comp_subdir}				\
508		MAKEFILES=${SOURCE}/$${comp_subdir}/Makefile	\
509		SOURCE=${SOURCE}$${comp_subdir}/		\
510		RELATIVE_SOURCE_PATH=$(RELATIVE_SOURCE_PATH)/$${comp_subdir}	\
511		TARGET=$${TARGET}				\
512		build_all;
513
514build_all: $(BUILD_ALL_SUBDIRS_TARGETS)
515	$(_v)if [ $(MACHINE_CONFIG) = DEFAULT ] ; then  \
516		TARGET=$(OBJROOT)/$(KERNEL_CONFIG)_$(ARCH_CONFIG)/$(COMPONENT);	\
517	else		\
518		TARGET="$(OBJROOT)/$(KERNEL_CONFIG)_$(ARCH_CONFIG)_$(MACHINE_CONFIG)/$(COMPONENT)";	\
519	fi;		\
520	${MAKE} INCL_MAKEDEP=TRUE TARGET=$${TARGET} do_build_all;	\
521	_TMP_comp_subdir="$(CONFIG_SUBDIRS) $($(addprefix CONFIG_SUBDIRS_, $(ARCH_CONFIG)))";	\
522	for comp_subdir in $${_TMP_comp_subdir};			\
523	do								\
524		[ -d $${comp_subdir} ] || $(MKDIR) $${comp_subdir};				\
525		${MAKE} -C $${comp_subdir}				\
526			MAKEFILES=${SOURCE}/$${comp_subdir}/Makefile	\
527			SOURCE=${SOURCE}$${comp_subdir}/		\
528			RELATIVE_SOURCE_PATH=$(RELATIVE_SOURCE_PATH)/$${comp_subdir}	\
529			TARGET=$${TARGET}				\
530		build_all;						\
531	done;								
532	
533
534#
535# Build all architectures for all Configuration/Architecture options
536#
537# Note - TARGET_CONFIGS_UC variable holds sets of three configuration options.  The first 
538# item in the set is the kernel configuration.  The second item is the architecture  
539# and the third item is the machine configuration.  There may be multiple sets to build.
540#
541mach_kernel:
542	$(_v)my_counter=1;		\
543	for my_config in $(TARGET_CONFIGS_UC);				\
544	do		\
545	if [ $${my_counter} -eq 1 ] ; then	\
546		my_counter=2;		\
547		kernel_config=$${my_config};		\
548		if [ $${kernel_config} = DEFAULT ] ; then	\
549			kernel_config=$(DEFAULT_KERNEL_CONFIG);		\
550		fi;		\
551	elif [ $${my_counter} -eq 2 ] ; then	\
552		my_counter=3;		\
553		arch_config=$${my_config};		\
554		if [ $${arch_config} = DEFAULT ] ; then	\
555			arch_config=`arch | $(TR) a-z A-Z`;		\
556		fi;		\
557	else		\
558		my_counter=1;		\
559		machine_config=$${my_config};		\
560		if [ $${arch_config} = ARM ] ; then	\
561			if [ $${machine_config} = DEFAULT ] ; then	\
562				machine_config=$(DEFAULT_ARM_MACHINE_CONFIG);		\
563			fi;		\
564		fi;		\
565		if [ $${arch_config} = L4_ARM ] ; then	\
566			if [ $${machine_config} = DEFAULT ] ; then	\
567				machine_config=$(DEFAULT_L4_ARM_MACHINE_CONFIG);		\
568			fi;		\
569		fi;		\
570		if [ $${machine_config} = DEFAULT ] ; then	\
571			build_subdir=${OBJROOT}/$${kernel_config}_$${arch_config};	\
572		else		\
573			build_subdir=${OBJROOT}/$${kernel_config}_$${arch_config}_$${machine_config};	\
574		fi;		\
575		[ -d $${build_subdir} ] || $(MKDIR) $${build_subdir};					\
576		${MAKE} ${MAKEJOBS} -C $${build_subdir}					\
577			KERNEL_CONFIG=$${kernel_config}				\
578			ARCH_CONFIG=$${arch_config}				\
579			MACHINE_CONFIG=$${machine_config}			\
580			MAKEFILES=${SOURCE}/Makefile 				\
581			SOURCE=${SOURCE}/					\
582			TARGET=$${build_subdir}/				\
583			build_mach_kernel;					\
584	fi;		\
585	done;
586
587#
588# Build all architectures for all Configuration/Architecture options
589#
590do_build_mach_kernel:
591
592build_mach_kernel: 
593	$(_v)${MAKE} do_build_mach_kernel;
594
595
596#
597#
598# Install dependencies order
599#
600.ORDER: installhdrs exporthdrs all
601
602#
603# Install kernel based on RC_ARCHS for all INSTALL_TYPES
604# Install kernel header files based on RC_ARCHS
605#
606install: installhdrs all installman installmachinekernels
607ifeq ($(findstring Libsyscall,$(RC_ProjectName)),Libsyscall)
608# nothing to do
609else ifeq ($(findstring libkxld,$(RC_ProjectName)),libkxld)
610# nothing to do, work performed in "all" action
611else ifeq ($(RC_ProjectName),libkmod)
612# nothing to do, work performed in "all" action
613else ifeq ($(findstring _headers_Sim,$(RC_ProjectName)),_headers_Sim)
614# nothing to do
615else # xnu or xnu_debug
616# A bit of a hack for machine_config: machine configs aren't really threaded through properly.
617	$(_v)machine_config=$(MACHINE_CONFIG);		\
618	for kernel_config in $(INSTALL_TYPE);				\
619	do								\
620	for arch_config in $(INSTALL_ARCHS);				\
621	do								\
622	if [ $${arch_config} = ARM ] ; then	\
623		if [ $${machine_config} = DEFAULT ] ; then	\
624			machine_config=$(DEFAULT_ARM_MACHINE_CONFIG);		\
625		fi;		\
626	fi;		\
627	if [ $${arch_config} = L4_ARM ] ; then	\
628		if [ $${machine_config} = DEFAULT ] ; then	\
629			machine_config=$(DEFAULT_L4_ARM_MACHINE_CONFIG);		\
630		fi;		\
631	fi;		\
632	if [ $${machine_config} = DEFAULT ] ; then	\
633		install_subdir=${OBJROOT}/$${kernel_config}_$${arch_config}/${RELATIVE_SOURCE_PATH};	\
634	else		\
635		install_subdir=${OBJROOT}/$${kernel_config}_$${arch_config}_$${machine_config}/${RELATIVE_SOURCE_PATH};	\
636	fi;		\
637	[ -d $${install_subdir} ] || $(MKDIR) $${install_subdir};					\
638	${MAKE} ${MAKEJOBS} -C $${install_subdir}			\
639		KERNEL_CONFIG=$${kernel_config}				\
640		ARCH_CONFIG=$${arch_config}				\
641		MACHINE_CONFIG=$${machine_config}			\
642		MAKEFILES=${SOURCE}/Makefile 				\
643		SOURCE=${SOURCE}/					\
644		RELATIVE_SOURCE_PATH=${RELATIVE_SOURCE_PATH}		\
645		build_install;						\
646	done;								\
647	done;
648ifeq ($(RC_ProjectName),xnu_debug)
649	$(_v)$(MKDIR) $(DSTROOT)/$(DEVELOPER_EXTRAS_DIR)
650	$(_v)$(MV) $(DSTROOT)/mach_kernel* $(DSTROOT)/$(DEVELOPER_EXTRAS_DIR)
651	$(_v)$(CP) $(SYMROOT)/kgmacros $(DSTROOT)/$(DEVELOPER_EXTRAS_DIR)
652	$(_v)$(CP) -r $(SYMROOT)/System.kext $(DSTROOT)/$(DEVELOPER_EXTRAS_DIR)
653	$(_v)$(CP) -r $(SYMROOT)/mach_kernel.dSYM $(DSTROOT)/$(DEVELOPER_EXTRAS_DIR)
654	$(_v)$(CP) $(SRCROOT)/config/README.DEBUG-kernel.txt $(DSTROOT)/$(DEVELOPER_EXTRAS_DIR)
655	$(_v)$(MV) $(DSTROOT)/System $(DSTROOT)/usr $(OBJROOT)/
656endif
657endif
658
659.PHONY: install_embedded install_devicemap
660install_embedded install_devicemap: install
661
662installmachinekernels:
663	@echo "[ $(SOURCE) ] make installmachinekernels";				\
664	my_counter=1;		\
665	for my_config in $(TARGET_CONFIGS_UC);				\
666	do		\
667	if [ $${my_counter} -eq 1 ] ; then	\
668		my_counter=2;		\
669		kernel_config=$${my_config};		\
670		if [ $${kernel_config} = DEFAULT ] ; then	\
671			kernel_config=$(DEFAULT_KERNEL_CONFIG);		\
672		fi;		\
673	elif [ $${my_counter} -eq 2 ] ; then	\
674		my_counter=3;		\
675		arch_config=$${my_config};		\
676		if [ $${arch_config} = DEFAULT ] ; then	\
677			arch_config=`arch | $(TR) a-z A-Z`;		\
678		fi;		\
679	else		\
680		my_counter=1;		\
681		machine_config=$${my_config};		\
682		if [ $${machine_config} != DEFAULT ] ; then	\
683			build_subdir=${OBJROOT}/$${kernel_config}_$${arch_config}_$${machine_config};	\
684			install_kernel_file=mach.`printf "%s" "$${kernel_config}" | $(TR) A-Z a-z`.`printf "%s" "$${machine_config}" | $(TR) A-Z a-z`;	\
685			[ -d $${build_subdir} ] || $(MKDIR) $${build_subdir};					\
686			${MAKE} ${MAKEJOBS} -C $${build_subdir}					\
687				INSTALL_KERNEL_FILE=$${install_kernel_file}		\
688				KERNEL_CONFIG=$${kernel_config}				\
689				ARCH_CONFIG=$${arch_config}				\
690				MACHINE_CONFIG=$${machine_config}			\
691				MAKEFILES=${SOURCE}/Makefile 				\
692				SOURCE=${SOURCE}/					\
693				RELATIVE_SOURCE_PATH=${RELATIVE_SOURCE_PATH}		\
694				TARGET=$${build_subdir}/				\
695				do_build_install;					\
696		fi;		\
697	fi;		\
698	done;
699
700#
701# Install for all architectures for all Configuration/Architecture options
702#
703setup_build_install:
704
705do_build_install:
706
707BUILD_INSTALL_SUBDIRS_TARGETS = $(addprefix build_install_,$(INST_SUBDIRS))
708
709.PHONY: $(BUILD_INSTALL_SUBDIRS_TARGETS)
710
711$(BUILD_INSTALL_SUBDIRS_TARGETS):
712	$(_v)if [ $(MACHINE_CONFIG) = DEFAULT ] ; then  \
713		TARGET=${OBJROOT}/$(KERNEL_CONFIG)_$(ARCH_CONFIG)/$(COMPONENT);	\
714	else		\
715		TARGET="$(OBJROOT)/$(KERNEL_CONFIG)_$(ARCH_CONFIG)_$(MACHINE_CONFIG)/$(COMPONENT)";	\
716	fi;		\
717	${MAKE} TARGET=$${TARGET} setup_build_install;			\
718	kernel_config=$(KERNEL_CONFIG);					\
719	install_subdir="$(patsubst build_install_%,%,$@)";		\
720	[ -d $${install_subdir} ] || $(MKDIR) $${install_subdir};				\
721	${MAKE} -C $${install_subdir}				\
722		KERNEL_CONFIG=$${kernel_config}			\
723		MAKEFILES=${SOURCE}/$${install_subdir}/Makefile	\
724		SOURCE=${SOURCE}$${install_subdir}/		\
725		RELATIVE_SOURCE_PATH=${RELATIVE_SOURCE_PATH}/$${install_subdir}		\
726		TARGET=$${TARGET}				\
727		build_install;
728
729build_install: $(BUILD_INSTALL_SUBDIRS_TARGETS)
730	$(_v)if [ $(MACHINE_CONFIG) = DEFAULT ] ; then  \
731		TARGET=${OBJROOT}/$(KERNEL_CONFIG)_$(ARCH_CONFIG)/$(COMPONENT);	\
732	else		\
733		TARGET="$(OBJROOT)/$(KERNEL_CONFIG)_$(ARCH_CONFIG)_$(MACHINE_CONFIG)/$(COMPONENT)";	\
734	fi;		\
735	${MAKE} TARGET=$${TARGET} do_build_install;
736
737
738#
739# Install source tree
740#
741.PHONY: installsrc
742
743installsrc:
744	$(_v)($(TAR) -c --mode go=r,+X --no-ignore-case --exclude .svn --exclude .git --exclude cscope.\* --exclude BUILD --exclude \*~ -f - .) | (cd $(SRCROOT) && $(TAR) --no-same-owner -xf -)
745
746
747#
748# Clean up source tree
749#
750.PHONY: clean
751
752clean:
753
754#
755# Build source file list for cscope database and tags
756#
757cscope.files:
758	@echo "Building file list for cscope and tags"
759	@find . -name '*.h' -type f | grep -v ^..BUILD > _cscope.files 2> /dev/null
760	@find . -name '*.defs' -type f | grep -v ^..BUILD >> _cscope.files 2> /dev/null
761	@find . -name '*.c' -type f | grep -v ^..BUILD >> _cscope.files 2> /dev/null
762	@find . -name '*.cpp' -type f | grep -v ^..BUILD >> _cscope.files 2> /dev/null
763	@find . -name '*.s' -type f | grep -v ^..BUILD >> _cscope.files 2> /dev/null
764	@find . -name '*.h.template' -type f | grep -v ^..BUILD >> _cscope.files 2> /dev/null
765	@echo -k -q -c > cscope.files 2> /dev/null
766	@sort -u < _cscope.files >> cscope.files 2> /dev/null
767	@rm -f _cscope.files _cscope.files2 2> /dev/null
768
769#
770# Build cscope database
771#
772cscope: cscope.files
773	@echo "Building cscope database"
774	@cscope -bvU 2> /dev/null
775
776#
777# Build tags
778#
779
780tags: cscope.files
781	@echo "Building ctags"
782	@-sed 1d cscope.files | xargs ctags -dtw 2> /dev/null || \
783		echo "Phantom files detected!" 2>&1 > /dev/null
784	@-[ -f TAGS ] || ${MAKE} TAGS
785
786TAGS: cscope.files
787	@echo "Building etags"
788	@-cat cscope.files | etags -l auto -S - 2> /dev/null
789
790#
791# Install Man Pages
792#
793.PHONY: installman
794
795installman:
796ifeq ($(findstring Libsyscall,$(RC_ProjectName)),Libsyscall)
797# nothing to do
798else ifeq ($(findstring libkxld,$(RC_ProjectName)),libkxld)
799# nothing to do
800else ifeq ($(RC_ProjectName),libkmod)
801# nothing to do
802else ifeq ($(findstring xnu_,$(RC_ProjectName)),xnu_)
803installman:
804# nothing to do
805else # xnu
806	@echo "[ $(SRCROOT) ] Installing man pages"
807	$(_v)manpath=$(DSTROOT)/$(MANDIR);   \
808	[ -d $$manpath ] || $(MKDIR) $$manpath;             \
809	${MAKE} ${MAKEJOBS} MAKEFILES=${SOURCE}/Makefile \
810		SOURCE=${SOURCE}/ \
811		RELATIVE_SOURCE_PATH=${RELATIVE_SOURCE_PATH} \
812		TARGET=${DSTROOT}/ \
813		build_installman
814	${SRCROOT}/config/compress-man-pages.pl ${DSTROOT}/${MANDIR}
815endif
816
817do_installman:
818
819BUILD_INSTALLMAN_SUBDIRS_TARGETS = $(addprefix build_installman_,$(INSTMAN_SUBDIRS))
820
821.PHONY: $(BUILD_INSTALLMAN_SUBDIRS_TARGETS)
822
823$(BUILD_INSTALLMAN_SUBDIRS_TARGETS):
824	$(_v)installman_subdir="$(patsubst build_installman_%,%,$@)";	\
825	${MAKE} -C $${installman_subdir} -r 	 				\
826		MAKEFILES=$(SOURCE)$${installman_subdir}/Makefile 		\
827		SOURCE=$(SOURCE)$${installman_subdir}/ 				\
828		RELATIVE_SOURCE_PATH=$(RELATIVE_SOURCE_PATH)/$${installman_subdir}	\
829		TARGET=$(TARGET)$${installman_subdir}/ 				\
830		build_installman; 
831
832build_installman: $(BUILD_INSTALLMAN_SUBDIRS_TARGETS)
833	$(_v)if [ -n "$(strip $(INSTALL_MAN_LIST))" ]; then \
834		${MAKE} do_installman; \
835	fi
836
837# vim: set ft=make:
838