xref: /xnu-12377.41.6/libkern/kxld/Makefile (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
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