use unix paths for dir tests and prefer PathFormat…
[LibreOffice.git] / compilerplugins / README.md
blob8f8a51bd6f02f3e349ae4ecb70e143ec1776271c
1 # Compiler plugins
3 ## Overview
5 This directory contains code for compiler plugins. These are used to perform
6 additional actions during compilation (such as additional warnings) and
7 also to perform mass code refactoring.
9 Currently only the Clang compiler is supported <http://wiki.documentfoundation.org/Development/Clang>.
11 ## Usage
13 Compiler plugins are enabled automatically by `--enable-dbgutil` if Clang headers
14 are found or explicitly using `--enable-compiler-plugins`.
16 ## Functionality
18 There are two kinds of plugin actions:
20 - compile checks - these are run during normal compilation
21 - rewriters - these must be run manually and modify source files
23 Each source has a comment saying whether it's compile check or a rewriter
24 and description of functionality.
26 ### Compile Checks
28 Used during normal compilation to perform additional checks.
29 All warnings and errors are marked '[loplugin]' in the message.
31 ### Rewriters
33 Rewriters analyse and possibly modify given source files.
34 Usage: `make COMPILER_PLUGIN_TOOL=<rewriter_name>`
35 Additional optional make arguments:
37 - it is possible to also pass `FORCE_COMPILE=all` to make to trigger rebuild of all source files,
38     even those that are up to date. FORCE_COMPILE takes a list of gbuild targets specifying
39     where to run the rewriter ('all' means everything, '-' prepended means to not enable, '/' appended means
40     everything in the directory; there is no ordering, more specific overrides
41     more general, and disabling takes precedence).
42     Example: FORCE_COMPILE="all -sw/ -Library_sc"
44 - `UPDATE_FILES=<scope>` - limits which modified files will be actually written back with the changes
45     - `mainfile` - only the main `.cxx` file will be modified (default)
46     - `all` - all source files involved will be modified (possibly even header files from other LO modules),
47         3rd party header files are however never modified
48     - `<module>` - only files in the given LO module (toplevel directory) will be modified (including headers)
50 Modifications will be written directly to the source files.
52 Some rewriter plugins are dual-mode and can also be used in a non-rewriting mode
53 in which they emit warnings for problematic code that they would otherwise
54 automatically rewrite.  When any rewriter is enabled explicitly via `make
55 COMPILER_PLUGIN_TOOL=<rewriter_name>` it works in rewriting mode (and all other
56 plugins are disabled), but when no rewriter is explicitly enabled (i.e., just
57 `make`), all dual-mode rewriters are enabled in non-rewriting mode (along with
58 all non-rewriter plugins; and all non--dual-mode plugins are disabled).  The
59 typical process to use such a dual-mode rewriter X in rewriting mode is
61     make COMPILER_PLUGIN_WARNINGS_ONLY=X \
62     && make COMPILER_PLUGIN_TOOL=X FORCE_COMPILE=all UPDATE_FILES=all
64 which first generates a full build without failing due to warnings from plugin
65 X in non-rewriting mode (in case of `--enable-werror`) and then repeats the build
66 in rewriting mode (during which no object files are generate).
69 ## Code Documentation / HowTos
71 <https://wiki.documentfoundation.org/Clang_plugins>