about summary refs log tree commit homepage
path: root/Makefile.PL
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile.PL')
-rw-r--r--Makefile.PL182
1 files changed, 118 insertions, 64 deletions
diff --git a/Makefile.PL b/Makefile.PL
index 6da2ed70..27fe02ff 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -1,16 +1,19 @@
 #!/usr/bin/perl -w
-# Copyright (C) 2013-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 use strict;
 use ExtUtils::MakeMaker;
 open my $m, '<', 'MANIFEST' or die "open(MANIFEST): $!\n";
 chomp(my @manifest = (<$m>));
+push @manifest, 'lib/PublicInbox.pm'; # generated
 my @EXE_FILES = grep(m!^script/!, @manifest);
 my $v = {};
 my $t = {};
 
 # do not sort
-my @RELEASES = qw(v1.6.1 v1.6.0 v1.5.0 v1.4.0 v1.3.0 v1.2.0 v1.1.0-pre1 v1.0.0);
+my @RELEASES = qw(v1.9.0
+        v1.8.0 v1.7.0 v1.6.1 v1.6.0 v1.5.0 v1.4.0 v1.3.0 v1.2.0
+        v1.1.0-pre1 v1.0.0);
 
 $v->{news_deps} = [ map { "Documentation/RelNotes/$_.eml" } @RELEASES ];
 $v->{txt} = [ qw(INSTALL README COPYING TODO HACKING) ];
@@ -21,7 +24,7 @@ push @dtxt, @{$v->{txt}};
 for my $txt (@dtxt) {
         my $html = $txt;
         $html =~ s/\.txt\z/.html/ or $html .= '.html';
-        $t->{"$html : $txt"} = [ "\$(txt2pre) <$txt" ];
+        $t->{"$html : $txt"} = [ "\$(txt2pre) <$txt", "touch -r $txt \$@" ];
 }
 $v->{t_slash_star_dot_t} = [ grep(m!\At/.*\.t\z!, @manifest) ];
 my @scripts = qw(scripts/ssoma-replay); # legacy
@@ -31,6 +34,19 @@ my @syn = (@EXE_FILES, grep(m!^lib/.*\.pm$!, @manifest), @scripts);
 @syn = grep(!/SaPlugin/, @syn) if !eval { require Mail::SpamAssasin };
 $v->{syn_files} = \@syn;
 $v->{my_syntax} = [map { "$_.syntax" } @syn];
+my %native = (
+        XapHelperCxx => [ qw(xh_cidx.h xh_mset.h xap_helper.h) ],
+);
+my @ck_build;
+for my $m (sort keys %native) {
+        my $hdr = $native{$m};
+        my @dep = map { "lib/PublicInbox/$_" } ("$m.pm", @$hdr);
+        $t->{"$m.check_build: @dep"} = [ "\$(PERL) -w -I lib ".
+                "-MPublicInbox::$m -e PublicInbox::${m}::check_build" ];
+        push @ck_build, "$m.check_build";
+}
+$t->{"check-build: @ck_build"} = [];
+
 my @no_pod;
 $v->{-m1} = [ map {
                 my $x = (split('/'))[-1];
@@ -44,12 +60,23 @@ $v->{-m1} = [ map {
                 }
         } @EXE_FILES,
         qw(
-        lei-add-external lei-config lei-daemon-kill lei-daemon-pid
-        lei-forget-external lei-import lei-init lei-ls-external lei-q)];
+        lei-add-external lei-add-watch lei-blob lei-config lei-convert
+        lei-daemon-kill lei-daemon-pid lei-edit-search lei-export-kw
+        lei-forget-external lei-forget-mail-sync lei-forget-search
+        lei-import lei-index lei-init lei-inspect lei-lcat
+        lei-ls-external lei-ls-label lei-ls-mail-source lei-ls-mail-sync
+        lei-ls-search lei-ls-watch lei-mail-diff lei-p2q lei-q
+        lei-rediff lei-refresh-mail-sync lei-reindex
+        lei-rm lei-rm-watch lei-tag
+        lei-up)];
 $v->{-m5} = [ qw(public-inbox-config public-inbox-v1-format
-                public-inbox-v2-format public-inbox-extindex-format) ];
-$v->{-m7} = [ qw(lei-overview public-inbox-overview public-inbox-tuning) ];
-$v->{-m8} = [ qw(public-inbox-daemon) ];
+                public-inbox-v2-format public-inbox-extindex-format
+                lei-mail-formats lei-store-format
+                ) ];
+$v->{-m7} = [ qw(lei-mail-sync-overview lei-overview lei-security
+                public-inbox-overview public-inbox-tuning
+                public-inbox-glossary) ];
+$v->{-m8} = [ qw(public-inbox-daemon lei-daemon) ];
 my @sections = (1, 5, 7, 8);
 $v->{check_80} = [];
 $v->{manuals} = [];
@@ -61,13 +88,15 @@ for my $i (@sections) {
                 my $pod = "Documentation/$m.pod";
                 my $txt = "Documentation/$m.txt";
                 $t->{"$m.$i : $pod"} = [ "\$(podman) -s$i $pod \$@" ];
-                $t->{"$txt : $pod"} = [ "\$(podtext) $pod \$\@+",
-                                        "touch -r $pod \$\@+",
+                $t->{"$txt : $m.$i"} = [ "\$(man2text) ./$m.$i >\$\@+",
+                                        "touch -r $pod \$\@+ ./$m.$i",
                                         "mv \$\@+ \$@" ];
-                $t->{"Documentation/$m.html : $txt"} = [ "\$(txt2pre) <$txt" ];
+                $t->{"Documentation/$m.html : $txt"} = [ "\$(txt2pre) <$txt",
+                                                        "touch -r $txt \$@" ];
                 $t->{".$m.cols : $m.$i"} = [
-                        "\@echo CHECK80 $m.$i;".
-                        "COLUMNS=80 \$(MAN) ./$m.$i | \$(check_man)" ];
+                        "\@echo CHECK80 $m.$i; LC_ALL=C LANG=C ".
+                        "COLUMNS=80 \$(MAN) ./$m.$i | \$(check_man)",
+                        '>$@' ];
                 $t->{".$m.lexgrog: $m.$i"} = [
                         "\@echo LEXGROG $m.$i;" .
                         "\$(LEXGROG) ./$m.$i >\$\@+ && mv \$\@+ \$@" ];
@@ -78,34 +107,16 @@ for my $i (@sections) {
         push @{$v->{manuals}}, @$manuals;
         push @{$v->{mantxt}}, map { "Documentation/$_.txt" } @$ary;
 }
-push @dtxt, @{$v->{mantxt}};
 $v->{docs} = [ @dtxt, 'NEWS' ];
 $v->{docs_html} = [ map {;
                 my $x = $_;
                 $x =~ s/\.txt\z//;
                 "$x.html"
-        } @{$v->{docs}} ];
+        } (@{$v->{docs}}, @{$v->{mantxt}}) ];
 $v->{gz_docs} = [ map { "$_.gz" } (@{$v->{docs}},@{$v->{docs_html}}) ];
 $v->{rsync_docs} = [ @{$v->{gz_docs}}, @{$v->{docs}},
         @{$v->{docs_html}}, qw(NEWS.atom NEWS.atom.gz)];
 
-# external manpages which we host ourselves, since some packages
-# (currently just Xapian) doesn't host manpages themselves.
-my @xman = qw(copydatabase.1 xapian-compact.1);
-$v->{xdocs} = [ map { "Documentation/.$_.txt" } @xman ];
-$v->{xdocs_html} = [ map { "Documentation/.$_.html" } @xman ];
-for (@{$v->{xdocs}}) {
-        $t->{"$_:"} = [
-                '$(PERL) -w Documentation/extman.perl $@ >$@+',
-                'mv $@+ $@'
-        ];
-        my $html = $_;
-        $html =~ s/\.txt\z/.html/;
-        $t->{"$html : $_"} = [ "\$(txt2pre) <$_" ];
-}
-$v->{gz_xdocs} = [ map { "$_.gz" } (@{$v->{xdocs_html}}, @{$v->{xdocs}}) ];
-$v->{rsync_xdocs} = [ @{$v->{gz_xdocs}}, @{$v->{xdocs_html}}, @{$v->{xdocs}} ];
-
 my $TGTS = join("\n", map {;
         my $tgt_prereq = $_;
         my $cmds = $t->{$_};
@@ -128,18 +139,23 @@ my %man3 = map {; # semi-colon tells Perl this is a BLOCK (and not EXPR)
         "lib/PublicInbox/$_" => "blib/man3/PublicInbox::$mod.\$(MAN3EXT)"
 } qw(Git.pm Import.pm WWW.pod SaPlugin/ListMirror.pod);
 my $warn_no_pod = @no_pod ? "\n\t\@echo W: missing .pod: @no_pod\n" : '';
-chomp(my $lexgrog = `which lexgrog 2>/dev/null`);
+chomp(my $lexgrog = `command -v lexgrog 2>/dev/null`);
 my $check_lexgrog = $lexgrog ? 'check-lexgrog' : '';
 
 WriteMakefile(
         NAME => 'PublicInbox', # n.b. camel-case is not our choice
 
         # XXX drop "PENDING" in .pod before updating this!
-        VERSION => '1.6.1',
+        VERSION => '2.0.0.PENDING',
 
-        AUTHOR => 'Eric Wong <e@80x24.org>',
-        ABSTRACT => 'public-inbox server infrastructure',
+        AUTHOR => 'public-inbox hackers <meta@public-inbox.org>',
+        ABSTRACT => 'an "archives first" approach to mailing lists',
         EXE_FILES => \@EXE_FILES,
+
+        # DO NOT blindly put "use v5.12" in *.pm files, unicode_strings
+        # causes known breakages.  "use v5.10.1" is safe, though
+        MIN_PERL_VERSION => '5.12.0',
+        LICENSE => 'agpl_3', # AGPL-3.0+, CPAN::Meta::Spec doesn't have '+'
         PREREQ_PM => {
                 # note: we use spamc(1), NOT the Perl modules
                 # We also depend on git.
@@ -147,40 +163,57 @@ WriteMakefile(
 
                 # perl-modules-5.xx or libperl5.xx in Debian-based
                 # part of "perl5" on FreeBSD
-                'Compress::Raw::Zlib' => 0,
-                'Compress::Zlib' => 0,
-                'Data::Dumper' => 0,
+                'autodie' => 0, # rpm: perl-autodie
+                'Compress::Raw::Zlib' => 0, # rpm: perl-Compress-Raw-Zlib
+                'Compress::Zlib' => 0, # rpm: perl-IO-Compress
+                'Data::Dumper' => 0, # rpm: perl-Data-Dumper
                 'Digest::SHA' => 0, # rpm: perl-Digest-SHA
-                'Encode' => 2.35, # 2.35 shipped with 5.10.1
-                'IO::Compress::Gzip' => 0,
-                'IO::Uncompress::Gunzip' => 0,
-                'Storable' => 0, # rpm: perl-Storable
+                'IO::Compress::Gzip' => 0, # rpm: perl-IO-Compress
+                'IO::Uncompress::Gunzip' => 0, # rpm: perl-IO-Compress
+                'Sys::Syslog' => 0, # rpm: perl-Sys-Syslog
                 'Text::ParseWords' => 0, # rpm: perl-Text-ParseWords
 
                 # Plack is needed for public-inbox-httpd and PublicInbox::WWW
                 # 'Plack' => 0,
 
-                'URI::Escape' => 0,
+                'URI' => 0,
 
                 # We have more test dependencies, but do not force
                 # users to install them.  See INSTALL
 
                 # All Perl installs I know about have these, but RH-based
-                # distros make them separate even though 'perl' pulls them in
+                # distros can separate these even if `perl' depends on them:
+                'constant' => 0, # rpm: perl-constant
+                'Encode' => 2.35, # rpm: perl-Encode # 2.35 shipped with 5.10.1
                 'File::Path' => 0,
                 'File::Temp' => '0.19', # for ->tmpdir support
-                'Getopt::Long' => 0,
-                'Exporter' => 0,
+                'Getopt::Long' => 0, # rpm: perl-Getopt-Long
+                'Exporter' => 0, # rpm: perl-Exporter
+                'IO::Poll' => 0,
+                'Storable' => 0, # rpm: perl-Storable
+                'Time::HiRes' => 0, # rpm: perl-Time-HiRes
                 # ExtUtils::MakeMaker # this file won't run w/o it...
         },
         MAN3PODS => \%man3,
         clean => {
-                FILES => 't/home*/setup* t/home*/t* t/home*/.public-inbox'
+                FILES => 't/home*/setup* t/home*/t* t/home*/.public-inbox '.
+                        't/data-gen/*'
+        },
+        PM => {
+                map {
+                        s[^lib/][]s;
+                        +('lib/' . $_ => '$(INST_LIB)/' . $_);
+                } grep {
+                        # Will include *.pod and an *.h file, but so
+                        # would ExtUtils::MakeMaker.
+                        m[^lib/];
+                } @manifest
         },
 );
 
 sub MY::postamble {
-        my $N = (`{ getconf _NPROCESSORS_ONLN || nproc; } 2>/dev/null` || 1);
+        my $N = (`{ getconf _NPROCESSORS_ONLN ||
+                getconf NPROCESSORS_ONLN; } 2>/dev/null` || 1);
         $N += 1; # account for sleeps in some tests (and makes an IV)
         <<EOF;
 PROVE = prove
@@ -193,7 +226,7 @@ $VARS
 -include Documentation/include.mk
 $TGTS
 
-check-man :: $check_lexgrog$warn_no_pod
+check-man : $check_lexgrog$warn_no_pod
 
 # syntax checks are currently GNU make only:
 %.syntax :: %
@@ -211,19 +244,30 @@ check-manifest : MANIFEST
         \$(check_manifest)
 
 # the traditional way running per-*.t processes:
-check-each :: pure_all
+check-each : pure_all
         \$(EATMYDATA) \$(PROVE) --state=save -bvw -j\$(N)
         -@\$(check_manifest)
 
-# lightly-tested way to run tests, relies "--state=save" in check-each
-# for best performance
-check-run :: pure_all check-man
-        \$(EATMYDATA) \$(PROVE) -bvw t/run.perl :: -j\$(N)
+# check-run relies "--state=save" in check-each for best performance
+check-run : check-man
+
+# n.b. while `-' isn't specified as an allowed make(1posix) macro name,
+# GNU and *BSD both allow it.
+check-run_T_ARGS = -j\$(N)
+
+check-xh0 :
+        \$(MAKE) check-run TEST_DAEMON_XH='-X0'
+
+check-xh1 :
+        \$(MAKE) check-run TEST_DAEMON_XH='-X1'
+
+check-debris check-run : pure_all
+        \$(EATMYDATA) \$(PROVE) -bvw xt/\$@.t :: \$(\$\@_T_ARGS)
         -@\$(check_manifest)
 
-check :: check-each
+check : check-each
 
-lib/PublicInbox/UserContent.pm :: contrib/css/216dark.css
+lib/PublicInbox/UserContent.pm : contrib/css/216dark.css
         \$(PERL) -I lib \$@ \$?
 
 # Ensure new .pm files will always be installed by updating
@@ -237,17 +281,27 @@ Makefile.PL : MANIFEST
 # prefix + bindir matches git.git Makefile:
 prefix = \$(HOME)
 bindir = \$(prefix)/bin
-symlink-install :
+symlink-install : lib/PublicInbox.pm
         mkdir -p \$(bindir)
-        lei=\$\$(realpath lei.sh) && cd \$(bindir) && \\
+        lei="\$(PWD)/lei.sh" && cd \$(bindir) && \\
         for x in \$(EXE_FILES); do \\
                 ln -sf "\$\$lei" \$\$(basename "\$\$x"); \\
         done
 
-update-copyrights :
-        \@case '\$(GNULIB_PATH)' in '') echo >&2 GNULIB_PATH unset; false;; esac
-        git ls-files | UPDATE_COPYRIGHT_HOLDER='all contributors' \\
-                UPDATE_COPYRIGHT_USE_INTERVALS=2 \\
-                xargs \$(GNULIB_PATH)/build-aux/update-copyright
+pm_to_blib : lib/PublicInbox.pm
+lib/PublicInbox.pm : FORCE
+        VERSION=\$(VERSION) \$(PERL) -w ./version-gen.perl
+
+XH_TESTS = t/xap_helper.t t/cindex.t
+
+test-asan : pure_all
+        TEST_XH_CXX_ONLY=1 CXXFLAGS='-Wall -ggdb3 -fsanitize=address' \\
+                prove -bvw \$(XH_TESTS)
+
+VG_OPT = -v --trace-children=yes --track-fds=yes
+VG_OPT += --leak-check=yes --track-origins=yes
+test-valgrind : pure_all
+        TEST_XH_CXX_ONLY=1 VALGRIND="valgrind \$(VG_OPT)" \\
+                prove -bvw \$(XH_TESTS)
 EOF
 }