1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#include <sys/wait.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <string.h>
#define GLOBAL_INCLUDE "-Iinclude/"
#define ENGINE_INCLUDE "-Iinclude/engine"
#define UCI_INCLUDE "-Iinclude/uci"
#define CC "gcc", "-fsanitize=address", "-g", GLOBAL_INCLUDE
#define ENGINE_O "output/engine.o"
#define UCI_O "output/uci.o"
#define MAIN_O "output/main.o"
#define IPC_O "output/ipc.o"
int status;
#define RUN_CMD(...) do { \
if (fork() == 0) { \
char* args[] = __VA_ARGS__; \
print_cmd(args); \
execvp(args[0], args); \
return 0; \
} else { \
wait(&status); \
} \
} while (0);
void print_cmd(char** args) {
int i = 0;
while (args[i] != NULL) {
printf("%s ", args[i++]);
}
printf("\n");
}
int clean_mode(int run_mode);
int test_mode(int run_mode);
int uci_mode(int run_mode);
// https://github.com/tsoding/nob.h/blob/0a08926d8094fc4ae678155c5d73ae21d1f96f3f/nob.h#L2413
int needs_rebuild(char* bin_file, char* source_file) {
struct stat statbuf = {0};
if (stat(bin_file, &statbuf) < 0) {
if (errno == ENOENT) return 1;
return -1;
}
time_t output_path_time = statbuf.st_mtime;
if (stat(source_file, &statbuf) < 0) {
fprintf(stderr, "could not stat %s: %s", source_file, strerror(errno));
return -1;
}
time_t input_path_time = statbuf.st_mtime;
return input_path_time > output_path_time;
}
int main(int argc, char** argv) {
if (needs_rebuild(argv[0], __FILE__)) {
RUN_CMD({CC, __FILE__, "-o", argv[0], NULL});
if (status != 0) {
// cc error
return 0;
}
print_cmd(argv);
execvp(argv[0], argv);
}
RUN_CMD({"mkdir", "-p", "output", NULL});
if (argc <= 1) return 1;
int run_mode = argc == 3;
if (strcmp(argv[1], "test") == 0) {
return test_mode(run_mode);
}
if (strcmp(argv[1], "clean") == 0) {
return clean_mode(run_mode);
}
return uci_mode(run_mode);
}
int clean_mode(int _) {
char* args[] = {"rm", "-r", "output", NULL};
print_cmd(args);
execvp(args[0], args);
return 0;
}
int test_mode(int run_mode) {
if (run_mode) {
char* args[] = {"./output/test.o", NULL};
print_cmd(args);
execvp(args[0], args);
}
RUN_CMD({CC, "generate/find_tests.c", "-o", "output/find_tests.o", NULL});
RUN_CMD({"./output/find_tests.o", NULL});
printf("\n");
RUN_CMD({CC, "tests/main.c", "-o", "output/test.o", NULL});
return status != 0;
}
int uci_mode(int run_mode) {
if (run_mode) {
char* args[] = {MAIN_O, NULL};
print_cmd(args);
execvp(args[0], args);
}
RUN_CMD({CC, "-c", "src/ipc.c", "-o", IPC_O, NULL});
RUN_CMD({CC, ENGINE_INCLUDE, "-c", "src/engine.c", "-o", ENGINE_O, NULL});
RUN_CMD({CC, UCI_INCLUDE, "-c", "src/uci.c", "-o", UCI_O, NULL});
RUN_CMD({CC, UCI_O, ENGINE_O, IPC_O, "-o", MAIN_O, NULL});
return status != 0;
}
|