1 # Build the `libc-test` tests as Wasm programs and run them with the selected
2 # engine. Contributors beware! This Makefile follows the style of the
3 # `libc-test` Makefile and uses some more exotic features of `make`.
5 # The top-level `test` target is composed of a chain of several phony
7 # - `download`: retrieve the `libc-test` source from a Git `$(MIRROR)`
8 # - `build`: construct Wasm modules for a subset of the `libc-test` tests
9 # - `run`: execute the benchmarks with a Wasm `$(ENGINE)` of choice (e.g.,
14 # Unlike the `libc-test` directory, we will output all artifacts to the `build`
15 # directory (keeping with the `wasi-libc` conventions).
16 OBJDIR ?
= $(CURDIR
)/build
17 DOWNDIR ?
= $(CURDIR
)/download
19 ##### DOWNLOAD #################################################################
21 LIBC_TEST_URL ?
= https
://github.com
/bytecodealliance
/libc-test
22 LIBC_TEST
= $(DOWNDIR
)/libc-test
23 LIBRT_URL ?
= https
://github.com
/WebAssembly
/wasi-sdk
/releases
/download
/wasi-sdk-16
/libclang_rt.builtins-wasm32-wasi-16.0.
tar.gz
24 LIBRT
= $(DOWNDIR
)/lib
/wasi
/libclang_rt.builtins-wasm32.a
25 WASMTIME_URL ?
= https
://github.com
/bytecodealliance
/wasmtime
/releases
/download
/v3.0
.0/wasmtime-v3.0
.0-x86_64-linux.
tar.xz
26 WASMTIME
= $(DOWNDIR
)/$(shell basename $(WASMTIME_URL
) .
tar.xz
)/wasmtime
28 download
: $(LIBC_TEST
) $(LIBRT
) $(WASMTIME
)
33 $(LIBC_TEST
): |
$(DOWNDIR
)
34 git clone
--depth
1 $(LIBC_TEST_URL
) $@
36 # TODO install target to place into...
37 $(LIBRT
): |
$(DOWNDIR
)
38 wget
--no-clobber
--directory-prefix
=$(DOWNDIR
) $(LIBRT_URL
)
39 tar --extract
--file
=$(DOWNDIR
)/$(shell basename $(LIBRT_URL
)) --directory
=$(DOWNDIR
)/
41 $(WASMTIME
): |
$(DOWNDIR
)
42 wget
--no-clobber
--directory-prefix
=$(DOWNDIR
) $(WASMTIME_URL
)
43 tar --extract
--file
=$(DOWNDIR
)/$(shell basename $(WASMTIME_URL
)) --directory
=$(DOWNDIR
)/
48 ##### BUILD ####################################################################
50 # For now, we list out the tests that we can currently build and run. This is
51 # heavily focused on the functional tests; in the future it would be good to
52 # fill out the missing tests and also include some `src/api` and `src/math`
55 $(LIBC_TEST
)/src
/functional
/argv.c \
56 $(LIBC_TEST
)/src
/functional
/basename.c \
57 $(LIBC_TEST
)/src
/functional
/clocale_mbfuncs.c \
58 $(LIBC_TEST
)/src
/functional
/clock_gettime.c \
59 $(LIBC_TEST
)/src
/functional
/crypt.c \
60 $(LIBC_TEST
)/src
/functional
/dirname.c \
61 $(LIBC_TEST
)/src
/functional
/env.c \
62 $(LIBC_TEST
)/src
/functional
/fnmatch.c \
63 $(LIBC_TEST
)/src
/functional
/iconv_open.c \
64 $(LIBC_TEST
)/src
/functional
/mbc.c \
65 $(LIBC_TEST
)/src
/functional
/memstream.c \
66 $(LIBC_TEST
)/src
/functional
/qsort.c \
67 $(LIBC_TEST
)/src
/functional
/random.c \
68 $(LIBC_TEST
)/src
/functional
/search_hsearch.c \
69 $(LIBC_TEST
)/src
/functional
/search_insque.c \
70 $(LIBC_TEST
)/src
/functional
/search_lsearch.c \
71 $(LIBC_TEST
)/src
/functional
/search_tsearch.c \
72 $(LIBC_TEST
)/src
/functional
/snprintf.c \
73 $(LIBC_TEST
)/src
/functional
/sscanf.c \
74 $(LIBC_TEST
)/src
/functional
/strftime.c \
75 $(LIBC_TEST
)/src
/functional
/string.c \
76 $(LIBC_TEST
)/src
/functional
/string_memcpy.c \
77 $(LIBC_TEST
)/src
/functional
/string_memmem.c \
78 $(LIBC_TEST
)/src
/functional
/string_memset.c \
79 $(LIBC_TEST
)/src
/functional
/string_strchr.c \
80 $(LIBC_TEST
)/src
/functional
/string_strcspn.c \
81 $(LIBC_TEST
)/src
/functional
/string_strstr.c \
82 $(LIBC_TEST
)/src
/functional
/strtod.c \
83 $(LIBC_TEST
)/src
/functional
/strtod_long.c \
84 $(LIBC_TEST
)/src
/functional
/strtod_simple.c \
85 $(LIBC_TEST
)/src
/functional
/strtof.c \
86 $(LIBC_TEST
)/src
/functional
/strtol.c \
87 $(LIBC_TEST
)/src
/functional
/swprintf.c \
88 $(LIBC_TEST
)/src
/functional
/tgmath.c \
89 $(LIBC_TEST
)/src
/functional
/udiv.c \
90 $(LIBC_TEST
)/src
/functional
/wcsstr.c \
91 $(LIBC_TEST
)/src
/functional
/wcstol.c
93 # Part of the problem including more tests is that the `libc-test`
94 # infrastructure code is not all Wasm-compilable. As we include more tests
95 # above, this list will also likely need to grow.
97 $(LIBC_TEST
)/src
/common
/path.c \
98 $(LIBC_TEST
)/src
/common
/print.c \
99 $(LIBC_TEST
)/src
/common
/rand.c \
100 $(LIBC_TEST
)/src
/common
/utf8.c
102 # Create various lists containing the various artifacts to be built: mainly,
103 # $(WASM_OBJS) are compiled in the $(OBJDIRS) and then linked together to form
104 # the $(WASMS) tests.
105 NAMES
:= $(TESTS
:$(LIBC_TEST
)/src
/%.c
=%)
106 WASMS
:= $(TESTS
:$(LIBC_TEST
)/src
/%.c
=$(OBJDIR
)/%.wasm
)
107 WASM_OBJS
:= $(TESTS
:$(LIBC_TEST
)/src
/%.c
=$(OBJDIR
)/%.wasm.o
)
108 INFRA_WASM_OBJS
:= $(COMMON_TEST_INFRA
:$(LIBC_TEST
)/src
/%.c
=$(OBJDIR
)/%.wasm.o
)
109 WASM_OBJS
+= $(INFRA_WASM_OBJS
)
110 DIRS
:= $(patsubst $(OBJDIR
)/%/,%,$(sort $(dir $(WASM_OBJS
))))
111 OBJDIRS
:= $(DIRS
:%=$(OBJDIR
)/%)
113 # Allow $(CC) to be set from the command line; ?= doesn't work for CC because
114 # make has a default value for it.
115 ifeq ($(origin CC
), default
)
119 CFLAGS ?
= --target
=wasm32-wasi
--sysroot
=..
/sysroot
120 # Always include the `libc-test` infrastructure headers.
121 CFLAGS
+= -I
$(LIBC_TEST
)/src
/common
123 # Compile each selected test using Clang. Note that failures here are likely
124 # due to a missing `libclang_rt.builtins-wasm32.a` in the Clang lib directory.
125 # This location is system-dependent, but could be fixed by something like:
126 # $ sudo mkdir /usr/lib64/clang/14.0.5/lib/wasi
127 # $ sudo cp download/lib/wasi/libclang_rt.builtins-wasm32.a /usr/lib64/clang/14.0.5/lib/wasi/
128 build
: download
$(WASMS
)
130 $(WASMS
): |
$(OBJDIRS
)
131 $(OBJDIR
)/%.wasm
: $(OBJDIR
)/%.wasm.o
$(INFRA_WASM_OBJS
)
132 $(CC
) $(CFLAGS
) $(LDFLAGS
) -o
$@
$^
134 $(WASM_OBJS
): $(LIBC_TEST
)/src
/common
/test.h |
$(OBJDIRS
)
135 $(OBJDIR
)/%.wasm.o
: $(LIBC_TEST
)/src
/%.c
136 $(CC
) $(CFLAGS
) -c
-o
$@
$<
144 ##### RUN ######################################################################
146 ENGINE ?
= $(WASMTIME
) run
147 ERRS
:=$(WASMS
:%.wasm
=%.wasm.err
)
149 # Use the provided Wasm engine to execute each test, emitting its output into
154 $(ERRS
): |
$(OBJDIRS
)
160 rm -rf
$(OBJDIR
)/*/*.err
162 ##### MISC #####################################################################
164 # Note: the `clean` target has been built up by all of the previous sections.
170 @echo WASM_OBJS
$(WASM_OBJS
)
173 @echo OBJDIRS
$(OBJDIRS
)
175 .PHONY
: test download build run
clean