diff options
Diffstat (limited to 'OVERVIEW.md')
-rw-r--r-- | OVERVIEW.md | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/OVERVIEW.md b/OVERVIEW.md new file mode 100644 index 0000000..6fec949 --- /dev/null +++ b/OVERVIEW.md @@ -0,0 +1,255 @@ +# mm-common overview + +The following sections provide an overview of the various files shipped +with mm-common, and briefly explain their purpose. Detailed documentation +and usage instructions can be found in the files themselves. + +## mm-common-prepare and Autotools + +The mm-common-prepare shell script is installed in ${bindir} and must be +invoked from the bootstrap script of a binding module in order to set up +necessary support files in the project's source tree. It should be run +before any of Autotools' own setup utilities. The classic command line +options such as --copy and --force can be used to adjust the behavior of +mm-common-prepare. A typical autogen.sh would look like this: +``` + #! /bin/sh -e + test -n "$srcdir" || srcdir=`dirname "$0"` + test -n "$srcdir" || srcdir=. + + mm-common-prepare --copy --force "$srcdir" + autoreconf --force --install --verbose "$srcdir" + test -n "$NOCONFIGURE" || "$srcdir/configure" --enable-maintainer-mode "$@" +``` +Do not forget to set: +``` + ACLOCAL_AMFLAGS = -I build ${ACLOCAL_FLAGS} +``` +in your project's top-level Makefile.am. "build" should be changed to the +name of the Autoconf M4 macro subdirectory of your project's source tree. +Also note that mm-common-prepare inspects the project's configure.ac file +for the AC_CONFIG_AUX_DIR([...]) argument. This is explained in further +detail below in the section on Automake include files. + +## mm-common-get and Meson + +The mm-common-get shell script is installed in ${bindir} and must be +invoked with run_command() early in a meson.build file. The meson.build file +should contain code similar to +``` + python3 = import('python').find_installation() + cmd_py = ''' + import os + import sys + sys.exit(os.path.isdir("@0@") or os.path.isfile("@0@")) + '''.format(project_source_root / '.git') + is_git_build = run_command(python3, '-c', cmd_py, check: false).returncode() != 0 + maintainer_mode_opt = get_option('maintainer-mode') + maintainer_mode = maintainer_mode_opt == 'true' or \ + (maintainer_mode_opt == 'if-git-build' and is_git_build) + mm_common_get = find_program('mm-common-get', required: false) + if maintainer_mode and not mm_common_get.found() + message('Maintainer mode requires the \'mm-common-get\' command. If it is not found,\n' + + 'install the \'mm-common\' package, version 1.0.0 or higher.') + # If meson --wrap-mode != forcefallback, Meson falls back to the mm-common + # subproject only if mm-common-get is required. + mm_common_get = find_program('mm-common-get', required: true) + endif + if maintainer_mode + # Copy files to untracked/build_scripts and untracked/docs. + run_command(mm_common_get, '--force', + project_source_root / 'untracked' / 'build_scripts', + project_source_root / 'untracked' / 'docs', + check: true, + ) + endif +``` + +## Autoconf M4 macros (Autotools) + +The Autoconf M4 macros are installed into the system-wide macro repository +in the ${datadir}/aclocal directory. Since all used M4 macros are copied +into aclocal.m4, these macro files are required only in maintainer-mode. +For this reason, they are not copied into the source tree of a project by +mm-common-prepare. If mm-common is installed to a different prefix than +Automake, it may be necessary to adjust ACLOCAL_PATH accordingly so that +aclocal can find the M4 files: +``` + export ACLOCAL_PATH="${mm_common_prefix}/share/aclocal" +``` +This step is not necessary when using jhbuild, as it takes care of setting +up the environment for using the locally built modules. + +- macros/mm-common.m4: (generated from macros/mm-common.m4.in) \ + Provides MM_PREREQ() for requiring a minimum version of mm-common, and + an internal initialization macro shared by the other mm-common macros. + +- macros/mm-warnings.m4: \ + Implements the MM_ARG_ENABLE_WARNINGS() Autoconf macro for easy setup + of compiler diagnostics through the --enable-warnings configure option. + +- macros/mm-doc.m4: \ + Implements the MM_ARG_ENABLE_DOCUMENTATION() Autoconf macro to initialize + the documentation support for a C++ binding package. Among other things, + it provides the --enable-documentation configure option, and checks for + the required utilities. + The other Autoconf macro defined here is MM_ARG_WITH_TAGFILE_DOC(), which + ties all the ends together in order to make cross-referencing to external + documentation work. This macro should be called once for each external + Doxygen tag file a binding package depends on. It implements a configure + option to override tag file locations, attempts automatic configuration + if possible, and takes care of building the list of tag files and their + default base paths for substitution into the configuration Doxyfile. It + also generates the command line options for doc-install.pl. + +- macros/mm-module.m4: \ + The magic MM_INIT_MODULE() macro takes care of defining the various + substitution variables and preprocessor macros to identify the name, + version and API version of a C++ binding module. + +- macros/mm-pkg.m4: \ + The helper macro MM_PKG_CONFIG_SUBST, which simplifies the retrieval of + specific configuration values from pkg-config. Checks for particular + utility programs are also defined here, such as MM_CHECK_GNU_MAKE and + MM_CHECK_PERL. + +- macros/mm-dietlib.m4: \ + Implements Autoconf macros which provide options intended to reduce the + binary size of the generated binding library, typically for embedded use. + The MM_PROG_GCC_VISIBILITY macro is defined in this file as well. + +- macros/mm-ax_cxx_compile_stdcxx.m4: \ + Implements the MM_AX_CXX_COMPILE_STDCXX() macro to test and set flags + for C++11/14/17 compatibility of the C++ compiler. This is identical to the + AX_CXX_COMPILE_STDCXX() macro described at + <http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html>, + except for the MM_ prefix. + +## Automake include files (Autotools) + +The Automake include files are located in the am_include/ directory. +The installed mm-common-prepare program copies all of the .am files into +a project's source tree. If AC_CONFIG_AUX_DIR([...]) is specified in +the configure.ac file, the .am files will be placed in the indicated +subdirectory. + +- am_include/generate-binding.am: \ + Variables and rules for running the gmmproc code generator to produce + the source code files for a C++ binding module. + +- am_include/compile-binding.am: \ + Variables and rules for compiling and linking the shared library which + implements a C++ binding module. + +- am_include/doc-reference.am: \ + Variables and rules for building the API reference documentation using + Doxygen, and to create a Devhelp book for the library. The installation + rules also take care of translating references to external documentation + in the generated hypertext documents. + +- am_include/dist-changelog.am: \ + A dist-hook rule to automatically generate a ChangeLog file when making + a release, intended to be used by modules which use the version control + log exclusively to document changes. + +## Python build scripts (Meson) + +These scripts can be called from meson.build files with run_command(), +custom_target(), meson.add_postconf_script(), meson.add_install_script() +and meson.add_dist_script(). + +- util/build_scripts/generate-binding.py: \ + Commands for running the gmmproc code generator to produce + the source code files for a C++ binding module. + +- util/build_scripts/doc-reference.py: \ + Commands for building the API reference documentation using + Doxygen, and to create a Devhelp book for the library. The installation + rules also take care of translating references to external documentation + in the generated hypertext documents. + +- util/build_scripts/dist-changelog.py: \ + A git command to generate a ChangeLog file when making a release, + intended to be used by modules which use the version control + log exclusively to document changes. + +- util/build_scripts/dist-build-scripts.py: \ + Commands that trim the distribution directory before a tarball is made. + The scripts copied by mm-common-get are distributed, although they are + not checked into the git repository. All .gitignore files and an empty build/ + directory are removed + +- util/build_scripts/check-dllexport-usage.py: \ + Command that checks on the gmmproc version that is to be used or has been used + to generate the sources, to check whether to use compiler directives to + export symbols. Only used for Visual Studio or clang-cl builds. + +## Documentation utilities (Meson and Autotools) + +These are two Perl scripts and two equivalent Python scripts, a style sheet, +and one XSL transformation which assist with the task of generating and installing +the Doxygen reference documentation. At least doc-install.pl or doc-install.py +is also required for tarball builds. Autotools uses the Perl scripts. +Meson uses the Python scripts. + +Autotools: To avoid copying these files into all binding modules, they are +distributed and installed with the mm-common module. Those binding modules +which shall depend on mm-common only in maintainer-mode must call +MM_CONFIG_DOCTOOL_DIR([...]) in configure.ac to indicate to mm-common-prepare +that it should copy the documentation utilities into the project's source tree. +Otherwise the files installed with mm-common will be used automatically. + +- util/doc-postprocess.pl: \ + util/doc_postprocess.py: \ + A simple script to post-process the HTML files generated by Doxygen. + It replaces various code constructs that do not match the coding style + used throughout the C++ bindings. For instance, it rewrites function + prototypes in order to place the reference symbol (&) next to the type + instead of the name of the argument. + +- util/doc-install.pl: \ + util/doc_install.py: \ + A replacement for the installdox script generated by Doxygen. Its + purpose is to translate references to external documentation at the + time the documentation is installed. This step is necessary because + the documentation is included in the tarballs, and the location of + external documentation on the installation system is not known at the + time the documentation is generated. + Apart from replacing the functionality of installdox, doc-install.pl + also acts as a drop-in replacement for the classic BSD install command + for easy integration with Automake. It also translates Devhelp books + as well, and will happily pass through unrecognized files without any + alterations. + +- util/doxygen.css: \ + A Cascading Style Sheet to unify the appearance of the HTML reference + documentation generated by Doxygen for each C++ binding module. + This file is deprecated. Use util/doxygen-extra.css instead. + +- util/doxygen-extra.css: \ + A Cascading Style Sheet to unify the appearance of the HTML reference + documentation generated by Doxygen for each C++ binding module. + +- util/tagfile-to-devhelp2.xsl: \ + An XSLT script to generate a Devhelp2 book for the Doxygen reference + documentation. The generated Doxygen tag file serves as the input of + the translation. + +## GNU C++ Library tag file + +All modules in the GNOME C++ bindings set make use of the C++ standard +library in the API. As the GNU C++ Library shipped with GCC also uses +Doxygen for its reference documentation, its tag file is made available +by mm-common at a shared location for use by all C++ binding modules. + +- doctags/libstdc++.tag: \ + The Doxygen tag file for the GNU libstdc++ reference documentation + hosted at <http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/>. + This file is distributed with release archives of mm-common, but not + checked into version control on gnome.org. If mm-common is built with + Autotools in maintainer-mode or with Meson and use-network=true, + the file will be downloaded automatically from the gcc.gnu.org web server. + The file libstdc++.tag is installed into the package data directory + of mm-common. The mm-common-libstdc++ pkg-config module defines the + variables ${doxytagfile} and ${htmlrefpub}, which can be queried for + the location of the tag file and the URL of the online documentation. |