-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathMakefile
159 lines (134 loc) · 6.08 KB
/
Makefile
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
TMP = tmp
DIST = dist
OBJDIR_MACOS = tmp/macos/.obj
OBJDIR_WINDOWS = tmp/windows/.obj
QUICKJS_STATIC = node_modules/quickjs-static
GENERATED_FOR_TEST = src/test/generated
ENTRYPOINT_MACOS = $(OBJDIR_MACOS)/entrypoint.o
ENTRYPOINT_DEV_MACOS = $(OBJDIR_MACOS)/entrypoint-dev.o
ENTRYPOINT_WINDOWS = $(OBJDIR_WINDOWS)/entrypoint.o
C_ENTRYPOINT = src/native/entrypoint.c
JS_ENTRYPOINT_FOR_TEST = $(GENERATED_FOR_TEST)/js-entrypoint.c
NATIVE_BINDINGS = $(wildcard src/native/binding/*.c)
OBJFILES_MACOS = $(patsubst src/native/binding/%.c, $(OBJDIR_MACOS)/%.o, $(NATIVE_BINDINGS)) $(OBJDIR_MACOS)/miniz.o
OBJFILES_WINDOWS = $(patsubst src/native/binding/%.c, $(OBJDIR_WINDOWS)/%.o, $(NATIVE_BINDINGS)) $(OBJDIR_WINDOWS)/miniz.o
BIN_MACOS = $(TMP)/macos/app
BIN_WINDOWS = $(TMP)/windows/app
BIN_DEV_MACOS = $(TMP)/macos/app-dev
BIN_DEV_WINDOWS = $(TMP)/windows/app-dev
TEST_ZIP = $(TMP)/test.zip
TEST_ZIP_FIXTURE = $(TMP)/fixture/zip
SDL2_VERSION = 2.0.10
MINIZ_VERSION = 2.1.0
QUICKJS_VERSION = 2019-09-18
DOCKCROSS_WINDOWS = $(TMP)/dockcross-win
SDL2_FRAMEWORK_MACOS = $(TMP)/SDL2.framework
SDL2_MINGW_WINDOWS = $(TMP)/SDL2-$(SDL2_VERSION)/x86_64-w64-mingw32
MINIZ = $(TMP)/miniz
CC_WINDOWS = $(DOCKCROSS_WINDOWS) x86_64-w64-mingw32.static-gcc
SDL2_CONFIG_WINDOWS = $(DOCKCROSS_WINDOWS) $(SDL2_MINGW_WINDOWS)/bin/sdl2-config
CC_SDL2_OPTIONS_MACOS = -rpath @executable_path/../Frameworks -F $(TMP) -framework SDL2
CC_SDL2_DEV_OPTIONS_MACOS = -rpath @executable_path/..
CC_SDL2_OPTIONS_WINDOWS = -I$(SDL2_MINGW_WINDOWS)/include/SDL2 -L$(SDL2_MINGW_WINDOWS)/lib $(shell $(SDL2_CONFIG_WINDOWS) --static-libs)
CC_QUICKJS_PATH_MACOS = $(QUICKJS_STATIC)/bin/macos/quickjs-$(QUICKJS_VERSION)
CC_QUICKJS_PATH_WINDOWS = $(QUICKJS_STATIC)/bin/windows/quickjs-$(QUICKJS_VERSION)
CC_QUICKJS_OPTIONS_MACOS = -I$(CC_QUICKJS_PATH_MACOS) -L$(CC_QUICKJS_PATH_MACOS) -lquickjs
CC_QUICKJS_OPTIONS_WINDOWS = -I$(CC_QUICKJS_PATH_WINDOWS) -L$(CC_QUICKJS_PATH_WINDOWS) -lquickjs
CC_MINIZ_OPTIONS = -I$(MINIZ)
CC_MACOS_OPTIONS = $(CC_SDL2_OPTIONS_MACOS) $(CC_QUICKJS_OPTIONS_MACOS) $(CC_MINIZ_OPTIONS)
CC_WINDOWS_OPTIONS = -static $(CC_SDL2_OPTIONS_WINDOWS) $(CC_QUICKJS_OPTIONS_WINDOWS) $(CC_MINIZ_OPTIONS)
.PHONY: all
all: macos windows
.PHONY: clean
clean:
-@$(RM) -rf $(TMP) $(DIST) $(GENERATED_FOR_TEST)
.PHONY: dev
dev: $(BIN_DEV_MACOS) $(TEST_ZIP)
$(BIN_DEV_MACOS)
.PHONY: dev-windows
dev-windows: $(BIN_DEV_WINDOWS) $(TEST_ZIP)
cp $(BIN_DEV_WINDOWS) $(TMP)/gawain-dev.exe
cat $(TEST_ZIP) >> $(TMP)/gawain-dev.exe
.ONESHELL:
$(TEST_ZIP): $(TEST_ZIP_FIXTURE)/entrypoint
ZIP=$(shell pwd)/$@;\
pushd $(TEST_ZIP_FIXTURE);\
zip $$ZIP entrypoint;\
popd;
.PHONY: macos
macos: $(BIN_MACOS) $(TEST_ZIP)
-@$(RM) -rf $(DIST)/gawain.app
@mkdir -p $(DIST)
cp -R dev/gawain.app $(DIST)/gawain.app
@mkdir -p $(DIST)/gawain.app/Contents/MacOS
cp $(BIN_MACOS) $(DIST)/gawain.app/Contents/MacOS/app
@mkdir -p $(DIST)/gawain.app/Contents/Resources
cp $(TEST_ZIP) $(DIST)/gawain.app/Contents/Resources/archive.zip
@mkdir -p $(DIST)/gawain.app/Contents/Frameworks
cp -R $(SDL2_FRAMEWORK_MACOS) $(DIST)/gawain.app/Contents/Frameworks/SDL2.framework
pushd $(DIST) && tar cvf gawain.app.tar gawain.app && popd
.PHONY: windows
windows: $(BIN_WINDOWS)
@mkdir -p $(DIST)
cp $(BIN_WINDOWS) $(DIST)/gawain.exe
$(BIN_MACOS): $(ENTRYPOINT_MACOS) $(OBJFILES_MACOS)
@mkdir -p $(TMP)/macos
$(CC) $(CC_MACOS_OPTIONS) -o $@ $^
$(BIN_DEV_MACOS): $(ENTRYPOINT_DEV_MACOS) $(OBJFILES_MACOS)
@mkdir -p $(TMP)/macos
$(CC) $(CC_SDL2_DEV_OPTIONS_MACOS) $(CC_MACOS_OPTIONS) -o $@ $^
$(ENTRYPOINT_MACOS): $(JS_ENTRYPOINT_FOR_TEST) $(C_ENTRYPOINT) $(SDL2_FRAMEWORK_MACOS) $(MINIZ)
@mkdir -p $(OBJDIR_MACOS)
$(CC) $(CC_MACOS_OPTIONS) -c -o $@ $(C_ENTRYPOINT)
$(ENTRYPOINT_DEV_MACOS): $(JS_ENTRYPOINT_FOR_TEST) $(C_ENTRYPOINT) $(SDL2_FRAMEWORK_MACOS) $(MINIZ)
@mkdir -p $(OBJDIR_MACOS)
$(CC) $(CC_MACOS_OPTIONS) -DGAWAIN_DEV -c -o $@ $(C_ENTRYPOINT)
$(OBJDIR_MACOS)/%.o: src/native/binding/%.c $(SDL2_FRAMEWORK_MACOS)
@mkdir -p $(OBJDIR_MACOS)
$(CC) $(CC_MACOS_OPTIONS) -c -o $@ $<
$(OBJDIR_MACOS)/miniz.o: $(MINIZ) $(SDL2_FRAMEWORK_MACOS)
@mkdir -p $(OBJDIR_MACOS)
$(CC) $(CC_MACOS_OPTIONS) -c -o $@ $(MINIZ)/miniz.c
$(BIN_WINDOWS): $(ENTRYPOINT_WINDOWS) $(OBJFILES_WINDOWS)
@mkdir -p $(TMP)/windows
$(CC_WINDOWS) -o $@ $^ $(CC_WINDOWS_OPTIONS)
upx --overlay=strip $@
$(BIN_DEV_WINDOWS): $(ENTRYPOINT_WINDOWS) $(OBJFILES_WINDOWS)
@mkdir -p $(TMP)/windows
$(CC_WINDOWS) -o $@ $^ $(CC_WINDOWS_OPTIONS) -mconsole
upx --overlay=strip $@
$(ENTRYPOINT_WINDOWS): $(JS_ENTRYPOINT_FOR_TEST) $(C_ENTRYPOINT) $(SDL2_MINGW_WINDOWS) $(MINIZ) $(DOCKCROSS_WINDOWS)
@mkdir -p $(OBJDIR_WINDOWS)
$(CC_WINDOWS) $(CC_WINDOWS_OPTIONS) -c -o $@ $(C_ENTRYPOINT)
$(OBJDIR_WINDOWS)/%.o: src/native/binding/%.c $(SDL2_MINGW_WINDOWS) $(DOCKCROSS_WINDOWS)
@mkdir -p $(OBJDIR_WINDOWS)
$(CC_WINDOWS) $(CC_WINDOWS_OPTIONS) -c -o $@ $<
$(OBJDIR_WINDOWS)/miniz.o: $(MINIZ) $(SDL2_MINGW_WINDOWS) $(DOCKCROSS_WINDOWS)
@mkdir -p $(OBJDIR_WINDOWS)
$(CC_WINDOWS) $(CC_WINDOWS_OPTIONS) -c -o $@ $(MINIZ)/miniz.c
$(TEST_ZIP_FIXTURE)/entrypoint: $(JS_ENTRYPOINT_FOR_TEST)
@mkdir -p $(TEST_ZIP_FIXTURE)
node --experimental-modules src/test/generate-js-entrypoint-binary.mjs
$(JS_ENTRYPOINT_FOR_TEST): src/test/entrypoint.mjs $(QUICKJS_STATIC)
@mkdir -p $(GENERATED_FOR_TEST)
npx qjsc -c -m -M sdl.so,sdl -o $@ src/test/entrypoint.mjs
$(QUICKJS_STATIC):
npm install
$(SDL2_FRAMEWORK_MACOS):
@mkdir -p $(TMP)
curl -o "$(TMP)/SDL2-$(SDL2_VERSION).dmg" https://www.libsdl.org/release/SDL2-$(SDL2_VERSION).dmg
hdiutil mount $(TMP)/SDL2-$(SDL2_VERSION).dmg
cp -R /Volumes/SDL2/SDL2.framework $(SDL2_FRAMEWORK_MACOS)
hdiutil unmount /Volumes/SDL2
$(SDL2_MINGW_WINDOWS):
@mkdir -p $(TMP)
curl -o "$(TMP)/sdl2-win.tar.gz" https://www.libsdl.org/release/SDL2-devel-$(SDL2_VERSION)-mingw.tar.gz
tar -zxvf "$(TMP)/sdl2-win.tar.gz" -C $(TMP)
$(MINIZ):
@mkdir -p $(TMP)
curl -L -o $(TMP)/miniz.zip https://github.com/richgel999/miniz/releases/download/$(MINIZ_VERSION)/miniz-$(MINIZ_VERSION).zip
unzip -d $@ $(TMP)/miniz.zip
$(DOCKCROSS_WINDOWS):
@mkdir -p $(TMP)
docker run --rm dockcross/windows-static-x64 > $(DOCKCROSS_WINDOWS)
chmod +x $(DOCKCROSS_WINDOWS)