diff mbox series

Makefile: add help target

Message ID 20220408074524.156165-1-gitter.spiros@gmail.com (mailing list archive)
State New, archived
Headers show
Series Makefile: add help target | expand

Commit Message

Elia Pinto April 8, 2022, 7:45 a.m. UTC
Add a help target to the Makefile to be able to run make help, in the same way
does the Makefiles self-generated by some build systems.

The target list has been statically extracted from the git Makefile with a
script and the results have been filtered in an essentially arbitrary way to
leave the ones that i imagines most interesting and frequent for a developer.

Signed-off-by: Elia Pinto <gitter.spiros@gmail.com>
---
The toy script I used is here
https://gist.github.com/devzero2000/cb887a6ba2764f7234191e560b64b7c8#file-list_targets_makefile-sh
 Makefile | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)

Comments

Philip Oakley April 8, 2022, 9:32 a.m. UTC | #1
On 08/04/2022 08:45, Elia Pinto wrote:
> Add a help target to the Makefile to be able to run make help, in the same way
> does the Makefiles self-generated by some build systems.
>
> The target list has been statically extracted from the git Makefile with a
> script and the results have been filtered in an essentially arbitrary way to
> leave the ones that i imagines most interesting and frequent for a developer.
>
> Signed-off-by: Elia Pinto <gitter.spiros@gmail.com>
> ---
> The toy script I used is here
> https://gist.github.com/devzero2000/cb887a6ba2764f7234191e560b64b7c8#file-list_targets_makefile-sh
>  Makefile | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 63 insertions(+)
>
> diff --git a/Makefile b/Makefile
> index e8aba291d7..f6d6de2eb9 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -3448,3 +3448,66 @@ $(FUZZ_PROGRAMS): all
>  		$(XDIFF_OBJS) $(EXTLIBS) git.o $@.o $(LIB_FUZZING_ENGINE) -o $@
>  
>  fuzz-all: $(FUZZ_PROGRAMS)
> +
> +# Help Target
> +help:
> +	@echo "The following are some of the valid targets for this Makefile:"
> +	@echo "... all (the default if no target is provided)"
> +	@echo "... build-perl-script"
> +	@echo "... build-python-script"
> +	@echo "... build-sh-script"
> +	@echo "... check"
> +	@echo "... check-builtins"
> +	@echo "... check-docs"
> +	@echo "... check-sha1"
> +	@echo "... clean"
> +	@echo "... clean-perl-script"
> +	@echo "... clean-python-script"
> +	@echo "... clean-sh-script"
> +	@echo "... coccicheck"
> +	@echo "... coccicheck-pending"
> +	@echo "... cocciclean"
> +	@echo "... configure"
> +	@echo "... coverage"
> +	@echo "... coverage-clean"
> +	@echo "... coverage-clean-results"
> +	@echo "... coverage-compile"
> +	@echo "... coverage-prove"
> +	@echo "... coverage-report"
> +	@echo "... coverage-test"
> +	@echo "... coverage-untested-functions"
> +	@echo "... cover_db"
> +	@echo "... cover_db_html"
> +	@echo "... cscope"
> +	@echo "... dist"
> +	@echo "... distclean"
> +	@echo "... dist-doc"
> +	@echo "... doc"
> +	@echo "... fuzz-all"
> +	@echo "... fuzz-commit-graph"
> +	@echo "... fuzz-objs"
> +	@echo "... fuzz-pack-headers"
> +	@echo "... fuzz-pack-idx"
> +	@echo "... html"
> +	@echo "... info"
> +	@echo "... install"
> +	@echo "... man"
> +	@echo "... pdf"
> +	@echo "... perf"
> +	@echo "... profile"
> +	@echo "... profile-clean"
> +	@echo "... profile-fast"
> +	@echo "... profile-fast-install"
> +	@echo "... profile-install"
> +	@echo "... quick-install-doc"
> +	@echo "... quick-install-html"
> +	@echo "... quick-install-man"
> +	@echo "... reconfigure"
> +	@echo "... rpm"
> +	@echo "... sparse"
> +	@echo "... strip"
> +	@echo "... style"
> +	@echo "... tags"
> +	@echo "... TAGS"
> +	@echo "... test"
> +.PHONY : help

Makes me realise how many areas I'm unfamiliar with, .. which is a help. ;-)
--
Philip
Taylor Blau April 8, 2022, 3:30 p.m. UTC | #2
On Fri, Apr 08, 2022 at 07:45:24AM +0000, Elia Pinto wrote:
> Add a help target to the Makefile to be able to run make help, in the same way
> does the Makefiles self-generated by some build systems.
>
> The target list has been statically extracted from the git Makefile with a
> script and the results have been filtered in an essentially arbitrary way to
> leave the ones that i imagines most interesting and frequent for a developer.

I could definitely see something like "make help" being helpful, since
make itself doesn't have a convenient way to list all of a Makefile's
targets.

I worry about this list getting stale, though. If we add a new target,
will we remember to update the "help" list here? It would be nice if we
could dynamically generate this list, but I think that loses out on the
filtering you've done here.

Thanks,
Taylor
Ævar Arnfjörð Bjarmason April 8, 2022, 3:44 p.m. UTC | #3
On Fri, Apr 08 2022, Taylor Blau wrote:

> On Fri, Apr 08, 2022 at 07:45:24AM +0000, Elia Pinto wrote:
>> Add a help target to the Makefile to be able to run make help, in the same way
>> does the Makefiles self-generated by some build systems.
>>
>> The target list has been statically extracted from the git Makefile with a
>> script and the results have been filtered in an essentially arbitrary way to
>> leave the ones that i imagines most interesting and frequent for a developer.
>
> I could definitely see something like "make help" being helpful, since
> make itself doesn't have a convenient way to list all of a Makefile's
> targets.
>
> I worry about this list getting stale, though. If we add a new target,
> will we remember to update the "help" list here? It would be nice if we
> could dynamically generate this list, but I think that loses out on the
> filtering you've done here.

There's some nice suggestions at:
https://stackoverflow.com/questions/4219255/how-do-you-get-the-list-of-targets-in-a-makefile

I managed to get pretty close to this by massaging the various parsers
that were suggested there.

But I wonder if defining help as we go along wouldn't be the best and
least likely to break, and most likely to be kept up-to-date. I.e. some
variant of the comments added there.

Or better (maybe it's discussed in that SO thing, I didn't skim it all),
something like:

    HELP_all = the default target
    all::
    [...]

We could then even print a heading showing what target(s) we're running
by looking at MAKECMDGOALS.

Also, Elia's ad-hoc script here copied from StackOverflow looks awfully
similar to what I have in /usr/share/bash-completion/completions/make
installed with my OS. Available here:
https://github.com/scop/bash-completion/blob/master/completions/make

So maybe we could just make this an optional target that depended on
that widely-available bash completion?

That would also have the nice benefit that to the extent that the output
sucked we could maybe massage our Makefile a bit to make it better, and
then we'd not only benefit "make help" users, but anyone doing "make
<TAB>".
Junio C Hamano April 8, 2022, 6:58 p.m. UTC | #4
Taylor Blau <me@ttaylorr.com> writes:

> I could definitely see something like "make help" being helpful, since
> make itself doesn't have a convenient way to list all of a Makefile's
> targets.

But is listing all useful to begin with?  I doubt it.

Most useful targets are all .PHONYs, so a possible approach is to
make them double-colon rules, and have a section at the top, next to
where we explain "# The default target of this Makefile is...", that
lists all of them there, and have a rule

	# The default target of this Makefile is...
	all::
	+# Common targets
	+test::
	+doc::
	+...
        +help::
        +        sed -e '/help::/q' Makefile
        # Import tree-wide shared Makefile behavior and libraries
        include shared.mak

perhaps?

> I worry about this list getting stale, though.

Absolutely.

A well-curated list of common targets, maybe, but I find nothing
interesting in the posted patch that lists way too many.

I also suspect that a well-curated list at the top would eliminate
the need for the "help" target in the first place.  Between "make
help" and "less Makefile", the latter is much more intuitive.

Thanks.
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index e8aba291d7..f6d6de2eb9 100644
--- a/Makefile
+++ b/Makefile
@@ -3448,3 +3448,66 @@  $(FUZZ_PROGRAMS): all
 		$(XDIFF_OBJS) $(EXTLIBS) git.o $@.o $(LIB_FUZZING_ENGINE) -o $@
 
 fuzz-all: $(FUZZ_PROGRAMS)
+
+# Help Target
+help:
+	@echo "The following are some of the valid targets for this Makefile:"
+	@echo "... all (the default if no target is provided)"
+	@echo "... build-perl-script"
+	@echo "... build-python-script"
+	@echo "... build-sh-script"
+	@echo "... check"
+	@echo "... check-builtins"
+	@echo "... check-docs"
+	@echo "... check-sha1"
+	@echo "... clean"
+	@echo "... clean-perl-script"
+	@echo "... clean-python-script"
+	@echo "... clean-sh-script"
+	@echo "... coccicheck"
+	@echo "... coccicheck-pending"
+	@echo "... cocciclean"
+	@echo "... configure"
+	@echo "... coverage"
+	@echo "... coverage-clean"
+	@echo "... coverage-clean-results"
+	@echo "... coverage-compile"
+	@echo "... coverage-prove"
+	@echo "... coverage-report"
+	@echo "... coverage-test"
+	@echo "... coverage-untested-functions"
+	@echo "... cover_db"
+	@echo "... cover_db_html"
+	@echo "... cscope"
+	@echo "... dist"
+	@echo "... distclean"
+	@echo "... dist-doc"
+	@echo "... doc"
+	@echo "... fuzz-all"
+	@echo "... fuzz-commit-graph"
+	@echo "... fuzz-objs"
+	@echo "... fuzz-pack-headers"
+	@echo "... fuzz-pack-idx"
+	@echo "... html"
+	@echo "... info"
+	@echo "... install"
+	@echo "... man"
+	@echo "... pdf"
+	@echo "... perf"
+	@echo "... profile"
+	@echo "... profile-clean"
+	@echo "... profile-fast"
+	@echo "... profile-fast-install"
+	@echo "... profile-install"
+	@echo "... quick-install-doc"
+	@echo "... quick-install-html"
+	@echo "... quick-install-man"
+	@echo "... reconfigure"
+	@echo "... rpm"
+	@echo "... sparse"
+	@echo "... strip"
+	@echo "... style"
+	@echo "... tags"
+	@echo "... TAGS"
+	@echo "... test"
+.PHONY : help