123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 |
- .. _defining_binaries:
- ======================================
- Defining Binaries for the Build System
- ======================================
- One part of what the build system does is compile C/C++ and link the resulting
- objects to produce executables and/or libraries. This document describes the
- basics of defining what is going to be built and how. All the following
- describes constructs to use in moz.build files.
- Source files
- ============
- Source files to be used in a given directory are registered in the ``SOURCES``
- and ``UNIFIED_SOURCES`` variables. ``UNIFIED_SOURCES`` have a special behavior
- in that they are aggregated by batches of 16, requiring, for example, that there
- are no conflicting variables in those source files.
- ``SOURCES`` and ``UNIFIED_SOURCES`` are lists which must be appended to, and
- each append requires the given list to be alphanumerically ordered.
- .. code-block:: python
- UNIFIED_SOURCES += [
- 'FirstSource.cpp',
- 'SecondSource.cpp',
- 'ThirdSource.cpp',
- ]
- SOURCES += [
- 'OtherSource.cpp',
- ]
- ``SOURCES`` and ``UNIFIED_SOURCES`` can contain a mix of different file types,
- for C, C++, and Objective C.
- Static Libraries
- ================
- To build a static library, other than defining the source files (see above), one
- just needs to define a library name with the ``Library`` template.
- .. code-block:: python
- Library('foo')
- The library file name will be ``libfoo.a`` on UNIX systems and ``foo.lib`` on
- Windows.
- If the static library needs to aggregate other static libraries, a list of
- ``Library`` names can be added to the ``USE_LIBS`` variable. Like ``SOURCES``, it
- requires the appended list to be alphanumerically ordered.
- .. code-block:: python
- USE_LIBS += ['bar', 'baz']
- If there are multiple directories containing the same ``Library`` name, it is
- possible to disambiguate by prefixing with the path to the wanted one (relative
- or absolute):
- .. code-block:: python
- USE_LIBS += [
- '/path/from/topsrcdir/to/bar',
- '../relative/baz',
- ]
- Note that the leaf name in those paths is the ``Library`` name, not an actual
- file name.
- Note that currently, the build system may not create an actual library for
- static libraries. It is an implementation detail that shouldn't need to be
- worried about.
- As a special rule, ``USE_LIBS`` is allowed to contain references to shared
- libraries. In such cases, programs and shared libraries linking this static
- library will inherit those shared library dependencies.
- Intermediate (Static) Libraries
- ===============================
- In many cases in the tree, static libraries are built with the only purpose
- of being linked into another, bigger one (like libxul). Instead of adding all
- required libraries to ``USE_LIBS`` for the bigger one, it is possible to tell
- the build system that the library built in the current directory is meant to
- be linked to that bigger library, with the ``FINAL_LIBRARY`` variable.
- .. code-block:: python
- FINAL_LIBRARY = 'xul'
- The ``FINAL_LIBRARY`` value must match a unique ``Library`` name somewhere
- in the tree.
- As a special rule, those intermediate libraries don't need a ``Library`` name
- for themselves.
- Shared Libraries
- ================
- Sometimes, we want shared libraries, a.k.a. dynamic libraries. Such libraries
- are defined similarly to static libraries, using the ``SharedLibrary`` template
- instead of ``Library``.
- .. code-block:: python
- SharedLibrary('foo')
- When this template is used, no static library is built. See further below to
- build both types of libraries.
- With a ``SharedLibrary`` name of ``foo``, the library file name will be
- ``libfoo.dylib`` on OSX, ``libfoo.so`` on ELF systems (Linux, etc.), and
- ``foo.dll`` on Windows. On Windows, there is also an import library named
- ``foo.lib``, used on the linker command line. ``libfoo.dylib`` and
- ``libfoo.so`` are considered the import library name for, resp. OSX and ELF
- systems.
- On OSX, one may want to create a special kind of dynamic library: frameworks.
- This is done with the ``Framework`` template.
- .. code-block:: python
- Framework('foo')
- With a ``Framework`` name of ``foo``, the framework file name will be ``foo``.
- This template however affects the behavior on all platforms, so it needs to
- be set only on OSX.
- Executables
- ===========
- Executables, a.k.a. programs, are, in the simplest form, defined with the
- ``Program`` template.
- .. code-block:: python
- Program('foobar')
- On UNIX systems, the executable file name will be ``foobar``, while on Windows,
- it will be ``foobar.exe``.
- Like static and shared libraries, the build system can be instructed to link
- libraries to the executable with ``USE_LIBS``, listing various ``Library``
- names.
- In some cases, we want to create an executable per source file in the current
- directory, in which case we can use the ``SimplePrograms`` template
- .. code-block:: python
- SimplePrograms([
- 'FirstProgram',
- 'SecondProgram',
- ])
- Contrary to ``Program``, which requires corresponding ``SOURCES``, when using
- ``SimplePrograms``, the corresponding ``SOURCES`` are implied. If the
- corresponding ``sources`` have an extension different from ``.cpp``, it is
- possible to specify the proper extension:
- .. code-block:: python
- SimplePrograms([
- 'ThirdProgram',
- 'FourthProgram',
- ], ext='.c')
- Please note this construct was added for compatibility with what already lives
- in the mozilla tree ; it is recommended not to add new simple programs with
- sources with a different extension than ``.cpp``.
- Similar to ``SimplePrograms``, is the ``CppUnitTests`` template, which defines,
- with the same rules, C++ unit tests programs. Like ``SimplePrograms``, it takes
- an ``ext`` argument to specify the extension for the corresponding ``SOURCES``,
- if it's different from ``.cpp``.
- Linking with system libraries
- =============================
- Programs and libraries usually need to link with system libraries, such as a
- widget toolkit, etc. Those required dependencies can be given with the
- ``OS_LIBS`` variable.
- .. code-block:: python
- OS_LIBS += [
- 'foo',
- 'bar',
- ]
- This expands to ``foo.lib bar.lib`` when building with MSVC, and
- ``-lfoo -lbar`` otherwise.
- For convenience with ``pkg-config``, ``OS_LIBS`` can also take linker flags
- such as ``-L/some/path`` and ``-llib``, such that it is possible to directly
- assign ``LIBS`` variables from ``CONFIG``, such as:
- .. code-block:: python
- OS_LIBS += CONFIG['MOZ_PANGO_LIBS']
- (assuming ``CONFIG['MOZ_PANGO_LIBS']`` is a list, not a string)
- Like ``USE_LIBS``, this variable applies to static and shared libraries, as
- well as programs.
- Libraries from third party build system
- =======================================
- Some libraries in the tree are not built by the moz.build-governed build
- system, and there is no ``Library`` corresponding to them.
- However, ``USE_LIBS`` allows to reference such libraries by giving a full
- path (like when disambiguating identical ``Library`` names). The same naming
- rules apply as other uses of ``USE_LIBS``, so only the library name without
- prefix and suffix shall be given.
- .. code-block:: python
- USE_LIBS += [
- '/path/from/topsrcdir/to/third-party/bar',
- '../relative/third-party/baz',
- ]
- Note that ``/path/from/topsrcdir/to/third-party`` and
- ``../relative/third-party/baz`` must lead under a subconfigured directory (a
- directory with an AC_OUTPUT_SUBDIRS in configure.in), or ``security/nss``.
- Building both static and shared libraries
- =========================================
- When both types of libraries are required, one needs to set both
- ``FORCE_SHARED_LIB`` and ``FORCE_STATIC_LIB`` boolean variables.
- .. code-block:: python
- FORCE_SHARED_LIB = True
- FORCE_STATIC_LIB = True
- But because static libraries and Windows import libraries have the same file
- names, either the static or the shared library name needs to be different
- than the name given to the ``Library`` template.
- The ``STATIC_LIBRARY_NAME`` and ``SHARED_LIBRARY_NAME`` variables can be used
- to change either the static or the shared library name.
- .. code-block:: python
- Library('foo')
- STATIC_LIBRARY_NAME = 'foo_s'
- With the above, on Windows, ``foo_s.lib`` will be the static library,
- ``foo.dll`` the shared library, and ``foo.lib`` the import library.
- In some cases, for convenience, it is possible to set both
- ``STATIC_LIBRARY_NAME`` and ``SHARED_LIBRARY_NAME``. For example:
- .. code-block:: python
- Library('mylib')
- STATIC_LIBRARY_NAME = 'mylib_s'
- SHARED_LIBRARY_NAME = CONFIG['SHARED_NAME']
- This allows to use ``mylib`` in the ``USE_LIBS`` of another library or
- executable.
- When refering to a ``Library`` name building both types of libraries in
- ``USE_LIBS``, the shared library is chosen to be linked. But sometimes,
- it is wanted to link the static version, in which case the ``Library`` name
- needs to be prefixed with ``static:`` in ``USE_LIBS``
- ::
- a/moz.build:
- Library('mylib')
- FORCE_SHARED_LIB = True
- FORCE_STATIC_LIB = True
- STATIC_LIBRARY_NAME = 'mylib_s'
- b/moz.build:
- Program('myprog')
- USE_LIBS += [
- 'static:mylib',
- ]
- Miscellaneous
- =============
- The ``SDK_LIBRARY`` boolean variable defines whether the library in the current
- directory is going to be installed in the SDK.
- The ``SONAME`` variable declares a "shared object name" for the library. It
- defaults to the ``Library`` name or the ``SHARED_LIBRARY_NAME`` if set. When
- linking to a library with a ``SONAME``, the resulting library or program will
- have a dependency on the library with the name corresponding to the ``SONAME``
- instead of the ``Library`` name. This only impacts ELF systems.
- ::
- a/moz.build:
- Library('mylib')
- b/moz.build:
- Library('otherlib')
- SONAME = 'foo'
- c/moz.build:
- Program('myprog')
- USE_LIBS += [
- 'mylib',
- 'otherlib',
- ]
- On e.g. Linux, the above ``myprog`` will have DT_NEEDED markers for
- ``libmylib.so`` and ``libfoo.so`` instead of ``libmylib.so`` and
- ``libotherlib.so`` if there weren't a ``SONAME``. This means the runtime
- requirement for ``myprog`` is ``libfoo.so`` instead of ``libotherlib.so``.
- Gecko-related binaries
- ======================
- Some programs or libraries are totally independent of Gecko, and can use the
- above mentioned templates. Others are Gecko-related in some way, and may
- need XPCOM linkage, mozglue. These things are tedious. A set of additional
- templates exists to ease defining such programs and libraries. They are
- essentially the same as the above mentioned templates, prefixed with "Gecko":
- - ``GeckoProgram``
- - ``GeckoSimplePrograms``
- - ``GeckoCppUnitTests``
- - ``GeckoSharedLibrary``
- - ``GeckoFramework``
- There is also ``XPCOMBinaryComponent`` for XPCOM components, which is a
- special kind of library.
- All the Gecko-prefixed templates take the same arguments as their
- non-Gecko-prefixed counterparts, and can take a few more arguments
- for non-standard cases. See the definition of ``GeckoBinary`` in
- build/gecko_templates.mozbuild for more details, but most usecases
- should not require these additional arguments.
|