forked from pyodide/pyodide
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Makefile
254 lines (194 loc) · 7.65 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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
PYODIDE_ROOT=$(abspath .)
include Makefile.envs
.PHONY=check
CC=emcc
CXX=em++
all: check \
dist/pyodide.asm.js \
dist/pyodide.js \
dist/pyodide.d.ts \
dist/package.json \
npm-link \
dist/console.html \
dist/distutils.tar \
dist/test.tar \
dist/packages.json \
dist/pyodide_py.tar \
dist/test.html \
dist/module_test.html \
dist/webworker.js \
dist/webworker_dev.js \
dist/module_webworker_dev.js
echo -e "\nSUCCESS!"
$(CPYTHONLIB)/tzdata :
pip install tzdata --target=$(CPYTHONLIB)
dist/pyodide_py.tar: $(wildcard src/py/pyodide/*.py) $(wildcard src/py/_pyodide/*.py)
cd src/py && tar --exclude '*__pycache__*' -cf ../../dist/pyodide_py.tar pyodide _pyodide
dist/pyodide.asm.js: \
src/core/docstring.o \
src/core/error_handling.o \
src/core/error_handling_cpp.o \
src/core/hiwire.o \
src/core/js2python.o \
src/core/jsproxy.o \
src/core/main.o \
src/core/pyproxy.o \
src/core/python2js_buffer.o \
src/core/python2js.o \
src/js/_pyodide.out.js \
$(wildcard src/py/lib/*.py) \
$(CPYTHONLIB)/tzdata \
$(CPYTHONLIB)
date +"[%F %T] Building pyodide.asm.js..."
[ -d dist ] || mkdir dist
$(CXX) -o dist/pyodide.asm.js $(filter %.o,$^) \
$(MAIN_MODULE_LDFLAGS)
# Strip out C++ symbols which all start __Z.
# There are 4821 of these and they have VERY VERY long names.
# To show some stats on the symbols you can use the following:
# cat dist/pyodide.asm.js | grep -ohE 'var _{0,5}.' | sort | uniq -c | sort -nr | head -n 20
sed -i -E 's/var __Z[^;]*;//g' dist/pyodide.asm.js
sed -i '1i "use strict";' dist/pyodide.asm.js
# Remove last 6 lines of pyodide.asm.js, see issue #2282
# Hopefully we will remove this after emscripten fixes it, upstream issue
# emscripten-core/emscripten#16518
# Sed nonsense from https://stackoverflow.com/a/13383331
sed -i -n -e :a -e '1,6!{P;N;D;};N;ba' dist/pyodide.asm.js
echo "globalThis._createPyodideModule = _createPyodideModule;" >> dist/pyodide.asm.js
date +"[%F %T] done building pyodide.asm.js."
env:
env
node_modules/.installed : src/js/package.json src/js/package-lock.json
cd src/js && npm ci
ln -sfn src/js/node_modules/ node_modules
touch node_modules/.installed
dist/pyodide.js src/js/_pyodide.out.js: src/js/*.ts src/js/pyproxy.gen.ts src/js/error_handling.gen.ts node_modules/.installed
npx rollup -c src/js/rollup.config.js
dist/package.json : src/js/package.json
cp $< $@
.PHONY: npm-link
npm-link: dist/package.json
cd src/test-js && npm ci && npm link ../../dist
dist/pyodide.d.ts: src/js/*.ts src/js/pyproxy.gen.ts src/js/error_handling.gen.ts
npx dts-bundle-generator src/js/pyodide.ts --export-referenced-types false
mv src/js/pyodide.d.ts dist
src/js/error_handling.gen.ts : src/core/error_handling.ts
cp $< $@
src/js/pyproxy.gen.ts : src/core/pyproxy.* src/core/*.h
# We can't input pyproxy.js directly because CC will be unhappy about the file
# extension. Instead cat it and have CC read from stdin.
# -E : Only apply prepreocessor
# -C : Leave comments alone (this allows them to be preserved in typescript
# definition files, rollup will strip them out)
# -P : Don't put in macro debug info
# -imacros pyproxy.c : include all of the macros definitions from pyproxy.c
#
# First we use sed to delete the segments of the file between
# "// pyodide-skip" and "// end-pyodide-skip". This allows us to give
# typescript type declarations for the macros which we need for intellisense
# and documentation generation. The result of processing the type
# declarations with the macro processor is a type error, so we snip them
# out.
rm -f $@
echo "// This file is generated by applying the C preprocessor to core/pyproxy.ts" >> $@
echo "// It uses the macros defined in core/pyproxy.c" >> $@
echo "// Do not edit it directly!" >> $@
cat src/core/pyproxy.ts | \
sed '/^\/\/\s*pyodide-skip/,/^\/\/\s*end-pyodide-skip/d' | \
$(CC) -E -C -P -imacros src/core/pyproxy.c $(MAIN_MODULE_CFLAGS) - \
>> $@
dist/test.html: src/templates/test.html
cp $< $@
dist/module_test.html: src/templates/module_test.html
cp $< $@
.PHONY: dist/console.html
dist/console.html: src/templates/console.html
cp $< $@
sed -i -e 's#{{ PYODIDE_BASE_URL }}#$(PYODIDE_BASE_URL)#g' $@
.PHONY: docs/_build/html/console.html
docs/_build/html/console.html: src/templates/console.html
mkdir -p docs/_build/html
cp $< $@
sed -i -e 's#{{ PYODIDE_BASE_URL }}#$(PYODIDE_BASE_URL)#g' $@
.PHONY: dist/webworker.js
dist/webworker.js: src/templates/webworker.js
cp $< $@
sed -i -e 's#{{ PYODIDE_BASE_URL }}#$(PYODIDE_BASE_URL)#g' $@
.PHONY: dist/module_webworker_dev.js
dist/module_webworker_dev.js: src/templates/module_webworker.js
cp $< $@
sed -i -e 's#{{ PYODIDE_BASE_URL }}#./#g' $@
.PHONY: dist/webworker_dev.js
dist/webworker_dev.js: src/templates/webworker.js
cp $< $@
sed -i -e 's#{{ PYODIDE_BASE_URL }}#./#g' $@
update_base_url: \
dist/console.html \
dist/webworker.js
.PHONY: lint
lint:
pre-commit run -a --show-diff-on-failure
benchmark: all
$(HOSTPYTHON) benchmark/benchmark.py all --output dist/benchmarks.json
$(HOSTPYTHON) benchmark/plot_benchmark.py dist/benchmarks.json dist/benchmarks.png
clean:
rm -fr dist/*
rm -fr src/*/*.o
rm -fr node_modules
make -C packages clean
echo "The Emsdk, CPython are not cleaned. cd into those directories to do so."
clean-python: clean
make -C cpython clean
clean-all:
make -C emsdk clean
make -C cpython clean-all
src/core/error_handling_cpp.o: src/core/error_handling_cpp.cpp
$(CXX) -o $@ -c $< $(MAIN_MODULE_CFLAGS) -Isrc/core/
%.o: %.c $(CPYTHONLIB) $(wildcard src/core/*.h src/core/*.js)
$(CC) -o $@ -c $< $(MAIN_MODULE_CFLAGS) -Isrc/core/
# Stdlib modules that we repackage as standalone packages
TEST_EXTENSIONS= \
_testinternalcapi.so \
_testcapi.so \
_testbuffer.so \
_testimportmultiple.so \
_testmultiphase.so \
_ctypes_test.so
TEST_MODULE_CFLAGS= $(SIDE_MODULE_CFLAGS) -I Include/ -I .
# TODO: also include test directories included in other stdlib modules
dist/test.tar: $(CPYTHONLIB) node_modules/.installed
cd $(CPYTHONBUILD) && emcc $(TEST_MODULE_CFLAGS) -c Modules/_testinternalcapi.c -o Modules/_testinternalcapi.o \
-I Include/internal/ -DPy_BUILD_CORE_MODULE
cd $(CPYTHONBUILD) && emcc $(TEST_MODULE_CFLAGS) -c Modules/_testcapimodule.c -o Modules/_testcapi.o
cd $(CPYTHONBUILD) && emcc $(TEST_MODULE_CFLAGS) -c Modules/_testbuffer.c -o Modules/_testbuffer.o
cd $(CPYTHONBUILD) && emcc $(TEST_MODULE_CFLAGS) -c Modules/_testimportmultiple.c -o Modules/_testimportmultiple.o
cd $(CPYTHONBUILD) && emcc $(TEST_MODULE_CFLAGS) -c Modules/_testmultiphase.c -o Modules/_testmultiphase.o
cd $(CPYTHONBUILD) && emcc $(TEST_MODULE_CFLAGS) -c Modules/_ctypes/_ctypes_test.c -o Modules/_ctypes_test.o
for testname in $(TEST_EXTENSIONS); do \
cd $(CPYTHONBUILD) && \
emcc Modules/$${testname%.*}.o -o $$testname $(SIDE_MODULE_LDFLAGS) && \
ln -s $(CPYTHONBUILD)/$$testname $(CPYTHONLIB)/$$testname ; \
done
cd $(CPYTHONLIB) && tar -h --exclude=__pycache__ -cf $(PYODIDE_ROOT)/dist/test.tar \
test $(TEST_EXTENSIONS) unittest/test sqlite3/test ctypes/test
cd $(CPYTHONLIB) && rm $(TEST_EXTENSIONS)
dist/distutils.tar: $(CPYTHONLIB) node_modules/.installed
cd $(CPYTHONLIB) && tar --exclude=__pycache__ -cf $(PYODIDE_ROOT)/dist/distutils.tar distutils
$(CPYTHONLIB): emsdk/emsdk/.complete $(PYODIDE_EMCC) $(PYODIDE_CXX)
date +"[%F %T] Building cpython..."
make -C $(CPYTHONROOT)
date +"[%F %T] done building cpython..."
dist/packages.json: FORCE
date +"[%F %T] Building packages..."
make -C packages
date +"[%F %T] done building packages..."
emsdk/emsdk/.complete:
date +"[%F %T] Building emsdk..."
make -C emsdk
date +"[%F %T] done building emsdk."
FORCE:
check:
./tools/dependency-check.sh
debug :
EXTRA_CFLAGS+=" -D DEBUG_F" \
make