sections on %unified_info and build-file templates further down).
The variables PROGRAMS, LIBS, ENGINES and SCRIPTS are used to declare
-end products.
+end products. There are variants for them with '_NO_INST' as suffix
+(PROGRAM_NO_INST etc) to specify end products that shouldn't get
+installed.
The variables SOURCE, DEPEND, INCLUDE and ORDINALS are indexed by a
produced file, and their values are the source used to produce that
SOURCE[../libcrypto]=aes.c evp.c cversion.c
DEPEND[cversion.o]=buildinf.h
- BEGINRAW[Makefile(unix)]
- crypto/buildinf.h : Makefile
- perl util/mkbuildinf.h "$(CC) $(CFLAGS)" "$(PLATFORM)" \
- > crypto/buildinf.h
- ENDRAW[Makefile(unix)]
+ GENERATE[buildinf.h]=../util/mkbuildinf.pl "$(CC) $(CFLAGS)" "$(PLATFORM)"
+ DEPEND[buildinf.h]=../Makefile
+ DEPEND[../util/mkbuildinf.pl]=../util/Foo.pm
This is the build.info file in 'crypto', and it tells us a little more
about what's needed to produce 'libcrypto'. LIBS is used again to
source files, 'crypto/aes.c', 'crypto/evp.c' and 'crypto/cversion.c'.
It also shows us that building the object file inferred from
'crypto/cversion.c' depends on 'crypto/buildinf.h'. Finally, it
-also shows the possibility to include raw build-file statements in a
-build.info file, in this case showing how 'buildinf.h' is built on
-Unix-like operating systems.
+also shows the possibility to declare how some files are generated
+using some script, in this case a perl script, and how such scripts
+can be declared to depend on other files, in this case a perl module.
Two things are worth an extra note:
library 'libssl' is built from the source file 'ssl/tls.c'.
# engines/build.info
- ENGINES=libossltest
- SOURCE[libossltest]=e_ossltest.c
- DEPEND[libossltest]=../libcrypto
- INCLUDE[libossltest]=../include
-
-This is the build.info file in 'engines/', telling us that an engine
-called 'engines/libossltest' shall be built, that it's source is
+ ENGINES=dasync
+ SOURCE[dasync]=e_dasync.c
+ DEPEND[dasync]=../libcrypto
+ INCLUDE[dasync]=../include
+
+ ENGINES_NO_INST=ossltest
+ SOURCE[ossltest]=e_ossltest.c
+ DEPEND[ossltest]=../libcrypto.a
+ INCLUDE[ossltest]=../include
+
+This is the build.info file in 'engines/', telling us that two engines
+called 'engines/dasync' and 'engines/ossltest' shall be built, that
+dasync's source is 'engines/e_dasync.c' and ossltest's source is
'engines/e_ossltest.c' and that the include directory 'include/' may
-be used when building anything that will be part of this engine.
-Finally, the engine 'engines/libossltest' depends on the library
-'libcrypto' to function properly.
+be used when building anything that will be part of these engines.
+Also, both engines depend on the library 'libcrypto' to function
+properly. ossltest is explicitly linked with the static variant of
+the library 'libcrypto'. Finally, only dasync is being installed, as
+ossltest is only for internal testing.
When Configure digests these build.info files, the accumulated
information comes down to this:
INCLUDE[apps/openssl]=. include
DEPEND[apps/openssl]=libssl
- ENGINES=engines/libossltest
- SOURCE[engines/libossltest]=engines/e_ossltest.c
- DEPEND[engines/libossltest]=libcrypto
- INCLUDE[engines/libossltest]=include
+ ENGINES=engines/dasync
+ SOURCE[engines/dasync]=engines/e_dasync.c
+ DEPEND[engines/dasync]=libcrypto
+ INCLUDE[engines/dasync]=include
+
+ ENGINES_NO_INST=engines/ossltest
+ SOURCE[engines/ossltest]=engines/e_ossltest.c
+ DEPEND[engines/ossltest]=libcrypto.a
+ INCLUDE[engines/ossltest]=include
- BEGINRAW[Makefile(unix)]
- crypto/buildinf.h : Makefile
- perl util/mkbuildinf.h "$(CC) $(CFLAGS)" "$(PLATFORM)" \
- > crypto/buildinf.h
- ENDRAW[Makefile(unix)]
+ GENERATE[crypto/buildinf.h]=util/mkbuildinf.pl "$(CC) $(CFLAGS)" "$(PLATFORM)"
+ DEPEND[crypto/buildinf.h]=Makefile
+ DEPEND[util/mkbuildinf.pl]=util/Foo.pm
A few notes worth mentioning:
ENGINES may be used to declare engines only.
-The indexes for SOURCE, INCLUDE and ORDINALS must only be end product
-files, such as libraries, programs or engines. The values of SOURCE
+The indexes for SOURCE and ORDINALS must only be end product files,
+such as libraries, programs or engines. The values of SOURCE
variables must only be source files (possibly generated)
-DEPEND shows a relationship between different end product files, such
-as a program depending on a library, or between an object file and
-some extra source file.
+INCLUDE and DEPEND shows a relationship between different files
+(usually produced files) or between files and directories, such as a
+program depending on a library, or between an object file and some
+extra source file.
When Configure processes the build.info files, it will take it as
truth without question, and will therefore perform very few checks.
engines => a list of engines. These are directly inferred from
the ENGINES variable in build.info files.
+ generate => a hash table containing 'file' => [ 'generator' ... ]
+ pairs. These are directly inferred from the GENERATE
+ variables in build.info files.
+
includes => a hash table containing 'file' => [ 'include' ... ]
pairs. These are directly inferred from the INCLUDE
variables in build.info files.
+ install => a hash table containing 'type' => [ 'file' ... ] pairs.
+ The types are 'programs', 'libraries', 'engines' and
+ 'scripts', and the array of files list the files of
+ that type that should be installed.
+
libraries => a list of libraries. These are directly inferred from
the LIBS variable in build.info files.
SOURCE variables, and AS source files for programs and
libraries.
+ shared_sources =>
+ a hash table just like 'sources', but only as source
+ files (object files) for building shared libraries.
+
As an example, here is how the build.info files example from the
section above would be digested into a %unified_info table:
[
"libssl",
],
+ "crypto/buildinf.h" =>
+ [
+ "Makefile",
+ ],
"crypto/cversion.o" =>
[
"crypto/buildinf.h",
],
- "engines/libossltest" =>
+ "engines/dasync" =>
[
"libcrypto",
],
+ "engines/ossltest" =>
+ [
+ "libcrypto.a",
+ ],
"libssl" =>
[
"libcrypto",
],
+ "util/mkbuildinf.pl" =>
+ [
+ "util/Foo.pm",
+ ],
},
"engines" =>
[
- "engines/libossltest",
+ "engines/dasync",
+ "engines/ossltest",
],
+ "generate" =>
+ {
+ "crypto/buildinf.h" =>
+ [
+ "util/mkbuildinf.pl",
+ "\"\$(CC)",
+ "\$(CFLAGS)\"",
+ "\"$(PLATFORM)\"",
+ ],
+ },
"includes" =>
{
"apps/openssl" =>
".",
"include",
],
- "engines/libossltest" =>
+ "engines/ossltest" =>
[
"include"
],
[
"include",
],
+ "util/mkbuildinf.pl" =>
+ [
+ "util",
+ ],
}
+ "install" =>
+ {
+ "engines" =>
+ [
+ "engines/dasync",
+ ],
+ "libraries" =>
+ [
+ "libcrypto",
+ "libssl",
+ ],
+ "programs" =>
+ [
+ "apps/openssl",
+ ],
+ },
"libraries" =>
[
"libcrypto",
],
"rawlines" =>
[
- "crypto/buildinf.h : Makefile",
- " perl util/mkbuildinf.h \"\$(CC) \$(CFLAGS)\" \"\$(PLATFORM)\" \\"
- " > crypto/buildinf.h"
],
"sources" =>
{
[
"crypto/evp.c",
],
+ "engines/e_dasync.o" =>
+ [
+ "engines/e_dasync.c",
+ ],
+ "engines/dasync" =>
+ [
+ "engines/e_dasync.o",
+ ],
"engines/e_ossltest.o" =>
[
"engines/e_ossltest.c",
],
- "engines/libossltest" =>
+ "engines/ossltest" =>
[
"engines/e_ossltest.o",
],
from static libraries, to programs from object files and libraries,
etc.
+ 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", ... ]
+ 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.
functions defined in the build-file template.
As an example with the smaller build.info set we've seen as an
-example, producing the rules to build 'libssl' would result in the
+example, producing the rules to build 'libcrypto' would result in the
following calls:
# Note: libobj2shlib will only be called if shared libraries are
# Note 2: libobj2shlib gets both the name of the static library
# and the names of all the object files that go into it. It's up
# to the implementation to decide which to use as input.
- libobj2shlib(shlib => "libssl",
- lib => "libssl",
- objs => [ "ssl/tls.o" ],
- deps => [ "libcrypto" ]
- ordinals => [ "ssl", "util/libssl.num" ]);
-
- obj2lib(lib => "libssl"
- objs => [ "ssl/tls.o" ]);
-
- # Note 3: common.tmpl peals off the ".o" extension, as the
- # platform at hand may have a different one.
- src2obj(obj => "ssl/tls"
- srcs => [ "ssl/tls.c" ],
+ # Note 3: common.tmpl peals off the ".o" extension from all object
+ # files, as the platform at hand may have a different one.
+ libobj2shlib(shlib => "libcrypto",
+ lib => "libcrypto",
+ objs => [ "crypto/aes", "crypto/evp", "crypto/cversion" ],
+ deps => [ ]
+ ordinals => [ "crypto", "util/libcrypto.num" ]);
+
+ obj2lib(lib => "libcrypto"
+ objs => [ "crypto/aes", "crypto/evp", "crypto/cversion" ]);
+
+ src2obj(obj => "crypto/aes"
+ srcs => [ "crypto/aes.c" ],
deps => [ ],
- incs => [ "include" ]);
+ incs => [ "include" ],
+ intent => "lib");
- src2dep(obj => "ssl/tls"
- srcs => [ "ssl/tls.c" ],
- incs => [ "include" ]);
+ src2obj(obj => "crypto/evp"
+ srcs => [ "crypto/evp.c" ],
+ deps => [ ],
+ incs => [ "include" ],
+ intent => "lib");
+
+ src2obj(obj => "crypto/cversion"
+ srcs => [ "crypto/cversion.c" ],
+ deps => [ "crypto/buildinf.h" ],
+ incs => [ "include" ],
+ intent => "lib");
+
+ generatesrc(src => "crypto/buildinf.h",
+ generator => [ "util/mkbuildinf.pl", "\"$(CC)",
+ "$(CFLAGS)\"", "\"$(PLATFORM)\"" ],
+ generator_incs => [ "util" ],
+ generator_deps => [ "util/Foo.pm" ],
+ incs => [ ],
+ deps => [ ],
+ intent => "lib");
The returned strings from all those calls are then concatenated
together and written to the resulting build-file.