1#
2# Kernel Module Library code makefile
3#
4
5export MakeInc_cmd=${SRCROOT}/makedefs/MakeInc.cmd
6export MakeInc_def=${SRCROOT}/makedefs/MakeInc.def
7export MakeInc_rule=${SRCROOT}/makedefs/MakeInc.rule
8export MakeInc_dir=${SRCROOT}/makedefs/MakeInc.dir
9
10
11include $(MakeInc_cmd)
12include $(MakeInc_def)
13
14INSTALL_DIR = 		$(DSTROOT)/usr/lib
15KMOD_NAME =		libkmod
16KMODCPP_NAME =		libkmodc++
17LIB_INSTALL_FLAGS = 	-p -m 444
18
19# -mkernel implies -mlong-branch/-mlong-calls/-mno-red-zone as needed for
20# code linked into kexts
21# -fno-stack-protector is necessary for the kernel, but not for kexts
22CFLAGS_KMOD = $(filter-out -O0 -O1 -O2 -O3 -O4 -Os -Oz -freorder-blocks -flto -fno-stack-protector,$(CFLAGS)) \
23	    -Os -mkernel -Wall
24
25ifneq ($(MACHINE_CONFIG), DEFAULT)
26COMPOBJROOT = $(OBJROOT)/$(KERNEL_CONFIG)_$(ARCH_CONFIG)_$(MACHINE_CONFIG)/$(COMPONENT)/kmod
27INSTOBJROOT = $(OBJROOT)/$(INSTALL_TYPE)_$(ARCH_CONFIG)_$(MACHINE_CONFIG)/$(COMPONENT)/kmod
28else
29COMPOBJROOT = $(OBJROOT)/$(KERNEL_CONFIG)_$(ARCH_CONFIG)/$(COMPONENT)/kmod
30INSTOBJROOT = $(OBJROOT)/$(INSTALL_TYPE)_$(ARCH_CONFIG)/$(COMPONENT)/kmod
31endif
32
33KMOD_CFILES    = c_start.c  c_stop.c
34KMODCPP_CFILES = cplus_start.c  cplus_stop.c
35
36KMOD_OFILES    = $(KMOD_CFILES:.c=.o)
37KMODCPP_OFILES = $(KMODCPP_CFILES:.c=.o)
38
39ALL_OFILES = $(KMOD_OFILES) $(KMODCPP_OFILES)
40
41$(ALL_OFILES): %.o : %.c
42	@echo LIBKMOD_CC $@
43	$(_v)${LIBKMOD_CC} -c ${CFLAGS_KMOD} ${${join $@,_CFLAGS}} ${INCFLAGS} ${${join $@,_INCFLAGS}} -o $(COMPOBJROOT)/$(*F).o $<
44
45$(COMPOBJROOT)/$(KMOD_NAME).a: $(KMOD_OFILES)
46	@echo LIBTOOL $(notdir $@)
47	$(_v)$(LIBTOOL) -static -o $@ $^ $(_vstdout) 2>&1
48
49$(COMPOBJROOT)/$(KMODCPP_NAME).a: $(KMODCPP_OFILES)
50	@echo LIBTOOL $(notdir $@)
51	$(_v)$(LIBTOOL) -static -o $@ $^ $(_vstdout) 2>&1
52
53do_build_all: $(COMPOBJROOT)/$(KMOD_NAME).a $(COMPOBJROOT)/$(KMODCPP_NAME).a
54
55$(INSTALL_DIR)/%.a: $(INSTOBJROOT)/%.a
56	@echo Installing $< in $@;
57	$(_v)$(RM) $@ || true;						\
58	${MKDIR} $(INSTALL_DIR) $(SYMROOT);				\
59	if [ $(MACHINE_CONFIG) = DEFAULT ]; then			\
60		allarchs="";						\
61		for onearch in $(INSTALL_ARCHS); do			\
62			if [ $${onearch} = ARM ] ; then			\
63				archdir=$(OBJROOT)/$(KERNEL_CONFIG)_$${onearch}_$(DEFAULT_ARM_MACHINE_CONFIG)/$(COMPONENT); \
64			else						\
65				archdir=$(OBJROOT)/$(KERNEL_CONFIG)_$${onearch}/$(COMPONENT); \
66			fi;						\
67			if [ -e $${archdir}/kmod/$(*F).a ]; then	\
68				allarchs="$${allarchs} $${archdir}/kmod/$(*F).a"; \
69			fi;						\
70		done;							\
71		cmd="$(LIPO) $${allarchs} -create -output $(SYMROOT)/$(*F).a"; \
72		echo $$cmd; eval $$cmd;					\
73	else								\
74		my_counter=1;						\
75		my_innercounter=1;					\
76		outputfile=$(SYMROOT)/$(*F).a;				\
77		for my_config in $(TARGET_CONFIGS_UC); do		\
78			if [ $${my_counter} -eq 1 ]; then		\
79				my_counter=2;				\
80				my_kconfig=$${my_config};		\
81			elif [ $${my_counter} -eq 2 ]; then		\
82				my_counter=3;				\
83				my_aconfig=$${my_config};		\
84			else						\
85				my_counter=1;				\
86				if [ $${my_aconfig} = ARM ] ; then	\
87					if [ $${my_config} = DEFAULT ] ; then	\
88						my_config=$(DEFAULT_ARM_MACHINE_CONFIG);	\
89					fi;		    		\
90				fi;					\
91				inputfile=$(OBJROOT)/$${my_kconfig}_$${my_aconfig}_$${my_config}/$(COMPONENT)/kmod/$(*F).a; \
92				if [ -e $${inputfile} ]; then		\
93					if [ $${my_innercounter} -eq 1 ]; then \
94						my_innercounter=2;	\
95						cmd="$(LIPO) -create $${inputfile} -o $${outputfile}"; \
96					else				\
97						cmd="$(LIPO) -create $${outputfile} $${inputfile} -o $${outputfile} || true"; \
98					fi;				\
99					echo $$cmd; eval $$cmd;		\
100				fi;					\
101			fi;						\
102		done;							\
103	fi;								\
104	cmd="$(INSTALL) $(LIB_INSTALL_FLAGS) $(SYMROOT)/$(*F).a $@";	\
105	echo $$cmd; eval $$cmd
106
107do_build_install: $(INSTALL_DIR)/$(KMOD_NAME).a $(INSTALL_DIR)/$(KMODCPP_NAME).a
108
109# include $(MakeInc_rule)
110include $(MakeInc_dir)
111