123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711 |
- Intro
- =====
- This directory contains a few sets of files that are used for
- configuration in diverse ways:
- *.conf Target platform configurations, please read
- 'Configurations of OpenSSL target platforms' for more
- information.
- *.tmpl Build file templates, please read 'Build-file
- programming with the "unified" build system' as well
- as 'Build info files' for more information.
- *.pm Helper scripts / modules for the main `Configure`
- script. See 'Configure helper scripts for more
- information.
- Configurations of OpenSSL target platforms
- ==========================================
- Configuration targets are a collection of facts that we know about
- different platforms and their capabilities. We organise them in a
- hash table, where each entry represent a specific target.
- Note that configuration target names must be unique across all config
- files. The Configure script does check that a config file doesn't
- have config targets that shadow config targets from other files.
- In each table entry, the following keys are significant:
- inherit_from => Other targets to inherit values from.
- Explained further below. [1]
- template => Set to 1 if this isn't really a platform
- target. Instead, this target is a template
- upon which other targets can be built.
- Explained further below. [1]
- sys_id => System identity for systems where that
- is difficult to determine automatically.
- enable => Enable specific configuration features.
- This MUST be an array of words.
- disable => Disable specific configuration features.
- This MUST be an array of words.
- Note: if the same feature is both enabled
- and disabled, disable wins.
- as => The assembler command. This is not always
- used (for example on Unix, where the C
- compiler is used instead).
- asflags => Default assembler command flags [4].
- cpp => The C preprocessor command, normally not
- given, as the build file defaults are
- usually good enough.
- cppflags => Default C preprocessor flags [4].
- defines => As an alternative, macro definitions may be
- given here instead of in `cppflags' [4].
- If given here, they MUST be as an array of
- the string such as "MACRO=value", or just
- "MACRO" for definitions without value.
- includes => As an alternative, inclusion directories
- may be given here instead of in `cppflags'
- [4]. If given here, the MUST be an array
- of strings, one directory specification
- each.
- cc => The C compiler command, usually one of "cc",
- "gcc" or "clang". This command is normally
- also used to link object files and
- libraries into the final program.
- cxx => The C++ compiler command, usually one of
- "c++", "g++" or "clang++". This command is
- also used when linking a program where at
- least one of the object file is made from
- C++ source.
- cflags => Defaults C compiler flags [4].
- cxxflags => Default C++ compiler flags [4]. If unset,
- it gets the same value as cflags.
- (linking is a complex thing, see [3] below)
- ld => Linker command, usually not defined
- (meaning the compiler command is used
- instead).
- (NOTE: this is here for future use, it's
- not implemented yet)
- lflags => Default flags used when linking apps,
- shared libraries or DSOs [4].
- ex_libs => Extra libraries that are needed when
- linking shared libraries, DSOs or programs.
- The value is also assigned to Libs.private
- in $(libdir)/pkgconfig/libcrypto.pc.
- shared_cppflags => Extra C preprocessor flags used when
- processing C files for shared libraries.
- shared_cflag => Extra C compiler flags used when compiling
- for shared libraries, typically something
- like "-fPIC".
- shared_ldflag => Extra linking flags used when linking
- shared libraries.
- module_cppflags
- module_cflags
- module_ldflags => Has the same function as the corresponding
- `shared_' attributes, but for building DSOs.
- When unset, they get the same values as the
- corresponding `shared_' attributes.
- ar => The library archive command, the default is
- "ar".
- (NOTE: this is here for future use, it's
- not implemented yet)
- arflags => Flags to be used with the library archive
- command. On Unix, this includes the
- command letter, 'r' by default.
- ranlib => The library archive indexing command, the
- default is 'ranlib' it it exists.
- unistd => An alternative header to the typical
- '<unistd.h>'. This is very rarely needed.
- shared_extension => File name extension used for shared
- libraries.
- obj_extension => File name extension used for object files.
- On unix, this defaults to ".o" (NOTE: this
- is here for future use, it's not
- implemented yet)
- exe_extension => File name extension used for executable
- files. On unix, this defaults to "" (NOTE:
- this is here for future use, it's not
- implemented yet)
- shlib_variant => A "variant" identifier inserted between the base
- shared library name and the extension. On "unixy"
- platforms (BSD, Linux, Solaris, MacOS/X, ...) this
- supports installation of custom OpenSSL libraries
- that don't conflict with other builds of OpenSSL
- installed on the system. The variant identifier
- becomes part of the SONAME of the library and also
- any symbol versions (symbol versions are not used or
- needed with MacOS/X). For example, on a system
- where a default build would normally create the SSL
- shared library as 'libssl.so -> libssl.so.1.1' with
- the value of the symlink as the SONAME, a target
- definition that sets 'shlib_variant => "-abc"' will
- create 'libssl.so -> libssl-abc.so.1.1', again with
- an SONAME equal to the value of the symlink. The
- symbol versions associated with the variant library
- would then be 'OPENSSL_ABC_<version>' rather than
- the default 'OPENSSL_<version>'. The string inserted
- into symbol versions is obtained by mapping all
- letters in the "variant" identifier to upper case
- and all non-alphanumeric characters to '_'.
- thread_scheme => The type of threads is used on the
- configured platform. Currently known
- values are "(unknown)", "pthreads",
- "uithreads" (a.k.a solaris threads) and
- "winthreads". Except for "(unknown)", the
- actual value is currently ignored but may
- be used in the future. See further notes
- below [2].
- dso_scheme => The type of dynamic shared objects to build
- for. This mostly comes into play with
- modules, but can be used for other purposes
- as well. Valid values are "DLFCN"
- (dlopen() et al), "DLFCN_NO_H" (for systems
- that use dlopen() et al but do not have
- fcntl.h), "DL" (shl_load() et al), "WIN32"
- and "VMS".
- perlasm_scheme => The perlasm method used to create the
- assembler files used when compiling with
- assembler implementations.
- shared_target => The shared library building method used.
- This serves multiple purposes:
- - as index for targets found in shared_info.pl.
- - as linker script generation selector.
- To serve both purposes, the index for shared_info.pl
- should end with '-shared', and this suffix will be
- removed for use as a linker script generation
- selector. Note that the latter is only used if
- 'shared_defflag' is defined.
- build_scheme => The scheme used to build up a Makefile.
- In its simplest form, the value is a string
- with the name of the build scheme.
- The value may also take the form of a list
- of strings, if the build_scheme is to have
- some options. In this case, the first
- string in the list is the name of the build
- scheme.
- Currently recognised build scheme is "unified".
- For the "unified" build scheme, this item
- *must* be an array with the first being the
- word "unified" and the second being a word
- to identify the platform family.
- multilib => On systems that support having multiple
- implementations of a library (typically a
- 32-bit and a 64-bit variant), this is used
- to have the different variants in different
- directories.
- bn_ops => Building options (was just bignum options in
- the earlier history of this option, hence the
- name). This is a string of words that describe
- algorithms' implementation parameters that
- are optimal for the designated target platform,
- such as the type of integers used to build up
- the bignum, different ways to implement certain
- ciphers and so on. To fully comprehend the
- meaning, the best is to read the affected
- source.
- The valid words are:
- THIRTY_TWO_BIT bignum limbs are 32 bits,
- this is default if no
- option is specified, it
- works on any supported
- system [unless "wider"
- limb size is implied in
- assembly code];
- BN_LLONG bignum limbs are 32 bits,
- but 64-bit 'unsigned long
- long' is used internally
- in calculations;
- SIXTY_FOUR_BIT_LONG bignum limbs are 64 bits
- and sizeof(long) is 8;
- SIXTY_FOUR_BIT bignums limbs are 64 bits,
- but execution environment
- is ILP32;
- RC4_CHAR RC4 key schedule is made
- up of 'unsigned char's;
- RC4_INT RC4 key schedule is made
- up of 'unsigned int's;
- EXPORT_VAR_AS_FN for shared libraries,
- export vars as
- accessor functions.
- apps_aux_src => Extra source to build apps/openssl and other
- apps, as needed by the target and that can be
- collected in a library.
- apps_init_src => Init source to build apps/openssl and other
- apps, as needed by the target. This code
- cannot be placed in a library, as the rest
- of the code isn't expected to link to it
- explicitly.
- cpuid_asm_src => assembler implementation of cpuid code as
- well as OPENSSL_cleanse().
- Default to mem_clr.c
- bn_asm_src => Assembler implementation of core bignum
- functions.
- Defaults to bn_asm.c
- ec_asm_src => Assembler implementation of core EC
- functions.
- des_asm_src => Assembler implementation of core DES
- encryption functions.
- Defaults to 'des_enc.c fcrypt_b.c'
- aes_asm_src => Assembler implementation of core AES
- functions.
- Defaults to 'aes_core.c aes_cbc.c'
- bf_asm_src => Assembler implementation of core BlowFish
- functions.
- Defaults to 'bf_enc.c'
- md5_asm_src => Assembler implementation of core MD5
- functions.
- sha1_asm_src => Assembler implementation of core SHA1,
- functions, and also possibly SHA256 and
- SHA512 ones.
- cast_asm_src => Assembler implementation of core CAST
- functions.
- Defaults to 'c_enc.c'
- rc4_asm_src => Assembler implementation of core RC4
- functions.
- Defaults to 'rc4_enc.c rc4_skey.c'
- rmd160_asm_src => Assembler implementation of core RMD160
- functions.
- rc5_asm_src => Assembler implementation of core RC5
- functions.
- Defaults to 'rc5_enc.c'
- wp_asm_src => Assembler implementation of core WHIRLPOOL
- functions.
- cmll_asm_src => Assembler implementation of core CAMELLIA
- functions.
- Defaults to 'camellia.c cmll_misc.c cmll_cbc.c'
- modes_asm_src => Assembler implementation of cipher modes,
- currently the functions gcm_gmult_4bit and
- gcm_ghash_4bit.
- padlock_asm_src => Assembler implementation of core parts of
- the padlock engine. This is mandatory on
- any platform where the padlock engine might
- actually be built.
- [1] as part of the target configuration, one can have a key called
- 'inherit_from' that indicate what other configurations to inherit
- data from. These are resolved recursively.
- Inheritance works as a set of default values that can be overridden
- by corresponding key values in the inheriting configuration.
- Note 1: any configuration table can be used as a template.
- Note 2: pure templates have the attribute 'template => 1' and
- cannot be used as build targets.
- If several configurations are given in the 'inherit_from' array,
- the values of same attribute are concatenated with space
- separation. With this, it's possible to have several smaller
- templates for different configuration aspects that can be combined
- into a complete configuration.
- instead of a scalar value or an array, a value can be a code block
- of the form 'sub { /* your code here */ }'. This code block will
- be called with the list of inherited values for that key as
- arguments. In fact, the concatenation of strings is really done
- by using 'sub { join(" ",@_) }' on the list of inherited values.
- An example:
- "foo" => {
- template => 1,
- haha => "ha ha",
- hoho => "ho",
- ignored => "This should not appear in the end result",
- },
- "bar" => {
- template => 1,
- haha => "ah",
- hoho => "haho",
- hehe => "hehe"
- },
- "laughter" => {
- inherit_from => [ "foo", "bar" ],
- hehe => sub { join(" ",(@_,"!!!")) },
- ignored => "",
- }
- The entry for "laughter" will become as follows after processing:
- "laughter" => {
- haha => "ha ha ah",
- hoho => "ho haho",
- hehe => "hehe !!!",
- ignored => ""
- }
- [2] OpenSSL is built with threading capabilities unless the user
- specifies 'no-threads'. The value of the key 'thread_scheme' may
- be "(unknown)", in which case the user MUST give some compilation
- flags to Configure.
- [3] OpenSSL has three types of things to link from object files or
- static libraries:
- - shared libraries; that would be libcrypto and libssl.
- - shared objects (sometimes called dynamic libraries); that would
- be the modules.
- - applications; those are apps/openssl and all the test apps.
- Very roughly speaking, linking is done like this (words in braces
- represent the configuration settings documented at the beginning
- of this file):
- shared libraries:
- {ld} $(CFLAGS) {lflags} {shared_ldflag} -o libfoo.so \
- foo/something.o foo/somethingelse.o {ex_libs}
- shared objects:
- {ld} $(CFLAGS) {lflags} {module_ldflags} -o libeng.so \
- blah1.o blah2.o -lcrypto {ex_libs}
- applications:
- {ld} $(CFLAGS) {lflags} -o app \
- app1.o utils.o -lssl -lcrypto {ex_libs}
- [4] There are variants of these attribute, prefixed with `lib_',
- `dso_' or `bin_'. Those variants replace the unprefixed attribute
- when building library, DSO or program modules specifically.
- Historically, the target configurations came in form of a string with
- values separated by colons. This use is deprecated. The string form
- looked like this:
- "target" => "{cc}:{cflags}:{unistd}:{thread_cflag}:{sys_id}:{lflags}:{bn_ops}:{cpuid_obj}:{bn_obj}:{ec_obj}:{des_obj}:{aes_obj}:{bf_obj}:{md5_obj}:{sha1_obj}:{cast_obj}:{rc4_obj}:{rmd160_obj}:{rc5_obj}:{wp_obj}:{cmll_obj}:{modes_obj}:{padlock_obj}:{perlasm_scheme}:{dso_scheme}:{shared_target}:{shared_cflag}:{shared_ldflag}:{shared_extension}:{ranlib}:{arflags}:{multilib}"
- Build info files
- ================
- The build.info files that are spread over the source tree contain the
- minimum information needed to build and distribute OpenSSL. It uses a
- simple and yet fairly powerful language to determine what needs to be
- built, from what sources, and other relationships between files.
- For every build.info file, all file references are relative to the
- directory of the build.info file for source files, and the
- corresponding build directory for built files if the build tree
- differs from the source tree.
- When processed, every line is processed with the perl module
- Text::Template, using the delimiters "{-" and "-}". The hashes
- %config and %target are passed to the perl fragments, along with
- $sourcedir and $builddir, which are the locations of the source
- directory for the current build.info file and the corresponding build
- directory, all relative to the top of the build tree.
- 'Configure' only knows inherently about the top build.info file. For
- any other directory that has one, further directories to look into
- must be indicated like this:
- SUBDIRS=something someelse
- On to things to be built; they are declared by setting specific
- variables:
- PROGRAMS=foo bar
- LIBS=libsomething
- MODULES=libeng
- SCRIPTS=myhack
- Note that the files mentioned for PROGRAMS, LIBS and MODULES *must* be
- without extensions. The build file templates will figure them out.
- For each thing to be built, it is then possible to say what sources
- they are built from:
- PROGRAMS=foo bar
- SOURCE[foo]=foo.c common.c
- SOURCE[bar]=bar.c extra.c common.c
- It's also possible to tell some other dependencies:
- DEPEND[foo]=libsomething
- DEPEND[libbar]=libsomethingelse
- (it could be argued that 'libsomething' and 'libsomethingelse' are
- source as well. However, the files given through SOURCE are expected
- to be located in the source tree while files given through DEPEND are
- expected to be located in the build tree)
- It's also possible to depend on static libraries explicitly:
- DEPEND[foo]=libsomething.a
- DEPEND[libbar]=libsomethingelse.a
- This should be rarely used, and care should be taken to make sure it's
- only used when supported. For example, native Windows build doesn't
- support building static libraries and DLLs at the same time, so using
- static libraries on Windows can only be done when configured
- 'no-shared'.
- In some cases, it's desirable to include some source files in the
- shared form of a library only:
- SHARED_SOURCE[libfoo]=dllmain.c
- For any file to be built, it's also possible to tell what extra
- include paths the build of their source files should use:
- INCLUDE[foo]=include
- It's also possible to specify C macros that should be defined:
- DEFINE[foo]=FOO BAR=1
- In some cases, one might want to generate some source files from
- others, that's done as follows:
- GENERATE[foo.s]=asm/something.pl $(CFLAGS)
- GENERATE[bar.s]=asm/bar.S
- The value of each GENERATE line is a command line or part of it.
- Configure places no rules on the command line, except that the first
- item must be the generator file. It is, however, entirely up to the
- build file template to define exactly how those command lines should
- be handled, how the output is captured and so on.
- Sometimes, the generator file itself depends on other files, for
- example if it is a perl script that depends on other perl modules.
- This can be expressed using DEPEND like this:
- DEPEND[asm/something.pl]=../perlasm/Foo.pm
- There may also be cases where the exact file isn't easily specified,
- but an inclusion directory still needs to be specified. INCLUDE can
- be used in that case:
- INCLUDE[asm/something.pl]=../perlasm
- NOTE: GENERATE lines are limited to one command only per GENERATE.
- Finally, you can have some simple conditional use of the build.info
- information, looking like this:
- IF[1]
- something
- ELSIF[2]
- something other
- ELSE
- something else
- ENDIF
- The expression in square brackets is interpreted as a string in perl,
- and will be seen as true if perl thinks it is, otherwise false. For
- example, the above would have "something" used, since 1 is true.
- Together with the use of Text::Template, this can be used as
- conditions based on something in the passed variables, for example:
- IF[{- $disabled{shared} -}]
- LIBS=libcrypto
- SOURCE[libcrypto]=...
- ELSE
- LIBS=libfoo
- SOURCE[libfoo]=...
- ENDIF
- Build-file programming with the "unified" build system
- ======================================================
- "Build files" are called "Makefile" on Unix-like operating systems,
- "descrip.mms" for MMS on VMS, "makefile" for nmake on Windows, etc.
- To use the "unified" build system, the target configuration needs to
- set the three items 'build_scheme', 'build_file' and 'build_command'.
- In the rest of this section, we will assume that 'build_scheme' is set
- to "unified" (see the configurations documentation above for the
- details).
- For any name given by 'build_file', the "unified" system expects a
- template file in Configurations/ named like the build file, with
- ".tmpl" appended, or in case of possible ambiguity, a combination of
- the second 'build_scheme' list item and the 'build_file' name. For
- example, if 'build_file' is set to "Makefile", the template could be
- Configurations/Makefile.tmpl or Configurations/unix-Makefile.tmpl.
- In case both Configurations/unix-Makefile.tmpl and
- Configurations/Makefile.tmpl are present, the former takes
- precedence.
- The build-file template is processed with the perl module
- Text::Template, using "{-" and "-}" as delimiters that enclose the
- perl code fragments that generate configuration-dependent content.
- Those perl fragments have access to all the hash variables from
- configdata.pem.
- The build-file template is expected to define at least the following
- perl functions in a perl code fragment enclosed with "{-" and "-}".
- They are all expected to return a string with the lines they produce.
- generatesrc - function that produces build file lines to generate
- a source file from some input.
- It's called like this:
- generatesrc(src => "PATH/TO/tobegenerated",
- generator => [ "generatingfile", ... ]
- generator_incs => [ "INCL/PATH", ... ]
- generator_deps => [ "dep1", ... ]
- generator => [ "generatingfile", ... ]
- incs => [ "INCL/PATH", ... ],
- deps => [ "dep1", ... ],
- intent => one of "libs", "dso", "bin" );
- 'src' has the name of the file to be generated.
- 'generator' is the command or part of command to
- generate the file, of which the first item is
- expected to be the file to generate from.
- generatesrc() is expected to analyse and figure out
- exactly how to apply that file and how to capture
- the result. 'generator_incs' and 'generator_deps'
- are include directories and files that the generator
- file itself depends on. 'incs' and 'deps' are
- include directories and files that are used if $(CC)
- is used as an intermediary step when generating the
- end product (the file indicated by 'src'). 'intent'
- indicates what the generated file is going to be
- used for.
- src2obj - function that produces build file lines to build an
- object file from source files and associated data.
- It's called like this:
- src2obj(obj => "PATH/TO/objectfile",
- srcs => [ "PATH/TO/sourcefile", ... ],
- deps => [ "dep1", ... ],
- incs => [ "INCL/PATH", ... ]
- intent => one of "lib", "dso", "bin" );
- 'obj' has the intended object file with '.o'
- extension, src2obj() is expected to change it to
- something more suitable for the platform.
- 'srcs' has the list of source files to build the
- object file, with the first item being the source
- file that directly corresponds to the object file.
- 'deps' is a list of explicit dependencies. 'incs'
- is a list of include file directories. Finally,
- 'intent' indicates what this object file is going
- to be used for.
- obj2lib - function that produces build file lines to build a
- static library file ("libfoo.a" in Unix terms) from
- object files.
- called like this:
- obj2lib(lib => "PATH/TO/libfile",
- objs => [ "PATH/TO/objectfile", ... ]);
- 'lib' has the intended library file name *without*
- extension, obj2lib is expected to add that. 'objs'
- has the list of object files to build this library.
- libobj2shlib - backward compatibility function that's used the
- same way as obj2shlib (described next), and was
- expected to build the shared library from the
- corresponding static library when that was suitable.
- NOTE: building a shared library from a static
- library is now DEPRECATED, as they no longer share
- object files. Attempting to do this will fail.
- obj2shlib - function that produces build file lines to build a
- shareable object library file ("libfoo.so" in Unix
- terms) from the corresponding object files.
- called like this:
- obj2shlib(shlib => "PATH/TO/shlibfile",
- lib => "PATH/TO/libfile",
- objs => [ "PATH/TO/objectfile", ... ],
- deps => [ "PATH/TO/otherlibfile", ... ]);
- 'lib' has the base (static) library ffile name
- *without* extension. This is useful in case
- supporting files are needed (such as import
- libraries on Windows).
- 'shlib' has the corresponding shared library name
- *without* extension. 'deps' has the list of other
- libraries (also *without* extension) this library
- needs to be linked with. 'objs' has the list of
- object files to build this library.
- obj2dso - function that produces build file lines to build a
- dynamic shared object file from object files.
- called like this:
- obj2dso(lib => "PATH/TO/libfile",
- objs => [ "PATH/TO/objectfile", ... ],
- deps => [ "PATH/TO/otherlibfile",
- ... ]);
- This is almost the same as obj2shlib, but the
- intent is to build a shareable library that can be
- loaded in runtime (a "plugin"...).
- obj2bin - function that produces build file lines to build an
- executable file from object files.
- called like this:
- obj2bin(bin => "PATH/TO/binfile",
- objs => [ "PATH/TO/objectfile", ... ],
- deps => [ "PATH/TO/libfile", ... ]);
- 'bin' has the intended executable file name
- *without* extension, obj2bin is expected to add
- that. 'objs' has the list of object files to build
- this library. 'deps' has the list of library files
- (also *without* extension) that the programs needs
- to be linked with.
- in2script - function that produces build file lines to build a
- script file from some input.
- called like this:
- in2script(script => "PATH/TO/scriptfile",
- sources => [ "PATH/TO/infile", ... ]);
- 'script' has the intended script file name.
- 'sources' has the list of source files to build the
- resulting script from.
- In all cases, file file paths are relative to the build tree top, and
- the build file actions run with the build tree top as current working
- directory.
- Make sure to end the section with these functions with a string that
- you thing is appropriate for the resulting build file. If nothing
- else, end it like this:
- ""; # Make sure no lingering values end up in the Makefile
- -}
- Configure helper scripts
- ========================
- Configure uses helper scripts in this directory:
- Checker scripts
- ---------------
- These scripts are per platform family, to check the integrity of the
- tools used for configuration and building. The checker script used is
- either {build_platform}-{build_file}-checker.pm or
- {build_platform}-checker.pm, where {build_platform} is the second
- 'build_scheme' list element from the configuration target data, and
- {build_file} is 'build_file' from the same target data.
- If the check succeeds, the script is expected to end with a non-zero
- expression. If the check fails, the script can end with a zero, or
- with a `die`.
|