git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Makefile: Add help target
@ 2010-09-28  8:13 Stephen Boyd
  2010-09-28  9:45 ` Junio C Hamano
  0 siblings, 1 reply; 24+ messages in thread
From: Stephen Boyd @ 2010-09-28  8:13 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano

Today I forgot whether the target was quick-install-doc or
install-quick-doc and had to open the Makefile again to find out. I'd
rather not do that and just use:

	$ make help

to get a quick summary of the interesting targets when my brain fails to
refresh. Add a help target, but don't add uninteresting things like
strip, install-gitweb, or targets which alias (install-man).

Signed-off-by: Stephen Boyd <bebarino@gmail.com>
---
 Makefile |   40 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/Makefile b/Makefile
index b7a62cf..8c8fcb0 100644
--- a/Makefile
+++ b/Makefile
@@ -2366,3 +2366,43 @@ cover_db: coverage-report
 
 cover_db_html: cover_db
 	cover -report html -outputdir cover_db_html cover_db
+
+help:
+	@echo 'Cleaning targets:'
+	@echo '  clean      - Remove generated files but keep the configure script'
+	@echo '  distclean  - Remove generated files and the configure script'
+	@echo
+	@echo 'Packaging targets:'
+	@echo '  dist       - Build git-$(GIT_VERSION).tar.gz source tarball'
+	@echo '  rpm        - Build source and binary RPM packages'
+	@echo '  dist-doc   - Build $(manpages).tar.gz and $(htmldocs).tar.gz'
+	@echo
+	@echo 'Documentation targets:'
+	@echo '  doc     - Build man pages and HTML docs'
+	@echo '  man     - Build man pages'
+	@echo '  html    - Build HTML docs'
+	@echo '  info    - Build info docs'
+	@echo '  pdf     - Build PDF docs'
+	@echo
+	@echo 'Installation targets:'
+	@echo '  install             - Install the git suite'
+	@echo '  install-doc         - Install man pages'
+	@echo '  install-html        - Install HTML docs'
+	@echo '  install-info        - Install info docs'
+	@echo '  install-pdf         - Install PDF docs'
+	@echo '  quick-install-doc   - Install pregenerated man pages from origin/man'
+	@echo '  quick-install-html  - Install pregenerated HTML pages from origin/html'
+	@echo
+	@echo 'Common targets:'
+	@echo '  all            - Build the git suite'
+	@echo '  test           - Run the git test suite'
+	@echo
+	@echo 'Other targets:'
+	@echo '  tags/TAGS      - Generate tags for editors'
+	@echo '  cscope         - Generate cscope index'
+	@echo '  coverage       - Build git with gcov support and run the test suite'
+	@echo '  cover_db_html  - Generate HTML coverage report of the test suite coverage'
+	@echo '  check          - Check C sources with sparse'
+	@echo
+	@echo '  make V=1 [targets] verbose build'
+	@echo
-- 
1.7.3.16.g5d4d9

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH] Makefile: Add help target
  2010-09-28  8:13 [PATCH] Makefile: Add help target Stephen Boyd
@ 2010-09-28  9:45 ` Junio C Hamano
  2010-09-28 11:37   ` Sverre Rabbelier
  2010-09-29  6:10   ` [PATCH] Makefile: Add " yj2133011
  0 siblings, 2 replies; 24+ messages in thread
From: Junio C Hamano @ 2010-09-28  9:45 UTC (permalink / raw)
  To: Stephen Boyd; +Cc: git

Not interested, at least in the current form.

I do not look forward to having to maintain a large number of lines that
are doomed to go stale, and every time we need to touch we need to deal
with a lot of noise "@echo '"?  No thanks.

It might be a bit less distasteful if it were plain text additions at the
end of INSTALL file, though.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] Makefile: Add help target
  2010-09-28  9:45 ` Junio C Hamano
@ 2010-09-28 11:37   ` Sverre Rabbelier
  2010-09-28 12:35     ` Andreas Ericsson
  2010-09-29  6:10   ` [PATCH] Makefile: Add " yj2133011
  1 sibling, 1 reply; 24+ messages in thread
From: Sverre Rabbelier @ 2010-09-28 11:37 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Stephen Boyd, git

Heya,

On Tue, Sep 28, 2010 at 11:45, Junio C Hamano <gitster@pobox.com> wrote:
> I do not look forward to having to maintain a large number of lines that
> are doomed to go stale

How often have we changed makefile targets recently? The most recent
one that I can find is Jakub adding "install-gitweb" in 152d94348f,
which was back in May 1st. The next one before that is the addition of
'gitweb' in 62331ef1637f which was back in January 30th. Besides,
'make help' doesn't have to contain _all_ Makefile targets, just the
important ones that a user is most likely to need. Similar to 'git
help' itself.

> and every time we need to touch we need to deal
> with a lot of noise "@echo '"?

I don't understand what is particularly bothersome about the leading
"@echo" lines. Adding or removing a target is still very easy even
with the leading @echo's, the only thing that would be a PITA is
reflowing paragraphs, currently, there _are_ no paragraphs, everything
fits on one line.

> It might be a bit less distasteful if it were plain text additions at the
> end of INSTALL file, though.

That does not help me nearly as much when I want to know how a
makefile target is called. Am I wrong in asserting that having a "make
help" target is an accepted "good practice" in the unix world?

-- 
Cheers,

Sverre Rabbelier

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] Makefile: Add help target
  2010-09-28 11:37   ` Sverre Rabbelier
@ 2010-09-28 12:35     ` Andreas Ericsson
  2010-09-28 14:44       ` [PATCH] Makefile: implement " Michael J Gruber
  0 siblings, 1 reply; 24+ messages in thread
From: Andreas Ericsson @ 2010-09-28 12:35 UTC (permalink / raw)
  To: Sverre Rabbelier; +Cc: Junio C Hamano, Stephen Boyd, git

On 09/28/2010 01:37 PM, Sverre Rabbelier wrote:
> Heya,
> 
> On Tue, Sep 28, 2010 at 11:45, Junio C Hamano<gitster@pobox.com>  wrote:
>> I do not look forward to having to maintain a large number of lines that
>> are doomed to go stale
> 
> How often have we changed makefile targets recently? The most recent
> one that I can find is Jakub adding "install-gitweb" in 152d94348f,
> which was back in May 1st. The next one before that is the addition of
> 'gitweb' in 62331ef1637f which was back in January 30th. Besides,
> 'make help' doesn't have to contain _all_ Makefile targets, just the
> important ones that a user is most likely to need. Similar to 'git
> help' itself.
> 
>> and every time we need to touch we need to deal
>> with a lot of noise "@echo '"?
> 
> I don't understand what is particularly bothersome about the leading
> "@echo" lines. Adding or removing a target is still very easy even
> with the leading @echo's, the only thing that would be a PITA is
> reflowing paragraphs, currently, there _are_ no paragraphs, everything
> fits on one line.
> 
>> It might be a bit less distasteful if it were plain text additions at the
>> end of INSTALL file, though.
> 
> That does not help me nearly as much when I want to know how a
> makefile target is called. Am I wrong in asserting that having a "make
> help" target is an accepted "good practice" in the unix world?
> 

help:
    @echo Available make targets:
    @echo -----------------------
    @$(MAKE) --print-data-base --question | \
	sed -n -e '/^Makefile/d' -e 's/^\([a-z0-9_-]*\):.*/\1/p' | \
	sort | uniq | grep -v -e ^git -e ^test-

Automatically self-managing and seems to print most sensible targets.
Adjust to taste with whatever's appropriate.

Users with a too-old make program (pre 3.67, I think), won't be able
to use the help target, but that's perfectly acceptable imo.

-- 
Andreas Ericsson                   andreas.ericsson@op5.se
OP5 AB                             www.op5.se
Tel: +46 8-230225                  Fax: +46 8-230231

Considering the successes of the wars on alcohol, poverty, drugs and
terror, I think we should give some serious thought to declaring war
on peace.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH] Makefile: implement help target
  2010-09-28 12:35     ` Andreas Ericsson
@ 2010-09-28 14:44       ` Michael J Gruber
  2010-09-28 14:48         ` Sverre Rabbelier
                           ` (2 more replies)
  0 siblings, 3 replies; 24+ messages in thread
From: Michael J Gruber @ 2010-09-28 14:44 UTC (permalink / raw)
  To: git; +Cc: Junio C Hamano, Stephen Boyd, Andreas Ericsson, Sverre Rabbelier

with automatic help text collection from lines starting with "#H# " and
preceding a make target.

Suggested-by: Stephen Boyd <bebarino@gmail.com>
Helped-by: Andreas Ericsson <andreas.ericsson@op5.se>
Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
---
How's this for a version without maintenance issues?
We could sort differently, of course, or at a category key (build, doc, etc.)
but let's not go too far. Currently, the output of make help is:

GIT_VERSION = 1.7.3.99.gc16e8
dist                : Build git-$(GIT_VERSION).tar.gz source
html                : Build HTML doc
info                : Build info docs
man                 : Build man pages
doc                 : Build man pages and HTML docs
dist-doc            : Build $(manpages).tar.gz and $(htmldocs).tar.gz
pdf                 : Build PDF docs
rpm                 : Build source and binary RPM packages
check-docs          : Check documentation coverage
coverage            : Check test coverage
cover_db_html       : Check test coverage and create HTMl report
test                : Check the build by running the test suite
cscope              : Generate cscope index
tags                : Generate tags using ctags
install-html        : Install HTML docs
install-info        : Install info docs
install-doc         : Install man pages
install-man         : Install man pages
install-pdf         : Install PDF docs
quick-install-html  : Install pregenerated HTML pages from origin/html
quick-install-doc   : Install pregenerated man pages from origin/man
quick-install-man   : Install pregenerated man pages from origin/man
install             : Install the git suite
distclean           : Remove generated files and the configure script
clean               : Remove generated files but keep the configure script
help                : Show help for main make targets

 Makefile |   38 ++++++++++++++++++++++++++++++++++++--
 1 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index db2efd6..187a8a2 100644
--- a/Makefile
+++ b/Makefile
@@ -1952,29 +1952,37 @@ $(XDIFF_LIB): $(XDIFF_OBJS)
 $(VCSSVN_LIB): $(VCSSVN_OBJS)
 	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(VCSSVN_OBJS)
 
+#H# Build man pages and HTML docs
 doc:
 	$(MAKE) -C Documentation all
 
+#H# Build man pages
 man:
 	$(MAKE) -C Documentation man
 
+#H# Build HTML doc
 html:
 	$(MAKE) -C Documentation html
 
+#H# Build info docs
 info:
 	$(MAKE) -C Documentation info
 
+#H# Build PDF docs
 pdf:
 	$(MAKE) -C Documentation pdf
 
+#H# Generate tags using etags
 TAGS:
 	$(RM) TAGS
 	$(FIND) . -name '*.[hcS]' -print | xargs etags -a
 
+#H# Generate tags using ctags
 tags:
 	$(RM) tags
 	$(FIND) . -name '*.[hcS]' -print | xargs ctags -a
 
+#H# Generate cscope index
 cscope:
 	$(RM) cscope*
 	$(FIND) . -name '*.[hcS]' -print | xargs cscope -b
@@ -2040,6 +2048,7 @@ export NO_SVN_TESTS
 
 ### Testing rules
 
+#H# Check the build by running the test suite
 test: all
 	$(MAKE) -C t/ all
 
@@ -2099,6 +2108,7 @@ export gitexec_instdir
 
 install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)
 
+#H# Install the git suite
 install: all
 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
@@ -2155,27 +2165,35 @@ endif
 install-gitweb:
 	$(MAKE) -C gitweb install
 
+#H# Install man pages
 install-doc:
 	$(MAKE) -C Documentation install
 
+#H# Install man pages
 install-man:
 	$(MAKE) -C Documentation install-man
 
+#H# Install HTML docs
 install-html:
 	$(MAKE) -C Documentation install-html
 
+#H# Install info docs
 install-info:
 	$(MAKE) -C Documentation install-info
 
+#H# Install PDF docs
 install-pdf:
 	$(MAKE) -C Documentation install-pdf
 
+#H# Install pregenerated man pages from origin/man
 quick-install-doc:
 	$(MAKE) -C Documentation quick-install
 
+#H# Install pregenerated man pages from origin/man
 quick-install-man:
 	$(MAKE) -C Documentation quick-install-man
 
+#H# Install pregenerated HTML pages from origin/html
 quick-install-html:
 	$(MAKE) -C Documentation quick-install-html
 
@@ -2188,6 +2206,7 @@ git.spec: git.spec.in
 	mv $@+ $@
 
 GIT_TARNAME=git-$(GIT_VERSION)
+#H# Build git-$(GIT_VERSION).tar.gz source
 dist: git.spec git-archive$(X) configure
 	./git-archive --format=tar \
 		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
@@ -2203,6 +2222,7 @@ dist: git.spec git-archive$(X) configure
 	@$(RM) -r $(GIT_TARNAME)
 	gzip -f -9 $(GIT_TARNAME).tar
 
+#H# Build source and binary RPM packages
 rpm: dist
 	$(RPMBUILD) \
 		--define "_source_filedigest_algorithm md5" \
@@ -2211,6 +2231,8 @@ rpm: dist
 
 htmldocs = git-htmldocs-$(GIT_VERSION)
 manpages = git-manpages-$(GIT_VERSION)
+
+#H# Build $(manpages).tar.gz and $(htmldocs).tar.gz
 dist-doc:
 	$(RM) -r .doc-tmp-dir
 	mkdir .doc-tmp-dir
@@ -2230,10 +2252,11 @@ dist-doc:
 	$(RM) -r .doc-tmp-dir
 
 ### Cleaning rules
-
+#H# Remove generated files and the configure script
 distclean: clean
 	$(RM) configure
 
+#H# Remove generated files but keep the configure script
 clean:
 	$(RM) *.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o xdiff/*.o vcs-svn/*.o \
 		builtin/*.o $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
@@ -2268,7 +2291,7 @@ endif
 .PHONY: FORCE TAGS tags cscope
 
 ### Check documentation
-#
+#H# Check documentation coverage
 check-docs::
 	@(for v in $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git gitk; \
 	do \
@@ -2335,6 +2358,7 @@ check-builtins::
 #
 .PHONY: coverage coverage-clean coverage-build coverage-report
 
+#H# Check test coverage
 coverage:
 	$(MAKE) coverage-build
 	$(MAKE) coverage-report
@@ -2370,5 +2394,15 @@ coverage-untested-functions: coverage-report
 cover_db: coverage-report
 	gcov2perl -db cover_db *.gcov
 
+#H# Check test coverage and create HTMl report
 cover_db_html: cover_db
 	cover -report html -outputdir cover_db_html cover_db
+
+#H# Show help for main make targets
+help:
+	@sed -n  -e '/^#H#/ {N'\
+		-e 's/^#H# \(.*\)\n\([a-z0-9_-]*\):.*/\2 \1/p'\
+		-e '}' <Makefile | sort --key=2 | while read target txt;\
+	do \
+		printf "%-20s: %s\n" "$$target" "$$txt"; \
+	done
-- 
1.7.3.98.g5ad7d

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH] Makefile: implement help target
  2010-09-28 14:44       ` [PATCH] Makefile: implement " Michael J Gruber
@ 2010-09-28 14:48         ` Sverre Rabbelier
  2010-09-28 14:57           ` Zbyszek Szmek
  2010-09-28 14:54         ` Ævar Arnfjörð Bjarmason
  2010-09-28 15:33         ` Junio C Hamano
  2 siblings, 1 reply; 24+ messages in thread
From: Sverre Rabbelier @ 2010-09-28 14:48 UTC (permalink / raw)
  To: Michael J Gruber; +Cc: git, Junio C Hamano, Stephen Boyd, Andreas Ericsson

Heya,

On Tue, Sep 28, 2010 at 16:44, Michael J Gruber
<git@drmicha.warpmail.net> wrote:
> with automatic help text collection from lines starting with "#H# " and
> preceding a make target.

I don't know about the "#H#" in particular, but documenting what each
target does is a Good Thing (tm) in the first place, re-using that
documentation for 'make help' is even better.

> We could sort differently, of course, or at a category key (build, doc, etc.)

I think just sorting alphabetically would be a good start. Maybe pipe
the whole thing through sort?

-- 
Cheers,

Sverre Rabbelier

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] Makefile: implement help target
  2010-09-28 14:44       ` [PATCH] Makefile: implement " Michael J Gruber
  2010-09-28 14:48         ` Sverre Rabbelier
@ 2010-09-28 14:54         ` Ævar Arnfjörð Bjarmason
  2010-09-28 15:33         ` Junio C Hamano
  2 siblings, 0 replies; 24+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2010-09-28 14:54 UTC (permalink / raw)
  To: Michael J Gruber
  Cc: git, Junio C Hamano, Stephen Boyd, Andreas Ericsson,
	Sverre Rabbelier

On Tue, Sep 28, 2010 at 14:44, Michael J Gruber
<git@drmicha.warpmail.net> wrote:

> +#H# Check test coverage and create HTMl report

HTML, not HTMl

>  cover_db_html: cover_db
>        cover -report html -outputdir cover_db_html cover_db
> +
> +#H# Show help for main make targets

How about something less opaque, like "# Help: Show help [...]" or "#
About:". It would serve the same purpose as #H#, without the reader
wondering what that odd string means.

> +help:
> +       @sed -n  -e '/^#H#/ {N'\
> +               -e 's/^#H# \(.*\)\n\([a-z0-9_-]*\):.*/\2 \1/p'\
> +               -e '}' <Makefile | sort --key=2 | while read target txt;\
> +       do \
> +               printf "%-20s: %s\n" "$$target" "$$txt"; \
> +       done

Looks good, but --key=2 isn't in POSIX.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] Makefile: implement help target
  2010-09-28 14:48         ` Sverre Rabbelier
@ 2010-09-28 14:57           ` Zbyszek Szmek
  0 siblings, 0 replies; 24+ messages in thread
From: Zbyszek Szmek @ 2010-09-28 14:57 UTC (permalink / raw)
  To: Sverre Rabbelier
  Cc: Michael J Gruber, git, Junio C Hamano, Stephen Boyd,
	Andreas Ericsson

Hi,
the original output (divided into documentation, building, cleaning, etc.)
seems to be much more readable. Maybe a sort key could be added to the
begging of the help message and then stripped before output?
Something like:
  # Help: Building: compile everything
  all:
  
  # Help: Cleaning: remove things
  clean:

Best,
Zbyszek

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] Makefile: implement help target
  2010-09-28 14:44       ` [PATCH] Makefile: implement " Michael J Gruber
  2010-09-28 14:48         ` Sverre Rabbelier
  2010-09-28 14:54         ` Ævar Arnfjörð Bjarmason
@ 2010-09-28 15:33         ` Junio C Hamano
  2010-09-28 15:47           ` Michael J Gruber
  2 siblings, 1 reply; 24+ messages in thread
From: Junio C Hamano @ 2010-09-28 15:33 UTC (permalink / raw)
  To: Michael J Gruber; +Cc: git, Stephen Boyd, Andreas Ericsson, Sverre Rabbelier

Michael J Gruber <git@drmicha.warpmail.net> writes:

> How's this for a version without maintenance issues?

Something along these lines would be closer to what I had in mind,
actually.

Traditionally a multi-line sed command embed in Makefile has been
portability nightmare, which is a bit worrysome.

Isn't there a "makedoc" ala "perldoc" or "javadoc", by the way?

> ...
> +#H# Show help for main make targets
> +help:
> +	@sed -n  -e '/^#H#/ {N'\
> +		-e 's/^#H# \(.*\)\n\([a-z0-9_-]*\):.*/\2 \1/p'\
> +		-e '}' <Makefile | sort --key=2 | while read target txt;\
> +	do \
> +		printf "%-20s: %s\n" "$$target" "$$txt"; \
> +	done
> -- 
> 1.7.3.98.g5ad7d

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] Makefile: implement help target
  2010-09-28 15:33         ` Junio C Hamano
@ 2010-09-28 15:47           ` Michael J Gruber
  2010-09-28 16:04             ` Ævar Arnfjörð Bjarmason
  0 siblings, 1 reply; 24+ messages in thread
From: Michael J Gruber @ 2010-09-28 15:47 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Stephen Boyd, Andreas Ericsson, Sverre Rabbelier

Junio C Hamano venit, vidit, dixit 28.09.2010 17:33:
> Michael J Gruber <git@drmicha.warpmail.net> writes:
> 
>> How's this for a version without maintenance issues?
> 
> Something along these lines would be closer to what I had in mind,
> actually.
> 
> Traditionally a multi-line sed command embed in Makefile has been
> portability nightmare, which is a bit worrysome.

Yes, but I thought for "make help" it's not such problem if it works on
most platforms only - others can read inline ;)

If portability is an issue one can work around it - is "grep -A 1"
portable? I'd also have to get rid of sort --key=2.

> Isn't there a "makedoc" ala "perldoc" or "javadoc", by the way?

There is a "makedoc" but that's something different...

Michael

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] Makefile: implement help target
  2010-09-28 15:47           ` Michael J Gruber
@ 2010-09-28 16:04             ` Ævar Arnfjörð Bjarmason
  2010-09-28 20:38               ` [PATCHv2] " Michael J Gruber
  0 siblings, 1 reply; 24+ messages in thread
From: Ævar Arnfjörð Bjarmason @ 2010-09-28 16:04 UTC (permalink / raw)
  To: Michael J Gruber
  Cc: Junio C Hamano, git, Stephen Boyd, Andreas Ericsson,
	Sverre Rabbelier

On Tue, Sep 28, 2010 at 15:47, Michael J Gruber
<git@drmicha.warpmail.net> wrote:
> If portability is an issue one can work around it - is "grep -A 1"
> portable? I'd also have to get rid of sort --key=2.

No says http://man.cx/grep(1posix)

On the other hand I don't think portability is that important here.

But if you want to make it portable using awk to do most of the work
is probably easiest.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCHv2] Makefile: implement help target
  2010-09-28 16:04             ` Ævar Arnfjörð Bjarmason
@ 2010-09-28 20:38               ` Michael J Gruber
  2010-09-28 20:51                 ` Sverre Rabbelier
                                   ` (3 more replies)
  0 siblings, 4 replies; 24+ messages in thread
From: Michael J Gruber @ 2010-09-28 20:38 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Stephen Boyd, Andreas Ericsson, Sverre Rabbelier,
	Ævar Arnfjörð Bjarmason

with automatic help text collection from lines starting with "# Help: " and
preceding a make target.

Suggested-by: Stephen Boyd <bebarino@gmail.com>
Helped-by: Andreas Ericsson <andreas.ericsson@op5.se>
Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
---
Now how's this for portability and such? New output:

Build targets:
    all:                Build the Git suite
    dist:               Build git-$(GIT_VERSION).tar.gz source
    dist-doc:           Build $(manpages).tar.gz and $(htmldocs).tar.gz
    doc:                Build man pages and HTML docs
    html:               Build HTML doc
    info:               Build info docs
    man:                Build man pages
    pdf:                Build PDF docs
    rpm:                Build source and binary RPM packages
Clean targets:
    clean:              Remove generated files but keep the configure script
    distclean:          Remove generated files and the configure script
Develop targets:
    cscope:             Generate cscope index
    tags:               Generate tags using ctags
    TAGS:               Generate tags using etags
Help targets:
    help:               Show help for main make targets
Install targets:
    install-doc:        Install man pages
    install-html:       Install HTML docs
    install-info:       Install info docs
    install:            Install the Git suite
    install-man:        Install man pages
    install-pdf:        Install PDF docs
    quick-install-doc:  Install pregenerated man pages from origin/man
    quick-install-html: Install pregenerated HTML pages from origin/html
    quick-install-man:  Install pregenerated man pages from origin/man
Test targets:
    check-docs:         Check documentation coverage
    coverage:           Check test coverage
    cover_db_html:      Check test coverage and create HTML report
    test:               Check the build by running the test suite

 Makefile |   43 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 41 insertions(+), 2 deletions(-)

diff --git a/Makefile b/Makefile
index db2efd6..497dd92 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,5 @@
 # The default target of this Makefile is...
+# Help: Build: Build the Git suite
 all::
 
 # Define V=1 to have a more verbose compile.
@@ -1952,29 +1953,37 @@ $(XDIFF_LIB): $(XDIFF_OBJS)
 $(VCSSVN_LIB): $(VCSSVN_OBJS)
 	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(VCSSVN_OBJS)
 
+# Help: Build: Build man pages and HTML docs
 doc:
 	$(MAKE) -C Documentation all
 
+# Help: Build: Build man pages
 man:
 	$(MAKE) -C Documentation man
 
+# Help: Build: Build HTML doc
 html:
 	$(MAKE) -C Documentation html
 
+# Help: Build: Build info docs
 info:
 	$(MAKE) -C Documentation info
 
+# Help: Build: Build PDF docs
 pdf:
 	$(MAKE) -C Documentation pdf
 
+# Help: Develop: Generate tags using etags
 TAGS:
 	$(RM) TAGS
 	$(FIND) . -name '*.[hcS]' -print | xargs etags -a
 
+# Help: Develop: Generate tags using ctags
 tags:
 	$(RM) tags
 	$(FIND) . -name '*.[hcS]' -print | xargs ctags -a
 
+# Help: Develop: Generate cscope index
 cscope:
 	$(RM) cscope*
 	$(FIND) . -name '*.[hcS]' -print | xargs cscope -b
@@ -2040,6 +2049,7 @@ export NO_SVN_TESTS
 
 ### Testing rules
 
+# Help: Test: Check the build by running the test suite
 test: all
 	$(MAKE) -C t/ all
 
@@ -2099,6 +2109,7 @@ export gitexec_instdir
 
 install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)
 
+# Help: Install: Install the Git suite
 install: all
 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
@@ -2155,27 +2166,35 @@ endif
 install-gitweb:
 	$(MAKE) -C gitweb install
 
+# Help: Install: Install man pages
 install-doc:
 	$(MAKE) -C Documentation install
 
+# Help: Install: Install man pages
 install-man:
 	$(MAKE) -C Documentation install-man
 
+# Help: Install: Install HTML docs
 install-html:
 	$(MAKE) -C Documentation install-html
 
+# Help: Install: Install info docs
 install-info:
 	$(MAKE) -C Documentation install-info
 
+# Help: Install: Install PDF docs
 install-pdf:
 	$(MAKE) -C Documentation install-pdf
 
+# Help: Install: Install pregenerated man pages from origin/man
 quick-install-doc:
 	$(MAKE) -C Documentation quick-install
 
+# Help: Install: Install pregenerated man pages from origin/man
 quick-install-man:
 	$(MAKE) -C Documentation quick-install-man
 
+# Help: Install: Install pregenerated HTML pages from origin/html
 quick-install-html:
 	$(MAKE) -C Documentation quick-install-html
 
@@ -2188,6 +2207,7 @@ git.spec: git.spec.in
 	mv $@+ $@
 
 GIT_TARNAME=git-$(GIT_VERSION)
+# Help: Build: Build git-$(GIT_VERSION).tar.gz source
 dist: git.spec git-archive$(X) configure
 	./git-archive --format=tar \
 		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
@@ -2203,6 +2223,7 @@ dist: git.spec git-archive$(X) configure
 	@$(RM) -r $(GIT_TARNAME)
 	gzip -f -9 $(GIT_TARNAME).tar
 
+# Help: Build: Build source and binary RPM packages
 rpm: dist
 	$(RPMBUILD) \
 		--define "_source_filedigest_algorithm md5" \
@@ -2211,6 +2232,8 @@ rpm: dist
 
 htmldocs = git-htmldocs-$(GIT_VERSION)
 manpages = git-manpages-$(GIT_VERSION)
+
+# Help: Build: Build $(manpages).tar.gz and $(htmldocs).tar.gz
 dist-doc:
 	$(RM) -r .doc-tmp-dir
 	mkdir .doc-tmp-dir
@@ -2230,10 +2253,11 @@ dist-doc:
 	$(RM) -r .doc-tmp-dir
 
 ### Cleaning rules
-
+# Help: Clean: Remove generated files and the configure script
 distclean: clean
 	$(RM) configure
 
+# Help: Clean: Remove generated files but keep the configure script
 clean:
 	$(RM) *.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o xdiff/*.o vcs-svn/*.o \
 		builtin/*.o $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
@@ -2268,7 +2292,7 @@ endif
 .PHONY: FORCE TAGS tags cscope
 
 ### Check documentation
-#
+# Help: Test: Check documentation coverage
 check-docs::
 	@(for v in $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git gitk; \
 	do \
@@ -2335,6 +2359,7 @@ check-builtins::
 #
 .PHONY: coverage coverage-clean coverage-build coverage-report
 
+# Help: Test: Check test coverage
 coverage:
 	$(MAKE) coverage-build
 	$(MAKE) coverage-report
@@ -2370,5 +2395,19 @@ coverage-untested-functions: coverage-report
 cover_db: coverage-report
 	gcov2perl -db cover_db *.gcov
 
+# Help: Test: Check test coverage and create HTML report
 cover_db_html: cover_db
 	cover -report html -outputdir cover_db_html cover_db
+
+# Help: Help: Show help for main make targets
+help:
+	@awk '/^# Help:/ { l=substr($$0,8); \
+		getline; \
+		j=index(l,":"); \
+		print substr(l,1,j-1), substr($$0,1,index($$0,":")), substr(l,j+2); \
+		}' <Makefile | sort | while read category target text; \
+	do \
+		test "$$category" = "$$currcat" || printf "$$category targets:\n"; \
+		currcat="$$category"; \
+		printf "    %-20s%s\n" "$$target" "$$text"; \
+	done
-- 
1.7.3.98.g5ad7d

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCHv2] Makefile: implement help target
  2010-09-28 20:38               ` [PATCHv2] " Michael J Gruber
@ 2010-09-28 20:51                 ` Sverre Rabbelier
  2010-09-28 21:24                 ` Jakub Narebski
                                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 24+ messages in thread
From: Sverre Rabbelier @ 2010-09-28 20:51 UTC (permalink / raw)
  To: Michael J Gruber
  Cc: git, Junio C Hamano, Stephen Boyd, Andreas Ericsson,
	Ævar Arnfjörð Bjarmason

Heya,

On Tue, Sep 28, 2010 at 22:38, Michael J Gruber
<git@drmicha.warpmail.net> wrote:
> Now how's this for portability and such?

I applaud your leet awk skills :).

> Clean targets:
>    clean:              Remove generated files but keep the configure script
>    distclean:          Remove generated files and the configure script
> Develop targets:
>    cscope:             Generate cscope index
>    tags:               Generate tags using ctags
>    TAGS:               Generate tags using etags

Perhaps an extra newline after the end of a category? Otherwise, looks nice.

I haven't looked at the awk script itself wrt portability though.

-- 
Cheers,

Sverre Rabbelier

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCHv2] Makefile: implement help target
  2010-09-28 20:38               ` [PATCHv2] " Michael J Gruber
  2010-09-28 20:51                 ` Sverre Rabbelier
@ 2010-09-28 21:24                 ` Jakub Narebski
  2010-09-28 22:00                 ` Brandon Casey
  2010-09-29  5:16                 ` Jeff King
  3 siblings, 0 replies; 24+ messages in thread
From: Jakub Narebski @ 2010-09-28 21:24 UTC (permalink / raw)
  To: Michael J Gruber
  Cc: git, Junio C Hamano, Stephen Boyd, Andreas Ericsson,
	Sverre Rabbelier, Ævar Arnfjörð Bjarmason

I'm sorry for duplicated post; I made mistake that made vger anti-SPAM
filter stop it.

Michael J Gruber <git@drmicha.warpmail.net> writes:

> with automatic help text collection from lines starting with "# Help: " and
> preceding a make target.
> 
> Suggested-by: Stephen Boyd <bebarino@gmail.com>
> Helped-by: Andreas Ericsson <andreas.ericsson@op5.se>
> Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
> ---
> Now how's this for portability and such? New output:
> 
> Build targets:
>     all:                Build the Git suite
>     dist:               Build git-$(GIT_VERSION).tar.gz source
>     dist-doc:           Build $(manpages).tar.gz and $(htmldocs).tar.gz
>     doc:                Build man pages and HTML docs
>     html:               Build HTML doc
>     info:               Build info docs
>     man:                Build man pages
>     pdf:                Build PDF docs
>     rpm:                Build source and binary RPM packages
> Clean targets:
>     clean:              Remove generated files but keep the configure script
>     distclean:          Remove generated files and the configure script
[...]

Shouldn't some excerpt of this be put in the commit message as example
output fragment?


>  Makefile |   43 +++++++++++++++++++++++++++++++++++++++++--
>  1 files changed, 41 insertions(+), 2 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index db2efd6..497dd92 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1,4 +1,5 @@
>  # The default target of this Makefile is...
> +# Help: Build: Build the Git suite
>  all::
[...]

>  ### Testing rules

Why can't you use existing headers in Makefile, like the one above, to
divide list of targets in "make help" output into categories of
targets?

> +
> +# Help: Help: Show help for main make targets
> +help:
> +	@awk '/^# Help:/ { l=substr($$0,8); \

Doesn't it need to be $(AWK) not awk?

> +		getline; \
> +		j=index(l,":"); \
> +		print substr(l,1,j-1), substr($$0,1,index($$0,":")), substr(l,j+2); \
> +		}' <Makefile | sort | while read category target text; \
> +	do \
> +		test "$$category" = "$$currcat" || printf "$$category targets:\n"; \
> +		currcat="$$category"; \
> +		printf "    %-20s%s\n" "$$target" "$$text"; \
> +	done
> -- 
> 1.7.3.98.g5ad7d
> 

-- 
Jakub Narebski
Poland
ShadeHawk on #git

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCHv2] Makefile: implement help target
  2010-09-28 20:38               ` [PATCHv2] " Michael J Gruber
  2010-09-28 20:51                 ` Sverre Rabbelier
  2010-09-28 21:24                 ` Jakub Narebski
@ 2010-09-28 22:00                 ` Brandon Casey
  2010-09-29  8:06                   ` Michael J Gruber
  2010-09-29  5:16                 ` Jeff King
  3 siblings, 1 reply; 24+ messages in thread
From: Brandon Casey @ 2010-09-28 22:00 UTC (permalink / raw)
  To: Michael J Gruber
  Cc: git, Junio C Hamano, Stephen Boyd, Andreas Ericsson,
	Sverre Rabbelier, Ævar Arnfjörð Bjarmason

On 09/28/2010 03:38 PM, Michael J Gruber wrote:
> with automatic help text collection from lines starting with "# Help: " and
> preceding a make target.
> 
> Suggested-by: Stephen Boyd <bebarino@gmail.com>
> Helped-by: Andreas Ericsson <andreas.ericsson@op5.se>
> Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
> ---
> Now how's this for portability and such? New output:
> 
> Build targets:
>     all:                Build the Git suite
>     dist:               Build git-$(GIT_VERSION).tar.gz source
>     dist-doc:           Build $(manpages).tar.gz and $(htmldocs).tar.gz
<snip>

>  Makefile |   43 +++++++++++++++++++++++++++++++++++++++++--
>  1 files changed, 41 insertions(+), 2 deletions(-)


Very nice.  Too bad we have more targets than fit in my 33-line terminal.

/bikeshed

How about this micro-tweak:

  1) Remove the colon from the targets so they sort correctly.
     i.e. so "dist" sorts before "dist-doc" and "install" sorts
          before "install-*"
  2) Add " - " prefix to description strings and reduce target
     width accordingly so we still have just as much room for
     the description string.

So the output looks like this:

Build targets:
    all                - Build the Git suite
    dist               - Build git-$(GIT_VERSION).tar.gz source
    dist-doc           - Build $(manpages).tar.gz and $(htmldocs).tar.gz
    doc                - Build man pages and HTML docs
    html               - Build HTML doc
    info               - Build info docs
    man                - Build man pages
    pdf                - Build PDF docs
    rpm                - Build source and binary RPM packages
Clean targets:
    clean              - Remove generated files but keep the configure script
    distclean          - Remove generated files and the configure script
Develop targets:
    TAGS               - Generate tags using etags
    cscope             - Generate cscope index
    tags               - Generate tags using ctags
Help targets:
    help               - Show help for main make targets
Install targets:
    install            - Install the Git suite
    install-doc        - Install man pages
    install-html       - Install HTML docs
    install-info       - Install info docs
    install-man        - Install man pages
    install-pdf        - Install PDF docs
    quick-install-doc  - Install pregenerated man pages from origin/man
    quick-install-html - Install pregenerated HTML pages from origin/html
    quick-install-man  - Install pregenerated man pages from origin/man
Test targets:
    check-docs         - Check documentation coverage
    cover_db_html      - Check test coverage and create HTML report
    coverage           - Check test coverage
    test               - Check the build by running the test suite


(Warning: copy/pasted):

diff --git a/Makefile b/Makefile
index c7f0bb7..2803aa1 100644
--- a/Makefile
+++ b/Makefile
@@ -2398,10 +2398,10 @@ help:
        @awk '/^# Help:/ { l=substr($$0,8); \
                getline; \
                j=index(l,":"); \
-               print substr(l,1,j-1), substr($$0,1,index($$0,":")), substr(l,j+2); \
+               print substr(l,1,j-1), substr($$0,1,index($$0,":")-1), substr(l,j+2); \
                }' <Makefile | sort | while read category target text; \
        do \
                test "$$category" = "$$currcat" || printf "$$category targets:\n"; \
                currcat="$$category"; \
-               printf "    %-20s%s\n" "$$target" "$$text"; \
+               printf "    %-18s - %s\n" "$$target" "$$text"; \
        done


Oh, by the way, tested and works on Solaris 10 and IRIX 6.5.

-Brandon

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCHv2] Makefile: implement help target
  2010-09-28 20:38               ` [PATCHv2] " Michael J Gruber
                                   ` (2 preceding siblings ...)
  2010-09-28 22:00                 ` Brandon Casey
@ 2010-09-29  5:16                 ` Jeff King
  2010-09-29  7:03                   ` Michael J Gruber
  3 siblings, 1 reply; 24+ messages in thread
From: Jeff King @ 2010-09-29  5:16 UTC (permalink / raw)
  To: Michael J Gruber
  Cc: git, Junio C Hamano, Stephen Boyd, Andreas Ericsson,
	Sverre Rabbelier, Ævar Arnfjörð Bjarmason

On Tue, Sep 28, 2010 at 10:38:04PM +0200, Michael J Gruber wrote:

> +help:
> +	@awk '/^# Help:/ { l=substr($$0,8); \
> +		getline; \
> +		j=index(l,":"); \
> +		print substr(l,1,j-1), substr($$0,1,index($$0,":")), substr(l,j+2); \
> +		}' <Makefile | sort | while read category target text; \
> +	do \
> +		test "$$category" = "$$currcat" || printf "$$category targets:\n"; \
> +		currcat="$$category"; \
> +		printf "    %-20s%s\n" "$$target" "$$text"; \
> +	done

Surely this is why we have perl?

help:
	@perl -n0777 \
	  -e 'push @{$$h{$$1}}, [$$3, $$2] while /^# Help: (.*?): (.*)\n(.*?):/mg;' \
	  -e 'for (sort keys(%h)) {' \
	  -e '  print "$$_:\n";' \
	  -e '  printf("    %-20s%s\n", @$$_) for (@{$$h{$$_}});' \
	  -e '}' Makefile

Note that mine will actually print the targets in a heading in the order
in which they appear in the Makefile, which I consider slightly more
useful (especially in that we can tweak the order easily). It would also
be easy to sort the headers in some more meaningful way, but here I just
did it lexically.

-Peff

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH] Makefile: Add help target
  2010-09-28  9:45 ` Junio C Hamano
  2010-09-28 11:37   ` Sverre Rabbelier
@ 2010-09-29  6:10   ` yj2133011
  1 sibling, 0 replies; 24+ messages in thread
From: yj2133011 @ 2010-09-29  6:10 UTC (permalink / raw)
  To: git


Not interested, at least in the current form.

I do not look forward to having to maintain a large number of lines that
are doomed to go stale, and every time we need to touch we need to deal
with a lot of noise "@echo '"?  No thanks.

It might be a bit less distasteful if it were plain text additions at the
end of INSTALL file, though. 

-----
The voice input and output is very good in this 
http://www.tomtop.com/black-ps3-wireless-bluetooth-headset-for-playstation-3.html?aid=z
Wireless PS3 Headset . It is compatible with all PS3 games.Buy from Reliable 
http://www.tomtop.com/google-android-7-notebook-3g-tablet-pc-umpc-wifi-mid-pda.html?aid=z
Google Android PC  apad Wholesalers.
-- 
View this message in context: http://git.661346.n2.nabble.com/PATCH-Makefile-Add-help-target-tp5578369p5582616.html
Sent from the git mailing list archive at Nabble.com.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCHv2] Makefile: implement help target
  2010-09-29  5:16                 ` Jeff King
@ 2010-09-29  7:03                   ` Michael J Gruber
  2010-09-29  7:34                     ` Jeff King
  0 siblings, 1 reply; 24+ messages in thread
From: Michael J Gruber @ 2010-09-29  7:03 UTC (permalink / raw)
  To: Jeff King
  Cc: git, Junio C Hamano, Stephen Boyd, Andreas Ericsson,
	Sverre Rabbelier, Ævar Arnfjörð Bjarmason,
	Jakub Narebski

Jeff King venit, vidit, dixit 29.09.2010 07:16:
> On Tue, Sep 28, 2010 at 10:38:04PM +0200, Michael J Gruber wrote:
> 
>> +help:
>> +	@awk '/^# Help:/ { l=substr($$0,8); \
>> +		getline; \
>> +		j=index(l,":"); \
>> +		print substr(l,1,j-1), substr($$0,1,index($$0,":")), substr(l,j+2); \
>> +		}' <Makefile | sort | while read category target text; \
>> +	do \
>> +		test "$$category" = "$$currcat" || printf "$$category targets:\n"; \
>> +		currcat="$$category"; \
>> +		printf "    %-20s%s\n" "$$target" "$$text"; \
>> +	done
> 
> Surely this is why we have perl?

I don't speak perl.

Honestly, this is slowly going on my nerves. Maybe it's because I'm
reading too many "can't we do it this way" responses in one go and
without being coffeinated, and without seeing how "different" is better.
[I've been heeding all advise on portability and readability, as you can
see.]

So far we've been using neither awk nor perl in the Makefile, but sed.

> help:
> 	@perl -n0777 \
> 	  -e 'push @{$$h{$$1}}, [$$3, $$2] while /^# Help: (.*?): (.*)\n(.*?):/mg;' \

On top of everything else, you're even slashing mg! (See, I'm less
grumpy already...)

> 	  -e 'for (sort keys(%h)) {' \
> 	  -e '  print "$$_:\n";' \
> 	  -e '  printf("    %-20s%s\n", @$$_) for (@{$$h{$$_}});' \
> 	  -e '}' Makefile
> 

How portable are the regexps and the array/dictionary push?

> Note that mine will actually print the targets in a heading in the order
> in which they appear in the Makefile, which I consider slightly more
> useful (especially in that we can tweak the order easily).

I don't think Makefile order would be useful. If you know exactly what
you're looking for you need no sorting, you can just search for that
term. (I would do a 'grep -A20 "^target:" Makefile' or hit "/^target" in
my vim but I'm sure there's a different way of doing it in perl...)

If you're trying to find your way around you guess a generic term and
look for that, and that's easier to do when the categories are sorted
alphabetically.

Michael

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCHv2] Makefile: implement help target
  2010-09-29  7:03                   ` Michael J Gruber
@ 2010-09-29  7:34                     ` Jeff King
  2010-09-29 15:41                       ` Junio C Hamano
  0 siblings, 1 reply; 24+ messages in thread
From: Jeff King @ 2010-09-29  7:34 UTC (permalink / raw)
  To: Michael J Gruber
  Cc: git, Junio C Hamano, Stephen Boyd, Andreas Ericsson,
	Sverre Rabbelier, Ævar Arnfjörð Bjarmason,
	Jakub Narebski

On Wed, Sep 29, 2010 at 09:03:35AM +0200, Michael J Gruber wrote:

> > Surely this is why we have perl?
> 
> I don't speak perl.
> 
> Honestly, this is slowly going on my nerves. Maybe it's because I'm
> reading too many "can't we do it this way" responses in one go and
> without being coffeinated, and without seeing how "different" is better.
> [I've been heeding all advise on portability and readability, as you can
> see.]

I should have been more clear about my motivations. It was mainly "I
wonder how short I can make this in perl?" The alternate sorting was
something that happened incidentally, though it did make more sense to
me.

So you can just ignore me if you like. :)

> > 	  -e 'for (sort keys(%h)) {' \
> > 	  -e '  print "$$_:\n";' \
> > 	  -e '  printf("    %-20s%s\n", @$$_) for (@{$$h{$$_}});' \
> > 	  -e '}' Makefile
> > 
> 
> How portable are the regexps and the array/dictionary push?

AFAIK, it should work with any perl5. I don't have any ancient versions
handy to test these days, though.

> > Note that mine will actually print the targets in a heading in the order
> > in which they appear in the Makefile, which I consider slightly more
> > useful (especially in that we can tweak the order easily).
> 
> I don't think Makefile order would be useful. If you know exactly what
> you're looking for you need no sorting, you can just search for that
> term. (I would do a 'grep -A20 "^target:" Makefile' or hit "/^target" in
> my vim but I'm sure there's a different way of doing it in perl...)

What I was trying to say was more that alphabetical is not necessarily
the most useful order to present things in the help screen. Probably
there is some hand-selected order that presents the entries in the least
confusing way. And one way of representing that is to have the topics in
that order in the Makefile, which in theory probably makes reading the
Makefile itself simpler.

But yeah, this is way over-thinking the issue. It's a fricking list of
Makefile targets. I am happy with your original patch.

-Peff

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCHv2] Makefile: implement help target
  2010-09-28 22:00                 ` Brandon Casey
@ 2010-09-29  8:06                   ` Michael J Gruber
  0 siblings, 0 replies; 24+ messages in thread
From: Michael J Gruber @ 2010-09-29  8:06 UTC (permalink / raw)
  To: Brandon Casey
  Cc: git, Junio C Hamano, Stephen Boyd, Andreas Ericsson,
	Sverre Rabbelier, Ævar Arnfjörð Bjarmason

Brandon Casey venit, vidit, dixit 29.09.2010 00:00:
> On 09/28/2010 03:38 PM, Michael J Gruber wrote:
>> with automatic help text collection from lines starting with "# Help: " and
>> preceding a make target.
>>
>> Suggested-by: Stephen Boyd <bebarino@gmail.com>
>> Helped-by: Andreas Ericsson <andreas.ericsson@op5.se>
>> Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
>> ---
>> Now how's this for portability and such? New output:
>>
>> Build targets:
>>     all:                Build the Git suite
>>     dist:               Build git-$(GIT_VERSION).tar.gz source
>>     dist-doc:           Build $(manpages).tar.gz and $(htmldocs).tar.gz
> <snip>
> 
>>  Makefile |   43 +++++++++++++++++++++++++++++++++++++++++--
>>  1 files changed, 41 insertions(+), 2 deletions(-)
> 
> 
> Very nice.  Too bad we have more targets than fit in my 33-line terminal.
> 
> /bikeshed
> 
> How about this micro-tweak:
> 
>   1) Remove the colon from the targets so they sort correctly.
>      i.e. so "dist" sorts before "dist-doc" and "install" sorts
>           before "install-*"
>   2) Add " - " prefix to description strings and reduce target
>      width accordingly so we still have just as much room for
>      the description string.
> 
> So the output looks like this:
> 
....
> Install targets:
>     install            - Install the Git suite
>     install-doc        - Install man pages
>     install-html       - Install HTML docs
>     install-info       - Install info docs
>     install-man        - Install man pages
>     install-pdf        - Install PDF docs
>     quick-install-doc  - Install pregenerated man pages from origin/man
>     quick-install-html - Install pregenerated HTML pages from origin/html
>     quick-install-man  - Install pregenerated man pages from origin/man

Sounds good, although the sort order depends on the locale. "LANG=C
sort" takes care of that.

> Oh, by the way, tested and works on Solaris 10 and IRIX 6.5.

Thanks!
Michael

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCHv2] Makefile: implement help target
  2010-09-29  7:34                     ` Jeff King
@ 2010-09-29 15:41                       ` Junio C Hamano
  2010-09-29 20:15                         ` [PATCHv3] " Michael J Gruber
  0 siblings, 1 reply; 24+ messages in thread
From: Junio C Hamano @ 2010-09-29 15:41 UTC (permalink / raw)
  To: Jeff King
  Cc: Michael J Gruber, git, Stephen Boyd, Andreas Ericsson,
	Sverre Rabbelier, Ævar Arnfjörð Bjarmason,
	Jakub Narebski

Jeff King <peff@peff.net> writes:

> What I was trying to say was more that alphabetical is not necessarily
> the most useful order to present things in the help screen. Probably
> there is some hand-selected order that presents the entries in the least
> confusing way. And one way of representing that is to have the topics in
> that order in the Makefile, which in theory probably makes reading the
> Makefile itself simpler.

I agree with this, even though I do not feel _too_ strongly about it.

By the way, while we are at adding "make help" support...

With help annotations in the Makefile like this:

        # Help: install everything
        # - the user visible commands go to $(bindir)
        # - helper programs go to $(gitexec_instdir)
        # - templates go to $(template_instdir)
        install: all
                $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'

I imagine it would be really cool if "make help" said something like this:

    $ make help
    ...
    install:
      install everything
      - the user visible commands go to $(bindir) = /home/junio/bin
      - helper commands go to $(gitexec_instdir) = /home/junio/libexec/git-core
      - templates go to $(template_instdir) = /home/junio/share/git-core/templates

to help the builder figuring out what make variable(s) to tweak.  To be useful,
I think you would need to show the expansion, though.  E.g.

    - the user visible commands go to $(bindir) = /home/junio/bin
        bindir = $(prefix)/$(bindir_relative)
        prefix = $HOME
        HOME = /home/junio
        bindir_relative = bin

But again, I do not feel strongly about it either.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCHv3] Makefile: implement help target
  2010-09-29 15:41                       ` Junio C Hamano
@ 2010-09-29 20:15                         ` Michael J Gruber
  2010-09-29 20:39                           ` Junio C Hamano
  0 siblings, 1 reply; 24+ messages in thread
From: Michael J Gruber @ 2010-09-29 20:15 UTC (permalink / raw)
  To: git
  Cc: Junio C Hamano, Stephen Boyd, Andreas Ericsson, Sverre Rabbelier,
	Ævar Arnfjörð Bjarmason

with automatic help text collection from "help-X::" targets, where X
denotes a category for the target. This has the advantage (over a
comment based solution) that we can use make's variable expansion inside
the help text. Further exploitation of this feature is left for a future
patch.

With this, "make help" produces:

Help:
    help               - Show help for main make targets
    help-X             - Show help for category X (Build, Test, Install, Clean, Develop)
Build Git and the documentation:
    all                - Build the Git suite
    doc                - Build man pages and HTML docs
    man                - Build man pages
    html               - Build HTML doc
    info               - Build info docs
    pdf                - Build PDF docs
    dist               - Build git-1.7.3.99.gacf23.dirty.tar.gz source archive
    rpm                - Build source and binary RPM packages
    dist-doc           - Build git-manpages-1.7.3.99.gacf23.dirty.tar.gz and git-htmldocs-1.7.3.99.gacf23.dirty.tar.gz
Testing source and build:
    test               - Check the build by running the test suite
    check-docs         - Check documentation coverage
    coverage           - Check test coverage
    cover_db_html      - Check test coverage and create HTML report
Installing the Git suite and documentation:
    install            - Install the Git suite
    install-doc        - Install man pages
    install-man        - Install man pages
    install-html       - Install HTML docs
    install-info       - Install info docs
    install-pdf        - Install PDF docs
    quick-install-doc  - Install pregenerated man pages from origin/man
    quick-install-man  - Install pregenerated man pages from origin/man
    quick-install-html - Install pregenerated HTML pages from origin/html
Cleaning up after a build:
    distclean          - Remove generated files and the configure script
    clean              - Remove generated files but keep the configure script
Making development easier:
    TAGS               - Generate tags using etags
    tags               - Generate tags using ctags
    cscope             - Generate cscope index

Signed-off-by: Michael J Gruber <git@drmicha.warpmail.net>
---
Does it seem as if I can't let this go?

Anyhow, here's a make based variant which is a bit more chatty in the Makefile
itself but has a ton of advantages, such as make variable expansion. Making
good use of this for the install targets is left for another patch.

 Makefile |  109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 108 insertions(+), 1 deletions(-)

diff --git a/Makefile b/Makefile
index db2efd6..371214d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,10 @@
 # The default target of this Makefile is...
+help-Build::
+	$(H) 'Build Git and the documentation'
+
+help-Build::
+	$(HH) all 'Build the Git suite'
+
 all::
 
 # Define V=1 to have a more verbose compile.
@@ -1952,29 +1958,56 @@ $(XDIFF_LIB): $(XDIFF_OBJS)
 $(VCSSVN_LIB): $(VCSSVN_OBJS)
 	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(VCSSVN_OBJS)
 
+help-Build::
+	$(HH) doc 'Build man pages and HTML docs'
+
 doc:
 	$(MAKE) -C Documentation all
 
+help-Build::
+	$(HH) man 'Build man pages'
+
 man:
 	$(MAKE) -C Documentation man
 
+help-Build::
+	$(HH) html 'Build HTML doc'
+
 html:
 	$(MAKE) -C Documentation html
 
+help-Build::
+	$(HH) info 'Build info docs'
+
 info:
 	$(MAKE) -C Documentation info
 
+help-Build::
+	$(HH) pdf 'Build PDF docs'
+
 pdf:
 	$(MAKE) -C Documentation pdf
 
+help-Develop::
+	$(H) 'Making development easier'
+
+help-Develop::
+	$(HH) TAGS 'Generate tags using etags'
+
 TAGS:
 	$(RM) TAGS
 	$(FIND) . -name '*.[hcS]' -print | xargs etags -a
 
+help-Develop::
+	$(HH) tags 'Generate tags using ctags'
+
 tags:
 	$(RM) tags
 	$(FIND) . -name '*.[hcS]' -print | xargs ctags -a
 
+help-Develop::
+	$(HH) cscope 'Generate cscope index'
+
 cscope:
 	$(RM) cscope*
 	$(FIND) . -name '*.[hcS]' -print | xargs cscope -b
@@ -2040,6 +2073,12 @@ export NO_SVN_TESTS
 
 ### Testing rules
 
+help-Test::
+	$(H) 'Testing source and build'
+
+help-Test::
+	$(HH) test 'Check the build by running the test suite'
+
 test: all
 	$(MAKE) -C t/ all
 
@@ -2099,6 +2138,12 @@ export gitexec_instdir
 
 install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X)
 
+help-Install::
+	$(H) 'Installing the Git suite and documentation'
+
+help-Install::
+	$(HH) install 'Install the Git suite'
+
 install: all
 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
 	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
@@ -2155,27 +2200,51 @@ endif
 install-gitweb:
 	$(MAKE) -C gitweb install
 
+help-Install::
+	$(HH) install-doc 'Install man pages'
+
 install-doc:
 	$(MAKE) -C Documentation install
 
+help-Install::
+	$(HH) install-man 'Install man pages'
+
 install-man:
 	$(MAKE) -C Documentation install-man
 
+help-Install::
+	$(HH) install-html 'Install HTML docs'
+
 install-html:
 	$(MAKE) -C Documentation install-html
 
+help-Install::
+	$(HH) install-info 'Install info docs'
+
 install-info:
 	$(MAKE) -C Documentation install-info
 
+help-Install::
+	$(HH) install-pdf 'Install PDF docs'
+
 install-pdf:
 	$(MAKE) -C Documentation install-pdf
 
+help-Install::
+	$(HH) quick-install-doc 'Install pregenerated man pages from origin/man'
+
 quick-install-doc:
 	$(MAKE) -C Documentation quick-install
 
+help-Install::
+	$(HH) quick-install-man 'Install pregenerated man pages from origin/man'
+
 quick-install-man:
 	$(MAKE) -C Documentation quick-install-man
 
+help-Install::
+	$(HH) quick-install-html 'Install pregenerated HTML pages from origin/html'
+
 quick-install-html:
 	$(MAKE) -C Documentation quick-install-html
 
@@ -2188,6 +2257,9 @@ git.spec: git.spec.in
 	mv $@+ $@
 
 GIT_TARNAME=git-$(GIT_VERSION)
+help-Build::
+	$(HH) dist 'Build git-$(GIT_VERSION).tar.gz source archive'
+
 dist: git.spec git-archive$(X) configure
 	./git-archive --format=tar \
 		--prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
@@ -2203,6 +2275,9 @@ dist: git.spec git-archive$(X) configure
 	@$(RM) -r $(GIT_TARNAME)
 	gzip -f -9 $(GIT_TARNAME).tar
 
+help-Build::
+	$(HH) rpm 'Build source and binary RPM packages'
+
 rpm: dist
 	$(RPMBUILD) \
 		--define "_source_filedigest_algorithm md5" \
@@ -2211,6 +2286,10 @@ rpm: dist
 
 htmldocs = git-htmldocs-$(GIT_VERSION)
 manpages = git-manpages-$(GIT_VERSION)
+
+help-Build::
+	$(HH) dist-doc 'Build $(manpages).tar.gz and $(htmldocs).tar.gz'
+
 dist-doc:
 	$(RM) -r .doc-tmp-dir
 	mkdir .doc-tmp-dir
@@ -2230,10 +2309,18 @@ dist-doc:
 	$(RM) -r .doc-tmp-dir
 
 ### Cleaning rules
+help-Clean::
+	$(H) 'Cleaning up after a build'
+
+help-Clean::
+	$(HH) distclean 'Remove generated files and the configure script'
 
 distclean: clean
 	$(RM) configure
 
+help-Clean::
+	$(HH) clean 'Remove generated files but keep the configure script'
+
 clean:
 	$(RM) *.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o xdiff/*.o vcs-svn/*.o \
 		builtin/*.o $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
@@ -2268,7 +2355,9 @@ endif
 .PHONY: FORCE TAGS tags cscope
 
 ### Check documentation
-#
+help-Test::
+	$(HH) check-docs 'Check documentation coverage'
+
 check-docs::
 	@(for v in $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git gitk; \
 	do \
@@ -2335,6 +2424,9 @@ check-builtins::
 #
 .PHONY: coverage coverage-clean coverage-build coverage-report
 
+help-Test::
+	$(HH) coverage 'Check test coverage'
+
 coverage:
 	$(MAKE) coverage-build
 	$(MAKE) coverage-report
@@ -2370,5 +2462,20 @@ coverage-untested-functions: coverage-report
 cover_db: coverage-report
 	gcov2perl -db cover_db *.gcov
 
+help-Test::
+	$(HH) cover_db_html 'Check test coverage and create HTML report'
+
 cover_db_html: cover_db
 	cover -report html -outputdir cover_db_html cover_db
+
+H=@printf "%s:\n"
+HH=@printf "    %-18s - %s\n"
+
+help-Help::
+	$(H) Help
+
+help-Help::
+	$(HH) help 'Show help for main make targets'
+	$(HH) help-X 'Show help for category X (Build, Test, Install, Clean, Develop)'
+
+help: help-Help help-Build help-Test help-Install help-Clean help-Develop
-- 
1.7.3.98.g5ad7d

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCHv3] Makefile: implement help target
  2010-09-29 20:15                         ` [PATCHv3] " Michael J Gruber
@ 2010-09-29 20:39                           ` Junio C Hamano
  2010-09-30  7:08                             ` Michael J Gruber
  0 siblings, 1 reply; 24+ messages in thread
From: Junio C Hamano @ 2010-09-29 20:39 UTC (permalink / raw)
  To: Michael J Gruber
  Cc: git, Stephen Boyd, Andreas Ericsson, Sverre Rabbelier,
	Ævar Arnfjörð Bjarmason

Michael J Gruber <git@drmicha.warpmail.net> writes:

> diff --git a/Makefile b/Makefile
> index db2efd6..371214d 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1,4 +1,10 @@
>  # The default target of this Makefile is...
> +help-Build::

Heh, no way.  The default target of this Makefile should remain "all".

Even though letting phony double-colon rules to implicitly collect members
of groups and showing them is a neat idea, I do not think "make -j help"
would do what you are expecting ;-)

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCHv3] Makefile: implement help target
  2010-09-29 20:39                           ` Junio C Hamano
@ 2010-09-30  7:08                             ` Michael J Gruber
  0 siblings, 0 replies; 24+ messages in thread
From: Michael J Gruber @ 2010-09-30  7:08 UTC (permalink / raw)
  To: Junio C Hamano
  Cc: git, Stephen Boyd, Andreas Ericsson, Sverre Rabbelier,
	Ævar Arnfjörð Bjarmason

Junio C Hamano venit, vidit, dixit 09/29/2010 10:39 PM:
> Michael J Gruber <git@drmicha.warpmail.net> writes:
> 
>> diff --git a/Makefile b/Makefile
>> index db2efd6..371214d 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -1,4 +1,10 @@
>>  # The default target of this Makefile is...
>> +help-Build::
> 
> Heh, no way.  The default target of this Makefile should remain "all".

Damnit, that wasn't intended.... But that's solved by a simple
reordering, of course.

> Even though letting phony double-colon rules to implicitly collect members
> of groups and showing them is a neat idea, I do not think "make -j help"
> would do what you are expecting ;-)

I expect a randomly ordered mess, and "make -j help" fully meets those
expectations! Can "-j" be set in the environment or config.mak somehow?
Otherwise I think that explicitly shooting yourself in the foot should
be allowed...

Anyway, this topic is (only) about help on our Makefile, and I think
that as long as we don't want to go several extra miles, we have to
decide between two app roaches :)

* comment based:
  + readable
  + -j safe
  - no var expansion (that I know of, at least without recursive make)
  +- single line comments (unless more perl/awk foo is invested)
  +- either in Makefile order or lexically sorted (or more perl lines)

* phony :: rules based:
  +- somewhat less readable
  - not -j safe
  + var expansion
  + multi line comments (could easily add a 3rd level also)
  + categories can be ordered freely (targets in Makefile order within)

Michael

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2010-09-30  7:08 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-28  8:13 [PATCH] Makefile: Add help target Stephen Boyd
2010-09-28  9:45 ` Junio C Hamano
2010-09-28 11:37   ` Sverre Rabbelier
2010-09-28 12:35     ` Andreas Ericsson
2010-09-28 14:44       ` [PATCH] Makefile: implement " Michael J Gruber
2010-09-28 14:48         ` Sverre Rabbelier
2010-09-28 14:57           ` Zbyszek Szmek
2010-09-28 14:54         ` Ævar Arnfjörð Bjarmason
2010-09-28 15:33         ` Junio C Hamano
2010-09-28 15:47           ` Michael J Gruber
2010-09-28 16:04             ` Ævar Arnfjörð Bjarmason
2010-09-28 20:38               ` [PATCHv2] " Michael J Gruber
2010-09-28 20:51                 ` Sverre Rabbelier
2010-09-28 21:24                 ` Jakub Narebski
2010-09-28 22:00                 ` Brandon Casey
2010-09-29  8:06                   ` Michael J Gruber
2010-09-29  5:16                 ` Jeff King
2010-09-29  7:03                   ` Michael J Gruber
2010-09-29  7:34                     ` Jeff King
2010-09-29 15:41                       ` Junio C Hamano
2010-09-29 20:15                         ` [PATCHv3] " Michael J Gruber
2010-09-29 20:39                           ` Junio C Hamano
2010-09-30  7:08                             ` Michael J Gruber
2010-09-29  6:10   ` [PATCH] Makefile: Add " yj2133011

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).