2 goredo -- djb's redo implementation on pure Go
3 Copyright (C) 2020-2022 Sergey Matveev <stargrave@stargrave.org>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, version 3 of the License.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
28 Warranty = `Copyright (C) 2020-2022 Sergey Matveev
30 This program is free software: you can redistribute it and/or modify
31 it under the terms of the GNU General Public License as published by
32 the Free Software Foundation, version 3 of the License.
34 This program is distributed in the hope that it will be useful,
35 but WITHOUT ANY WARRANTY; without even the implied warranty of
36 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
37 GNU General Public License for more details.
39 You should have received a copy of the GNU General Public License
40 along with this program. If not, see <http://www.gnu.org/licenses/>.`
43 func usage(cmd string) {
47 d = `Usage: redo [-j X] [-k] [-s] [-x|-xx] [options] [target ...]
49 Forcefully and *sequentially* build specified targets.
50 If no targets specified, then use "all" one.`
51 case CmdNameRedoIfchange:
52 d = `Usage: redo-ifchange [-j X] [-k] [-s] [-x|-xx] target [...]
54 Build specified targets in parallel, if they are changed.
55 Record them as dependencies for current target.`
56 case CmdNameRedoIfcreate:
57 d = `Usage: redo-ifcreate target [...]
59 Record ifcreate dependency for current target. Unusable outside .do.`
60 case CmdNameRedoAlways:
61 d = `Usage: redo-always
63 Always build current target. Unusable outside .do.`
64 case CmdNameRedoCleanup:
65 d = `Usage: redo-cleanup [-n] {full,log,tmp} [...]
67 Remove either all goredo's related temporary files, or kept stderr
68 logs, or everything (including .redo directories) related.`
70 d = `Usage: redo-log [-c] [-r] target [ | tai64nlocal ]
72 Display kept target's stderr with TAI64N timestamped lines. Only the
73 last build is kept. You must enable stderr keeping with either -logs,
74 or REDO_LOGS=1. -c option show the exact command invoked, start and
75 finish time. -r option recursively and linearly show also all deeper
76 redo calls and their logs.`
78 d = `Usage: redo-dot target [...]
80 Write dependency DOT graph to stdout.`
81 case CmdNameRedoStamp:
82 d = `Usage: redo-stamp < [$3]
84 Record stamp dependency for current target. Unusable outside .do.
85 Stamp dependency does not play any role, as all targets are hashed
87 case CmdNameRedoWhichdo:
88 d = `Usage: redo-whichdo target
90 Display .do search paths for specified target. Exits successfully
91 if the last .do in output if the found existing one.`
92 case CmdNameRedoTargets:
93 d = `Usage: redo-targets [target ...]
95 List all currently known targets.`
96 case CmdNameRedoSources:
97 d = `Usage: redo-sources [target ...]
99 List all currently known source files.`
101 d = `Usage: redo-ood [target ...]
103 List all currently known out-of-date targets.`
104 case CmdNameRedoAffects:
105 d = `Usage: redo-affects target [...]
107 List all targets that will be affected by changing the specified ones.`
108 case CmdNameRedoDepFix:
109 d = `Usage: redo-depfix
111 Traverse over all .redo directories beneath and check if inode's information
112 (ctime/mtime) differs. Update dependency if file's content is still the same.`
114 d = `Usage: goredo -symlinks
116 goredo expects to be called through the symbolic link to it.
117 Available commands: redo, redo-affects, redo-always, redo-cleanup,
118 redo-depfix, redo-dot, redo-ifchange, redo-ifcreate, redo-log,
119 redo-ood, redo-sources, redo-stamp, redo-targets, redo-whichdo.`
121 fmt.Fprintf(os.Stderr, "%s\n\nCommon options:\n", d)
123 fmt.Fprintln(os.Stderr, `
124 Additional environment variables:
125 NO_COLOR -- disable messages colouring
126 REDO_TOP_DIR -- do not search for .do above that directory
127 (it can contain .redo/top as an alternative)`)
128 if cmd == CmdNameRedo || cmd == CmdNameRedoIfchange {
129 fmt.Fprintln(os.Stderr, `
130 REDO_NO_SYNC -- disable files/directories explicit filesystem syncing
131 REDO_INODE_TRUST -- {none,ctime,mtime}, either do not trust inode
132 information at all (always check size and hash), or
133 trust its ctime (the default one), or be satisfied
135 REDO_MAKE -- bmake/gmake/none(default) jobserver protocol compatibility`)