forked from uNetworking/uWebSockets.js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.c
143 lines (127 loc) · 4.54 KB
/
build.c
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
/* List of platform features */
#ifdef _WIN32
#define OS "win32"
#define IS_WINDOWS
#endif
#ifdef __linux
#define OS "linux"
#define IS_LINUX
#endif
#ifdef __APPLE__
#define OS "darwin"
#define IS_MACOS
#endif
/* System, but with string replace */
int run(const char *cmd, ...) {
char buf[512];
va_list args;
va_start(args, cmd);
vsprintf(buf, cmd, args);
va_end(args);
printf("--> %s\n\n", buf);
return system(buf);
}
/* List of Node.js versions */
struct node_version {
char *name;
char *abi;
} versions[] = {
{"v10.17.0", "64"},
{"v11.15.0", "67"},
{"v12.13.0", "72"},
{"v13.1.0", "79"},
{"v14.0.0", "83"},
{"v15.0.0", "88"}
};
/* Downloads headers, creates folders */
void prepare() {
#ifdef IS_WINDOWS
run("if not exist dist mkdir dist");
run("if not exist targets mkdir targets");
#else
run("test -d dist || mkdir dist");
run("test -d targets || mkdir targets");
#endif
/* For all versions */
unsigned int i;
for (i = 0; i < sizeof(versions) / sizeof(struct node_version); i++) {
#ifdef IS_WINDOWS
if (run("if not exist targets/node-%s/node.lib", versions[i].name)){
if (run("if not exist node-%s-headers.tar.gz", versions[i].name)){
#else
if (run("test -f targets/node-%s/node.lib", versions[i].name)){
if (run("test -f node-%s-headers.tar.gz", versions[i].name)){
#endif
run("curl -OJ https://nodejs.org/dist/%s/node-%s-headers.tar.gz", versions[i].name, versions[i].name);
}
run("tar xzf node-%s-headers.tar.gz -C targets", versions[i].name);
run("curl https://nodejs.org/dist/%s/win-x64/node.lib > targets/node-%s/node.lib", versions[i].name, versions[i].name);
}
}
}
/* Build for Unix systems */
void build(char *compiler, char *cpp_compiler, char *cpp_linker, char *os, char *arch) {
char *c_shared = "-DLIBUS_USE_LIBUV -DLIBUS_USE_OPENSSL -flto -O3 -c -fPIC -I uWebSockets/uSockets/src uWebSockets/uSockets/src/*.c uWebSockets/uSockets/src/eventing/*.c uWebSockets/uSockets/src/crypto/*.c";
char *cpp_shared = "-DUWS_WITH_PROXY -DLIBUS_USE_LIBUV -DLIBUS_USE_OPENSSL -flto -O3 -c -fPIC -std=c++17 -I uWebSockets/uSockets/src -I uWebSockets/src src/addon.cpp uWebSockets/uSockets/src/crypto/sni_tree.cpp";
unsigned int i;
for (i = 0; i < sizeof(versions) / sizeof(struct node_version); i++) {
run("%s %s -I targets/node-%s/include/node", compiler, c_shared, versions[i].name);
run("%s %s -I targets/node-%s/include/node", cpp_compiler, cpp_shared, versions[i].name);
run("%s %s %s -o dist/uws_%s_%s_%s.node", cpp_compiler, "-flto -O3 *.o -std=c++17 -shared", cpp_linker, os, arch, versions[i].abi);
}
}
void copy_files() {
#ifdef IS_WINDOWS
run("copy \"src\\uws.js\" dist /Y");
#else
run("cp src/uws.js dist/uws.js");
#endif
}
/* Special case for windows */
void build_windows(char *arch) {
/* For all versions */
unsigned int i;
for (i = 0; i < sizeof(versions) / sizeof(struct node_version); i++) {
run("cl /W3 /D \"UWS_WITH_PROXY\" /D \"LIBUS_USE_LIBUV\" /D \"LIBUS_USE_OPENSSL\" /std:c++17 /I uWebSockets/uSockets/src uWebSockets/uSockets/src/*.c uWebSockets/uSockets/src/crypto/sni_tree.cpp "
"uWebSockets/uSockets/src/eventing/*.c uWebSockets/uSockets/src/crypto/*.c /I targets/node-%s/include/node /I uWebSockets/src /EHsc "
"/Ox /LD /Fedist/uws_win32_%s_%s.node src/addon.cpp targets/node-%s/node.lib",
versions[i].name, arch, versions[i].abi, versions[i].name);
}
}
int main() {
printf("[Preparing]\n");
prepare();
printf("\n[Building]\n");
#ifdef IS_WINDOWS
build_windows("x64");
#else
#ifdef IS_MACOS
/* Apple special case */
build("clang -mmacosx-version-min=10.14",
"clang++ -stdlib=libc++ -mmacosx-version-min=10.14",
"-undefined dynamic_lookup",
OS,
"x64");
/* Try and build for arm64 macOS 11 */
build("clang -target arm64-apple-macos11",
"clang++ -stdlib=libc++ -target arm64-apple-macos11",
"-undefined dynamic_lookup",
OS,
"arm64");
#else
/* Linux */
build("clang",
"clang++",
"-static-libstdc++ -static-libgcc -s",
OS,
"x64");
/* If linux we also want arm64 */
build("aarch64-linux-gnu-gcc", "aarch64-linux-gnu-g++", "-static-libstdc++ -static-libgcc -s", OS, "arm64");
#endif
#endif
copy_files();
}