Blame Configurations/README.design

Packit Service 084de1
Design document for the unified scheme data
Packit Service 084de1
===========================================
Packit Service 084de1
Packit Service 084de1
How are things connected?
Packit Service 084de1
-------------------------
Packit Service 084de1
Packit Service 084de1
The unified scheme takes all its data from the build.info files seen
Packit Service 084de1
throughout the source tree.  These files hold the minimum information
Packit Service 084de1
needed to build end product files from diverse sources.  See the
Packit Service 084de1
section on build.info files below.
Packit Service 084de1
Packit Service 084de1
From the information in build.info files, Configure builds up an
Packit Service 084de1
information database as a hash table called %unified_info, which is
Packit Service 084de1
stored in configdata.pm, found at the top of the build tree (which may
Packit Service 084de1
or may not be the same as the source tree).
Packit Service 084de1
Packit Service 084de1
Configurations/common.tmpl uses the data from %unified_info to
Packit Service 084de1
generate the rules for building end product files as well as
Packit Service 084de1
intermediary files with the help of a few functions found in the
Packit Service 084de1
build-file templates.  See the section on build-file templates further
Packit Service 084de1
down for more information.
Packit Service 084de1
Packit Service 084de1
build.info files
Packit Service 084de1
----------------
Packit Service 084de1
Packit Service 084de1
As mentioned earlier, build.info files are meant to hold the minimum
Packit Service 084de1
information needed to build output files, and therefore only (with a
Packit Service 084de1
few possible exceptions [1]) have information about end products (such
Packit Service 084de1
as scripts, library files and programs) and source files (such as C
Packit Service 084de1
files, C header files, assembler files, etc).  Intermediate files such
Packit Service 084de1
as object files are rarely directly referred to in build.info files (and
Packit Service 084de1
when they are, it's always with the file name extension .o), they are
Packit Service 084de1
inferred by Configure.  By the same rule of minimalism, end product
Packit Service 084de1
file name extensions (such as .so, .a, .exe, etc) are never mentioned
Packit Service 084de1
in build.info.  Their file name extensions will be inferred by the
Packit Service 084de1
build-file templates, adapted for the platform they are meant for (see
Packit Service 084de1
sections on %unified_info and build-file templates further down).
Packit Service 084de1
Packit Service 084de1
The variables PROGRAMS, LIBS, ENGINES and SCRIPTS are used to declare
Packit Service 084de1
end products.  There are variants for them with '_NO_INST' as suffix
Packit Service 084de1
(PROGRAM_NO_INST etc) to specify end products that shouldn't get
Packit Service 084de1
installed.
Packit Service 084de1
Packit Service 084de1
The variables SOURCE, DEPEND and INCLUDE are indexed by a produced
Packit Service 084de1
file, and their values are the source used to produce that particular
Packit Service 084de1
produced file, extra dependencies, and include directories needed.
Packit Service 084de1
Packit Service 084de1
All their values in all the build.info throughout the source tree are
Packit Service 084de1
collected together and form a set of programs, libraries, engines and
Packit Service 084de1
scripts to be produced, source files, dependencies, etc etc etc.
Packit Service 084de1
Packit Service 084de1
Let's have a pretend example, a very limited contraption of OpenSSL,
Packit Service 084de1
composed of the program 'apps/openssl', the libraries 'libssl' and
Packit Service 084de1
'libcrypto', an engine 'engines/ossltest' and their sources and
Packit Service 084de1
dependencies.
Packit Service 084de1
Packit Service 084de1
    # build.info
Packit Service 084de1
    LIBS=libcrypto libssl
Packit Service 084de1
    INCLUDE[libcrypto]=include
Packit Service 084de1
    INCLUDE[libssl]=include
Packit Service 084de1
    DEPEND[libssl]=libcrypto
Packit Service 084de1
Packit Service 084de1
This is the top directory build.info file, and it tells us that two
Packit Service 084de1
libraries are to be built, the include directory 'include/' shall be
Packit Service 084de1
used throughout when building anything that will end up in each
Packit Service 084de1
library, and that the library 'libssl' depend on the library
Packit Service 084de1
'libcrypto' to function properly.
Packit Service 084de1
Packit Service 084de1
    # apps/build.info
Packit Service 084de1
    PROGRAMS=openssl
Packit Service 084de1
    SOURCE[openssl]=openssl.c
Packit Service 084de1
    INCLUDE[openssl]=.. ../include
Packit Service 084de1
    DEPEND[openssl]=../libssl
Packit Service 084de1
Packit Service 084de1
This is the build.info file in 'apps/', one may notice that all file
Packit Service 084de1
paths mentioned are relative to the directory the build.info file is
Packit Service 084de1
located in.  This one tells us that there's a program to be built
Packit Service 084de1
called 'apps/openssl' (the file name extension will depend on the
Packit Service 084de1
platform and is therefore not mentioned in the build.info file).  It's
Packit Service 084de1
built from one source file, 'apps/openssl.c', and building it requires
Packit Service 084de1
the use of '.' and 'include' include directories (both are declared
Packit Service 084de1
from the point of view of the 'apps/' directory), and that the program
Packit Service 084de1
depends on the library 'libssl' to function properly.
Packit Service 084de1
Packit Service 084de1
    # crypto/build.info
Packit Service 084de1
    LIBS=../libcrypto
Packit Service 084de1
    SOURCE[../libcrypto]=aes.c evp.c cversion.c
Packit Service 084de1
    DEPEND[cversion.o]=buildinf.h
Packit Service 084de1
Packit Service 084de1
    GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(CC) $(CFLAGS)" "$(PLATFORM)"
Packit Service 084de1
    DEPEND[buildinf.h]=../Makefile
Packit Service 084de1
    DEPEND[../util/mkbuildinf.pl]=../util/Foo.pm
Packit Service 084de1
Packit Service 084de1
This is the build.info file in 'crypto', and it tells us a little more
Packit Service 084de1
about what's needed to produce 'libcrypto'.  LIBS is used again to
Packit Service 084de1
declare that 'libcrypto' is to be produced.  This declaration is
Packit Service 084de1
really unnecessary as it's already mentioned in the top build.info
Packit Service 084de1
file, but can make the info file easier to understand.  This is to
Packit Service 084de1
show that duplicate information isn't an issue.
Packit Service 084de1
Packit Service 084de1
This build.info file informs us that 'libcrypto' is built from a few
Packit Service 084de1
source files, 'crypto/aes.c', 'crypto/evp.c' and 'crypto/cversion.c'.
Packit Service 084de1
It also shows us that building the object file inferred from
Packit Service 084de1
'crypto/cversion.c' depends on 'crypto/buildinf.h'.  Finally, it
Packit Service 084de1
also shows the possibility to declare how some files are generated
Packit Service 084de1
using some script, in this case a perl script, and how such scripts
Packit Service 084de1
can be declared to depend on other files, in this case a perl module.
Packit Service 084de1
Packit Service 084de1
Two things are worth an extra note:
Packit Service 084de1
Packit Service 084de1
'DEPEND[cversion.o]' mentions an object file.  DEPEND indexes is the
Packit Service 084de1
only location where it's valid to mention them
Packit Service 084de1
Packit Service 084de1
Lines in 'BEGINRAW'..'ENDRAW' sections must always mention files as
Packit Service 084de1
seen from the top directory, no exception.
Packit Service 084de1
Packit Service 084de1
    # ssl/build.info
Packit Service 084de1
    LIBS=../libssl
Packit Service 084de1
    SOURCE[../libssl]=tls.c
Packit Service 084de1
Packit Service 084de1
This is the build.info file in 'ssl/', and it tells us that the
Packit Service 084de1
library 'libssl' is built from the source file 'ssl/tls.c'.
Packit Service 084de1
Packit Service 084de1
    # engines/build.info
Packit Service 084de1
    ENGINES=dasync
Packit Service 084de1
    SOURCE[dasync]=e_dasync.c
Packit Service 084de1
    DEPEND[dasync]=../libcrypto
Packit Service 084de1
    INCLUDE[dasync]=../include
Packit Service 084de1
Packit Service 084de1
    ENGINES_NO_INST=ossltest
Packit Service 084de1
    SOURCE[ossltest]=e_ossltest.c
Packit Service 084de1
    DEPEND[ossltest]=../libcrypto.a
Packit Service 084de1
    INCLUDE[ossltest]=../include
Packit Service 084de1
Packit Service 084de1
This is the build.info file in 'engines/', telling us that two engines
Packit Service 084de1
called 'engines/dasync' and 'engines/ossltest' shall be built, that
Packit Service 084de1
dasync's source is 'engines/e_dasync.c' and ossltest's source is
Packit Service 084de1
'engines/e_ossltest.c' and that the include directory 'include/' may
Packit Service 084de1
be used when building anything that will be part of these engines.
Packit Service 084de1
Also, both engines depend on the library 'libcrypto' to function
Packit Service 084de1
properly.  ossltest is explicitly linked with the static variant of
Packit Service 084de1
the library 'libcrypto'.  Finally, only dasync is being installed, as
Packit Service 084de1
ossltest is only for internal testing.
Packit Service 084de1
Packit Service 084de1
When Configure digests these build.info files, the accumulated
Packit Service 084de1
information comes down to this:
Packit Service 084de1
Packit Service 084de1
    LIBS=libcrypto libssl
Packit Service 084de1
    SOURCE[libcrypto]=crypto/aes.c crypto/evp.c crypto/cversion.c
Packit Service 084de1
    DEPEND[crypto/cversion.o]=crypto/buildinf.h
Packit Service 084de1
    INCLUDE[libcrypto]=include
Packit Service 084de1
    SOURCE[libssl]=ssl/tls.c
Packit Service 084de1
    INCLUDE[libssl]=include
Packit Service 084de1
    DEPEND[libssl]=libcrypto
Packit Service 084de1
Packit Service 084de1
    PROGRAMS=apps/openssl
Packit Service 084de1
    SOURCE[apps/openssl]=apps/openssl.c
Packit Service 084de1
    INCLUDE[apps/openssl]=. include
Packit Service 084de1
    DEPEND[apps/openssl]=libssl
Packit Service 084de1
Packit Service 084de1
    ENGINES=engines/dasync
Packit Service 084de1
    SOURCE[engines/dasync]=engines/e_dasync.c
Packit Service 084de1
    DEPEND[engines/dasync]=libcrypto
Packit Service 084de1
    INCLUDE[engines/dasync]=include
Packit Service 084de1
Packit Service 084de1
    ENGINES_NO_INST=engines/ossltest
Packit Service 084de1
    SOURCE[engines/ossltest]=engines/e_ossltest.c
Packit Service 084de1
    DEPEND[engines/ossltest]=libcrypto.a
Packit Service 084de1
    INCLUDE[engines/ossltest]=include
Packit Service 084de1
Packit Service 084de1
    GENERATE[crypto/buildinf.h]=util/mkbuildinf.pl "$(CC) $(CFLAGS)" "$(PLATFORM)"
Packit Service 084de1
    DEPEND[crypto/buildinf.h]=Makefile
Packit Service 084de1
    DEPEND[util/mkbuildinf.pl]=util/Foo.pm
Packit Service 084de1
Packit Service 084de1
Packit Service 084de1
A few notes worth mentioning:
Packit Service 084de1
Packit Service 084de1
LIBS may be used to declare routine libraries only.
Packit Service 084de1
Packit Service 084de1
PROGRAMS may be used to declare programs only.
Packit Service 084de1
Packit Service 084de1
ENGINES may be used to declare engines only.
Packit Service 084de1
Packit Service 084de1
The indexes for SOURCE must only be end product files, such as
Packit Service 084de1
libraries, programs or engines.  The values of SOURCE variables must
Packit Service 084de1
only be source files (possibly generated).
Packit Service 084de1
Packit Service 084de1
INCLUDE and DEPEND shows a relationship between different files
Packit Service 084de1
(usually produced files) or between files and directories, such as a
Packit Service 084de1
program depending on a library, or between an object file and some
Packit Service 084de1
extra source file.
Packit Service 084de1
Packit Service 084de1
When Configure processes the build.info files, it will take it as
Packit Service 084de1
truth without question, and will therefore perform very few checks.
Packit Service 084de1
If the build tree is separate from the source tree, it will assume
Packit Service 084de1
that all built files and up in the build directory and that all source
Packit Service 084de1
files are to be found in the source tree, if they can be found there.
Packit Service 084de1
Configure will assume that source files that can't be found in the
Packit Service 084de1
source tree (such as 'crypto/bildinf.h' in the example above) are
Packit Service 084de1
generated and will be found in the build tree.
Packit Service 084de1
Packit Service 084de1
Packit Service 084de1
The %unified_info database
Packit Service 084de1
--------------------------
Packit Service 084de1
Packit Service 084de1
The information in all the build.info get digested by Configure and
Packit Service 084de1
collected into the %unified_info database, divided into the following
Packit Service 084de1
indexes:
Packit Service 084de1
Packit Service 084de1
  depends   => a hash table containing 'file' => [ 'dependency' ... ]
Packit Service 084de1
               pairs.  These are directly inferred from the DEPEND
Packit Service 084de1
               variables in build.info files.
Packit Service 084de1
Packit Service 084de1
  engines   => a list of engines.  These are directly inferred from
Packit Service 084de1
               the ENGINES variable in build.info files.
Packit Service 084de1
Packit Service 084de1
  generate  => a hash table containing 'file' => [ 'generator' ... ]
Packit Service 084de1
               pairs.  These are directly inferred from the GENERATE
Packit Service 084de1
               variables in build.info files.
Packit Service 084de1
Packit Service 084de1
  includes  => a hash table containing 'file' => [ 'include' ... ]
Packit Service 084de1
               pairs.  These are directly inferred from the INCLUDE
Packit Service 084de1
               variables in build.info files.
Packit Service 084de1
Packit Service 084de1
  install   => a hash table containing 'type' => [ 'file' ... ] pairs.
Packit Service 084de1
               The types are 'programs', 'libraries', 'engines' and
Packit Service 084de1
               'scripts', and the array of files list the files of
Packit Service 084de1
               that type that should be installed.
Packit Service 084de1
Packit Service 084de1
  libraries => a list of libraries.  These are directly inferred from
Packit Service 084de1
               the LIBS variable in build.info files.
Packit Service 084de1
Packit Service 084de1
  programs  => a list of programs.  These are directly inferred from
Packit Service 084de1
               the PROGRAMS variable in build.info files.
Packit Service 084de1
Packit Service 084de1
  rawlines  => a list of build-file lines.  These are a direct copy of
Packit Service 084de1
               the BEGINRAW..ENDRAW lines in build.info files.  Note:
Packit Service 084de1
               only the BEGINRAW..ENDRAW section for the current
Packit Service 084de1
               platform are copied, the rest are ignored.
Packit Service 084de1
Packit Service 084de1
  scripts   => a list of scripts.  There are directly inferred from
Packit Service 084de1
               the SCRIPTS variable in build.info files.
Packit Service 084de1
Packit Service 084de1
  sources   => a hash table containing 'file' => [ 'sourcefile' ... ]
Packit Service 084de1
               pairs.  These are indirectly inferred from the SOURCE
Packit Service 084de1
               variables in build.info files.  Object files are
Packit Service 084de1
               mentioned in this hash table, with source files from
Packit Service 084de1
               SOURCE variables, and AS source files for programs and
Packit Service 084de1
               libraries.
Packit Service 084de1
Packit Service 084de1
  shared_sources =>
Packit Service 084de1
               a hash table just like 'sources', but only as source
Packit Service 084de1
               files (object files) for building shared libraries.
Packit Service 084de1
Packit Service 084de1
As an example, here is how the build.info files example from the
Packit Service 084de1
section above would be digested into a %unified_info table:
Packit Service 084de1
Packit Service 084de1
    our %unified_info = (
Packit Service 084de1
        "depends" =>
Packit Service 084de1
            {
Packit Service 084de1
                "apps/openssl" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "libssl",
Packit Service 084de1
                    ],
Packit Service 084de1
                "crypto/buildinf.h" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "Makefile",
Packit Service 084de1
                    ],
Packit Service 084de1
                "crypto/cversion.o" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "crypto/buildinf.h",
Packit Service 084de1
                    ],
Packit Service 084de1
                "engines/dasync" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "libcrypto",
Packit Service 084de1
                    ],
Packit Service 084de1
                "engines/ossltest" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "libcrypto.a",
Packit Service 084de1
                    ],
Packit Service 084de1
                "libssl" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "libcrypto",
Packit Service 084de1
                    ],
Packit Service 084de1
                "util/mkbuildinf.pl" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "util/Foo.pm",
Packit Service 084de1
                    ],
Packit Service 084de1
            },
Packit Service 084de1
        "engines" =>
Packit Service 084de1
            [
Packit Service 084de1
                "engines/dasync",
Packit Service 084de1
                "engines/ossltest",
Packit Service 084de1
            ],
Packit Service 084de1
        "generate" =>
Packit Service 084de1
            {
Packit Service 084de1
                "crypto/buildinf.h" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "util/mkbuildinf.pl",
Packit Service 084de1
                        "\"\$(CC)",
Packit Service 084de1
                        "\$(CFLAGS)\"",
Packit Service 084de1
                        "\"$(PLATFORM)\"",
Packit Service 084de1
                    ],
Packit Service 084de1
            },
Packit Service 084de1
        "includes" =>
Packit Service 084de1
            {
Packit Service 084de1
                "apps/openssl" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        ".",
Packit Service 084de1
                        "include",
Packit Service 084de1
                    ],
Packit Service 084de1
                "engines/ossltest" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "include"
Packit Service 084de1
                    ],
Packit Service 084de1
                "libcrypto" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "include",
Packit Service 084de1
                    ],
Packit Service 084de1
                "libssl" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "include",
Packit Service 084de1
                    ],
Packit Service 084de1
                "util/mkbuildinf.pl" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "util",
Packit Service 084de1
                    ],
Packit Service 084de1
            }
Packit Service 084de1
        "install" =>
Packit Service 084de1
            {
Packit Service 084de1
                "engines" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "engines/dasync",
Packit Service 084de1
                    ],
Packit Service 084de1
                "libraries" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "libcrypto",
Packit Service 084de1
                        "libssl",
Packit Service 084de1
                    ],
Packit Service 084de1
                "programs" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "apps/openssl",
Packit Service 084de1
                    ],
Packit Service 084de1
           },
Packit Service 084de1
        "libraries" =>
Packit Service 084de1
            [
Packit Service 084de1
                "libcrypto",
Packit Service 084de1
                "libssl",
Packit Service 084de1
            ],
Packit Service 084de1
        "programs" =>
Packit Service 084de1
            [
Packit Service 084de1
                "apps/openssl",
Packit Service 084de1
            ],
Packit Service 084de1
        "rawlines" =>
Packit Service 084de1
            [
Packit Service 084de1
            ],
Packit Service 084de1
        "sources" =>
Packit Service 084de1
            {
Packit Service 084de1
                "apps/openssl" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "apps/openssl.o",
Packit Service 084de1
                    ],
Packit Service 084de1
                "apps/openssl.o" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "apps/openssl.c",
Packit Service 084de1
                    ],
Packit Service 084de1
                "crypto/aes.o" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "crypto/aes.c",
Packit Service 084de1
                    ],
Packit Service 084de1
                "crypto/cversion.o" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "crypto/cversion.c",
Packit Service 084de1
                    ],
Packit Service 084de1
                "crypto/evp.o" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "crypto/evp.c",
Packit Service 084de1
                    ],
Packit Service 084de1
                "engines/e_dasync.o" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "engines/e_dasync.c",
Packit Service 084de1
                    ],
Packit Service 084de1
                "engines/dasync" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "engines/e_dasync.o",
Packit Service 084de1
                    ],
Packit Service 084de1
                "engines/e_ossltest.o" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "engines/e_ossltest.c",
Packit Service 084de1
                    ],
Packit Service 084de1
                "engines/ossltest" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "engines/e_ossltest.o",
Packit Service 084de1
                    ],
Packit Service 084de1
                "libcrypto" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "crypto/aes.c",
Packit Service 084de1
                        "crypto/cversion.c",
Packit Service 084de1
                        "crypto/evp.c",
Packit Service 084de1
                    ],
Packit Service 084de1
                "libssl" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "ssl/tls.c",
Packit Service 084de1
                    ],
Packit Service 084de1
                "ssl/tls.o" =>
Packit Service 084de1
                    [
Packit Service 084de1
                        "ssl/tls.c",
Packit Service 084de1
                    ],
Packit Service 084de1
            },
Packit Service 084de1
    );
Packit Service 084de1
Packit Service 084de1
As can be seen, everything in %unified_info is fairly simple suggest
Packit Service 084de1
of information.  Still, it tells us that to build all programs, we
Packit Service 084de1
must build 'apps/openssl', and to build the latter, we will need to
Packit Service 084de1
build all its sources ('apps/openssl.o' in this case) and all the
Packit Service 084de1
other things it depends on (such as 'libssl').  All those dependencies
Packit Service 084de1
need to be built as well, using the same logic, so to build 'libssl',
Packit Service 084de1
we need to build 'ssl/tls.o' as well as 'libcrypto', and to build the
Packit Service 084de1
latter...
Packit Service 084de1
Packit Service 084de1
Packit Service 084de1
Build-file templates
Packit Service 084de1
--------------------
Packit Service 084de1
Packit Service 084de1
Build-file templates are essentially build-files (such as Makefile on
Packit Service 084de1
Unix) with perl code fragments mixed in.  Those perl code fragment
Packit Service 084de1
will generate all the configuration dependent data, including all the
Packit Service 084de1
rules needed to build end product files and intermediary files alike.
Packit Service 084de1
At a minimum, there must be a perl code fragment that defines a set of
Packit Service 084de1
functions that are used to generates specific build-file rules, to
Packit Service 084de1
build static libraries from object files, to build shared libraries
Packit Service 084de1
from static libraries, to programs from object files and libraries,
Packit Service 084de1
etc.
Packit Service 084de1
Packit Service 084de1
    generatesrc - function that produces build file lines to generate
Packit Service 084de1
                  a source file from some input.
Packit Service 084de1
Packit Service 084de1
                  It's called like this:
Packit Service 084de1
Packit Service 084de1
                        generatesrc(src => "PATH/TO/tobegenerated",
Packit Service 084de1
                                    generator => [ "generatingfile", ... ]
Packit Service 084de1
                                    generator_incs => [ "INCL/PATH", ... ]
Packit Service 084de1
                                    generator_deps => [ "dep1", ... ]
Packit Service 084de1
                                    incs => [ "INCL/PATH", ... ],
Packit Service 084de1
                                    deps => [ "dep1", ... ],
Packit Service 084de1
                                    intent => one of "libs", "dso", "bin" );
Packit Service 084de1
Packit Service 084de1
                  'src' has the name of the file to be generated.
Packit Service 084de1
                  'generator' is the command or part of command to
Packit Service 084de1
                  generate the file, of which the first item is
Packit Service 084de1
                  expected to be the file to generate from.
Packit Service 084de1
                  generatesrc() is expected to analyse and figure out
Packit Service 084de1
                  exactly how to apply that file and how to capture
Packit Service 084de1
                  the result.  'generator_incs' and 'generator_deps'
Packit Service 084de1
                  are include directories and files that the generator
Packit Service 084de1
                  file itself depends on.  'incs' and 'deps' are
Packit Service 084de1
                  include directories and files that are used if $(CC)
Packit Service 084de1
                  is used as an intermediary step when generating the
Packit Service 084de1
                  end product (the file indicated by 'src').  'intent'
Packit Service 084de1
                  indicates what the generated file is going to be
Packit Service 084de1
                  used for.
Packit Service 084de1
Packit Service 084de1
    src2obj     - function that produces build file lines to build an
Packit Service 084de1
                  object file from source files and associated data.
Packit Service 084de1
Packit Service 084de1
                  It's called like this:
Packit Service 084de1
Packit Service 084de1
                        src2obj(obj => "PATH/TO/objectfile",
Packit Service 084de1
                                srcs => [ "PATH/TO/sourcefile", ... ],
Packit Service 084de1
                                deps => [ "dep1", ... ],
Packit Service 084de1
                                incs => [ "INCL/PATH", ... ]
Packit Service 084de1
                                intent => one of "lib", "dso", "bin" );
Packit Service 084de1
Packit Service 084de1
                  'obj' has the intended object file *without*
Packit Service 084de1
                  extension, src2obj() is expected to add that.
Packit Service 084de1
                  'srcs' has the list of source files to build the
Packit Service 084de1
                  object file, with the first item being the source
Packit Service 084de1
                  file that directly corresponds to the object file.
Packit Service 084de1
                  'deps' is a list of explicit dependencies.  'incs'
Packit Service 084de1
                  is a list of include file directories.  Finally,
Packit Service 084de1
                  'intent' indicates what this object file is going
Packit Service 084de1
                  to be used for.
Packit Service 084de1
Packit Service 084de1
    obj2lib     - function that produces build file lines to build a
Packit Service 084de1
                  static library file ("libfoo.a" in Unix terms) from
Packit Service 084de1
                  object files.
Packit Service 084de1
Packit Service 084de1
                  called like this:
Packit Service 084de1
Packit Service 084de1
                        obj2lib(lib => "PATH/TO/libfile",
Packit Service 084de1
                                objs => [ "PATH/TO/objectfile", ... ]);
Packit Service 084de1
Packit Service 084de1
                  'lib' has the intended library file name *without*
Packit Service 084de1
                  extension, obj2lib is expected to add that.  'objs'
Packit Service 084de1
                  has the list of object files (also *without*
Packit Service 084de1
                  extension) to build this library.
Packit Service 084de1
Packit Service 084de1
    libobj2shlib - function that produces build file lines to build a
Packit Service 084de1
                  shareable object library file ("libfoo.so" in Unix
Packit Service 084de1
                  terms) from the corresponding static library file
Packit Service 084de1
                  or object files.
Packit Service 084de1
Packit Service 084de1
                  called like this:
Packit Service 084de1
Packit Service 084de1
                        libobj2shlib(shlib => "PATH/TO/shlibfile",
Packit Service 084de1
                                     lib => "PATH/TO/libfile",
Packit Service 084de1
                                     objs => [ "PATH/TO/objectfile", ... ],
Packit Service 084de1
                                     deps => [ "PATH/TO/otherlibfile", ... ]);
Packit Service 084de1
Packit Service 084de1
                  'lib' has the intended library file name *without*
Packit Service 084de1
                  extension, libobj2shlib is expected to add that.
Packit Service 084de1
                  'shlib' has the corresponding shared library name
Packit Service 084de1
                  *without* extension.  'deps' has the list of other
Packit Service 084de1
                  libraries (also *without* extension) this library
Packit Service 084de1
                  needs to be linked with.  'objs' has the list of
Packit Service 084de1
                  object files (also *without* extension) to build
Packit Service 084de1
                  this library.
Packit Service 084de1
Packit Service 084de1
                  This function has a choice; it can use the
Packit Service 084de1
                  corresponding static library as input to make the
Packit Service 084de1
                  shared library, or the list of object files.
Packit Service 084de1
Packit Service 084de1
    obj2dynlib  - function that produces build file lines to build a
Packit Service 084de1
                  dynamically loadable library file ("libfoo.so" on
Packit Service 084de1
                  Unix) from object files.
Packit Service 084de1
Packit Service 084de1
                  called like this:
Packit Service 084de1
Packit Service 084de1
                        obj2dynlib(lib => "PATH/TO/libfile",
Packit Service 084de1
                                   objs => [ "PATH/TO/objectfile", ... ],
Packit Service 084de1
                                   deps => [ "PATH/TO/otherlibfile",
Packit Service 084de1
                                   ... ]);
Packit Service 084de1
Packit Service 084de1
                  This is almost the same as libobj2shlib, but the
Packit Service 084de1
                  intent is to build a shareable library that can be
Packit Service 084de1
                  loaded in runtime (a "plugin"...).  The differences
Packit Service 084de1
                  are subtle, one of the most visible ones is that the
Packit Service 084de1
                  resulting shareable library is produced from object
Packit Service 084de1
                  files only.
Packit Service 084de1
Packit Service 084de1
    obj2bin     - function that produces build file lines to build an
Packit Service 084de1
                  executable file from object files.
Packit Service 084de1
Packit Service 084de1
                  called like this:
Packit Service 084de1
Packit Service 084de1
                        obj2bin(bin => "PATH/TO/binfile",
Packit Service 084de1
                                objs => [ "PATH/TO/objectfile", ... ],
Packit Service 084de1
                                deps => [ "PATH/TO/libfile", ... ]);
Packit Service 084de1
Packit Service 084de1
                  'bin' has the intended executable file name
Packit Service 084de1
                  *without* extension, obj2bin is expected to add
Packit Service 084de1
                  that.  'objs' has the list of object files (also
Packit Service 084de1
                  *without* extension) to build this library.  'deps'
Packit Service 084de1
                  has the list of library files (also *without*
Packit Service 084de1
                  extension) that the programs needs to be linked
Packit Service 084de1
                  with.
Packit Service 084de1
Packit Service 084de1
    in2script   - function that produces build file lines to build a
Packit Service 084de1
                  script file from some input.
Packit Service 084de1
Packit Service 084de1
                  called like this:
Packit Service 084de1
Packit Service 084de1
                        in2script(script => "PATH/TO/scriptfile",
Packit Service 084de1
                                  sources => [ "PATH/TO/infile", ... ]);
Packit Service 084de1
Packit Service 084de1
                  'script' has the intended script file name.
Packit Service 084de1
                  'sources' has the list of source files to build the
Packit Service 084de1
                  resulting script from.
Packit Service 084de1
Packit Service 084de1
Along with the build-file templates is the driving engine
Packit Service 084de1
Configurations/common.tmpl, which looks through all the information in
Packit Service 084de1
%unified_info and generates all the rulesets to build libraries,
Packit Service 084de1
programs and all intermediate files, using the rule generating
Packit Service 084de1
functions defined in the build-file template.
Packit Service 084de1
Packit Service 084de1
As an example with the smaller build.info set we've seen as an
Packit Service 084de1
example, producing the rules to build 'libcrypto' would result in the
Packit Service 084de1
following calls:
Packit Service 084de1
Packit Service 084de1
    # Note: libobj2shlib will only be called if shared libraries are
Packit Service 084de1
    # to be produced.
Packit Service 084de1
    # Note 2: libobj2shlib gets both the name of the static library
Packit Service 084de1
    # and the names of all the object files that go into it.  It's up
Packit Service 084de1
    # to the implementation to decide which to use as input.
Packit Service 084de1
    # Note 3: common.tmpl peals off the ".o" extension from all object
Packit Service 084de1
    # files, as the platform at hand may have a different one.
Packit Service 084de1
    libobj2shlib(shlib => "libcrypto",
Packit Service 084de1
                 lib => "libcrypto",
Packit Service 084de1
                 objs => [ "crypto/aes", "crypto/evp", "crypto/cversion" ],
Packit Service 084de1
                 deps => [  ]);
Packit Service 084de1
Packit Service 084de1
    obj2lib(lib => "libcrypto"
Packit Service 084de1
            objs => [ "crypto/aes", "crypto/evp", "crypto/cversion" ]);
Packit Service 084de1
Packit Service 084de1
    src2obj(obj => "crypto/aes"
Packit Service 084de1
            srcs => [ "crypto/aes.c" ],
Packit Service 084de1
            deps => [ ],
Packit Service 084de1
            incs => [ "include" ],
Packit Service 084de1
            intent => "lib");
Packit Service 084de1
Packit Service 084de1
    src2obj(obj => "crypto/evp"
Packit Service 084de1
            srcs => [ "crypto/evp.c" ],
Packit Service 084de1
            deps => [ ],
Packit Service 084de1
            incs => [ "include" ],
Packit Service 084de1
            intent => "lib");
Packit Service 084de1
Packit Service 084de1
    src2obj(obj => "crypto/cversion"
Packit Service 084de1
            srcs => [ "crypto/cversion.c" ],
Packit Service 084de1
            deps => [ "crypto/buildinf.h" ],
Packit Service 084de1
            incs => [ "include" ],
Packit Service 084de1
            intent => "lib");
Packit Service 084de1
Packit Service 084de1
    generatesrc(src => "crypto/buildinf.h",
Packit Service 084de1
                generator => [ "util/mkbuildinf.pl", "\"$(CC)",
Packit Service 084de1
                               "$(CFLAGS)\"", "\"$(PLATFORM)\"" ],
Packit Service 084de1
                generator_incs => [ "util" ],
Packit Service 084de1
                generator_deps => [ "util/Foo.pm" ],
Packit Service 084de1
                incs => [ ],
Packit Service 084de1
                deps => [ ],
Packit Service 084de1
                intent => "lib");
Packit Service 084de1
Packit Service 084de1
The returned strings from all those calls are then concatenated
Packit Service 084de1
together and written to the resulting build-file.