[331] | 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/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 lib/libce.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 | obj/crt/$(ARCH)/crti.o: $(srcdir)/crt/$(ARCH)/crti.s
|
---|
| 117 |
|
---|
| 118 | obj/crt/$(ARCH)/crtn.o: $(srcdir)/crt/$(ARCH)/crtn.s
|
---|
| 119 |
|
---|
| 120 | OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=$(srcdir)/src/%))
|
---|
| 121 | $(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.o) $(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.lo): CFLAGS += -O3
|
---|
| 122 |
|
---|
| 123 | MEMOPS_SRCS = src/string/memcpy.c src/string/memmove.c src/string/memcmp.c src/string/memset.c
|
---|
| 124 | $(MEMOPS_SRCS:%.c=obj/%.o) $(MEMOPS_SRCS:%.c=obj/%.lo): CFLAGS_ALL += $(CFLAGS_MEMOPS)
|
---|
| 125 |
|
---|
| 126 | NOSSP_SRCS = $(wildcard crt/*.c) \
|
---|
| 127 | src/env/__libc_start_main.c src/env/__init_tls.c \
|
---|
| 128 | src/env/__stack_chk_fail.c \
|
---|
| 129 | src/thread/__set_thread_area.c src/thread/$(ARCH)/__set_thread_area.c \
|
---|
| 130 | src/string/memset.c src/string/$(ARCH)/memset.c \
|
---|
| 131 | src/string/memcpy.c src/string/$(ARCH)/memcpy.c \
|
---|
| 132 | ldso/dlstart.c ldso/dynlink.c
|
---|
| 133 | $(NOSSP_SRCS:%.c=obj/%.o) $(NOSSP_SRCS:%.c=obj/%.lo): CFLAGS_ALL += $(CFLAGS_NOSSP)
|
---|
| 134 |
|
---|
| 135 | $(CRT_OBJS): CFLAGS_ALL += -DCRT
|
---|
| 136 |
|
---|
| 137 | $(LOBJS) $(LDSO_OBJS): CFLAGS_ALL += -fPIC
|
---|
| 138 |
|
---|
| 139 | CC_CMD = $(CC) $(CFLAGS_ALL) -c -o $@ $<
|
---|
| 140 |
|
---|
| 141 | # Choose invocation of assembler to be used
|
---|
| 142 | ifeq ($(ADD_CFI),yes)
|
---|
| 143 | 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 $@ -
|
---|
| 144 | else
|
---|
| 145 | AS_CMD = $(CC_CMD)
|
---|
| 146 | endif
|
---|
| 147 |
|
---|
| 148 | obj/%.o: $(srcdir)/%.s
|
---|
| 149 | $(AS_CMD)
|
---|
| 150 |
|
---|
| 151 | obj/%.o: $(srcdir)/%.S
|
---|
| 152 | $(CC_CMD)
|
---|
| 153 |
|
---|
| 154 | obj/%.o: $(srcdir)/%.c $(GENH) $(IMPH)
|
---|
| 155 | $(CC_CMD)
|
---|
| 156 |
|
---|
| 157 | obj/%.lo: $(srcdir)/%.s
|
---|
| 158 | $(AS_CMD)
|
---|
| 159 |
|
---|
| 160 | obj/%.lo: $(srcdir)/%.S
|
---|
| 161 | $(CC_CMD)
|
---|
| 162 |
|
---|
| 163 | obj/%.lo: $(srcdir)/%.c $(GENH) $(IMPH)
|
---|
| 164 | $(CC_CMD)
|
---|
| 165 |
|
---|
| 166 | lib/libc.so: $(LOBJS) $(LDSO_OBJS)
|
---|
| 167 | $(CC) $(CFLAGS_ALL) $(LDFLAGS_ALL) -nostdlib -shared \
|
---|
| 168 | -Wl,-e,_dlstart -o $@ $(LOBJS) $(LDSO_OBJS) $(LIBCC)
|
---|
| 169 |
|
---|
| 170 | lib/libc.a: $(AOBJS)
|
---|
| 171 | rm -f $@
|
---|
| 172 | $(AR) rc $@
|
---|
| 173 | @for obj in $(filter-out $(TCC_EXTRACT),$(AOBJS)); do (\
|
---|
| 174 | echo $(AR) q $@ $$obj;\
|
---|
| 175 | $(AR) q $@ $$obj; )\
|
---|
| 176 | done
|
---|
| 177 | $(RANLIB) $@
|
---|
| 178 |
|
---|
| 179 | lib/libce.a: $(TCC_EXTRACT)
|
---|
| 180 | rm -f $@
|
---|
| 181 | $(AR) rc $@
|
---|
| 182 | @for obj in $(TCC_EXTRACT); do (\
|
---|
| 183 | echo $(AR) q $@ $$obj;\
|
---|
| 184 | $(AR) q $@ $$obj; )\
|
---|
| 185 | done
|
---|
| 186 | $(RANLIB) $@
|
---|
| 187 |
|
---|
| 188 | $(EMPTY_LIBS):
|
---|
| 189 | rm -f $@
|
---|
| 190 | $(AR) rc $@
|
---|
| 191 |
|
---|
| 192 | lib/%.o: obj/crt/$(ARCH)/%.o
|
---|
| 193 | cp $< $@
|
---|
| 194 |
|
---|
| 195 | lib/%.o: obj/crt/%.o
|
---|
| 196 | cp $< $@
|
---|
| 197 |
|
---|
| 198 | lib/musl-gcc.specs: $(srcdir)/tools/musl-gcc.specs.sh config.mak
|
---|
| 199 | sh $< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@
|
---|
| 200 |
|
---|
| 201 | obj/musl-gcc: config.mak
|
---|
| 202 | printf '#!/bin/sh\nexec "$${REALGCC:-$(WRAPCC_GCC)}" "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@
|
---|
| 203 | chmod +x $@
|
---|
| 204 |
|
---|
| 205 | obj/%-clang: $(srcdir)/tools/%-clang.in config.mak
|
---|
| 206 | 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' $< > $@
|
---|
| 207 | chmod +x $@
|
---|
| 208 |
|
---|
| 209 | $(DESTDIR)$(bindir)/%: obj/%
|
---|
| 210 | $(INSTALL) -D $< $@
|
---|
| 211 |
|
---|
| 212 | $(DESTDIR)$(libdir)/%.so: lib/%.so
|
---|
| 213 | $(INSTALL) -D -m 755 $< $@
|
---|
| 214 |
|
---|
| 215 | $(DESTDIR)$(libdir)/%: lib/%
|
---|
| 216 | $(INSTALL) -D -m 644 $< $@
|
---|
| 217 |
|
---|
| 218 | $(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/$(ARCH)/bits/%
|
---|
| 219 | $(INSTALL) -D -m 644 $< $@
|
---|
| 220 |
|
---|
| 221 | $(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/generic/bits/%
|
---|
| 222 | $(INSTALL) -D -m 644 $< $@
|
---|
| 223 |
|
---|
| 224 | $(DESTDIR)$(includedir)/bits/%: obj/include/bits/%
|
---|
| 225 | $(INSTALL) -D -m 644 $< $@
|
---|
| 226 |
|
---|
| 227 | $(DESTDIR)$(includedir)/%: $(srcdir)/include/%
|
---|
| 228 | $(INSTALL) -D -m 644 $< $@
|
---|
| 229 |
|
---|
| 230 | $(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so
|
---|
| 231 | $(INSTALL) -D -l $(libdir)/libc.so $@ || true
|
---|
| 232 |
|
---|
| 233 | install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),)
|
---|
| 234 |
|
---|
| 235 | install-headers: $(ALL_INCLUDES:include/%=$(DESTDIR)$(includedir)/%)
|
---|
| 236 |
|
---|
| 237 | install-tools: $(ALL_TOOLS:obj/%=$(DESTDIR)$(bindir)/%)
|
---|
| 238 |
|
---|
| 239 | install: install-libs install-headers install-tools
|
---|
| 240 |
|
---|
| 241 | musl-git-%.tar.gz: .git
|
---|
| 242 | git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ $(patsubst musl-git-%.tar.gz,%,$@)
|
---|
| 243 |
|
---|
| 244 | musl-%.tar.gz: .git
|
---|
| 245 | git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ v$(patsubst musl-%.tar.gz,%,$@)
|
---|
| 246 |
|
---|
| 247 | endif
|
---|
| 248 |
|
---|
| 249 | clean:
|
---|
| 250 | rm -rf obj lib
|
---|
| 251 |
|
---|
| 252 | distclean: clean
|
---|
| 253 | rm -f config.mak
|
---|
| 254 |
|
---|
| 255 | .PHONY: all clean install install-libs install-headers install-tools
|
---|