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