Lint features
Shake features a built in "lint" features to check the build system is well formed. To run use build --lint. You are likely to catch more lint violations if you first build clean. The lint features are listed in this document. There is a performance penalty for building with --lint, but it is typically small.
Changing current directory
Enabled with --lint. Detects changing the current directory, typically with setCurrentDirectory. You should never change the current directory within the build system as multiple rules running at the same time share the current directory. You can still run cmd_ calls in different directories using the Cwd argument.
Changing outputs after building
Enabled with --lint. Detects if any files have changed after Shake has built them. There are a couple of causes for seeing this error:
- If there is a rule producing
foo.o, but another rule also modifiesfoo.o. - If you are on a file system where files change modification time after a while. A standard example would be an NFS drive where the underlying network file system stores modification times to second-level resolution, but the in-memory cache keeps them precisely.
- If you modify the build sources while running a build.
A consequence of this lint triggering would be that a subsequent build would do additional work, as it spots modifications.
Needed
Enabled with --lint. Calling needed is normally equivalent to need, but with --lint it also changes that the file does not change as a result of need - expressing that you have already used the contents of the file.
Manual tracking functions
Enabled with --lint. The tracking function trackRead and trackWrite can be called to declare reads/writes, and they can assert various invariants about what files can be written where. Examples include:
- You can only read a file that is either your dependency, or a transitive dependency.
- You can only write a file that you are declared to write, or that no one calls
needon.
Additionally, you can ignore certain missing rules with --lint-ignore=PATTERN. In general all files passed to trackRead or trackWrite are expected to be relative to the current directory, so --lint-ignore patterns should match those relative paths.
Automatic tracking functions
Using fsatrace you can augment command line programs (called with cmd or command) to automatically track which files they read and write, which turn into trackRead and trackWrite calls. To enable this feature pass --lint-fsatrace=DIR passing the directories you want to lint. Passing --lint-fsatrace is equivalent to --lint-fsatrace=. - namely only lint the current directory.
This feature requires fsatrace to be on the $PATH, as documented on the homepage. If you are using Windows, you can download a binary release here.