X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=Makefile;h=3a60cfc030ab189b154a4a9f59531d8078b2a895;hb=14469371cd1efd2be44f0825fec9ad8bb3216da9;hp=b419554463259fd5a84ea5dd1069d23b12705861;hpb=d86d2829abc116c3e8741aa92727a5c55023088a;p=oweals%2Fmusl.git diff --git a/Makefile b/Makefile index b4195544..3a60cfc0 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,7 @@ # Do not make changes here. # +srcdir = . exec_prefix = /usr/local bindir = $(exec_prefix)/bin @@ -16,69 +17,144 @@ includedir = $(prefix)/include libdir = $(prefix)/lib syslibdir = /lib -SRCS = $(sort $(wildcard src/*/*.c)) -OBJS = $(SRCS:.c=.o) +BASE_SRCS = $(sort $(wildcard $(srcdir)/src/*/*.c)) +BASE_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(BASE_SRCS))) +ARCH_SRCS = $(wildcard $(srcdir)/src/*/$(ARCH)/*.[csS]) +ARCH_OBJS = $(patsubst $(srcdir)/%,%.o,$(basename $(ARCH_SRCS))) +REPLACED_OBJS = $(sort $(subst /$(ARCH)/,/,$(ARCH_OBJS))) +OBJS = $(addprefix obj/, $(filter-out $(REPLACED_OBJS), $(sort $(BASE_OBJS) $(ARCH_OBJS)))) LOBJS = $(OBJS:.o=.lo) -GENH = include/bits/alltypes.h +GENH = obj/include/bits/alltypes.h +GENH_INT = obj/src/internal/version.h +IMPH = $(addprefix $(srcdir)/, src/internal/stdio_impl.h src/internal/pthread_impl.h src/internal/libc.h) + +LDFLAGS = +LDFLAGS_AUTO = +LIBCC = -lgcc +CPPFLAGS = +CFLAGS = +CFLAGS_AUTO = -Os -pipe +CFLAGS_C99FSE = -std=c99 -ffreestanding -nostdinc + +CFLAGS_ALL = $(CFLAGS_C99FSE) +CFLAGS_ALL += -D_XOPEN_SOURCE=700 -I$(srcdir)/arch/$(ARCH) -Iobj/src/internal -I$(srcdir)/src/internal -Iobj/include -I$(srcdir)/include +CFLAGS_ALL += $(CPPFLAGS) $(CFLAGS_AUTO) $(CFLAGS) + +LDFLAGS_ALL = $(LDFLAGS_AUTO) $(LDFLAGS) -CFLAGS = -Os -nostdinc -ffreestanding -std=c99 -D_XOPEN_SOURCE=700 -pipe -LDFLAGS = -nostdlib -shared -fPIC -Wl,-e,_start -Wl,-Bsymbolic-functions -INC = -I./src/internal -I./include -I./arch/$(ARCH) -PIC = -fPIC -O3 AR = $(CROSS_COMPILE)ar RANLIB = $(CROSS_COMPILE)ranlib +INSTALL = $(srcdir)/tools/install.sh -ALL_INCLUDES = $(sort $(wildcard include/*.h include/*/*.h) $(GENH)) +ARCH_INCLUDES = $(wildcard $(srcdir)/arch/$(ARCH)/bits/*.h) +INCLUDES = $(wildcard $(srcdir)/include/*.h $(srcdir)/include/*/*.h) +ALL_INCLUDES = $(sort $(INCLUDES:$(srcdir)/%=%) $(GENH:obj/%=%) $(ARCH_INCLUDES:$(srcdir)/arch/$(ARCH)/%=include/%)) EMPTY_LIB_NAMES = m rt pthread crypt util xnet resolv dl EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a) -CRT_LIBS = lib/crt1.o lib/crti.o lib/crtn.o -STATIC_LIBS = lib/libc.a $(EMPTY_LIBS) +CRT_LIBS = lib/crt1.o lib/Scrt1.o lib/rcrt1.o lib/crti.o lib/crtn.o +STATIC_LIBS = lib/libc.a SHARED_LIBS = lib/libc.so TOOL_LIBS = lib/musl-gcc.specs -ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(TOOL_LIBS) -ALL_TOOLS = tools/musl-gcc +ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(EMPTY_LIBS) $(TOOL_LIBS) +ALL_TOOLS = obj/musl-gcc -LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH).so.1 +WRAPCC_GCC = gcc +WRAPCC_CLANG = clang + +LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH)$(SUBARCH).so.1 -include config.mak +ifeq ($(ARCH),) +$(error Please set ARCH in config.mak before running make.) +endif + all: $(ALL_LIBS) $(ALL_TOOLS) -install: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(ALL_INCLUDES:include/%=$(DESTDIR)$(includedir)/%) $(ALL_TOOLS:tools/%=$(DESTDIR)$(bindir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),) +OBJ_DIRS = $(sort $(patsubst %/,%,$(dir $(ALL_LIBS) $(ALL_TOOLS) $(OBJS) $(GENH) $(GENH_INT))) $(addprefix obj/, crt crt/$(ARCH) include)) + +$(ALL_LIBS) $(ALL_TOOLS) $(CRT_LIBS:lib/%=obj/crt/%) $(OBJS) $(LOBJS) $(GENH) $(GENH_INT): | $(OBJ_DIRS) + +$(OBJ_DIRS): + mkdir -p $@ + +install: install-libs install-headers install-tools clean: - rm -f crt/*.o - rm -f $(OBJS) - rm -f $(LOBJS) - rm -f $(ALL_LIBS) lib/*.[ao] lib/*.so - rm -f $(ALL_TOOLS) - rm -f $(GENH) - rm -f include/bits + rm -rf obj lib + +distclean: clean + rm -f config.mak + +obj/include/bits/alltypes.h: $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in $(srcdir)/tools/mkalltypes.sed + sed -f $(srcdir)/tools/mkalltypes.sed $(srcdir)/arch/$(ARCH)/bits/alltypes.h.in $(srcdir)/include/alltypes.h.in > $@ + +obj/src/internal/version.h: $(wildcard $(srcdir)/VERSION $(srcdir)/.git) + printf '#define VERSION "%s"\n' "$$(cd $(srcdir); sh tools/version.sh)" > $@ + +obj/src/internal/version.o obj/src/internal/version.lo: obj/src/internal/version.h + +obj/crt/rcrt1.o obj/src/ldso/dlstart.lo obj/src/ldso/dynlink.lo: $(srcdir)/src/internal/dynlink.h $(srcdir)/arch/$(ARCH)/reloc.h + +obj/crt/crt1.o obj/crt/scrt1.o obj/crt/rcrt1.o obj/src/ldso/dlstart.lo: $(srcdir)/arch/$(ARCH)/crt_arch.h + +obj/crt/rcrt1.o: $(srcdir)/src/ldso/dlstart.c + +obj/crt/Scrt1.o obj/crt/rcrt1.o: CFLAGS_ALL += -fPIC + +obj/crt/$(ARCH)/crti.o: $(srcdir)/crt/$(ARCH)/crti.s + +obj/crt/$(ARCH)/crtn.o: $(srcdir)/crt/$(ARCH)/crtn.s -include/bits: - @test "$(ARCH)" || { echo "Please set ARCH in config.mak before running make." ; exit 1 ; } - ln -sf ../arch/$(ARCH)/bits $@ +OPTIMIZE_SRCS = $(wildcard $(OPTIMIZE_GLOBS:%=$(srcdir)/src/%)) +$(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.o) $(OPTIMIZE_SRCS:$(srcdir)/%.c=obj/%.lo): CFLAGS += -O3 -include/bits/alltypes.h.sh: include/bits +MEMOPS_SRCS = src/string/memcpy.c src/string/memmove.c src/string/memcmp.c src/string/memset.c +$(MEMOPS_SRCS:%.c=obj/%.o) $(MEMOPS_SRCS:%.c=obj/%.lo): CFLAGS_ALL += $(CFLAGS_MEMOPS) -include/bits/alltypes.h: include/bits/alltypes.h.sh - sh $< > $@ +NOSSP_SRCS = $(wildcard crt/*.c) \ + src/env/__libc_start_main.c src/env/__init_tls.c \ + src/thread/__set_thread_area.c src/env/__stack_chk_fail.c \ + src/string/memset.c src/string/memcpy.c \ + src/ldso/dlstart.c src/ldso/dynlink.c +$(NOSSP_SRCS:%.c=obj/%.o) $(NOSSP_SRCS:%.c=obj/%.lo): CFLAGS_ALL += $(CFLAGS_NOSSP) -%.o: $(ARCH)/%.s - $(CC) $(CFLAGS) $(INC) -c -o $@ $< +$(CRT_LIBS:lib/%=obj/crt/%): CFLAGS_ALL += -DCRT -%.o: %.c $(GENH) - $(CC) $(CFLAGS) $(INC) -c -o $@ $< +$(LOBJS): CFLAGS_ALL += -fPIC -DSHARED -%.lo: $(ARCH)/%.s - $(CC) $(CFLAGS) $(INC) $(PIC) -c -o $@ $< +CC_CMD = $(CC) $(CFLAGS_ALL) -c -o $@ $< -%.lo: %.c $(GENH) - $(CC) $(CFLAGS) $(INC) $(PIC) -c -o $@ $< +# Choose invocation of assembler to be used +ifeq ($(ADD_CFI),yes) + 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 $@ - +else + AS_CMD = $(CC_CMD) +endif + +obj/%.o: $(srcdir)/%.s + $(AS_CMD) + +obj/%.o: $(srcdir)/%.S + $(CC_CMD) + +obj/%.o: $(srcdir)/%.c $(GENH) $(IMPH) + $(CC_CMD) + +obj/%.lo: $(srcdir)/%.s + $(AS_CMD) + +obj/%.lo: $(srcdir)/%.S + $(CC_CMD) + +obj/%.lo: $(srcdir)/%.c $(GENH) $(IMPH) + $(CC_CMD) lib/libc.so: $(LOBJS) - $(CC) $(LDFLAGS) -Wl,-soname=libc.so -o $@ $(LOBJS) -lgcc + $(CC) $(CFLAGS_ALL) $(LDFLAGS_ALL) -nostdlib -shared \ + -Wl,-e,_dlstart -Wl,-Bsymbolic-functions \ + -o $@ $(LOBJS) $(LIBCC) lib/libc.a: $(OBJS) rm -f $@ @@ -89,32 +165,57 @@ $(EMPTY_LIBS): rm -f $@ $(AR) rc $@ -lib/%.o: crt/%.o +lib/%.o: obj/crt/%.o + cp $< $@ + +lib/crti.o: obj/crt/$(ARCH)/crti.o + cp $< $@ + +lib/crtn.o: obj/crt/$(ARCH)/crtn.o cp $< $@ -lib/musl-gcc.specs: tools/musl-gcc.specs.sh config.mak +lib/musl-gcc.specs: $(srcdir)/tools/musl-gcc.specs.sh config.mak sh $< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@ -tools/musl-gcc: config.mak - printf '#!/bin/sh\nexec gcc "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@ +obj/musl-gcc: config.mak + printf '#!/bin/sh\nexec "$${REALGCC:-$(WRAPCC_GCC)}" "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@ + chmod +x $@ + +obj/%-clang: $(srcdir)/tools/%-clang.in config.mak + 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' $< > $@ chmod +x $@ -$(DESTDIR)$(bindir)/%: tools/% - install -D $< $@ +$(DESTDIR)$(bindir)/%: obj/% + $(INSTALL) -D $< $@ $(DESTDIR)$(libdir)/%.so: lib/%.so - install -D -m 755 $< $@ + $(INSTALL) -D -m 755 $< $@ $(DESTDIR)$(libdir)/%: lib/% - install -D -m 644 $< $@ + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/bits/%: $(srcdir)/arch/$(ARCH)/bits/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/bits/%: obj/include/bits/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(includedir)/%: $(srcdir)/include/% + $(INSTALL) -D -m 644 $< $@ + +$(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so + $(INSTALL) -D -l $(libdir)/libc.so $@ || true + +install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),) + +install-headers: $(ALL_INCLUDES:include/%=$(DESTDIR)$(includedir)/%) -$(DESTDIR)$(includedir)/%: include/% - install -D -m 644 $< $@ +install-tools: $(ALL_TOOLS:obj/%=$(DESTDIR)$(bindir)/%) -$(DESTDIR)$(LDSO_PATHNAME): lib/libc.so - install -d -m 755 $(DESTDIR)$(syslibdir) || true - ln -sf $(libdir)/libc.so $@ || true +musl-git-%.tar.gz: .git + git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ $(patsubst musl-git-%.tar.gz,%,$@) -.PRECIOUS: $(CRT_LIBS:lib/%=crt/%) +musl-%.tar.gz: .git + git --git-dir=$(srcdir)/.git archive --format=tar.gz --prefix=$(patsubst %.tar.gz,%,$@)/ -o $@ v$(patsubst musl-%.tar.gz,%,$@) -.PHONY: all clean install +.PHONY: all clean install install-libs install-headers install-tools