]>
Commit | Line | Data |
---|---|---|
320054e8 DG |
1 | # |
2 | # Makefile for musl (requires GNU make) | |
3 | # | |
4 | # This is how simple every makefile should be... | |
5 | # No, I take that back - actually most should be less than half this size. | |
6 | # | |
7 | # Use config.mak to override any of the following variables. | |
8 | # Do not make changes here. | |
9 | # | |
10 | ||
11 | srcdir = . | |
12 | exec_prefix = /usr/local | |
13 | bindir = $(exec_prefix)/bin | |
14 | ||
15 | prefix = /usr/local/musl | |
16 | includedir = $(prefix)/include | |
17 | libdir = $(prefix)/lib | |
18 | syslibdir = /lib | |
19 | ||
20 | SRC_DIRS = $(addprefix $(srcdir)/,src/* crt ldso) | |
21 | BASE_GLOBS = $(addsuffix /*.c,$(SRC_DIRS)) | |
22 | ARCH_GLOBS = $(addsuffix /$(ARCH)/*.[csS],$(SRC_DIRS)) | |
23 | BASE_SRCS = $(sort $(wildcard $(BASE_GLOBS))) | |
24 | ARCH_SRCS = $(sort $(wildcard $(ARCH_GLOBS))) | |
25 | BASE_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(BASE_SRCS))) | |
26 | ARCH_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(ARCH_SRCS))) | |
27 | REPLACED_OBJS = $(sort $(subst /$(ARCH)/,/,$(ARCH_OBJS))) | |
28 | ALL_OBJS = $(addprefix obj/, $(filter-out $(REPLACED_OBJS), $(sort $(BASE_OBJS) $(ARCH_OBJS)))) | |
29 | ||
30 | LIBC_OBJS = $(filter obj/src/%,$(ALL_OBJS)) | |
31 | LDSO_OBJS = $(filter obj/ldso/%,$(ALL_OBJS:%.o=%.lo)) | |
32 | CRT_OBJS = $(filter obj/crt/%,$(ALL_OBJS)) | |
33 | ||
34 | AOBJS = $(LIBC_OBJS) | |
35 | LOBJS = $(LIBC_OBJS:.o=.lo) | |
36 | GENH = obj/include/bits/alltypes.h obj/include/bits/syscall.h | |
37 | GENH_INT = obj/src/internal/version.h | |
38 | IMPH = $(addprefix $(srcdir)/, src/internal/stdio_impl.h src/internal/pthread_impl.h src/internal/locale_impl.h src/internal/libc.h) | |
39 | ||
40 | LDFLAGS = | |
41 | LDFLAGS_AUTO = | |
42 | LIBCC = -lgcc | |
43 | CPPFLAGS = | |
44 | CFLAGS = | |
45 | CFLAGS_AUTO = -Os -pipe | |
46 | CFLAGS_C99FSE = -std=c99 -ffreestanding -nostdinc | |
47 | ||
48 | CFLAGS_ALL = $(CFLAGS_C99FSE) | |
49 | CFLAGS_ALL += -D_XOPEN_SOURCE=700 -I$(srcdir)/arch/$(ARCH) -I$(srcdir)/arch/generic -Iobj/src/internal -I$(srcdir)/src/include -I$(srcdir)/src/internal -Iobj/include -I$(srcdir)/include | |
50 | CFLAGS_ALL += $(CPPFLAGS) $(CFLAGS_AUTO) $(CFLAGS) | |
51 | ||
52 | LDFLAGS_ALL = $(LDFLAGS_AUTO) $(LDFLAGS) | |
53 | ||
54 | AR = $(CROSS_COMPILE)ar | |
55 | RANLIB = $(CROSS_COMPILE)ranlib | |
56 | INSTALL = $(srcdir)/tools/install.sh | |
57 | ||
58 | ARCH_INCLUDES = $(wildcard $(srcdir)/arch/$(ARCH)/bits/*.h) | |
59 | GENERIC_INCLUDES = $(wildcard $(srcdir)/arch/generic/bits/*.h) | |
60 | INCLUDES = $(wildcard $(srcdir)/include/*.h $(srcdir)/include/*/*.h) | |
61 | ALL_INCLUDES = $(sort $(INCLUDES:$(srcdir)/%=%) $(GENH:obj/%=%) $(ARCH_INCLUDES:$(srcdir)/arch/$(ARCH)/%=include/%) $(GENERIC_INCLUDES:$(srcdir)/arch/generic/%=include/%)) | |
62 | ||
63 | EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl | |
64 | EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a) | |
65 | CRT_LIBS = $(addprefix lib/,$(notdir $(CRT_OBJS))) | |
66 | STATIC_LIBS = lib/libc.a | |
67 | SHARED_LIBS = lib/libc.so | |
68 | TOOL_LIBS = lib/musl-gcc.specs | |
69 | ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(EMPTY_LIBS) $(TOOL_LIBS) | |
70 | ALL_TOOLS = obj/musl-gcc | |
71 | ||
72 | WRAPCC_GCC = gcc | |
73 | WRAPCC_CLANG = clang | |
74 | ||
75 | LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH)$(SUBARCH).so.1 | |
76 | ||
77 | -include config.mak | |
78 | ||
79 | ifeq ($(ARCH),) | |
80 | ||
81 | all: | |
82 | @echo "Please set ARCH in config.mak before running make." | |
83 | @exit 1 | |
84 | ||
85 | else | |
86 | ||
87 | all: $(ALL_LIBS) $(ALL_TOOLS) | |
88 | ||
89 | OBJ_DIRS = $(sort $(patsubst %/,%,$(dir $(ALL_LIBS) $(ALL_TOOLS) $(ALL_OBJS) $(GENH) $(GENH_INT))) obj/include) | |
90 | ||
91 | $(ALL_LIBS) $(ALL_TOOLS) $(ALL_OBJS) $(ALL_OBJS:%.o=%.lo) $(GENH) $(GENH_INT): | $(OBJ_DIRS) | |
92 | ||
93 | $(OBJ_DIRS): | |
94 | mkdir -p $@ | |
95 | ||
96 | obj/include/bits/alltypes.h: $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in $(srcdir)/tools/mkalltypes.sed | |
97 | sed -f $(srcdir)/tools/mkalltypes.sed $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in > $@ | |
98 | ||
99 | obj/include/bits/syscall.h: $(srcdir)/arch/$(ARCH)/bits/syscall.h.in | |
100 | cp $< $@ | |
101 | sed -n -e s/__NR_/SYS_/p < $< >> $@ | |
102 | ||
103 | obj/src/internal/version.h: $(wildcard $(srcdir)/VERSION $(srcdir)/.git) | |
104 | printf '#define VERSION "%s"\n' "$$(cd $(srcdir); sh tools/version.sh)" > $@ | |
105 | ||
106 | obj/src/internal/version.o obj/src/internal/version.lo: obj/src/internal/version.h | |
107 | ||
108 | obj/crt/rcrt1.o obj/ldso/dlstart.lo obj/ldso/dynlink.lo: $(srcdir)/src/internal/dynlink.h $(srcdir)/arch/$(ARCH)/reloc.h | |
109 | ||
110 | obj/crt/crt1.o obj/crt/scrt1.o obj/crt/rcrt1.o obj/ldso/dlstart.lo: $(srcdir)/arch/$(ARCH)/crt_arch.h | |
111 | ||
112 | obj/crt/rcrt1.o: $(srcdir)/ldso/dlstart.c | |
113 | ||
114 | obj/crt/Scrt1.o obj/crt/rcrt1.o: CFLAGS_ALL += -fPIC | |
115 | ||
116 | OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=$(srcdir)/src/%)) | |
117 | $(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.o) $(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.lo): CFLAGS += -O3 | |
118 | ||
119 | MEMOPS_OBJS = $(filter %/memcpy.o %/memmove.o %/memcmp.o %/memset.o, $(LIBC_OBJS)) | |
120 | $(MEMOPS_OBJS) $(MEMOPS_OBJS:%.o=%.lo): CFLAGS_ALL += $(CFLAGS_MEMOPS) | |
121 | ||
122 | NOSSP_OBJS = $(CRT_OBJS) $(LDSO_OBJS) $(filter \ | |
123 | %/__libc_start_main.o %/__init_tls.o %/__stack_chk_fail.o \ | |
124 | %/__set_thread_area.o %/memset.o %/memcpy.o \ | |
125 | , $(LIBC_OBJS)) | |
126 | $(NOSSP_OBJS) $(NOSSP_OBJS:%.o=%.lo): CFLAGS_ALL += $(CFLAGS_NOSSP) | |
127 | ||
128 | $(CRT_OBJS): CFLAGS_ALL += -DCRT | |
129 | ||
130 | $(LOBJS) $(LDSO_OBJS): CFLAGS_ALL += -fPIC | |
131 | ||
132 | CC_CMD = $(CC) $(CFLAGS_ALL) -c -o $@ $< | |
133 | ||
134 | # Choose invocation of assembler to be used | |
135 | ifeq ($(ADD_CFI),yes) | |
136 | AS_CMD = LC_ALL=C awk -f $(srcdir)/tools/add-cfi.common.awk -f $(srcdir)/tools/add-cfi.$(ARCH).awk $< | $(CC) $(CFLAGS_ALL) -x assembler -c -o $@ - | |
137 | else | |
138 | AS_CMD = $(CC_CMD) | |
139 | endif | |
140 | ||
141 | obj/%.o: $(srcdir)/%.s | |
142 | $(AS_CMD) | |
143 | ||
144 | obj/%.o: $(srcdir)/%.S | |
145 | $(CC_CMD) | |
146 | ||
147 | obj/%.o: $(srcdir)/%.c $(GENH) $(IMPH) | |
148 | $(CC_CMD) | |
149 | ||
150 | obj/%.lo: $(srcdir)/%.s | |
151 | $(AS_CMD) | |
152 | ||
153 | obj/%.lo: $(srcdir)/%.S | |
154 | $(CC_CMD) | |
155 | ||
156 | obj/%.lo: $(srcdir)/%.c $(GENH) $(IMPH) | |
157 | $(CC_CMD) | |
158 | ||
159 | lib/libc.so: $(LOBJS) $(LDSO_OBJS) | |
160 | $(CC) $(CFLAGS_ALL) $(LDFLAGS_ALL) -nostdlib -shared \ | |
161 | -Wl,-e,_dlstart -o $@ $(LOBJS) $(LDSO_OBJS) $(LIBCC) | |
162 | ||
163 | lib/libc.a: $(AOBJS) | |
164 | rm -f $@ | |
165 | $(AR) rc $@ $(AOBJS) | |
166 | $(RANLIB) $@ | |
167 | ||
168 | $(EMPTY_LIBS): | |
169 | rm -f $@ | |
170 | $(AR) rc $@ | |
171 | ||
172 | lib/%.o: obj/crt/$(ARCH)/%.o | |
173 | cp $< $@ | |
174 | ||
175 | lib/%.o: obj/crt/%.o | |
176 | cp $< $@ | |
177 | ||
178 | lib/musl-gcc.specs: $(srcdir)/tools/musl-gcc.specs.sh config.mak | |
179 | sh $< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@ | |
180 | ||
181 | obj/musl-gcc: config.mak | |
182 | printf '#!/bin/sh\nexec "$${REALGCC:-$(WRAPCC_GCC)}" "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@ | |
183 | chmod +x $@ | |
184 | ||
185 | obj/%-clang: $(srcdir)/tools/%-clang.in config.mak | |
186 | sed -e 's!@CC@!$(WRAPCC_CLANG)!g' -e 's!@PREFIX@!$(prefix)!g' -e 's!@INCDIR@!$(includedir)!g' -e 's!@LIBDIR@!$(libdir)!g' -e 's!@LDSO@!$(LDSO_PATHNAME)!g' $< > $@ | |
187 | chmod +x $@ | |
188 | ||
189 | $(DESTDIR)$(bindir)/%: obj/% | |
190 | $(INSTALL) -D $< $@ | |
191 | ||
192 | $(DESTDIR)$(libdir)/%.so: lib/%.so | |
193 | $(INSTALL) -D -m 755 $< $@ | |
194 | ||
195 | $(DESTDIR)$(libdir)/%: lib/% | |
196 | $(INSTALL) -D -m 644 $< $@ | |
197 | ||
198 | $(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/$(ARCH)/bits/% | |
199 | $(INSTALL) -D -m 644 $< $@ | |
200 | ||
201 | $(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/generic/bits/% | |
202 | $(INSTALL) -D -m 644 $< $@ | |
203 | ||
204 | $(DESTDIR)$(includedir)/bits/%: obj/include/bits/% | |
205 | $(INSTALL) -D -m 644 $< $@ | |
206 | ||
207 | $(DESTDIR)$(includedir)/%: $(srcdir)/include/% | |
208 | $(INSTALL) -D -m 644 $< $@ | |
209 | ||
210 | $(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so | |
211 | $(INSTALL) -D -l $(libdir)/libc.so $@ || true | |
212 | ||
213 | install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),) | |
214 | ||
215 | install-headers: $(ALL_INCLUDES:include/%=$(DESTDIR)$(includedir)/%) | |
216 | ||
217 | install-tools: $(ALL_TOOLS:obj/%=$(DESTDIR)$(bindir)/%) | |
218 | ||
219 | install: install-libs install-headers install-tools | |
220 | ||
221 | musl-git-%.tar.gz: .git | |
222 | git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ $(patsubst musl-git-%.tar.gz,%,$@) | |
223 | ||
224 | musl-%.tar.gz: .git | |
225 | git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ v$(patsubst musl-%.tar.gz,%,$@) | |
226 | ||
227 | endif | |
228 | ||
229 | clean: | |
230 | rm -rf obj lib | |
231 | ||
232 | distclean: clean | |
233 | rm -f config.mak | |
234 | ||
235 | .PHONY: all clean install install-libs install-headers install-tools |