1SDKROOT ?= /
2ifeq "$(RC_TARGET_CONFIG)" "iPhone"
3Embedded?=YES
4else
5Embedded?=$(shell echo $(SDKROOT) | grep -iq iphoneos && echo YES || echo NO)
6endif
7
8ifdef RC_ARCHS
9    ARCHS:=$(RC_ARCHS)
10  else
11    ifeq "$(Embedded)" "YES"
12      ARCHS:=armv7 armv7s arm64
13    else
14      ARCHS:=x86_64 i386
15  endif
16endif
17
18CC = $(shell xcrun -sdk "$(SDKROOT)" -find cc)
19STRIP = $(shell xcrun -sdk "$(SDKROOT)" -find strip)
20CODESIGN = $(shell xcrun -sdk "$(SDKROOT)" -find codesign)
21export CODESIGN_ALLOCATE := $(shell xcrun -sdk "$(SDKROOT)" -find codesign_allocate)
22DSYMUTIL = $(shell xcrun -sdk "$(SDKROOT)" -find dsymutil)
23CFLAGS = -O0 -g -isysroot $(SDKROOT) $(patsubst %, -arch %,$(ARCHS))
24LDFLAGS = -dead_strip \
25	-isysroot $(SDKROOT) $(patsubst %, -arch %,$(ARCHS))
26
27OBJROOT?=$(shell /bin/pwd)/BUILD/obj
28SYMROOT?=$(shell /bin/pwd)/BUILD/sym
29DSTROOT?=$(shell /bin/pwd)/BUILD/dst
30
31EXECUTABLES = exit.nodyld \
32	exit.nopie.dyld-but-no-Libsystem exit.pie.dyld-but-no-Libsystem \
33	exit.nopie.dyld-and-Libsystem exit.pie.dyld-and-Libsystem \
34	exit.nopie exit.pie \
35	printexecinfo run test
36OBJECTS = exit-asm.o exit.o printexecinfo.o run.o
37
38default: $(addprefix $(DSTROOT)/,$(EXECUTABLES))
39
40clean:
41	rm -f $(addprefix $(OBJROOT)/,$(OBJECTS))
42	rm -f $(addprefix $(SYMROOT)/,$(EXECUTABLES))
43	rm -rf $(addsuffix .dSYM,$(addprefix $(SYMROOT)/,$(EXECUTABLES)))
44	rm -f $(addprefix $(DSTROOT)/,$(EXECUTABLES))
45
46# DEPENDENCIES
47$(addprefix $(DSTROOT)/,$(EXECUTABLES)): DSTROOT SYMROOT
48
49$(addprefix $(OBJROOT)/,$(OBJECTS)): OBJROOT
50
51DSTROOT SYMROOT OBJROOT:
52	mkdir -p $($@)
53
54# OBJECTS
55
56$(OBJROOT)/exit-asm.o: exit-asm.S OBJROOT
57	$(CC) -c -o $@ $< $(CFLAGS)
58
59$(OBJROOT)/exit.o: exit.c OBJROOT
60	$(CC) -c -o $@ $< $(CFLAGS)
61
62$(OBJROOT)/printexecinfo.o: printexecinfo.c OBJROOT
63	$(CC) -c -o $@ $< $(CFLAGS)
64
65$(OBJROOT)/run.o: run.c OBJROOT
66	$(CC) -c -o $@ $< $(CFLAGS)
67
68# EXECUTABLES
69
70$(DSTROOT)/exit.nodyld: $(OBJROOT)/exit-asm.o
71	$(CC) -o $@ $< $(LDFLAGS) -e _main -nostartfiles -nodefaultlibs -static -Wl,-segalign,0x4000
72	$(CODESIGN) -s - $@
73
74$(DSTROOT)/exit.nopie.dyld-but-no-Libsystem: $(OBJROOT)/exit-asm.o
75	$(CC) -o $@ $< $(LDFLAGS) -e _main -Wl,-no_pie -nostartfiles -nodefaultlibs -Wl,-no_new_main
76	$(CODESIGN) -s - $@
77
78$(DSTROOT)/exit.pie.dyld-but-no-Libsystem: $(OBJROOT)/exit-asm.o
79	$(CC) -o $@ $< $(LDFLAGS) -e _main -Wl,-pie -nostartfiles -nodefaultlibs -Wl,-no_new_main
80	$(CODESIGN) -s - $@
81
82$(DSTROOT)/exit.nopie.dyld-and-Libsystem: $(OBJROOT)/exit-asm.o
83	$(CC) -o $@ $< $(LDFLAGS) -Wl,-no_pie -nostartfiles -nodefaultlibs -lSystem
84	$(CODESIGN) -s - $@
85
86$(DSTROOT)/exit.pie.dyld-and-Libsystem: $(OBJROOT)/exit-asm.o
87	$(CC) -o $@ $< $(LDFLAGS) -Wl,-pie -nostartfiles -nodefaultlibs -lSystem
88	$(CODESIGN) -s - $@
89
90$(DSTROOT)/exit.nopie: $(OBJROOT)/exit.o
91	$(CC) -o $@ $< $(LDFLAGS) -Wl,-no_pie
92	$(CODESIGN) -s - $@
93
94$(DSTROOT)/exit.pie: $(OBJROOT)/exit.o
95	$(CC) -o $@ $< $(LDFLAGS) -Wl,-pie
96	$(CODESIGN) -s - $@
97
98$(DSTROOT)/printexecinfo: $(OBJROOT)/printexecinfo.o
99	$(CC) -o $@ $< $(LDFLAGS)
100	$(CODESIGN) -s - $@
101
102$(DSTROOT)/run: $(OBJROOT)/run.o
103	$(CC) -o $(SYMROOT)/run $< $(LDFLAGS)
104	$(DSYMUTIL) $(SYMROOT)/run
105	$(STRIP) -S -o $@ $(SYMROOT)/run
106	$(CODESIGN) -s - $@
107
108$(DSTROOT)/test: test.sh
109	install -m 755 $< $@
110