Makefile.kmod   [plain text]


#
# Kernel Module Library code makefile
#

export MakeInc_cmd=${SRCROOT}/makedefs/MakeInc.cmd
export MakeInc_def=${SRCROOT}/makedefs/MakeInc.def
export MakeInc_rule=${SRCROOT}/makedefs/MakeInc.rule
export MakeInc_dir=${SRCROOT}/makedefs/MakeInc.dir


include $(MakeInc_cmd)
include $(MakeInc_def)

INSTALL_DIR = 		$(DSTROOT)/usr/lib
KMOD_NAME =		libkmod
KMODCPP_NAME =		libkmodc++
LIB_INSTALL_FLAGS = 	-p -m 444

# -mkernel implies -mlong-branch/-mlong-calls/-mno-red-zone as needed for
# code linked into kexts
# -fno-stack-protector is necessary for the kernel, but not for kexts
CFLAGS_KMOD = $(filter-out -O0 -O1 -O2 -O3 -O4 -Os -Oz -freorder-blocks -flto -fno-stack-protector,$(CFLAGS)) \
	    -Os -mkernel -Wall

ifneq ($(MACHINE_CONFIG), DEFAULT)
COMPOBJROOT = $(OBJROOT)/$(KERNEL_CONFIG)_$(ARCH_CONFIG)_$(MACHINE_CONFIG)/$(COMPONENT)/kmod
INSTOBJROOT = $(OBJROOT)/$(INSTALL_TYPE)_$(ARCH_CONFIG)_$(MACHINE_CONFIG)/$(COMPONENT)/kmod
else
COMPOBJROOT = $(OBJROOT)/$(KERNEL_CONFIG)_$(ARCH_CONFIG)/$(COMPONENT)/kmod
INSTOBJROOT = $(OBJROOT)/$(INSTALL_TYPE)_$(ARCH_CONFIG)/$(COMPONENT)/kmod
endif


KMOD_CFILES    = c_start.c c_stop.c
KMODCPP_CFILES = cplus_start.c cplus_stop.c

KMOD_OFILES    = $(KMOD_CFILES:.c=.o)
KMODCPP_OFILES = $(KMODCPP_CFILES:.c=.o)

ALL_OFILES = $(KMOD_OFILES) $(KMODCPP_OFILES)

$(ALL_OFILES): %.o : %.c
	@echo LIBKMOD_CC $@
	$(_v)${LIBKMOD_CC} -c ${CFLAGS_KMOD} ${${join $@,_CFLAGS}} ${INCFLAGS} ${${join $@,_INCFLAGS}} -o $(COMPOBJROOT)/$(*F).o $<

$(COMPOBJROOT)/$(KMOD_NAME).a: $(KMOD_OFILES)
	@echo LIBTOOL $(notdir $@)
	$(_v)$(LIBTOOL) -static -o $@ $^ $(_vstdout) 2>&1

$(COMPOBJROOT)/$(KMODCPP_NAME).a: $(KMODCPP_OFILES)
	@echo LIBTOOL $(notdir $@)
	$(_v)$(LIBTOOL) -static -o $@ $^ $(_vstdout) 2>&1

do_build_all: $(COMPOBJROOT)/$(KMOD_NAME).a $(COMPOBJROOT)/$(KMODCPP_NAME).a

$(INSTALL_DIR)/%.a: $(INSTOBJROOT)/%.a
	@echo Installing $< in $@;
	$(_v)$(RM) $@ || true;						\
	${MKDIR} $(INSTALL_DIR) $(SYMROOT);				\
	if [ $(MACHINE_CONFIG) = DEFAULT ]; then			\
		allarchs="";						\
		for onearch in $(INSTALL_ARCHS); do			\
			if [ $${onearch} = ARM ] ; then			\
				archdir=$(OBJROOT)/$(KERNEL_CONFIG)_$${onearch}_$(DEFAULT_ARM_MACHINE_CONFIG)/$(COMPONENT); \
			else						\
				archdir=$(OBJROOT)/$(KERNEL_CONFIG)_$${onearch}/$(COMPONENT); \
			fi;						\
			if [ -e $${archdir}/kmod/$(*F).a ]; then	\
				allarchs="$${allarchs} $${archdir}/kmod/$(*F).a"; \
			fi;						\
		done;							\
		cmd="$(LIPO) $${allarchs} -create -output $(SYMROOT)/$(*F).a"; \
		echo $$cmd; eval $$cmd;					\
	else								\
		my_counter=1;						\
		my_innercounter=1;					\
		outputfile=$(SYMROOT)/$(*F).a;				\
		for my_config in $(TARGET_CONFIGS_UC); do		\
			if [ $${my_counter} -eq 1 ]; then		\
				my_counter=2;				\
				my_kconfig=$${my_config};		\
			elif [ $${my_counter} -eq 2 ]; then		\
				my_counter=3;				\
				my_aconfig=$${my_config};		\
			else						\
				my_counter=1;				\
				if [ $${my_aconfig} = ARM ] ; then	\
					if [ $${my_config} = DEFAULT ] ; then	\
						my_config=$(DEFAULT_ARM_MACHINE_CONFIG);	\
					fi;		    		\
				fi;					\
				inputfile=$(OBJROOT)/$${my_kconfig}_$${my_aconfig}_$${my_config}/$(COMPONENT)/kmod/$(*F).a; \
				if [ -e $${inputfile} ]; then		\
					if [ $${my_innercounter} -eq 1 ]; then \
						my_innercounter=2;	\
						cmd="$(LIPO) -create $${inputfile} -o $${outputfile}"; \
					else				\
						cmd="$(LIPO) -create $${outputfile} $${inputfile} -o $${outputfile} || true"; \
					fi;				\
					echo $$cmd; eval $$cmd;		\
				fi;					\
			fi;						\
		done;							\
	fi;								\
	cmd="$(INSTALL) $(LIB_INSTALL_FLAGS) $(SYMROOT)/$(*F).a $@";	\
	echo $$cmd; eval $$cmd

do_build_install: $(INSTALL_DIR)/$(KMOD_NAME).a $(INSTALL_DIR)/$(KMODCPP_NAME).a

# include $(MakeInc_rule)
include $(MakeInc_dir)