By default, makem.sh uses your local Emacs configuration's packages, so e.g. it would load dependencies from ~/.emacs.d/elpa. That is useful sometimes, but it's not the best way to lint and test code, because, of course, it depends on your personal configuration.
That's what the sandbox features are for. There are two ways to use the sandbox features:
In temporary sandboxes. For example: ./makem.sh --sandbox lint. That will make a temporary sandbox directory, install the necessary dependencies and linters, run them, and then delete the temporary sandbox directory. This ensures that your personal config does not affect the output, and it always uses the latest versions of the linters and dependencies that are installed from ELPA and MELPA (e.g. the linters package-lint and relint; linters that are included with Emacs, like checkdoc, are used from your system's Emacs installation).
In non-temporary sandboxes. For example, ./makem.sh --sandbox=.sandbox --install-deps --install-linters creates a new sandbox directory named .sandbox, installs the package's current dependencies and the linters, and then returns. Then you can run rules in that sandbox like ./makem.sh -s.sandbox lint (using the short option form). This avoids having to install dependencies every time. Note as well that Emacs version-specific sandboxes are created, so e.g. since I'm using Emacs 26.3, it would make a .sandbox/26.3 directory; if I later ran a snapshot version, it would make a .sandbox/27.0.50 directory (and I would need to use --install-deps --install-linters the first time I used that sandbox directory).
You can also use the Makefile to run these rules, like make sandbox=.sandbox install-deps=t install-linters=t lint if you prefer that syntax.
e.g. https://github.com/DamienCassou/ledger-import/pull/1#issuecomment-590010200