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