AR = ar CC = gcc CFLAGS = -Wall -g -O3 -march=native arch = x86_64 cflags = -pipe -std=c99 -nostdinc -D_XOPEN_SOURCE=700 \ -ffreestanding -fexcess-precision=standard -fno-strict-aliasing \ -frounding-math -fno-pic -fno-stack-protector \ -fno-unwind-tables -fno-asynchronous-unwind-tables \ -ffunction-sections -fdata-sections \ -Iarch/$(arch) -Iarch/generic -Isrc/include -Isrc/internal \ -Igenerated/include -Iinclude $(CFLAGS) prefix = / includedir = $(prefix)/include libdir = $(prefix)/lib src_dirs = src/* src/mallocng crt common_src = $(wildcard $(addsuffix /*.c, $(src_dirs))) arch_src = $(wildcard $(addsuffix /$(arch)/*.[csS], $(src_dirs))) common_obj = $(common_src:.c=.o) arch_obj = $(patsubst %, %.o, $(basename $(arch_src))) replaced_obj = $(subst /$(arch)/,/, $(arch_obj)) all_obj = $(filter-out $(replaced_obj), $(common_obj) $(arch_obj)) memops_obj = $(filter %/memcpy.o %/memmove.o %/memcmp.o %/memset.o, $(all_obj)) crt_obj = $(filter crt/%, $(all_obj)) generated_headers = $(addprefix generated/include/bits/, \ alltypes.h syscall.h) implementation_headers = $(addprefix src/internal/, \ stdio_impl.h pthread_impl.h locale_impl.h libc.h) lib_obj = libc.a crt1.o crti.o crtn.o arch_inc = $(wildcard arch/$(arch)/bits/*.h) generic_inc = $(wildcard arch/generic/bits/*.h) inc = $(wildcard include/*.h include/*/*.h) all_inc = $(sort $(inc) $(generated_headers:generated/%=%) \ $(arch_inc:arch/$(arch)/%=include/%) \ $(generic_inc:arch/generic/%=include/%)) default: $(lib_obj) generated_dirs: mkdir -p $(dir $(generated_headers)) $(generated_headers): | generated_dirs generated/include/bits/alltypes.h: arch/$(arch)/bits/alltypes.h.in \ include/alltypes.h.in sed -f tools/mkalltypes.sed $^ >$@ generated/include/bits/syscall.h: arch/$(arch)/bits/syscall.h.in cp $< $@ sed -n -e 's/__NR_/SYS_/p' < $< >>$@ src/internal/version.o: cflags += -DVERSION=\"$(shell cat VERSION)\" crt/crt1.o: arch/$(arch)/crt_arch.h $(memops_obj): cflags += -fno-tree-loop-distribute-patterns $(crt_obj): cflags += -DCRT cc_cmd = $(CC) $(cflags) -c -o $@ $< as_cmd = $(cc_cmd) install_cmd = install -D -m 644 $< $@ %.o: %.s $(as_cmd) %.o: %.S $(cc_cmd) %.o: %.c $(generated_headers) $(implementation_headers) $(cc_cmd) %.o: crt/$(arch)/%.o cp $< $@ %.o: crt/%.o cp $< $@ libc.a: $(all_obj) rm -f $@ $(AR) rcs $@ $^ $(DESTDIR)$(libdir)/%: % $(install_cmd) $(DESTDIR)$(includedir)/bits/%: arch/$(arch)/bits/% $(install_cmd) $(DESTDIR)$(includedir)/bits/%: arch/generic/bits/% $(install_cmd) $(DESTDIR)$(includedir)/bits/%: generated/include/bits/% $(install_cmd) $(DESTDIR)$(includedir)/%: include/% $(install_cmd) install-libs: $(addprefix $(DESTDIR)$(libdir)/, $(lib_obj)) install-headers: $(all_inc:include/%=$(DESTDIR)$(includedir)/%) install: install-libs install-headers clean: rm -rf generated rm -f crt/*.o src/*/*.o libc.a crt1.o crti.o crtn.o