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