# directories in the source tree.
BASICS_DIR = $(CURDIR)/basics
BASICS_INC = $(BASICS_DIR)/include
-BASICS_LIBC_DIR = $(BASICS_DIR)/libc
-BASICS_CRT_SOURCES = $(wildcard $(BASICS_LIBC_DIR)/crt*.c)
-BASICS_LIBC_SOURCES = $(BASICS_LIBC_DIR)/string.c
+BASICS_CRT_SOURCES = $(wildcard $(BASICS_DIR)/crt/*.c)
+BASICS_SOURCES = $(wildcard $(BASICS_DIR)/sources/*.c)
DLMALLOC_DIR = $(CURDIR)/dlmalloc
DLMALLOC_SRC_DIR = $(DLMALLOC_DIR)/src
DLMALLOC_SOURCES = $(DLMALLOC_SRC_DIR)/dlmalloc.c
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/network/htons.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/network/ntohl.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/network/ntohs.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/network/inet_ntop.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/network/inet_pton.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/network/inet_aton.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/network/in6addr_any.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/network/in6addr_loopback.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/fenv/fenv.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/fenv/fesetround.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/fenv/feupdateenv.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/fenv/fesetexceptflag.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/fenv/fegetexceptflag.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/fenv/feholdexcept.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/exit/exit.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/exit/atexit.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/exit/assert.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/exit/quick_exit.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/exit/at_quick_exit.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/time/strftime.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/time/asctime.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/time/asctime_r.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/time/ctime.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/time/ctime_r.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/time/wcsftime.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/time/strptime.c \
$(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/prng/*.c) \
$(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/conf/*.c) \
$(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/ctype/*.c) \
- $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/math/*.c) \
+ $(filter-out %/__signbit.c %/__signbitf.c %/__signbitl.c \
+ %/__fpclassify.c %/__fpclassifyf.c %/__fpclassifyl.c, \
+ $(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/math/*.c)) \
$(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/complex/*.c) \
$(wildcard $(LIBC_TOP_HALF_MUSL_SRC_DIR)/crypt/*.c)
MUSL_PRINTSCAN_SOURCES = \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/internal/floatscan.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdio/vfprintf.c \
+ $(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdio/vfwprintf.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdio/vfscanf.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdlib/strtod.c \
$(LIBC_TOP_HALF_MUSL_SRC_DIR)/stdlib/wcstod.c
$(LIBC_TOP_HALF_MUSL_SOURCES) \
$(shell find $(LIBC_TOP_HALF_SOURCES) -name \*.c)
-# Set the target variables. The multiarch triple is the same as the
-# regular triple for wasm, except that it excludes the vendor field.
-TARGET_TRIPLE = wasm32-unknown-wasi
+# Set the target variables. Multiarch triples notably omit the vendor
+# field, which happens to be what we do for the main target triple too.
+TARGET_TRIPLE = wasm32-wasi
MULTIARCH_TRIPLE = wasm32-wasi
# These variables describe the locations of various files and
override WASM_CFLAGS += --sysroot="$(SYSROOT)"
objs = $(patsubst $(CURDIR)/%.c,$(OBJDIR)/%.o,$(1))
-override BASICS_LIBC_OBJS = $(call objs,$(BASICS_LIBC_SOURCES))
+override BASICS_OBJS = $(call objs,$(BASICS_SOURCES))
override DLMALLOC_OBJS = $(call objs,$(DLMALLOC_SOURCES))
override LIBC_BOTTOM_HALF_ALL_OBJS = $(call objs,$(LIBC_BOTTOM_HALF_ALL_SOURCES))
override LIBC_TOP_HALF_ALL_OBJS = $(call objs,$(LIBC_TOP_HALF_ALL_SOURCES))
-override LIBC_OBJS := $(BASICS_LIBC_OBJS)
+override LIBC_OBJS := $(BASICS_OBJS)
ifeq ($(BUILD_DLMALLOC),yes)
override LIBC_OBJS += $(DLMALLOC_OBJS)
endif
-D__wasilibc_printscan_no_floating_point \
-D__wasilibc_printscan_floating_point_support_option="\"remove -lc-printscan-no-floating-point from the link command\""
-$(OBJDIR)/%.long-double.o: $(CURDIR)/%.c $(SYSROOT_INC)
+$(OBJDIR)/%.long-double.o: $(CURDIR)/%.c include_dirs
@mkdir -p "$(@D)"
"$(WASM_CC)" $(WASM_CFLAGS) -MD -MP -o $@ -c $<
-$(OBJDIR)/%.no-floating-point.o: $(CURDIR)/%.c $(SYSROOT_INC)
+$(OBJDIR)/%.no-floating-point.o: $(CURDIR)/%.c include_dirs
@mkdir -p "$(@D)"
"$(WASM_CC)" $(WASM_CFLAGS) -MD -MP -o $@ -c $<
-$(OBJDIR)/%.o: $(CURDIR)/%.c $(SYSROOT_INC)
+$(OBJDIR)/%.o: $(CURDIR)/%.c include_dirs
@mkdir -p "$(@D)"
"$(WASM_CC)" $(WASM_CFLAGS) -MD -MP -o $@ -c $<
-Wno-dangling-else \
-Wno-unknown-pragmas
-$(SYSROOT): startup_files libc finish check
-
-$(SYSROOT_INC):
+include_dirs:
$(RM) -r "$(SYSROOT)"
#
"$(SYSROOT_INC)/spawn.h" \
"$(SYSROOT_INC)/ucontext.h" \
"$(SYSROOT_INC)/sys/ucontext.h" \
- "$(SYSROOT_INC)/sys/membarrier.h"
+ "$(SYSROOT_INC)/sys/membarrier.h" \
+ "$(SYSROOT_INC)/sys/signalfd.h" \
+ "$(SYSROOT_INC)/termios.h" \
+ "$(SYSROOT_INC)/sys/termios.h" \
+ "$(SYSROOT_INC)/bits/termios.h" \
+ "$(SYSROOT_INC)/net/if.h" \
+ "$(SYSROOT_INC)/net/if_arp.h" \
+ "$(SYSROOT_INC)/net/ethernet.h" \
+ "$(SYSROOT_INC)/net/route.h" \
+ "$(SYSROOT_INC)/netinet/if_ether.h" \
+ "$(SYSROOT_INC)/netinet/ether.h" \
+ "$(SYSROOT_INC)/sys/timerfd.h"
ifeq ($(THREAD_MODEL), single)
$(RM) "$(SYSROOT_INC)/aio.h" \
"$(SYSROOT_INC)/pthread.h"
override CRT_SOURCES = $(LIBC_BOTTOM_HALF_CRT_SOURCES)
endif
-startup_files: $(SYSROOT_INC)
+startup_files: include_dirs
#
# Build the startup files.
#
mkdir -p "$(SYSROOT_LIB)" && \
mv *.o "$(SYSROOT_LIB)"
-libc: $(SYSROOT_INC) \
+libc: include_dirs \
$(SYSROOT_LIB)/libc.a \
$(SYSROOT_LIB)/libc-printscan-long-double.a \
$(SYSROOT_LIB)/libc-printscan-no-floating-point.a \
$(SYSROOT_LIB)/libwasi-emulated-mman.a
-finish: $(SYSROOT_INC) libc
+finish: startup_files libc
#
# Create empty placeholder libraries.
#
- for name in m rt pthread crypt util xnet resolv dl c++ c++abi; do \
+ for name in m rt pthread crypt util xnet resolv dl; do \
$(WASM_AR) crs "$(SYSROOT_LIB)/lib$${name}.a"; \
done
# The build succeeded! The generated sysroot is in $(SYSROOT).
#
-check: $(SYSROOT) finish
+check: finish
# Check that the computed metadata matches the expected metadata.
diff -ur "$(CURDIR)/expected/$(MULTIARCH_TRIPLE)" "$(SYSROOT_SHARE)"
-install: $(SYSROOT)
+install: finish
mkdir -p "$(INSTALL_DIR)"
cp -r "$(SYSROOT)/lib" "$(SYSROOT)/share" "$(SYSROOT)/include" "$(INSTALL_DIR)"
-.PHONY: $(SYSROOT) default startup_files libc finish check install $(SYSROOT_INC)
+.PHONY: default startup_files libc finish check install include_dirs