1# Binaries that should generate the same output every time 2EXPECT_NAMES=\ 3 alloca \ 4 args \ 5 arpainet \ 6 assert \ 7 constructor \ 8 ctype \ 9 destructor \ 10 dirent/scandir \ 11 errno \ 12 error \ 13 fcntl/create \ 14 fcntl/fcntl \ 15 fnmatch \ 16 futimens \ 17 libgen \ 18 locale \ 19 math \ 20 netdb/getaddrinfo \ 21 netdb/netdb \ 22 ptrace \ 23 regex \ 24 select \ 25 setjmp \ 26 signal \ 27 stdio/all \ 28 stdio/buffer \ 29 stdio/fgets \ 30 stdio/fputs \ 31 stdio/fread \ 32 stdio/freopen \ 33 stdio/fseek \ 34 stdio/fwrite \ 35 stdio/getc_unget \ 36 stdio/mutex \ 37 stdio/popen \ 38 stdio/printf \ 39 stdio/rename \ 40 stdio/scanf \ 41 stdio/setvbuf \ 42 stdio/sprintf \ 43 stdlib/a64l \ 44 stdlib/alloc \ 45 stdlib/atof \ 46 stdlib/atoi \ 47 stdlib/div \ 48 stdlib/env \ 49 stdlib/lcg48 \ 50 stdlib/mkostemps \ 51 stdlib/rand \ 52 stdlib/strtod \ 53 stdlib/strtol \ 54 stdlib/strtoul \ 55 stdlib/system \ 56 string/mem \ 57 string/strcat \ 58 string/strchr \ 59 string/strcpy \ 60 string/strcspn \ 61 string/strlen \ 62 string/strncmp \ 63 string/strpbrk \ 64 string/strrchr \ 65 string/strspn \ 66 string/strstr \ 67 string/strtok \ 68 string/strtok_r \ 69 string/strsignal \ 70 strings \ 71 time/asctime \ 72 time/gmtime \ 73 time/localtime \ 74 time/macros \ 75 time/mktime \ 76 time/strftime \ 77 time/time \ 78 tls \ 79 unistd/access \ 80 unistd/brk \ 81 unistd/dup \ 82 unistd/exec \ 83 unistd/fchdir \ 84 unistd/fork \ 85 unistd/fsync \ 86 unistd/ftruncate \ 87 unistd/getopt \ 88 unistd/getopt_long \ 89 unistd/pipe \ 90 unistd/rmdir \ 91 unistd/sleep \ 92 unistd/swab \ 93 unistd/write \ 94 waitpid \ 95 wchar/mbrtowc \ 96 wchar/mbsrtowcs \ 97 wchar/printf-on-wchars \ 98 wchar/putwchar \ 99 wchar/wcrtomb \ 100 wchar/wcscspn \ 101 wchar/wcsrchr \ 102 wchar/wcsstr \ 103 wchar/wcstod \ 104 wchar/wcstok \ 105 wchar/wcstol 106 # TODO: Fix these 107 # mkfifo 108 109# Binaries that may generate varied output 110NAMES=\ 111 $(EXPECT_NAMES) \ 112 dirent/main \ 113 pwd \ 114 stdio/tempnam \ 115 stdio/tmpnam \ 116 stdlib/bsearch \ 117 stdlib/mktemp \ 118 stdlib/realpath \ 119 sys_epoll/epoll \ 120 sys_utsname/uname \ 121 time/gettimeofday \ 122 unistd/chdir \ 123 unistd/getcwd \ 124 unistd/gethostname \ 125 unistd/getid \ 126 unistd/getpagesize \ 127 unistd/isatty \ 128 unistd/link \ 129 unistd/pathconf \ 130 unistd/setid \ 131 unistd/stat \ 132 unistd/sysconf 133# resource/getrusage 134# time/times 135 136BINS=$(patsubst %,bins/%,$(NAMES)) 137EXPECT_BINS=$(patsubst %,bins/%,$(EXPECT_NAMES)) 138 139TEST_RUNNER?=sh -- 140 141.PHONY: all clean run expected verify 142 143all: $(BINS) 144 145clean: 146 rm -rf bins gen *.out 147 148run: | $(BINS) 149 for name in $(NAMES); \ 150 do \ 151 echo "# $${name} #"; \ 152 "bins/$${name}" test args || exit $$?; \ 153 done 154 155expected: | $(EXPECT_BINS) 156 rm -rf expected 157 mkdir -p expected 158 for name in $(EXPECT_NAMES); \ 159 do \ 160 echo "# $${name} #"; \ 161 mkdir -p expected/`dirname $${name}`; \ 162 "bins/$${name}" test args > "expected/$${name}.stdout" 2> "expected/$${name}.stderr" || exit $$?; \ 163 done 164 165verify: | $(EXPECT_BINS) 166 $(TEST_RUNNER) ./verify.sh $(EXPECT_NAMES) 167 168CFLAGS=\ 169 -std=c11 \ 170 -fno-builtin \ 171 -fno-stack-protector \ 172 -static \ 173 -Wall \ 174 -pedantic \ 175 -g \ 176 -I . 177 178LIBS= 179 180NATIVE_RELIBC?=0 181ifeq ($(NATIVE_RELIBC),0) 182CFLAGS+=\ 183 -nostdinc \ 184 -nostdlib \ 185 -isystem ../sysroot/include \ 186 ../sysroot/lib/crt0.o \ 187 ../sysroot/lib/crti.o 188 189LIBS=\ 190 ../sysroot/lib/libc.a \ 191 ../sysroot/lib/crtn.o 192 193../sysroot: 194 $(MAKE) -C .. sysroot 195 196bins/%: %.c ../sysroot 197 mkdir -p "$$(dirname "$@")" 198 $(CC) $(CFLAGS) "$<" $(LIBS) -o "$@" 199else 200bins/%: %.c 201 mkdir -p "$$(dirname "$@")" 202 $(CC) $(CFLAGS) "$<" $(LIBS) -o "$@" 203endif 204