mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			763 lines
		
	
	
	
		
			35 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			763 lines
		
	
	
	
		
			35 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
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`.
 |