764 lines
35 KiB
Plaintext
764 lines
35 KiB
Plaintext
|
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
|
||
|
engines, 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 is a target found in Makefile.shared.
|
||
|
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 engines.
|
||
|
- 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.
|
||
|
|
||
|
To begin with, things to be built are declared by setting specific
|
||
|
variables:
|
||
|
|
||
|
PROGRAMS=foo bar
|
||
|
LIBS=libsomething
|
||
|
ENGINES=libeng
|
||
|
SCRIPTS=myhack
|
||
|
EXTRA=file1 file2
|
||
|
|
||
|
Note that the files mentioned for PROGRAMS, LIBS and ENGINES *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'.
|
||
|
|
||
|
One some platforms, shared libraries come with a name that's different
|
||
|
from their static counterpart. That's declared as follows:
|
||
|
|
||
|
SHARED_NAME[libfoo]=cygfoo-{- $config{shlibver} -}
|
||
|
|
||
|
The example is from Cygwin, which has a required naming convention.
|
||
|
|
||
|
Sometimes, it makes sense to rename an output file, for example a
|
||
|
library:
|
||
|
|
||
|
RENAME[libfoo]=libbar
|
||
|
|
||
|
That line has "libfoo" renamed to "libbar". While it makes no
|
||
|
sense at all to just have a rename like that (why not just use
|
||
|
"libbar" everywhere?), it does make sense when it can be used
|
||
|
conditionally. See a little further below for an example.
|
||
|
|
||
|
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
|
||
|
|
||
|
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.
|
||
|
|
||
|
As a last resort, it's possible to have raw build file lines, between
|
||
|
BEGINRAW and ENDRAW lines as follows:
|
||
|
|
||
|
BEGINRAW[Makefile(unix)]
|
||
|
haha.h: {- $builddir -}/Makefile
|
||
|
echo "/* haha */" > haha.h
|
||
|
ENDRAW[Makefile(unix)]
|
||
|
|
||
|
The word within square brackets is the build_file configuration item
|
||
|
or the build_file configuration item followed by the second word in the
|
||
|
build_scheme configuration item for the configured target within
|
||
|
parenthesis as shown above. For example, with the following relevant
|
||
|
configuration items:
|
||
|
|
||
|
build_file => "build.ninja"
|
||
|
build_scheme => [ "unified", "unix" ]
|
||
|
|
||
|
... these lines will be considered:
|
||
|
|
||
|
BEGINRAW[build.ninja]
|
||
|
build haha.h: echo "/* haha */" > haha.h
|
||
|
ENDRAW[build.ninja]
|
||
|
|
||
|
BEGINRAW[build.ninja(unix)]
|
||
|
build hoho.h: echo "/* hoho */" > hoho.h
|
||
|
ENDRAW[build.ninja(unix)]
|
||
|
|
||
|
Should it be needed because the recipes within a RAW section might
|
||
|
clash with those generated by Configure, it's possible to tell it
|
||
|
not to generate them with the use of OVERRIDES, for example:
|
||
|
|
||
|
SOURCE[libfoo]=foo.c bar.c
|
||
|
|
||
|
OVERRIDES=bar.o
|
||
|
BEGINRAW[Makefile(unix)]
|
||
|
bar.o: bar.c
|
||
|
$(CC) $(CFLAGS) -DSPECIAL -c -o $@ $<
|
||
|
ENDRAW[Makefile(unix)]
|
||
|
|
||
|
See the documentation further up for more information on configuration
|
||
|
items.
|
||
|
|
||
|
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
|
||
|
|
||
|
or:
|
||
|
|
||
|
# VMS has a cultural standard where all libraries are prefixed.
|
||
|
# For OpenSSL, the choice is 'ossl_'
|
||
|
IF[{- $config{target} =~ /^vms/ -}]
|
||
|
RENAME[libcrypto]=ossl_libcrypto
|
||
|
RENAME[libssl]=ossl_libssl
|
||
|
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 *without*
|
||
|
extension, src2obj() is expected to add that.
|
||
|
'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 (also *without*
|
||
|
extension) to build this library.
|
||
|
|
||
|
libobj2shlib - function that produces build file lines to build a
|
||
|
shareable object library file ("libfoo.so" in Unix
|
||
|
terms) from the corresponding static library file
|
||
|
or object files.
|
||
|
|
||
|
called like this:
|
||
|
|
||
|
libobj2shlib(shlib => "PATH/TO/shlibfile",
|
||
|
lib => "PATH/TO/libfile",
|
||
|
objs => [ "PATH/TO/objectfile", ... ],
|
||
|
deps => [ "PATH/TO/otherlibfile", ... ]);
|
||
|
|
||
|
'lib' has the intended library file name *without*
|
||
|
extension, libobj2shlib is expected to add that.
|
||
|
'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 (also *without* extension) to build
|
||
|
this library.
|
||
|
|
||
|
This function has a choice; it can use the
|
||
|
corresponding static library as input to make the
|
||
|
shared library, or the list of object files.
|
||
|
|
||
|
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 libobj2shlib, but the
|
||
|
intent is to build a shareable library that can be
|
||
|
loaded in runtime (a "plugin"...). The differences
|
||
|
are subtle, one of the most visible ones is that the
|
||
|
resulting shareable library is produced from object
|
||
|
files only.
|
||
|
|
||
|
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 (also
|
||
|
*without* extension) 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`.
|