Makefile   [plain text]


################################################################################
# Note: this makefile is used only for the libkxld build alias.  It is not part
# of the regular kernel build process.
################################################################################

# Version
COMPATIBILITY_VERSION=1
CURRENT_VERSION=1

# Paths
ifndef DSTROOT
DSTROOT=./BUILD/dst
endif
ifndef OBJROOT
OBJROOT=./BUILD/obj
endif
ifndef SYMROOT
SYMROOT=./BUILD/sym
endif
ifdef SRCROOT
HDRSRC=$(SRCROOT)/libkern/libkern
OBJSRC=$(SRCROOT)/libkern/kxld
else
SRCROOT=.
HDRSRC=$(SRCROOT)/../libkern
OBJSRC=$(SRCROOT)
ROOT=BUILD
endif
ifdef RC_CFLAGS
ARCHS=$(addprefix -arch , $(RC_ARCHS))
else
ARCHS=-arch i386 -arch x86_64 -arch ppc
RC_CFLAGS=$(ARCHS) -pipe
endif

PRODUCT_TYPE ?= DYLIB

HDRDST=$(DSTROOT)/usr/local/include
LIBDST=$(DSTROOT)/usr/lib/system
ARCHIVEDST=$(DSTROOT)/usr/local/lib
LIBOBJ=$(OBJROOT)/libkxld.o
LIBKXLD_DYLIB=libkxld.dylib
LIBKXLD_ARCHIVE=libkxld.a
LIBKXLDNAME=/usr/lib/system/$(LIBKXLD_DYLIB)
LIBKXLDOBJ_DYLIB=$(OBJROOT)/$(LIBKXLD_DYLIB)
LIBKXLDOBJ_ARCHIVE=$(OBJROOT)/$(LIBKXLD_ARCHIVE)
LIBKXLDDST_DYLIB=$(LIBDST)/$(LIBKXLD_DYLIB)
LIBKXLDDST_ARCHIVE=$(ARCHIVEDST)/$(LIBKXLD_ARCHIVE)
TESTSRC=$(SRCROOT)/tests
TESTDST=./BUILD/tests

# Flags
SDKROOT ?= /
CFLAGS=-std=c99 -Wall -Wextra -Werror -pedantic -Wformat=2 -Wcast-align \
	-Wwrite-strings -Wshorten-64-to-32 -Wshadow -Winit-self -Wpointer-arith \
	-Wno-format-y2k -W -Wstrict-prototypes -Wmissing-prototypes -Wreturn-type \
	-Wcast-qual -Wwrite-strings -Wswitch -Wcast-align -Wbad-function-cast \
	-Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls -g \
	-isysroot $(SDKROOT)
LDFLAGS=$(ARCHS) -dynamiclib -install_name $(LIBKXLDNAME) \
	-compatibility_version $(COMPATIBILITY_VERSION) \
	-current_version $(CURRENT_VERSION) -isysroot $(SDKROOT) -lstdc++
INCLUDES=-I$(HDRSRC) $(INCFLAGS_EXTERN)

# Tools
CC = xcrun -sdk $(SDKROOT) cc
LIBTOOL = xcrun -sdk $(SDKROOT) libtool
STRIP = xcrun -sdk $(SDKROOT) strip

# Turn on -Wno-cast-align for arm since it won't build without it
ifeq ($(findstring arm, $(ARCHS)),arm)
CFLAGS+=-Wno-cast-align 
endif

# Files
HDR_NAMES=kxld.h kxld_types.h
OBJ_NAMES=kxld.o kxld_array.o kxld_copyright.o kxld_demangle.o kxld_dict.o \
	kxld_kext.o kxld_reloc.o kxld_sect.o kxld_seg.o kxld_sym.o kxld_state.o \
	kxld_symtab.o kxld_util.o kxld_uuid.o kxld_vtable.o
HDRS=$(addprefix $(HDRSRC)/, $(HDR_NAMES))
OBJS=$(addprefix $(OBJROOT)/, $(OBJ_NAMES))

$(shell [ -d $(OBJROOT) ] || mkdir -p $(OBJROOT))

# Implicit rules
%.o : %.c
$(OBJROOT)/%.o : $(OBJSRC)/%.c
	$(CC) $(RC_CFLAGS) $(CFLAGS) $(OPTIM) $(INCLUDES) -c $< -o $@
$(OBJROOT)/%.o : $(TESTSRC)/%.c
	$(CC) $(RC_CFLAGS) $(CFLAGS) -O0 -DDEBUG $(INCLUDES) -I $(SRCROOT) -c $< -o $@

SRCROOTESC=$(subst /,\/,$(SRCROOT))
OBJROOTESC=$(subst /,\/,$(OBJROOT))
SEDOBJS=sed -E 's/(^[a-z_]+)\.o/$(OBJROOTESC)\/\1\.o $(OBJROOTESC)\/\1\.d/'
SEDSRCS=sed -E 's/([a-z_]+\.[ch])/$(SRCROOTESC)\/\1/g'
$(OBJROOT)/%.d: $(OBJSRC)/%.c
	@set -e; rm -f $@; \
	$(CC) $(INCLUDES) -MM $< | $(SEDOBJS) | $(SEDSRCS) > $@;

# Rules
release: OPTIM=-Os -dynamic
release: build

debug: OPTIM=-O0 -DDEBUG -dynamic
debug: build

profile: OPTIM=-Os -pg -dynamic
profile: build

tests: OPTIM=-O0 -DDEBUG
tests: kxld_dict_test copyrighttest

build: $(LIBKXLDOBJ_$(PRODUCT_TYPE))
	@[ -d $(SYMROOT) ] || mkdir -p $(SYMROOT)
	install -c -m 644 $< $(SYMROOT)

$(LIBKXLDOBJ_DYLIB): $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $^

$(LIBKXLDOBJ_ARCHIVE): $(OBJS)
	$(LIBTOOL) -static -o $@ $^

installhdrs:
	@[ -d $(HDRDST) ] || mkdir -p $(HDRDST)
	install -o 0 -g 0 -c -m 444 $(HDRS) $(HDRDST)

install: release installhdrs $(LIBKXLDDST_$(PRODUCT_TYPE))

$(LIBKXLDDST_DYLIB):
	@[ -d $(LIBDST) ] || mkdir -p $(LIBDST)
	install -o 0 -g 0 -c -m 555 $(SYMROOT)/$(LIBKXLD_DYLIB) $(LIBDST)
	$(STRIP) -S -x $@

$(LIBKXLDDST_ARCHIVE):
	@[ -d $(ARCHIVEDST) ] || mkdir -p $(ARCHIVEDST)
	install -o 0 -g 0 -c -m 555 $(SYMROOT)/$(LIBKXLD_ARCHIVE) $(ARCHIVEDST)


KEXTCOPYOBJS=$(OBJROOT)/kextcopyright.o $(OBJROOT)/kxld_copyright.o $(OBJROOT)/kxld_util.o 
kextcopyright: $(KEXTCOPYOBJS) $(TESTDST)
	$(CC) $(ARCHS) $(KEXTCOPYOBJS) -framework CoreFoundation -o $(OBJROOT)/kextcopyright
	install -c -m 755 $(OBJROOT)/kextcopyright $(TESTDST)

DICTOBJS=$(OBJROOT)/kxld_dict_test.o $(OBJROOT)/kxld_dict.o $(OBJROOT)/kxld_array.o $(OBJROOT)/kxld_util.o
kxld_dict_test: $(DICTOBJS) $(TESTDST)
	$(CC) $(ARCHS) $(DICTOBJS) -o $(OBJROOT)/kxld_dict_test
	install -c -m 755 $(OBJROOT)/kxld_dict_test $(TESTDST)

COPYTESTOBJS=$(OBJROOT)/kxld_copyright.o $(OBJROOT)/kxld_util.o
copyrighttest: OPTIM+=-DTEST
copyrighttest: $(KEXTCOPYOBJS) $(TESTDST)
	$(CC) $(ARCHS) $(COPYTESTOBJS) -framework CoreFoundation -framework IOKit -o $(OBJROOT)/copyrighttest
	install -c -m 755 $(OBJROOT)/copyrighttest $(TESTDST)

$(TESTDST):
	@[ -d $(TESTDST) ] || mkdir -p $(TESTDST)

clean: 
	@rm -rf $(OBJROOT)/*

fullclean:
ifdef ROOT
	@rm -rf $(ROOT)
else
	@rm -rf $(OBJROOT) $(DSTROOT) $(SYMROOT)
endif

# Automatically build dependency information when .c or .h files change based
# on implicit rule for .d:.c
-include $(OBJS:.o=.d)