1 | # Build OVM App Bundles (Python code with a statically-linked CPython
|
2 | # interpreter.)
|
3 | #
|
4 | # We also build a tarball that allows the end user to build an app bundle.
|
5 | # They need GNU Make, bash, and a C compiler. (And xargs, chmod, etc.)
|
6 | #
|
7 | # Tarball layout (see build/compile.sh for details):
|
8 | #
|
9 | # oil.tar/
|
10 | # configure
|
11 | # install
|
12 | # Makefile
|
13 | # _build/ # Intermediate files
|
14 | # oil/ # The app name
|
15 | # bytecode-opy.zip # Arch-independent
|
16 | # main_name.c
|
17 | # module_init.c # Python module initializer
|
18 | # c-module-srcs.txt # List of Modules/ etc.
|
19 | # native/ # App-specific modules
|
20 | # libc.c
|
21 | # build/
|
22 | # static-c-modules.txt # From Python interpreter
|
23 | # compile.sh ...
|
24 | # detect-cc.c ...
|
25 | # Python-2.7.13/
|
26 | # pyconfig.h # A frozen version
|
27 | # Python/
|
28 | # Objects/
|
29 | # Modules/
|
30 | # Include/
|
31 | #
|
32 | #
|
33 | # Intermediate layout:
|
34 | #
|
35 | # _build/
|
36 | # cpython-full/ # Full CPython build, for dynamically
|
37 | # # discovering Python/C dependencies
|
38 | # c-module-toc.txt # What files each module is in
|
39 | # oil/ # App-specific dir
|
40 | # py-to-compile.txt
|
41 | # all-deps-py.txt # input to compiler: _build/py-to-compile +
|
42 | # _build/oil/py-to-compile
|
43 | # opy-app-deps.txt # compiled with OPy, name DOESN'T match app-deps-% !
|
44 | # all-deps-c.txt # App deps plus CPython platform deps
|
45 | # app-deps-cpython.txt # compiled with CPython
|
46 | # bytecode-cpython.zip
|
47 | # bytecode-opy.zip
|
48 | # c-module-srcs.txt
|
49 | # main_name.c
|
50 | # module_init.c
|
51 | # ovm.d # Make fragment
|
52 | # ovm, ovm-dbg # OVM executables (without bytecode)
|
53 | # _release/
|
54 | # oil.tar # See tarball layout above
|
55 | # _bin/ # Concatenated App Bundles
|
56 | # oil.ovm
|
57 | # oil.ovm-dbg
|
58 | # hello.ovm
|
59 | # hello.ovm-dbg
|
60 |
|
61 | # Needed for rules with '> $@'. Does this always work?
|
62 | .DELETE_ON_ERROR:
|
63 |
|
64 | # Intermediate targets aren't automatically deleted.
|
65 | .SECONDARY:
|
66 |
|
67 | # Don't use the built-in rules database. This makes the 'make -d' output
|
68 | # easier to read.
|
69 | .SUFFIXES:
|
70 |
|
71 | # Make all directories before every build.
|
72 | $(shell mkdir -p _bin _release _tmp _build/hello _build/oil _build/opy)
|
73 |
|
74 | STAMP_SH := build/stamp.sh
|
75 | ACTIONS_SH := build/ovm-actions.sh
|
76 | COMPILE_SH := build/ovm-compile.sh
|
77 | CLEAN_SH := build/clean.sh
|
78 |
|
79 | # Change the bytecode compiler here.
|
80 | #BYTECODE_ZIP := bytecode-cpython.zip
|
81 | BYTECODE_ZIP := bytecode-opy.zip
|
82 |
|
83 | # We want to generated the unstripped binary first, then strip it, so we can
|
84 | # retain symbols. There doesn't seem to be a portable way to do this?
|
85 | #
|
86 | # The GNU toolchain has objcopy, and Clang has dsymutil.
|
87 |
|
88 | HAVE_OBJCOPY := $(shell command -v objcopy 2>/dev/null)
|
89 |
|
90 | # For faster testing of builds
|
91 | #default: _bin/oil.ovm-dbg
|
92 |
|
93 | # What the end user should build when they type 'make'.
|
94 | default: _bin/oil.ovm
|
95 |
|
96 | # Debug bundles and release tarballs.
|
97 | all: \
|
98 | _bin/hello.ovm _bin/oil.ovm \
|
99 | _bin/hello.ovm-dbg _bin/oil.ovm-dbg \
|
100 | _release/hello.tar _release/oil.tar
|
101 |
|
102 | # Take care not to remove _build/oil/bytecode-opy.zip, etc.
|
103 | clean:
|
104 | $(CLEAN_SH) source-tarball-build
|
105 |
|
106 | clean-repo:
|
107 | $(CLEAN_SH) cpp
|
108 |
|
109 | # .PHONY alias for compatibility
|
110 | install:
|
111 | @./install
|
112 |
|
113 | uninstall:
|
114 | @./uninstall
|
115 |
|
116 | .PHONY: default all clean clean-repo install uninstall
|
117 |
|
118 | # For debugging
|
119 | print-%:
|
120 | @echo $*=$($*)
|
121 |
|
122 | # These files is intentionally NOT included in release tarballs. For example,
|
123 | # we don't want try to rebuild _build/oil/bytecode-opy.zip, which is already
|
124 | # included in the release tarball. Portable rules can be run on the developer
|
125 | # machine rather than on the end-user machine.
|
126 |
|
127 | -include build/portable-rules.mk # Must come first
|
128 | -include build/hello.mk
|
129 | -include build/oil.mk
|
130 |
|
131 | #
|
132 | # Native Builds
|
133 | #
|
134 |
|
135 | # Release build.
|
136 | # This depends on the static modules
|
137 | _build/%/ovm-opt: _build/%/module_init.c _build/%/main_name.c \
|
138 | _build/%/c-module-srcs.txt $(COMPILE_SH)
|
139 | $(COMPILE_SH) build-opt $@ $(filter-out $(COMPILE_SH),$^)
|
140 |
|
141 |
|
142 | ifdef HAVE_OBJCOPY
|
143 |
|
144 | # If possible, we want symbols for OPTIMIZED builds, for various profiling
|
145 | # tools.
|
146 |
|
147 | # First copy the symbols out of the binary we built.
|
148 | # (Distro packagers might use this to create symbols packages?)
|
149 | _build/%/ovm-opt.symbols: _build/%/ovm-opt
|
150 | objcopy --only-keep-debug $^ $@
|
151 |
|
152 | # Then create a stripped binary that LINKS to the symbols.
|
153 |
|
154 | _build/%/ovm-opt.stripped: _build/%/ovm-opt _build/%/ovm-opt.symbols
|
155 | strip -o $@ _build/$*/ovm-opt # What's the difference with debug symbols?
|
156 | # We need a relative path since it will be _bin/oil.ovm
|
157 | objcopy --add-gnu-debuglink=_build/$*/ovm-opt.symbols $@
|
158 |
|
159 | else
|
160 |
|
161 | # We don't have objcopy, which means we might be using the Clang toolchain
|
162 | # (e.g. on OS X). We're not doing any profiling on OS X, and there's no way to
|
163 | # link the symbols, so just strip it.
|
164 | #
|
165 | # We used to have 'dsymutil' but it was never tested.
|
166 | # https://stackoverflow.com/a/33307778
|
167 |
|
168 | _build/%/ovm-opt.stripped: _build/%/ovm-opt
|
169 | strip -o $@ _build/$*/ovm-opt
|
170 |
|
171 | endif
|
172 |
|
173 | # Fast build, with symbols for debugging.
|
174 | _build/%/ovm-dbg: _build/%/module_init.c _build/%/main_name.c \
|
175 | _build/%/c-module-srcs.txt $(COMPILE_SH)
|
176 | $(COMPILE_SH) build-dbg $@ $(filter-out $(COMPILE_SH),$^)
|
177 |
|
178 | # Coverage, for paring down the files that we build.
|
179 | # TODO: Hook this up.
|
180 | _build/%/ovm-cov: _build/%/module_init.c _build/%/main_name.c \
|
181 | _build/%/c-module-srcs.txt $(COMPILE_SH)
|
182 | $(COMPILE_SH) build $@ $(filter-out $(COMPILE_SH),$^)
|
183 |
|
184 | # App bundles.
|
185 | _bin/%.ovm-dbg: _build/%/ovm-dbg _build/%/$(BYTECODE_ZIP)
|
186 | cat $^ > $@
|
187 | chmod +x $@
|
188 |
|
189 | _bin/%.ovm: _build/%/ovm-opt.stripped _build/%/$(BYTECODE_ZIP)
|
190 | cat $^ > $@
|
191 | chmod +x $@
|
192 |
|
193 | # Optimized version with symbols.
|
194 | _bin/%.ovm-opt: _build/%/ovm-opt _build/%/$(BYTECODE_ZIP)
|
195 | cat $^ > $@
|
196 | chmod +x $@
|