1################################################################################ 2# Note: this makefile is used only for the libkxld build alias. It is not part 3# of the regular kernel build process. 4################################################################################ 5 6# Version 7COMPATIBILITY_VERSION=1 8CURRENT_VERSION=1 9 10# Paths 11ifndef DSTROOT 12DSTROOT=./BUILD/dst 13endif 14ifndef OBJROOT 15OBJROOT=./BUILD/obj 16endif 17ifndef SYMROOT 18SYMROOT=./BUILD/sym 19endif 20ifdef SRCROOT 21HDRSRC=$(SRCROOT)/libkern/libkern 22OBJSRC=$(SRCROOT)/libkern/kxld 23else 24SRCROOT=. 25HDRSRC=$(SRCROOT)/../libkern 26OBJSRC=$(SRCROOT) 27ROOT=BUILD 28endif 29ifdef RC_CFLAGS 30ARCHS=$(addprefix -arch , $(RC_ARCHS)) 31else 32ARCHS=-arch x86_64 33RC_CFLAGS=$(ARCHS) -pipe 34endif 35ifdef INSTALL_LOCATION 36override DSTROOT := $(DSTROOT)/$(INSTALL_LOCATION) 37endif 38 39PRODUCT_TYPE ?= ALL 40 41HDRDST=$(DSTROOT)/usr/local/include 42DYLIBDST=$(DSTROOT)/usr/lib/system 43ARCHIVEDST=$(DSTROOT)/usr/local/lib 44LIBKXLD_DYLIB=libkxld.dylib 45LIBKXLD_ARCHIVE=libkxld.a 46LIBKXLD_DSYM=$(LIBKXLD_DYLIB).dSYM 47LIBKXLD_INSTALLNAME=/usr/lib/system/$(LIBKXLD_DYLIB) 48LIBKXLDOBJ_DYLIB=$(OBJROOT)/$(LIBKXLD_DYLIB) 49LIBKXLDOBJ_ARCHIVE=$(OBJROOT)/$(LIBKXLD_ARCHIVE) 50LIBKXLDSYM_DYLIB=$(SYMROOT)/$(LIBKXLD_DYLIB) 51LIBKXLDSYM_DYLIB_DSYM=$(SYMROOT)/$(LIBKXLD_DSYM) 52LIBKXLDSYM_ARCHIVE=$(SYMROOT)/$(LIBKXLD_ARCHIVE) 53LIBKXLDDST_DYLIB=$(DYLIBDST)/$(LIBKXLD_DYLIB) 54LIBKXLDDST_ARCHIVE=$(ARCHIVEDST)/$(LIBKXLD_ARCHIVE) 55TESTSRC=$(SRCROOT)/tests 56TESTDST=./BUILD/tests 57 58# Build both the dylib and archive 59LIBKXLDDST_ALL=$(LIBKXLDDST_DYLIB) $(LIBKXLDDST_ARCHIVE) 60 61# Flags 62ifdef SDKROOT 63 SDK_DIR := $(shell xcodebuild -version -sdk $(SDKROOT) Path) 64endif 65 66ifeq ($(strip $(SDK_DIR)),) 67 SDK_DIR := / 68endif 69 70 71DEFINES = -DPRIVATE 72CFLAGS=-std=c99 -Wall -Wextra -Werror -pedantic -Wformat=2 -Wcast-align \ 73 -Wwrite-strings -Wshorten-64-to-32 -Wshadow -Winit-self -Wpointer-arith \ 74 -Wno-format-y2k -W -Wstrict-prototypes -Wmissing-prototypes -Wreturn-type \ 75 -Wcast-qual -Wwrite-strings -Wswitch -Wcast-align -Wbad-function-cast \ 76 -Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls -g 77LDFLAGS=$(ARCHS) -dynamiclib -install_name $(LIBKXLD_INSTALLNAME) \ 78 -compatibility_version $(COMPATIBILITY_VERSION) \ 79 -current_version $(CURRENT_VERSION) -lstdc++ 80INCLUDES=-I$(HDRSRC) 81 82ifneq ($(SDK_DIR),/) 83 CFLAGS += -isysroot $(SDK_DIR) 84 LDFLAGS += -isysroot $(SDK_DIR) 85endif 86 87# Tools 88CC = xcrun -sdk $(SDK_DIR) clang 89LIBTOOL = xcrun -sdk $(SDK_DIR) libtool 90STRIP = xcrun -sdk $(SDK_DIR) strip 91DSYMUTIL = xcrun -sdk $(SDK_DIR) dsymutil 92 93# Files 94HDR_NAMES=kxld.h kxld_types.h prelink.h 95OBJ_NAMES=kxld.o kxld_array.o kxld_copyright.o kxld_demangle.o kxld_dict.o \ 96 kxld_kext.o kxld_object.o kxld_reloc.o kxld_sect.o kxld_seg.o \ 97 kxld_srcversion.o kxld_splitinfolc.o kxld_sym.o kxld_symtab.o kxld_util.o kxld_uuid.o \ 98 kxld_vtable.o kxld_versionmin.o 99 100HDRS=$(addprefix $(HDRSRC)/, $(HDR_NAMES)) 101OBJS=$(addprefix $(OBJROOT)/, $(OBJ_NAMES)) 102 103$(shell [ -d $(OBJROOT) ] || mkdir -p $(OBJROOT)) 104 105# Implicit rules 106%.o : %.c 107$(OBJROOT)/%.o : $(OBJSRC)/%.c 108 $(CC) $(RC_CFLAGS) $(CFLAGS) $(DEFINES) $(OPTIM) $(INCLUDES) -c $< -o $@ 109$(OBJROOT)/%.o : $(TESTSRC)/%.c 110 $(CC) $(RC_CFLAGS) $(CFLAGS) $(DEFINES) -O0 -DDEBUG $(INCLUDES) -I$(SRCROOT) -c $< -o $@ 111 112SRCROOTESC=$(subst /,\/,$(SRCROOT)) 113OBJROOTESC=$(subst /,\/,$(OBJROOT)) 114SEDOBJS=sed -E 's/(^[a-z_]+)\.o/$(OBJROOTESC)\/\1\.o $(OBJROOTESC)\/\1\.d/' 115SEDSRCS=sed -E 's/ ([a-z_]+\.[ch])/ $(SRCROOTESC)\/\1/g' 116$(OBJROOT)/%.d: $(OBJSRC)/%.c 117 @set -e; rm -f $@; \ 118 $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -MM $< | $(SEDOBJS) | $(SEDSRCS) > $@; 119 120# Rules 121release: OPTIM=-Os -dynamic 122release: build 123 124debug: OPTIM=-O0 -DDEBUG -dynamic 125debug: build 126 127profile: OPTIM=-Os -pg -dynamic 128profile: build 129 130tests: OPTIM=-O0 -DDEBUG 131tests: kxld_array_test kxld_dict_test copyrighttest 132 133build: $(LIBKXLDSYM_$(PRODUCT_TYPE)) 134 135$(LIBKXLDSYM_DYLIB): $(LIBKXLDOBJ_DYLIB) 136 @mkdir -p $(SYMROOT) 137 install -c -m 644 $< $@ 138 $(DSYMUTIL) $@ -o $(LIBKXLDSYM_DYLIB_DSYM) 139 140$(LIBKXLDSYM_ARCHIVE): $(LIBKXLDOBJ_ARCHIVE) 141 @mkdir -p $(SYMROOT) 142 install -c -m 644 $< $@ 143 144 145$(LIBKXLDOBJ_DYLIB): $(OBJS) 146 $(CC) $(LDFLAGS) -o $@ $^ 147 148$(LIBKXLDOBJ_ARCHIVE): $(OBJS) 149 $(LIBTOOL) -static -o $@ $^ 150 151installhdrs: 152 @mkdir -p $(HDRDST) 153 install -o 0 -g 0 -c -m 444 $(HDRS) $(HDRDST) 154 155install: release installhdrs $(LIBKXLDDST_$(PRODUCT_TYPE)) 156 157$(LIBKXLDDST_DYLIB): $(LIBKXLDSYM_DYLIB) 158 @mkdir -p $(DYLIBDST) 159 install -o 0 -g 0 -c -m 555 $< $@ 160 $(STRIP) -S -x $@ 161 162$(LIBKXLDDST_ARCHIVE): $(LIBKXLDSYM_ARCHIVE) 163 @mkdir -p $(ARCHIVEDST) 164 install -o 0 -g 0 -c -m 555 $< $@ 165 166KEXTCOPYOBJS=$(OBJROOT)/kextcopyright.o $(OBJROOT)/kxld_copyright.o $(OBJROOT)/kxld_util.o 167kextcopyright: $(TESTDST)/kextcopyright 168$(TESTDST)/kextcopyright: $(KEXTCOPYOBJS) 169 @mkdir -p $(TESTDST) 170 $(CC) $(ARCHS) $(KEXTCOPYOBJS) -framework CoreFoundation -o $(OBJROOT)/kextcopyright 171 install -c -m 755 $(OBJROOT)/kextcopyright $@ 172 173TESTOBJS=$(OBJROOT)/kxld_test.o $(OBJROOT)/kxld_util.o 174 175ARRAYOBJS=$(OBJROOT)/kxld_array_test.o $(OBJROOT)/kxld_array.o $(TESTOBJS) 176kxld_array_test: $(TESTDST)/kxld_array_test 177$(TESTDST)/kxld_array_test: $(ARRAYOBJS) 178 @mkdir -p $(TESTDST) 179 $(CC) $(ARCHS) $(ARRAYOBJS) -o $(OBJROOT)/kxld_array_test 180 install -c -m 755 $(OBJROOT)/kxld_array_test $@ 181 182DICTOBJS=$(OBJROOT)/kxld_dict_test.o $(OBJROOT)/kxld_dict.o $(OBJROOT)/kxld_array.o $(TESTOBJS) 183kxld_dict_test: $(TESTDST)/kxld_dict_test 184$(TESTDST)/kxld_dict_test: $(DICTOBJS) 185 @mkdir -p $(TESTDST) 186 $(CC) $(ARCHS) $(DICTOBJS) -o $(OBJROOT)/kxld_dict_test 187 install -c -m 755 $(OBJROOT)/kxld_dict_test $@ 188 189COPYTESTOBJS=$(OBJROOT)/kxld_copyright.o $(OBJROOT)/kxld_util.o 190copyrighttest: OPTIM+=-DTEST 191copyrighttest: $(TESTDST)/copyrighttest 192$(TESTDST)/copyrighttest: $(COPYTESTOBJS) 193 @mkdir -p $(TESTDST) 194 $(CC) $(ARCHS) $(COPYTESTOBJS) -framework CoreFoundation -framework IOKit -o $(OBJROOT)/copyrighttest 195 install -c -m 755 $(OBJROOT)/copyrighttest $@ 196 197clean: 198 @rm -rf $(OBJROOT)/* 199 200fullclean: 201ifdef ROOT 202 @rm -rf $(ROOT) 203else 204 @rm -rf $(OBJROOT) $(DSTROOT) $(SYMROOT) 205endif 206 207# Automatically build dependency information when .c or .h files change based 208# on implicit rule for .d:.c 209-include $(OBJS:.o=.d) 210