#!/usr/bin/env perl use strict; use warnings; my %msg = (); my @start = (); my %reorder = (help=>-1); READ: while(<>) { if(m/^# HELP HEADER START/) { while(<>) { next READ if m/^# HELP HEADER END/; if(m/# (.*)/) { push @start, $1 } else { die "$0: Invalid HELP HEADER section in Makefile!\n"; } } next READ } if(m/# HELP((?:\([^\(\)]+\))?):\s*(.*)/) { my ($target, $message) = ($1, $2); if($target=~m/\((.*)\)/) { $target = $1; } else { my $line = <>; die "$0: Unexpected end of file, target expected!\n" if not defined $line; $line=~m/^([^:]+):/ or die "$0: HELP marker expects target but no target found!\n"; $target = $1 } $msg{$target} .= $message } } print "$_\n" for @start; print "\n" if @start; for my $tar(sort {($reorder{$a}||0) <=> ($reorder{$b}||0) || $a cmp $b } keys %msg) { print "$tar\n $msg{$tar}\n\n" }