* The Arduino IDE considers the .tools directory special and warns if it finds .tools the repo * Added detection of .tools directory rename * Corrected README errata References #672
261 lines
9.9 KiB
Markdown
261 lines
9.9 KiB
Markdown
# Development Tools
|
|
|
|
### Overview
|
|
|
|
This directory hosts MySensors development tools. The following
|
|
conventions are employed to facilitate consistent re-use/invocation
|
|
across modalitiies (e.g. local development, continuous integration,
|
|
editor linters, etc.)
|
|
|
|
1. All common tools are hosted and managed in
|
|
the tools directory (used for both local development
|
|
and continuous integration)
|
|
2. Each tool comprises a directory, akin to a bundle,
|
|
that encapsulates declarative command-line options,
|
|
configuration files and a run script
|
|
3. A single bootstrap script configures a
|
|
development environment
|
|
4. A lightweight runtime provides a common set of
|
|
convenience functions and variables to all scripts
|
|
5. Support for all MySensors development environments
|
|
|
|
### Usage
|
|
|
|
The [boostrap-dev](bootstrap-dev.sh) script completely configures a
|
|
development environment. The boostrap-dev script validates development
|
|
prerequisites such as verifying the git repo ```origin``` &
|
|
```upstream``` remotes, tools needed for the git client hooks,
|
|
installing local commit hooks, and creating git aliases, etc.
|
|
|
|
```shell-script
|
|
$ cd MySensors # git repo
|
|
$ .mystools/bootstrap-dev.sh
|
|
Checking operating system support: darwin16...
|
|
Checking github 'origin' & 'upstream' remotes...
|
|
Checking tool/utility prerequisites...
|
|
Installing git client-side hooks...
|
|
Configuring git aliases for running mysensor tool bundles...
|
|
Successfully configured your repo for MySensors development... Thanks for your support!
|
|
$
|
|
```
|
|
**Note:** If the bootstrap can not find required command-line
|
|
utilities, you will be requested to install the required tools and
|
|
re-run bootstrap.sh. See [Installation instructions for prerequisite
|
|
tools](#installtools).
|
|
|
|
Once the bootstrapping process is complete, a git alias for each tool
|
|
is available to conveniently run the tool with the pre-configured
|
|
mysensors options and settings (no need to remember all those
|
|
command-line options or where the configuration files reside).
|
|
Furthermore, you can run the command against staged files, unstaged
|
|
modified files or a list of files common to most git commands.
|
|
|
|
```shell-script
|
|
$ # Run cppcheck on an individual file
|
|
$ git cppcheck core/MyMessage.cpp
|
|
$
|
|
$ # Run cppcheck on all changed files
|
|
$ git cppcheck
|
|
$
|
|
$ # Run astyle on staged files
|
|
$ git astyle --cached
|
|
```
|
|
|
|
Available tool aliases:
|
|
|
|
* git cppcheck [--cached] [files]
|
|
* git astyle [--cached] [files]
|
|
|
|
Finally, to maintain code quality and a legible git revision history,
|
|
two git hooks are installed that will trigger whenever you commit
|
|
changes to your local repo. The hooks will examine your changes to
|
|
ensure they satisfy the [MySensors Code Contribution
|
|
Guidelines](https://www.mysensors.org/download/contributing) before
|
|
you push your changes to GitHub for merging by the core MySensors
|
|
team. Gitler will also enforce the coding guidelines so the hooks are
|
|
provided to reduce development cycle times by detecting standards
|
|
variances locally before pushing to GitHub.
|
|
|
|
### <a name="installtools"></a>Installation instructions for prerequisite tools
|
|
|
|
This first time you run the bootstrap script, it may inform you that
|
|
certain development tools are missing from your path or system:
|
|
|
|
```
|
|
Checking operating system support: darwin16...
|
|
Checking github 'origin' & 'upstream' remotes...
|
|
Checking tool/utility prerequisites...
|
|
astyle not installed or not in current path.
|
|
cppcheck not installed or not in current path.
|
|
One or more required tools not found. Install required tools and re-run .mystools/bootstrap-dev.sh
|
|
```
|
|
|
|
To finish the bootstrap process, you will need to install the required
|
|
tools for your specific operating system as follows. Currently we use
|
|
Astyle 2.0.5 or later and Cppcheck 1.76 or later. Once you have
|
|
installed AStyle and Cppcheck, re-run bootstrap-dev.sh to finish
|
|
configuring your development environment.
|
|
|
|
##### macOS
|
|
|
|
```brew install astyle cppcheck```
|
|
|
|
#### Linux Xenial or later
|
|
|
|
```apt-get install astyle cppcheck```
|
|
|
|
#### Linux Trusty or earlier
|
|
|
|
##### Note: The apt versions are too old on Trusty so follow the [Linux - Build and Install from Source](#buildFromSource) instructions
|
|
|
|
##### Windows - GitHub Git Shell
|
|
|
|
###### *IMPORTANT: Be sure to launch PowerShell As Administrator*
|
|
|
|
```
|
|
### Install AStyle
|
|
|
|
# Download
|
|
iwr 'https://sourceforge.net/projects/astyle/files/astyle/astyle%202.05.1/AStyle_2.05.1_windows.zip/download' -UserAgent [Microsoft.PowerShell.Commands.PSUserAgent]::FireFox -OutFile astyle.2.05.zip
|
|
|
|
# Unzip the filed & move the C:\Program Files
|
|
expand-archive astyle.2.05.zip
|
|
mv .\astyle.2.05 'C:\Program Files\AStyle\'
|
|
|
|
# Add AStyle to your path
|
|
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\AStyle\bin", [EnvironmentVariableTarget]::Machine)
|
|
|
|
### Install Cppcheck (either 64-bit or 32-bit depending upon your version of Windows - pick one below)
|
|
|
|
# 64-bit
|
|
iwr 'http://github.com/danmar/cppcheck/releases/download/1.76.1/cppcheck-1.76.1-x64-Setup.msi' -UserAgent [Microsoft.PowerShell.Commands.PSUserAgent]::FireFox -OutFile cppcheck-1.76.1-Setup.msi
|
|
|
|
# 32-bit
|
|
iwr 'http://github.com/danmar/cppcheck/releases/download/1.76.1/cppcheck-1.76.1-x86-Setup.msi' -UserAgent [Microsoft.PowerShell.Commands.PSUserAgent]::FireFox -OutFile cppcheck-1.76.1-Setup.msi
|
|
|
|
# Launch installer to install Cppcheck
|
|
& .\cppcheck-1.76.1-Setup.msi
|
|
|
|
### Add Cppcheck to your path
|
|
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Cppcheck", [EnvironmentVariableTarget]::Machine)
|
|
|
|
### At this point you need to reboot for the path changes to take effect
|
|
```
|
|
|
|
##### Windows - bash
|
|
|
|
###### NOTE: At the time of this writing, the apt vresions of cppcheck and astyle are too old. Follow the [Linux - Build and Install from Source](#buildFromSource) instructions
|
|
|
|
##### Windows - Cygwin
|
|
```
|
|
Run Either Cygwin Setup-x86-64.exe or Setup-x86.exe depending upon your OS. Select and install astyle and cppcheck
|
|
```
|
|
|
|
##### <a name="buildFromSource"></a>Linux - Build and Install from Source
|
|
|
|
```
|
|
### Install AStyle
|
|
|
|
# Download
|
|
curl -L 'https://sourceforge.net/projects/astyle/files/astyle/astyle%202.05.1/astyle_2.05.1_linux.tar.gz/download' | tar xvz
|
|
|
|
# Compile and install
|
|
cd astyle/build/gcc && sudo make shared release shared static install
|
|
|
|
### Install Cppcheck
|
|
|
|
# Download
|
|
curl -L 'https://sourceforge.net/projects/cppcheck/files/cppcheck/1.76.1/cppcheck-1.76.1.tar.gz/download' | tar xvz
|
|
|
|
# Compile and install
|
|
cd cppcheck-1.76.1
|
|
sudo apt-get install libpcre++-dev
|
|
sudo make SRCDIR=build CFGDIR=/usr/share/cppcheck HAVE_RULES=yes CXXFLAGS="-O2 -DNDEBUG -Wall -Wno-sign-compare -Wno-unused-function" install
|
|
|
|
```
|
|
|
|
### Implementation Details
|
|
|
|
*This section is intended for developers curious about the
|
|
implementation details or interested in extending the development
|
|
environment to support additional tools, aliases, etc.*
|
|
|
|
A lightweight [runtime](.bundle_runtime.sh) (less than 70 lines of
|
|
code) provides a simple API to consistently run the MySensors toolset
|
|
across modalities including, but not limited to, local development and
|
|
continuous integration. The core concept is that each tool
|
|
encapsulates all runtime configuration settings in a simple,
|
|
stand-alone bundle, that can be executed by the bundle runtime. The
|
|
runtime provides an API to execute a tool bundle along with
|
|
convenience functions and environment variables common to all tools.
|
|
|
|
Each tool bundle is laid out as follows:
|
|
|
|
```
|
|
${TOOLSDIR} [e.g. ${GITREPO}/.mystools}]
|
|
.../tool [e.g. cppcheck, astyle]
|
|
....../run.sh [tool run script]
|
|
....../options.sh [command-line options]
|
|
....../config [supporting config files]
|
|
........./some.cfg
|
|
```
|
|
|
|
All bundle runtime dependencies are defined withing the namespace /
|
|
context of a git repo so users are free to rename or move repos or
|
|
even use multiple copies of the same repo without encountering
|
|
intra-repo tool settings/configuration conflicts.
|
|
|
|
During the bootstrap process, certain keys and aliases are defined
|
|
that the runtime leverages.
|
|
|
|
#####git config keys
|
|
|
|
* mysensors.toolsdir = .mystools (defined as a repo-relative path - location agnostic)
|
|
* mysensors.bootstrap-cksum = \<git sha of bootstrap-dev.sh used to detect an outdated environment>
|
|
|
|
#####git aliases
|
|
|
|
* mystoolspath = *returns the absolute path to the tools dir*
|
|
* \<bundle name> = *(e.g. cppcheck) runs the tool bundle*
|
|
|
|
NOTE: The \<bundle> aliases are auto-generated by enumerating the bundles located
|
|
in *mystoolspath*.
|
|
|
|
While the ```git <tool> args``` API is designed to cover many the
|
|
common use cases, tool and hook authors may need to source the
|
|
[runtime](.bundle_runtime.sh) into their script context in order to
|
|
use the convenience functions and environment variables as follows:
|
|
|
|
```shell-script
|
|
. "$(git config mystoolspath).bundle_runtime.sh"
|
|
```
|
|
|
|
The runtime shim will instantiate the following environment variables
|
|
and convenience functions in the script context for use within a tool
|
|
or script.
|
|
|
|
```
|
|
TOOLSDIR - absolute path to repo tools dir. Maintained in
|
|
a location-agnostic fashion (e.g. if the user
|
|
moves the repo, changes tools directory within
|
|
repo, etc.
|
|
GITREPO - absolute path to the git repo
|
|
GITDIR - absolute path to the repo .git directory
|
|
|
|
runBundle() - Run a given tool / bundle
|
|
is_installed() - true if a given utility is installed
|
|
supported_os() - true if running on a supported os
|
|
log() - log a message in default color to console
|
|
warn() - log a message in yellow to console
|
|
err() - log a message in red and exit with non-zero status
|
|
```
|
|
|
|
Many of the aforementioned details can be safely ignored if you want
|
|
to add a new development tool to the toolset. Simply create a bundle
|
|
that follows the layout above, declare the tool command-line options
|
|
in the [bundle]/options.sh and any configuration files in
|
|
[bundle]/config/. While it should not be necessary to alter the
|
|
bundle execution behavior beyond declaring command-line options and
|
|
configuration files, you can override it by modifing the [bundle]
|
|
run.sh script.
|