Contents ======== This directory contains tools for developers working on this repository. deterministic-fuzz-coverage =========================== A tool to check for non-determinism in fuzz coverage. To get the help, run: ``` cargo run --manifest-path ./contrib/devtools/deterministic-fuzz-coverage/Cargo.toml -- --help ``` To execute the tool, compilation has to be done with the build options: ``` -DCMAKE_C_COMPILER='clang' -DCMAKE_CXX_COMPILER='clang++' -DBUILD_FOR_FUZZING=ON -DCMAKE_CXX_FLAGS='-fprofile-instr-generate -fcoverage-mapping' ``` Both llvm-profdata and llvm-cov must be installed. Also, the qa-assets repository must have been cloned. Finally, a fuzz target has to be picked before running the tool: ``` cargo run --manifest-path ./contrib/devtools/deterministic-fuzz-coverage/Cargo.toml -- $PWD/build_dir $PWD/qa-assets/fuzz_corpora fuzz_target_name ``` deterministic-unittest-coverage =========================== A tool to check for non-determinism in unit-test coverage. To get the help, run: ``` cargo run --manifest-path ./contrib/devtools/deterministic-unittest-coverage/Cargo.toml -- --help ``` To execute the tool, compilation has to be done with the build options: ``` -DCMAKE_C_COMPILER='clang' -DCMAKE_CXX_COMPILER='clang++' -DCMAKE_CXX_FLAGS='-fprofile-instr-generate -fcoverage-mapping' ``` Both llvm-profdata and llvm-cov must be installed. ``` cargo run --manifest-path ./contrib/devtools/deterministic-unittest-coverage/Cargo.toml -- $PWD/build_dir ``` clang-format-diff.py =================== A script to format unified git diffs according to [.clang-format](../../src/.clang-format). Requires `clang-format`, installed e.g. via `brew install clang-format` on macOS, or `sudo apt install clang-format` on Debian/Ubuntu. For instance, to format the last commit with 0 lines of context, the script should be called from the git root folder as follows. ``` git diff -U0 HEAD~1.. | ./contrib/devtools/clang-format-diff.py -p1 -i -v ``` copyright\_header.py ==================== Provides utilities for managing copyright headers of `The Bitcoin Core developers` in repository source files. It has three subcommands: ``` $ ./copyright_header.py report [verbose] $ ./copyright_header.py update $ ./copyright_header.py insert ``` Running these subcommands without arguments displays a usage string. copyright\_header.py report \ [verbose] --------------------------------------------------------- Produces a report of all copyright header notices found inside the source files of a repository. Useful to quickly visualize the state of the headers. Specifying `verbose` will list the full filenames of files of each category. copyright\_header.py update \ [verbose] --------------------------------------------------------- Updates all the copyright headers of `The Bitcoin Core developers` which were changed in a year more recent than is listed. For example: ``` // Copyright (c) - The Bitcoin Core developers ``` will be updated to: ``` // Copyright (c) - The Bitcoin Core developers ``` where `` is obtained from the `git log` history. This subcommand also handles copyright headers that have only a single year. In those cases: ``` // Copyright (c) The Bitcoin Core developers ``` will be updated to: ``` // Copyright (c) - The Bitcoin Core developers ``` where the update is appropriate. copyright\_header.py insert \ ------------------------------------ Inserts a copyright header for `The Bitcoin Core developers` at the top of the file in either Python or C++ style as determined by the file extension. If the file is a Python file and it has `#!` starting the first line, the header is inserted in the line below it. The copyright dates will be set to be `-` where `` is according to the `git log` history. If `` is equal to ``, it will be set as a single year rather than two hyphenated years. If the file already has a copyright for `The Bitcoin Core developers`, the script will exit. gen-manpages.py =============== A small script to automatically create manpages in ../../doc/man by running the release binaries with the -help option. This requires help2man which can be found at: https://www.gnu.org/software/help2man/ This script assumes a build directory named `build` as suggested by example build documentation. To use it with a different build directory, set `BUILDDIR`. For example: ```bash BUILDDIR=$PWD/my-build-dir contrib/devtools/gen-manpages.py ``` headerssync-params.py ===================== A script to generate optimal parameters for the headerssync module (src/headerssync.cpp). It takes no command-line options, as all its configuration is set at the top of the file. It runs many times faster inside PyPy. Invocation: ```bash pypy3 contrib/devtools/headerssync-params.py ``` gen-bitcoin-conf.sh =================== Generates a bitcoin.conf file in `share/examples/` by parsing the output from `bitcoind --help`. This script is run during the release process to include a bitcoin.conf with the release binaries and can also be run by users to generate a file locally. When generating a file as part of the release process, make sure to commit the changes after running the script. This script assumes a build directory named `build` as suggested by example build documentation. To use it with a different build directory, set `BUILDDIR`. For example: ```bash BUILDDIR=$PWD/my-build-dir contrib/devtools/gen-bitcoin-conf.sh ``` circular-dependencies.py ======================== Run this script from the root of the source tree (`src/`) to find circular dependencies in the source code. This looks only at which files include other files, treating the `.cpp` and `.h` file as one unit. Example usage: cd .../src ../contrib/devtools/circular-dependencies.py {*,*/*,*/*/*}.{h,cpp}