README-design.md revision 1.1 1 1.1 christos Design document for the unified scheme data
2 1.1 christos ===========================================
3 1.1 christos
4 1.1 christos How are things connected?
5 1.1 christos -------------------------
6 1.1 christos
7 1.1 christos The unified scheme takes all its data from the `build.info` files seen
8 1.1 christos throughout the source tree. These files hold the minimum information
9 1.1 christos needed to build end product files from diverse sources. See the
10 1.1 christos section on `build.info` files below.
11 1.1 christos
12 1.1 christos From the information in `build.info` files, `Configure` builds up an
13 1.1 christos information database as a hash table called `%unified_info`, which is
14 1.1 christos stored in configdata.pm, found at the top of the build tree (which may
15 1.1 christos or may not be the same as the source tree).
16 1.1 christos
17 1.1 christos [`Configurations/common.tmpl`](common.tmpl) uses the data from `%unified_info` to
18 1.1 christos generate the rules for building end product files as well as
19 1.1 christos intermediary files with the help of a few functions found in the
20 1.1 christos build-file templates. See the section on build-file templates further
21 1.1 christos down for more information.
22 1.1 christos
23 1.1 christos build.info files
24 1.1 christos ----------------
25 1.1 christos
26 1.1 christos As mentioned earlier, `build.info` files are meant to hold the minimum
27 1.1 christos information needed to build output files, and therefore only (with a
28 1.1 christos few possible exceptions [1]) have information about end products (such
29 1.1 christos as scripts, library files and programs) and source files (such as C
30 1.1 christos files, C header files, assembler files, etc). Intermediate files such
31 1.1 christos as object files are rarely directly referred to in `build.info` files (and
32 1.1 christos when they are, it's always with the file name extension `.o`), they are
33 1.1 christos inferred by `Configure`. By the same rule of minimalism, end product
34 1.1 christos file name extensions (such as `.so`, `.a`, `.exe`, etc) are never mentioned
35 1.1 christos in `build.info`. Their file name extensions will be inferred by the
36 1.1 christos build-file templates, adapted for the platform they are meant for (see
37 1.1 christos sections on `%unified_info` and build-file templates further down).
38 1.1 christos
39 1.1 christos The variables `PROGRAMS`, `LIBS`, `MODULES` and `SCRIPTS` are used to declare
40 1.1 christos end products. There are variants for them with `_NO_INST` as suffix
41 1.1 christos (`PROGRAM_NO_INST` etc) to specify end products that shouldn't get installed.
42 1.1 christos
43 1.1 christos The variables `SOURCE`, `DEPEND`, `INCLUDE` and `DEFINE` are indexed by a
44 1.1 christos produced file, and their values are the source used to produce that
45 1.1 christos particular produced file, extra dependencies, include directories
46 1.1 christos needed, or C macros to be defined.
47 1.1 christos
48 1.1 christos All their values in all the `build.info` throughout the source tree are
49 1.1 christos collected together and form a set of programs, libraries, modules and
50 1.1 christos scripts to be produced, source files, dependencies, etc etc etc.
51 1.1 christos
52 1.1 christos Let's have a pretend example, a very limited contraption of OpenSSL,
53 1.1 christos composed of the program `apps/openssl`, the libraries `libssl` and
54 1.1 christos `libcrypto`, an module `engines/ossltest` and their sources and
55 1.1 christos dependencies.
56 1.1 christos
57 1.1 christos # build.info
58 1.1 christos LIBS=libcrypto libssl
59 1.1 christos INCLUDE[libcrypto]=include
60 1.1 christos INCLUDE[libssl]=include
61 1.1 christos DEPEND[libssl]=libcrypto
62 1.1 christos
63 1.1 christos This is the top directory `build.info` file, and it tells us that two
64 1.1 christos libraries are to be built, the include directory `include/` shall be
65 1.1 christos used throughout when building anything that will end up in each
66 1.1 christos library, and that the library `libssl` depend on the library
67 1.1 christos `libcrypto` to function properly.
68 1.1 christos
69 1.1 christos # apps/build.info
70 1.1 christos PROGRAMS=openssl
71 1.1 christos SOURCE[openssl]=openssl.c
72 1.1 christos INCLUDE[openssl]=.. ../include
73 1.1 christos DEPEND[openssl]=../libssl
74 1.1 christos
75 1.1 christos This is the `build.info` file in `apps/`, one may notice that all file
76 1.1 christos paths mentioned are relative to the directory the `build.info` file is
77 1.1 christos located in. This one tells us that there's a program to be built
78 1.1 christos called `apps/openss` (the file name extension will depend on the
79 1.1 christos platform and is therefore not mentioned in the `build.info` file). It's
80 1.1 christos built from one source file, `apps/openssl.c`, and building it requires
81 1.1 christos the use of `.` and `include/` include directories (both are declared
82 1.1 christos from the point of view of the `apps/` directory), and that the program
83 1.1 christos depends on the library `libssl` to function properly.
84 1.1 christos
85 1.1 christos # crypto/build.info
86 1.1 christos LIBS=../libcrypto
87 1.1 christos SOURCE[../libcrypto]=aes.c evp.c cversion.c
88 1.1 christos DEPEND[cversion.o]=buildinf.h
89 1.1 christos
90 1.1 christos GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(CC) $(CFLAGS)" "$(PLATFORM)"
91 1.1 christos DEPEND[buildinf.h]=../Makefile
92 1.1 christos DEPEND[../util/mkbuildinf.pl]=../util/Foo.pm
93 1.1 christos
94 1.1 christos This is the `build.info` file in `crypto/`, and it tells us a little more
95 1.1 christos about what's needed to produce `libcrypto`. LIBS is used again to
96 1.1 christos declare that `libcrypto` is to be produced. This declaration is
97 1.1 christos really unnecessary as it's already mentioned in the top `build.info`
98 1.1 christos file, but can make the info file easier to understand. This is to
99 1.1 christos show that duplicate information isn't an issue.
100 1.1 christos
101 1.1 christos This `build.info` file informs us that `libcrypto` is built from a few
102 1.1 christos source files, `crypto/aes.c`, `crypto/evp.c` and `crypto/cversion.c`.
103 1.1 christos It also shows us that building the object file inferred from
104 1.1 christos `crypto/cversion.c` depends on `crypto/buildinf.h`. Finally, it
105 1.1 christos also shows the possibility to declare how some files are generated
106 1.1 christos using some script, in this case a perl script, and how such scripts
107 1.1 christos can be declared to depend on other files, in this case a perl module.
108 1.1 christos
109 1.1 christos Two things are worth an extra note:
110 1.1 christos
111 1.1 christos `DEPEND[cversion.o]` mentions an object file. DEPEND indexes is the
112 1.1 christos only location where it's valid to mention them
113 1.1 christos
114 1.1 christos # ssl/build.info
115 1.1 christos LIBS=../libssl
116 1.1 christos SOURCE[../libssl]=tls.c
117 1.1 christos
118 1.1 christos This is the build.info file in `ssl/`, and it tells us that the
119 1.1 christos library `libssl` is built from the source file `ssl/tls.c`.
120 1.1 christos
121 1.1 christos # engines/build.info
122 1.1 christos MODULES=dasync
123 1.1 christos SOURCE[dasync]=e_dasync.c
124 1.1 christos DEPEND[dasync]=../libcrypto
125 1.1 christos INCLUDE[dasync]=../include
126 1.1 christos
127 1.1 christos MODULES_NO_INST=ossltest
128 1.1 christos SOURCE[ossltest]=e_ossltest.c
129 1.1 christos DEPEND[ossltest]=../libcrypto.a
130 1.1 christos INCLUDE[ossltest]=../include
131 1.1 christos
132 1.1 christos This is the `build.info` file in `engines/`, telling us that two modules
133 1.1 christos called `engines/dasync` and `engines/ossltest` shall be built, that
134 1.1 christos `dasync`'s source is `engines/e_dasync.c` and `ossltest`'s source is
135 1.1 christos `engines/e_ossltest.c` and that the include directory `include/` may
136 1.1 christos be used when building anything that will be part of these modules.
137 1.1 christos Also, both modules depend on the library `libcrypto` to function
138 1.1 christos properly. `ossltest` is explicitly linked with the static variant of
139 1.1 christos the library `libcrypto`. Finally, only `dasync` is being installed, as
140 1.1 christos `ossltest` is only for internal testing.
141 1.1 christos
142 1.1 christos When `Configure` digests these `build.info` files, the accumulated
143 1.1 christos information comes down to this:
144 1.1 christos
145 1.1 christos LIBS=libcrypto libssl
146 1.1 christos SOURCE[libcrypto]=crypto/aes.c crypto/evp.c crypto/cversion.c
147 1.1 christos DEPEND[crypto/cversion.o]=crypto/buildinf.h
148 1.1 christos INCLUDE[libcrypto]=include
149 1.1 christos SOURCE[libssl]=ssl/tls.c
150 1.1 christos INCLUDE[libssl]=include
151 1.1 christos DEPEND[libssl]=libcrypto
152 1.1 christos
153 1.1 christos PROGRAMS=apps/openssl
154 1.1 christos SOURCE[apps/openssl]=apps/openssl.c
155 1.1 christos INCLUDE[apps/openssl]=. include
156 1.1 christos DEPEND[apps/openssl]=libssl
157 1.1 christos
158 1.1 christos MODULES=engines/dasync
159 1.1 christos SOURCE[engines/dasync]=engines/e_dasync.c
160 1.1 christos DEPEND[engines/dasync]=libcrypto
161 1.1 christos INCLUDE[engines/dasync]=include
162 1.1 christos
163 1.1 christos MODULES_NO_INST=engines/ossltest
164 1.1 christos SOURCE[engines/ossltest]=engines/e_ossltest.c
165 1.1 christos DEPEND[engines/ossltest]=libcrypto.a
166 1.1 christos INCLUDE[engines/ossltest]=include
167 1.1 christos
168 1.1 christos GENERATE[crypto/buildinf.h]=util/mkbuildinf.pl "$(CC) $(CFLAGS)" "$(PLATFORM)"
169 1.1 christos DEPEND[crypto/buildinf.h]=Makefile
170 1.1 christos DEPEND[util/mkbuildinf.pl]=util/Foo.pm
171 1.1 christos
172 1.1 christos A few notes worth mentioning:
173 1.1 christos
174 1.1 christos `LIBS` may be used to declare routine libraries only.
175 1.1 christos
176 1.1 christos `PROGRAMS` may be used to declare programs only.
177 1.1 christos
178 1.1 christos `MODULES` may be used to declare modules only.
179 1.1 christos
180 1.1 christos The indexes for `SOURCE` must only be end product files, such as
181 1.1 christos libraries, programs or modules. The values of `SOURCE` variables must
182 1.1 christos only be source files (possibly generated).
183 1.1 christos
184 1.1 christos `INCLUDE` and `DEPEND` shows a relationship between different files
185 1.1 christos (usually produced files) or between files and directories, such as a
186 1.1 christos program depending on a library, or between an object file and some
187 1.1 christos extra source file.
188 1.1 christos
189 1.1 christos When `Configure` processes the `build.info` files, it will take it as
190 1.1 christos truth without question, and will therefore perform very few checks.
191 1.1 christos If the build tree is separate from the source tree, it will assume
192 1.1 christos that all built files and up in the build directory and that all source
193 1.1 christos files are to be found in the source tree, if they can be found there.
194 1.1 christos `Configure` will assume that source files that can't be found in the
195 1.1 christos source tree (such as `crypto/bildinf.h` in the example above) are
196 1.1 christos generated and will be found in the build tree.
197 1.1 christos
198 1.1 christos The `%unified_info` database
199 1.1 christos ----------------------------
200 1.1 christos
201 1.1 christos The information in all the `build.info` get digested by `Configure` and
202 1.1 christos collected into the `%unified_info` database, divided into the following
203 1.1 christos indexes:
204 1.1 christos
205 1.1 christos depends => a hash table containing 'file' => [ 'dependency' ... ]
206 1.1 christos pairs. These are directly inferred from the DEPEND
207 1.1 christos variables in build.info files.
208 1.1 christos
209 1.1 christos modules => a list of modules. These are directly inferred from
210 1.1 christos the MODULES variable in build.info files.
211 1.1 christos
212 1.1 christos generate => a hash table containing 'file' => [ 'generator' ... ]
213 1.1 christos pairs. These are directly inferred from the GENERATE
214 1.1 christos variables in build.info files.
215 1.1 christos
216 1.1 christos includes => a hash table containing 'file' => [ 'include' ... ]
217 1.1 christos pairs. These are directly inferred from the INCLUDE
218 1.1 christos variables in build.info files.
219 1.1 christos
220 1.1 christos install => a hash table containing 'type' => [ 'file' ... ] pairs.
221 1.1 christos The types are 'programs', 'libraries', 'modules' and
222 1.1 christos 'scripts', and the array of files list the files of
223 1.1 christos that type that should be installed.
224 1.1 christos
225 1.1 christos libraries => a list of libraries. These are directly inferred from
226 1.1 christos the LIBS variable in build.info files.
227 1.1 christos
228 1.1 christos programs => a list of programs. These are directly inferred from
229 1.1 christos the PROGRAMS variable in build.info files.
230 1.1 christos
231 1.1 christos scripts => a list of scripts. There are directly inferred from
232 1.1 christos the SCRIPTS variable in build.info files.
233 1.1 christos
234 1.1 christos sources => a hash table containing 'file' => [ 'sourcefile' ... ]
235 1.1 christos pairs. These are indirectly inferred from the SOURCE
236 1.1 christos variables in build.info files. Object files are
237 1.1 christos mentioned in this hash table, with source files from
238 1.1 christos SOURCE variables, and AS source files for programs and
239 1.1 christos libraries.
240 1.1 christos
241 1.1 christos shared_sources =>
242 1.1 christos a hash table just like 'sources', but only as source
243 1.1 christos files (object files) for building shared libraries.
244 1.1 christos
245 1.1 christos As an example, here is how the `build.info` files example from the
246 1.1 christos section above would be digested into a `%unified_info` table:
247 1.1 christos
248 1.1 christos our %unified_info = (
249 1.1 christos "depends" =>
250 1.1 christos {
251 1.1 christos "apps/openssl" =>
252 1.1 christos [
253 1.1 christos "libssl",
254 1.1 christos ],
255 1.1 christos "crypto/buildinf.h" =>
256 1.1 christos [
257 1.1 christos "Makefile",
258 1.1 christos ],
259 1.1 christos "crypto/cversion.o" =>
260 1.1 christos [
261 1.1 christos "crypto/buildinf.h",
262 1.1 christos ],
263 1.1 christos "engines/dasync" =>
264 1.1 christos [
265 1.1 christos "libcrypto",
266 1.1 christos ],
267 1.1 christos "engines/ossltest" =>
268 1.1 christos [
269 1.1 christos "libcrypto.a",
270 1.1 christos ],
271 1.1 christos "libssl" =>
272 1.1 christos [
273 1.1 christos "libcrypto",
274 1.1 christos ],
275 1.1 christos "util/mkbuildinf.pl" =>
276 1.1 christos [
277 1.1 christos "util/Foo.pm",
278 1.1 christos ],
279 1.1 christos },
280 1.1 christos "modules" =>
281 1.1 christos [
282 1.1 christos "engines/dasync",
283 1.1 christos "engines/ossltest",
284 1.1 christos ],
285 1.1 christos "generate" =>
286 1.1 christos {
287 1.1 christos "crypto/buildinf.h" =>
288 1.1 christos [
289 1.1 christos "util/mkbuildinf.pl",
290 1.1 christos "\"\$(CC)",
291 1.1 christos "\$(CFLAGS)\"",
292 1.1 christos "\"$(PLATFORM)\"",
293 1.1 christos ],
294 1.1 christos },
295 1.1 christos "includes" =>
296 1.1 christos {
297 1.1 christos "apps/openssl" =>
298 1.1 christos [
299 1.1 christos ".",
300 1.1 christos "include",
301 1.1 christos ],
302 1.1 christos "engines/ossltest" =>
303 1.1 christos [
304 1.1 christos "include"
305 1.1 christos ],
306 1.1 christos "libcrypto" =>
307 1.1 christos [
308 1.1 christos "include",
309 1.1 christos ],
310 1.1 christos "libssl" =>
311 1.1 christos [
312 1.1 christos "include",
313 1.1 christos ],
314 1.1 christos "util/mkbuildinf.pl" =>
315 1.1 christos [
316 1.1 christos "util",
317 1.1 christos ],
318 1.1 christos }
319 1.1 christos "install" =>
320 1.1 christos {
321 1.1 christos "modules" =>
322 1.1 christos [
323 1.1 christos "engines/dasync",
324 1.1 christos ],
325 1.1 christos "libraries" =>
326 1.1 christos [
327 1.1 christos "libcrypto",
328 1.1 christos "libssl",
329 1.1 christos ],
330 1.1 christos "programs" =>
331 1.1 christos [
332 1.1 christos "apps/openssl",
333 1.1 christos ],
334 1.1 christos },
335 1.1 christos "libraries" =>
336 1.1 christos [
337 1.1 christos "libcrypto",
338 1.1 christos "libssl",
339 1.1 christos ],
340 1.1 christos "programs" =>
341 1.1 christos [
342 1.1 christos "apps/openssl",
343 1.1 christos ],
344 1.1 christos "sources" =>
345 1.1 christos {
346 1.1 christos "apps/openssl" =>
347 1.1 christos [
348 1.1 christos "apps/openssl.o",
349 1.1 christos ],
350 1.1 christos "apps/openssl.o" =>
351 1.1 christos [
352 1.1 christos "apps/openssl.c",
353 1.1 christos ],
354 1.1 christos "crypto/aes.o" =>
355 1.1 christos [
356 1.1 christos "crypto/aes.c",
357 1.1 christos ],
358 1.1 christos "crypto/cversion.o" =>
359 1.1 christos [
360 1.1 christos "crypto/cversion.c",
361 1.1 christos ],
362 1.1 christos "crypto/evp.o" =>
363 1.1 christos [
364 1.1 christos "crypto/evp.c",
365 1.1 christos ],
366 1.1 christos "engines/e_dasync.o" =>
367 1.1 christos [
368 1.1 christos "engines/e_dasync.c",
369 1.1 christos ],
370 1.1 christos "engines/dasync" =>
371 1.1 christos [
372 1.1 christos "engines/e_dasync.o",
373 1.1 christos ],
374 1.1 christos "engines/e_ossltest.o" =>
375 1.1 christos [
376 1.1 christos "engines/e_ossltest.c",
377 1.1 christos ],
378 1.1 christos "engines/ossltest" =>
379 1.1 christos [
380 1.1 christos "engines/e_ossltest.o",
381 1.1 christos ],
382 1.1 christos "libcrypto" =>
383 1.1 christos [
384 1.1 christos "crypto/aes.c",
385 1.1 christos "crypto/cversion.c",
386 1.1 christos "crypto/evp.c",
387 1.1 christos ],
388 1.1 christos "libssl" =>
389 1.1 christos [
390 1.1 christos "ssl/tls.c",
391 1.1 christos ],
392 1.1 christos "ssl/tls.o" =>
393 1.1 christos [
394 1.1 christos "ssl/tls.c",
395 1.1 christos ],
396 1.1 christos },
397 1.1 christos );
398 1.1 christos
399 1.1 christos As can be seen, everything in `%unified_info` is fairly simple suggest
400 1.1 christos of information. Still, it tells us that to build all programs, we
401 1.1 christos must build `apps/openssl`, and to build the latter, we will need to
402 1.1 christos build all its sources (`apps/openssl.o` in this case) and all the
403 1.1 christos other things it depends on (such as `libssl`). All those dependencies
404 1.1 christos need to be built as well, using the same logic, so to build `libssl`,
405 1.1 christos we need to build `ssl/tls.o` as well as `libcrypto`, and to build the
406 1.1 christos latter...
407 1.1 christos
408 1.1 christos Build-file templates
409 1.1 christos --------------------
410 1.1 christos
411 1.1 christos Build-file templates are essentially build-files (such as `Makefile` on
412 1.1 christos Unix) with perl code fragments mixed in. Those perl code fragment
413 1.1 christos will generate all the configuration dependent data, including all the
414 1.1 christos rules needed to build end product files and intermediary files alike.
415 1.1 christos At a minimum, there must be a perl code fragment that defines a set of
416 1.1 christos functions that are used to generates specific build-file rules, to
417 1.1 christos build static libraries from object files, to build shared libraries
418 1.1 christos from static libraries, to programs from object files and libraries,
419 1.1 christos etc.
420 1.1 christos
421 1.1 christos generatesrc - function that produces build file lines to generate
422 1.1 christos a source file from some input.
423 1.1 christos
424 1.1 christos It's called like this:
425 1.1 christos
426 1.1 christos generatesrc(src => "PATH/TO/tobegenerated",
427 1.1 christos generator => [ "generatingfile", ... ]
428 1.1 christos generator_incs => [ "INCL/PATH", ... ]
429 1.1 christos generator_deps => [ "dep1", ... ]
430 1.1 christos incs => [ "INCL/PATH", ... ],
431 1.1 christos deps => [ "dep1", ... ],
432 1.1 christos intent => one of "libs", "dso", "bin" );
433 1.1 christos
434 1.1 christos 'src' has the name of the file to be generated.
435 1.1 christos 'generator' is the command or part of command to
436 1.1 christos generate the file, of which the first item is
437 1.1 christos expected to be the file to generate from.
438 1.1 christos generatesrc() is expected to analyse and figure out
439 1.1 christos exactly how to apply that file and how to capture
440 1.1 christos the result. 'generator_incs' and 'generator_deps'
441 1.1 christos are include directories and files that the generator
442 1.1 christos file itself depends on. 'incs' and 'deps' are
443 1.1 christos include directories and files that are used if $(CC)
444 1.1 christos is used as an intermediary step when generating the
445 1.1 christos end product (the file indicated by 'src'). 'intent'
446 1.1 christos indicates what the generated file is going to be
447 1.1 christos used for.
448 1.1 christos
449 1.1 christos src2obj - function that produces build file lines to build an
450 1.1 christos object file from source files and associated data.
451 1.1 christos
452 1.1 christos It's called like this:
453 1.1 christos
454 1.1 christos src2obj(obj => "PATH/TO/objectfile",
455 1.1 christos srcs => [ "PATH/TO/sourcefile", ... ],
456 1.1 christos deps => [ "dep1", ... ],
457 1.1 christos incs => [ "INCL/PATH", ... ]
458 1.1 christos intent => one of "lib", "dso", "bin" );
459 1.1 christos
460 1.1 christos 'obj' has the intended object file with `.o`
461 1.1 christos extension, src2obj() is expected to change it to
462 1.1 christos something more suitable for the platform.
463 1.1 christos 'srcs' has the list of source files to build the
464 1.1 christos object file, with the first item being the source
465 1.1 christos file that directly corresponds to the object file.
466 1.1 christos 'deps' is a list of explicit dependencies. 'incs'
467 1.1 christos is a list of include file directories. Finally,
468 1.1 christos 'intent' indicates what this object file is going
469 1.1 christos to be used for.
470 1.1 christos
471 1.1 christos obj2lib - function that produces build file lines to build a
472 1.1 christos static library file ("libfoo.a" in Unix terms) from
473 1.1 christos object files.
474 1.1 christos
475 1.1 christos called like this:
476 1.1 christos
477 1.1 christos obj2lib(lib => "PATH/TO/libfile",
478 1.1 christos objs => [ "PATH/TO/objectfile", ... ]);
479 1.1 christos
480 1.1 christos 'lib' has the intended library file name *without*
481 1.1 christos extension, obj2lib is expected to add that. 'objs'
482 1.1 christos has the list of object files to build this library.
483 1.1 christos
484 1.1 christos libobj2shlib - backward compatibility function that's used the
485 1.1 christos same way as obj2shlib (described next), and was
486 1.1 christos expected to build the shared library from the
487 1.1 christos corresponding static library when that was suitable.
488 1.1 christos NOTE: building a shared library from a static
489 1.1 christos library is now DEPRECATED, as they no longer share
490 1.1 christos object files. Attempting to do this will fail.
491 1.1 christos
492 1.1 christos obj2shlib - function that produces build file lines to build a
493 1.1 christos shareable object library file ("libfoo.so" in Unix
494 1.1 christos terms) from the corresponding object files.
495 1.1 christos
496 1.1 christos called like this:
497 1.1 christos
498 1.1 christos obj2shlib(shlib => "PATH/TO/shlibfile",
499 1.1 christos lib => "PATH/TO/libfile",
500 1.1 christos objs => [ "PATH/TO/objectfile", ... ],
501 1.1 christos deps => [ "PATH/TO/otherlibfile", ... ]);
502 1.1 christos
503 1.1 christos 'lib' has the base (static) library file name
504 1.1 christos *without* extension. This is useful in case
505 1.1 christos supporting files are needed (such as import
506 1.1 christos libraries on Windows).
507 1.1 christos 'shlib' has the corresponding shared library name
508 1.1 christos *without* extension. 'deps' has the list of other
509 1.1 christos libraries (also *without* extension) this library
510 1.1 christos needs to be linked with. 'objs' has the list of
511 1.1 christos object files to build this library.
512 1.1 christos
513 1.1 christos obj2dso - function that produces build file lines to build a
514 1.1 christos dynamic shared object file from object files.
515 1.1 christos
516 1.1 christos called like this:
517 1.1 christos
518 1.1 christos obj2dso(lib => "PATH/TO/libfile",
519 1.1 christos objs => [ "PATH/TO/objectfile", ... ],
520 1.1 christos deps => [ "PATH/TO/otherlibfile",
521 1.1 christos ... ]);
522 1.1 christos
523 1.1 christos This is almost the same as obj2shlib, but the
524 1.1 christos intent is to build a shareable library that can be
525 1.1 christos loaded in runtime (a "plugin"...).
526 1.1 christos
527 1.1 christos obj2bin - function that produces build file lines to build an
528 1.1 christos executable file from object files.
529 1.1 christos
530 1.1 christos called like this:
531 1.1 christos
532 1.1 christos obj2bin(bin => "PATH/TO/binfile",
533 1.1 christos objs => [ "PATH/TO/objectfile", ... ],
534 1.1 christos deps => [ "PATH/TO/libfile", ... ]);
535 1.1 christos
536 1.1 christos 'bin' has the intended executable file name
537 1.1 christos *without* extension, obj2bin is expected to add
538 1.1 christos that. 'objs' has the list of object files to build
539 1.1 christos this library. 'deps' has the list of library files
540 1.1 christos (also *without* extension) that the programs needs
541 1.1 christos to be linked with.
542 1.1 christos
543 1.1 christos in2script - function that produces build file lines to build a
544 1.1 christos script file from some input.
545 1.1 christos
546 1.1 christos called like this:
547 1.1 christos
548 1.1 christos in2script(script => "PATH/TO/scriptfile",
549 1.1 christos sources => [ "PATH/TO/infile", ... ]);
550 1.1 christos
551 1.1 christos 'script' has the intended script file name.
552 1.1 christos 'sources' has the list of source files to build the
553 1.1 christos resulting script from.
554 1.1 christos
555 1.1 christos Along with the build-file templates is the driving template
556 1.1 christos [`Configurations/common.tmpl`](common.tmpl), which looks through all the
557 1.1 christos information in `%unified_info` and generates all the rulesets to build libraries,
558 1.1 christos programs and all intermediate files, using the rule generating
559 1.1 christos functions defined in the build-file template.
560 1.1 christos
561 1.1 christos As an example with the smaller `build.info` set we've seen as an
562 1.1 christos example, producing the rules to build `libcrypto` would result in the
563 1.1 christos following calls:
564 1.1 christos
565 1.1 christos # Note: obj2shlib will only be called if shared libraries are
566 1.1 christos # to be produced.
567 1.1 christos # Note 2: obj2shlib must convert the '.o' extension to whatever
568 1.1 christos # is suitable on the local platform.
569 1.1 christos obj2shlib(shlib => "libcrypto",
570 1.1 christos objs => [ "crypto/aes.o", "crypto/evp.o", "crypto/cversion.o" ],
571 1.1 christos deps => [ ]);
572 1.1 christos
573 1.1 christos obj2lib(lib => "libcrypto"
574 1.1 christos objs => [ "crypto/aes.o", "crypto/evp.o", "crypto/cversion.o" ]);
575 1.1 christos
576 1.1 christos src2obj(obj => "crypto/aes.o"
577 1.1 christos srcs => [ "crypto/aes.c" ],
578 1.1 christos deps => [ ],
579 1.1 christos incs => [ "include" ],
580 1.1 christos intent => "lib");
581 1.1 christos
582 1.1 christos src2obj(obj => "crypto/evp.o"
583 1.1 christos srcs => [ "crypto/evp.c" ],
584 1.1 christos deps => [ ],
585 1.1 christos incs => [ "include" ],
586 1.1 christos intent => "lib");
587 1.1 christos
588 1.1 christos src2obj(obj => "crypto/cversion.o"
589 1.1 christos srcs => [ "crypto/cversion.c" ],
590 1.1 christos deps => [ "crypto/buildinf.h" ],
591 1.1 christos incs => [ "include" ],
592 1.1 christos intent => "lib");
593 1.1 christos
594 1.1 christos generatesrc(src => "crypto/buildinf.h",
595 1.1 christos generator => [ "util/mkbuildinf.pl", "\"$(CC)",
596 1.1 christos "$(CFLAGS)\"", "\"$(PLATFORM)\"" ],
597 1.1 christos generator_incs => [ "util" ],
598 1.1 christos generator_deps => [ "util/Foo.pm" ],
599 1.1 christos incs => [ ],
600 1.1 christos deps => [ ],
601 1.1 christos intent => "lib");
602 1.1 christos
603 1.1 christos The returned strings from all those calls are then concatenated
604 1.1 christos together and written to the resulting build-file.
605