1 # portable-rules.mk: These are done on the dev machine.
2 #
3 # Non-portable rules involves C compilers, and must be done on the target
4 # machine.
5
6 # The root of this repo, e.g. ~/git/oil, should be our PYTHONPATH for
7 # detecting dependencies.
8 #
9 # From this link:
10 # https://stackoverflow.com/questions/322936/common-gnu-makefile-directory-path
11 # Except we're using 'firstword' instead of 'lastword', because
12 # _build/oil/ovm.d is the last one.
13 REPO_ROOT := $(abspath $(dir $(firstword $(MAKEFILE_LIST))))
14
15 #
16 # App-independent rules.
17 #
18
19 # NOTES:
20 # - Manually rm this file to generate a new build timestamp.
21 # - This messes up reproducible builds.
22 # - It's not marked .PHONY because that would mess up the end user build.
23 # bytecode-*.zip should NOT be built by the user.
24 _build/release-date.txt:
25 $(STAMP_SH) write-release-date
26
27 # The Makefiles generated by autoconf don't call configure, but Linux/toybox
28 # config system does. This can be overridden.
29 _build/detected-config.sh:
30 ./configure
31
32 # Needed by make-tar for gcc -M
33 _build/detected-config.h:
34 ./configure
35
36 # What files correspond to each C module.
37 # TODO:
38 # - Where to put -l z? (Done in Modules/Setup.dist)
39 _build/c-module-toc.txt: build/c_module_toc.py
40 $(ACTIONS_SH) c-module-toc > $@
41
42 #
43 # App-Independent Pattern Rules.
44 #
45
46 # Regenerate dependencies. But only if we made the app dirs.
47 _build/%/ovm.d: _build/%/app-deps-c.txt
48 $(ACTIONS_SH) make-dotd $* $^ > $@
49
50 # Source paths of all C modules the app depends on. For the tarball.
51 # A trick: remove the first dep to form the lists. You can't just use $^
52 # because './c_module_srcs.py' is rewritten to 'c_module_srcs.py'.
53 _build/%/c-module-srcs.txt: \
54 build/c_module_srcs.py _build/c-module-toc.txt _build/%/app-deps-c.txt
55 build/c_module_srcs.py $(filter-out $<,$^) > $@
56
57 _build/%/all-deps-c.txt: build/static-c-modules.txt _build/%/app-deps-c.txt
58 $(ACTIONS_SH) join-modules $^ > $@
59
60 _build/%/all-deps-py.txt: _build/%/py-to-compile.txt
61 sort $^ | uniq > $@
62
63 _build/opy/py27.grammar.marshal: opy/py27.grammar
64 bin/opyc pgen2 $^ $@
65
66 # NOTE: This should really depend on all the .py files.
67 # I should make a _build/oil/py.d file and include it?
68 # This depends on the grammar pickle because it's the first one that calls opy
69 # compile.
70 _build/%/opy-app-deps.txt: _build/opy/py27.grammar.marshal _build/%/all-deps-py.txt
71 # exclude the pickle
72 cat _build/$*/all-deps-py.txt | opy/build.sh compile-manifest _build/$*/bytecode-opy > $@
73
74
75 PY27 := Python-2.7.13
76
77 # Per-app extension module initialization.
78 _build/%/module_init.c: $(PY27)/Modules/config.c.in _build/%/all-deps-c.txt
79 # NOTE: Using xargs < input.txt style because it will fail if input.txt
80 # doesn't exist! 'cat' errors will be swallowed.
81 xargs $(ACTIONS_SH) gen-module-init < _build/$*/all-deps-c.txt > $@
82
83
84 #
85 # Tarballs
86 #
87 # Contain Makefile and associated shell scripts, discovered .c and .py deps,
88 # app source.
89
90 _release/%.tar: _build/%/$(BYTECODE_ZIP) \
91 _build/%/module_init.c \
92 _build/%/main_name.c \
93 _build/%/c-module-srcs.txt \
94 _build/detected-config.h
95 $(COMPILE_SH) make-tar $* $(BYTECODE_ZIP) $@
96