2 # Makefile for musl (requires GNU make)
4 # This is how simple every makefile should be...
5 # No, I take that back - actually most should be less than half this size.
7 # Use config.mak to override any of the following variables.
8 # Do not make changes here.
12 exec_prefix = /usr
/local
13 bindir = $(exec_prefix)/bin
15 prefix = /usr
/local
/musl
16 includedir = $(prefix)/include
17 libdir = $(prefix)/lib
20 BASE_SRCS
= $(sort $(wildcard $(srcdir)/src
/*/*.c
$(srcdir)/arch
/$(ARCH
)/src
/*.c
))
21 BASE_OBJS
= $(patsubst $(srcdir)/%,%.o
,$(basename $(BASE_SRCS
)))
22 ARCH_SRCS
= $(wildcard $(srcdir)/src
/*/$(ARCH
)/*.
[csS
] $(srcdir)/src
/*/$(ARCH
)$(ASMSUBARCH
)/*.sub
)
23 ARCH_OBJS
= $(patsubst $(srcdir)/%,%.o
,$(basename $(ARCH_SRCS
)))
24 REPLACED_OBJS
= $(sort $(subst /$(ARCH
)$(ASMSUBARCH
)/,/,$(subst /$(ARCH
)/,/,$(ARCH_OBJS
))) $(subst /$(ARCH
)$(ASMSUBARCH
)/,/$(ARCH
)/,$(subst /$(ARCH
)/,/,$(ARCH_OBJS
))))
25 OBJS
= $(addprefix obj
/, $(filter-out $(REPLACED_OBJS
), $(sort $(BASE_OBJS
) $(ARCH_OBJS
))))
26 LOBJS
= $(OBJS
:.o
=.lo
)
27 GENH
= obj
/include/bits
/alltypes.h
28 GENH_INT
= obj
/src
/internal
/version.h
29 IMPH
= $(addprefix $(srcdir)/, src
/internal
/stdio_impl.h src
/internal
/pthread_impl.h src
/internal
/libc.h
)
36 CFLAGS_AUTO
= -Os
-pipe
37 CFLAGS_C99FSE
= -std
=c99
-ffreestanding
-nostdinc
39 CFLAGS_ALL
= $(CFLAGS_C99FSE
)
40 CFLAGS_ALL
+= -D_XOPEN_SOURCE
=700 -I
$(srcdir)/arch
/$(ARCH
) -Iobj
/src
/internal
-I
$(srcdir)/src
/internal
-Iobj
/include -I
$(srcdir)/include
41 CFLAGS_ALL
+= $(CPPFLAGS
) $(CFLAGS_AUTO
) $(CFLAGS
)
43 LDFLAGS_ALL
= $(LDFLAGS_AUTO
) $(LDFLAGS
)
45 AR
= $(CROSS_COMPILE
)ar
46 RANLIB
= $(CROSS_COMPILE
)ranlib
47 INSTALL
= $(srcdir)/tools
/install.sh
49 ARCH_INCLUDES
= $(wildcard $(srcdir)/arch
/$(ARCH
)/bits
/*.h
)
50 INCLUDES
= $(wildcard $(srcdir)/include/*.h
$(srcdir)/include/*/*.h
)
51 ALL_INCLUDES
= $(sort $(INCLUDES
:$(srcdir)/%=%) $(GENH
:obj
/%=%) $(ARCH_INCLUDES
:$(srcdir)/arch
/$(ARCH
)/%=include/%))
53 EMPTY_LIB_NAMES
= m rt pthread crypt util xnet resolv dl
54 EMPTY_LIBS
= $(EMPTY_LIB_NAMES
:%=lib
/lib
%.a
)
55 CRT_LIBS
= lib
/crt1.o lib
/Scrt1.o lib
/rcrt1.o lib
/crti.o lib
/crtn.o
56 STATIC_LIBS
= lib
/libc.a
57 SHARED_LIBS
= lib
/libc.so
58 TOOL_LIBS
= lib
/musl-gcc.specs
59 ALL_LIBS
= $(CRT_LIBS
) $(STATIC_LIBS
) $(SHARED_LIBS
) $(EMPTY_LIBS
) $(TOOL_LIBS
)
60 ALL_TOOLS
= obj
/musl-gcc
65 LDSO_PATHNAME
= $(syslibdir
)/ld-musl-
$(ARCH
)$(SUBARCH
).so
.1
70 $(error Please set ARCH in config.mak before running make.
)
73 all: $(ALL_LIBS
) $(ALL_TOOLS
)
75 OBJ_DIRS
= $(sort $(patsubst %/,%,$(dir $(ALL_LIBS
) $(ALL_TOOLS
) $(OBJS
) $(GENH
) $(GENH_INT
))) $(addprefix obj
/, crt crt
/$(ARCH
) include))
77 $(ALL_LIBS
) $(ALL_TOOLS
) $(CRT_LIBS
:lib
/%=obj
/crt
/%) $(OBJS
) $(LOBJS
) $(GENH
) $(GENH_INT
): |
$(OBJ_DIRS
)
82 install: install-libs install-headers install-tools
85 rm -f obj
/crt
/*.o obj
/crt
/$(ARCH
)/*.o
88 rm -f
$(ALL_LIBS
) lib
/*.
[ao
] lib
/*.so
90 rm -f
$(GENH
) $(GENH_INT
)
91 rm -f obj
/include/bits
/alltypes.h
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
> $@
99 obj
/src
/internal
/version.h
: $(wildcard $(srcdir)/VERSION
$(srcdir)/.git
)
100 printf
'#define VERSION "%s"\n' "$$(cd $(srcdir); sh tools/version.sh)" > $@
102 obj
/src
/internal
/version.o obj
/src
/internal
/version.lo
: obj
/src
/internal
/version.h
104 obj
/crt
/rcrt1.o obj
/src
/ldso
/dlstart.lo obj
/src
/ldso
/dynlink.lo
: $(srcdir)/src
/internal
/dynlink.h
$(srcdir)/arch
/$(ARCH
)/reloc.h
106 obj
/crt
/crt1.o obj
/crt
/scrt1.o obj
/crt
/rcrt1.o obj
/src
/ldso
/dlstart.lo
: $(srcdir)/arch
/$(ARCH
)/crt_arch.h
108 obj
/crt
/rcrt1.o
: $(srcdir)/src
/ldso
/dlstart.c
110 obj
/crt
/Scrt1.o obj
/crt
/rcrt1.o
: CFLAGS_ALL
+= -fPIC
112 obj
/crt
/$(ARCH
)/crti.o
: $(srcdir)/crt
/$(ARCH
)/crti.s
114 obj
/crt
/$(ARCH
)/crtn.o
: $(srcdir)/crt
/$(ARCH
)/crtn.s
116 OPTIMIZE_SRCS
= $(wildcard $(OPTIMIZE_GLOBS
:%=$(srcdir)/src
/%))
117 $(OPTIMIZE_SRCS
:$(srcdir)/%.c
=obj
/%.o
) $(OPTIMIZE_SRCS
:$(srcdir)/%.c
=obj
/%.lo
): CFLAGS
+= -O3
119 MEMOPS_SRCS
= src
/string
/memcpy.c src
/string
/memmove.c src
/string
/memcmp.c src
/string
/memset.c
120 $(MEMOPS_SRCS
:%.c
=obj
/%.o
) $(MEMOPS_SRCS
:%.c
=obj
/%.lo
): CFLAGS_ALL
+= $(CFLAGS_MEMOPS
)
122 NOSSP_SRCS
= $(wildcard crt
/*.c
) \
123 src
/env
/__libc_start_main.c src
/env
/__init_tls.c \
124 src
/thread
/__set_thread_area.c src
/env
/__stack_chk_fail.c \
125 src
/string
/memset.c src
/string
/memcpy.c \
126 src
/ldso
/dlstart.c src
/ldso
/dynlink.c
127 $(NOSSP_SRCS
:%.c
=obj
/%.o
) $(NOSSP_SRCS
:%.c
=obj
/%.lo
): CFLAGS_ALL
+= $(CFLAGS_NOSSP
)
129 $(CRT_LIBS
:lib
/%=obj
/crt
/%): CFLAGS_ALL
+= -DCRT
131 # This incantation ensures that changes to any subarch asm files will
132 # force the corresponding object file to be rebuilt, even if the implicit
133 # rule below goes indirectly through a .sub file.
135 $(patsubst $(srcdir)/%,obj
/%,$(dir $(patsubst %/,%,$(dir $(1))))$(ARCH
)$(ASMSUBARCH
)/$(notdir $(1:.s
=.o
))): $(1)
137 $(foreach s
,$(wildcard $(srcdir)/src
/*/$(ARCH
)*/*.s
),$(eval
$(call mkasmdep
,$(s
))))
139 $(LOBJS
): CFLAGS_ALL
+= -fPIC
-DSHARED
141 # Choose invocation of assembler to be used
142 # $(1) is input file, $(2) is output file, $(3) is assembler flags
143 ifeq ($(ADD_CFI
),yes
)
144 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
$@
-
146 AS_CMD
= $(CC
) $(CFLAGS_ALL
) -c
-o
$@
$<
149 obj
/%.o
: $(srcdir)/%.sub
150 $(CC
) $(CFLAGS_ALL
) -c
-o
$@
$(dir $<)$$(cat
$<)
152 obj
/%.o
: $(srcdir)/%.s
153 $(AS_CMD
) $(CFLAGS_ALL
)
155 obj
/%.o
: $(srcdir)/%.S
156 $(CC
) $(CFLAGS_ALL
) -c
-o
$@
$<
158 obj
/%.o
: $(srcdir)/%.c
$(GENH
) $(IMPH
)
159 $(CC
) $(CFLAGS_ALL
) -c
-o
$@
$<
161 obj
/%.lo
: $(srcdir)/%.sub
162 $(CC
) $(CFLAGS_ALL
) -c
-o
$@
$(dir $<)$$(cat
$<)
164 obj
/%.lo
: $(srcdir)/%.s
165 $(AS_CMD
) $(CFLAGS_ALL
)
167 obj
/%.lo
: $(srcdir)/%.S
168 $(CC
) $(CFLAGS_ALL
) -c
-o
$@
$<
170 obj
/%.lo
: $(srcdir)/%.c
$(GENH
) $(IMPH
)
171 $(CC
) $(CFLAGS_ALL
) -c
-o
$@
$<
173 lib
/libc.so
: $(LOBJS
)
174 $(CC
) $(CFLAGS_ALL
) $(LDFLAGS_ALL
) -nostdlib
-shared \
175 -Wl
,-e
,_dlstart
-Wl
,-Bsymbolic-functions \
176 -o
$@
$(LOBJS
) $(LIBCC
)
190 lib
/crti.o
: obj
/crt
/$(ARCH
)/crti.o
193 lib
/crtn.o
: obj
/crt
/$(ARCH
)/crtn.o
196 lib
/musl-gcc.specs
: $(srcdir)/tools
/musl-gcc.specs.sh config.mak
197 sh
$< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@
199 obj
/musl-gcc
: config.mak
200 printf
'#!/bin/sh\nexec "$${REALGCC:-$(WRAPCC_GCC)}" "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@
203 obj
/%-clang
: $(srcdir)/tools
/%-clang.in config.mak
204 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 $(DESTDIR
)$(bindir)/%: obj
/%
210 $(DESTDIR
)$(libdir)/%.so
: lib
/%.so
211 $(INSTALL
) -D
-m
755 $< $@
213 $(DESTDIR
)$(libdir)/%: lib
/%
214 $(INSTALL
) -D
-m
644 $< $@
216 $(DESTDIR
)$(includedir)/bits
/%: $(srcdir)/arch
/$(ARCH
)/bits
/%
217 $(INSTALL
) -D
-m
644 $< $@
219 $(DESTDIR
)$(includedir)/bits
/%: obj
/include/bits
/%
220 $(INSTALL
) -D
-m
644 $< $@
222 $(DESTDIR
)$(includedir)/%: $(srcdir)/include/%
223 $(INSTALL
) -D
-m
644 $< $@
225 $(DESTDIR
)$(LDSO_PATHNAME
): $(DESTDIR
)$(libdir)/libc.so
226 $(INSTALL
) -D
-l
$(libdir)/libc.so
$@ || true
228 install-libs
: $(ALL_LIBS
:lib
/%=$(DESTDIR
)$(libdir)/%) $(if
$(SHARED_LIBS
),$(DESTDIR
)$(LDSO_PATHNAME
),)
230 install-headers
: $(ALL_INCLUDES
:include/%=$(DESTDIR
)$(includedir)/%)
232 install-tools
: $(ALL_TOOLS
:obj
/%=$(DESTDIR
)$(bindir)/%)
234 musl-git-
%.
tar.gz
: .git
235 git
--git-dir
=$(srcdir)/.git archive
--format
=tar.gz
--prefix=$(patsubst %.
tar.gz
,%,$@
)/ -o
$@
$(patsubst musl-git-
%.
tar.gz
,%,$@
)
238 git
--git-dir
=$(srcdir)/.git archive
--format
=tar.gz
--prefix=$(patsubst %.
tar.gz
,%,$@
)/ -o
$@ v
$(patsubst musl-
%.
tar.gz
,%,$@
)
240 .PHONY
: all clean install install-libs install-headers install-tools