Skip to content

Commit

Permalink
Makefile: replace perl/Makefile.PL with simple make rules
Browse files Browse the repository at this point in the history
Replace the perl/Makefile.PL and the fallback perl/Makefile used under
NO_PERL_MAKEMAKER=NoThanks with a much simpler implementation heavily
inspired by how the i18n infrastructure's build process works[1].

The reason for having the Makefile.PL in the first place is that it
was initially[2] building a perl C binding to interface with libgit,
this functionality, that was removed[3] before Git.pm ever made it to
the master branch.

We've since since started maintaining a fallback perl/Makefile, as
MakeMaker wouldn't work on some platforms[4]. That's just the tip of
the iceberg. We have the PM.stamp hack in the top-level Makefile[5] to
detect whether we need to regenerate the perl/perl.mak, which I fixed
just recently to deal with issues like the perl version changing from
under us[6].

There is absolutely no reason for why this needs to be so complex
anymore. All we're getting out of this elaborate Rube Goldberg machine
was copying perl/* to perl/blib/* as we do a string-replacement on
the *.pm files to hardcode @@LOCALEDIR@@ in the source, as well as
pod2man-ing Git.pm & friends.

So replace the whole thing with something that's pretty much a copy of
how we generate po/build/**.mo from po/*.po, just with a small sed(1)
command instead of msgfmt. As that's being done rename the files
from *.pm to *.pmc just to indicate that they're generated (see
"perldoc -f require").

While I'm at it, change the fallback for Error.pm from being something
where we'll ship our own Error.pm if one doesn't exist at build time
to one where we just use a Git::Error wrapper that'll always prefer
the system-wide Error.pm, only falling back to our own copy if it
really doesn't exist at runtime. It's now shipped as
Git::FromCPAN::Error, making it easy to add other modules to
Git::FromCPAN::* in the future if that's needed.

Functional changes:

 * This will not always install into perl's idea of its global
   "installsitelib". This only potentially matters for packagers that
   need to expose Git.pm for non-git use, and as explained in the
   INSTALL file there's a trivial workaround.

 * The scripts themselves will 'use lib' the target directory, but if
   INSTLIBDIR is set it overrides it. It doesn't have to be this way,
   it could be set in addition to INSTLIBDIR, but my reading of [7] is
   that this is the desired behavior.

 * We don't build man pages for all of the perl modules as we used to,
   only Git(3pm). As discussed on-list[8] that we were building
   installed manpages for purely internal APIs like Git::I18N or
   private-Error.pm was always a bug anyway, and all the Git::SVN::*
   ones say they're internal APIs.

   There are apparently external users of Git.pm, but I don't expect
   there to be any of the others.

   As a side-effect of these general changes the perl documentation
   now only installed by install-{doc,man}, not a mere "install" as
   before.

1. 5e9637c ("i18n: add infrastructure for translating Git with
   gettext", 2011-11-18)

2. b1edc53 ("Introduce Git.pm (v4)", 2006-06-24)

3. 18b0fc1 ("Git.pm: Kill Git.xs for now", 2006-09-23)

4. f848718 ("Make perl/ build procedure ActiveState friendly.",
   2006-12-04)

5. ee9be06 ("perl: detect new files in MakeMaker builds",
   2012-07-27)

6. c59c493 ("perl: regenerate perl.mak if perl -V changes",
   2017-03-29)

7. 0386dd3 ("Makefile: add PERLLIB_EXTRA variable that adds to
   default perl path", 2013-11-15)

8. 87bmjjv1pu.fsf@evledraar.booking.com ("Re: [PATCH] Makefile:
   replace perl/Makefile.PL with simple make rules"

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
avar authored and gitster committed Dec 11, 2017
1 parent 1a4e40a commit 20d2a30
Show file tree
Hide file tree
Showing 14 changed files with 106 additions and 199 deletions.
17 changes: 16 additions & 1 deletion INSTALL
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,24 @@ Issues of note:

GIT_EXEC_PATH=`pwd`
PATH=`pwd`:$PATH
GITPERLLIB=`pwd`/perl/blib/lib
GITPERLLIB=`pwd`/perl/build/lib
export GIT_EXEC_PATH PATH GITPERLLIB

- By default (unless NO_PERL is provided) Git will ship various perl
scripts & libraries it needs. However, for simplicity it doesn't
use the ExtUtils::MakeMaker toolchain to decide where to place the
perl libraries. Depending on the system this can result in the perl
libraries not being where you'd like them if they're expected to be
used by things other than Git itself.

Manually supplying a perllibdir prefix should fix this, if this is
a problem you care about, e.g.:

prefix=/usr perllibdir=/usr/$(/usr/bin/perl -MConfig -wle 'print substr $Config{installsitelib}, 1 + length $Config{siteprefixexp}')

Will result in e.g. perllibdir=/usr/share/perl/5.26.1 on Debian,
perllibdir=/usr/share/perl5 (which we'd use by default) on CentOS.

- Git is reasonably self-sufficient, but does depend on a few external
programs and libraries. Git can be used without most of them by adding
the approriate "NO_<LIBRARY>=YesPlease" to the make command line or
Expand Down
67 changes: 36 additions & 31 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -295,9 +295,6 @@ all::
#
# Define PERL_PATH to the path of your Perl binary (usually /usr/bin/perl).
#
# Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
# MakeMaker (e.g. using ActiveState under Cygwin).
#
# Define NO_PERL if you do not want Perl scripts or libraries at all.
#
# Define PYTHON_PATH to the path of your Python binary (often /usr/bin/python
Expand Down Expand Up @@ -473,6 +470,7 @@ gitexecdir = libexec/git-core
mergetoolsdir = $(gitexecdir)/mergetools
sharedir = $(prefix)/share
gitwebdir = $(sharedir)/gitweb
perllibdir = $(sharedir)/perl5
localedir = $(sharedir)/locale
template_dir = share/git-core/templates
htmldir = $(prefix)/share/doc/git-doc
Expand All @@ -486,7 +484,7 @@ mandir_relative = $(patsubst $(prefix)/%,%,$(mandir))
infodir_relative = $(patsubst $(prefix)/%,%,$(infodir))
htmldir_relative = $(patsubst $(prefix)/%,%,$(htmldir))

export prefix bindir sharedir sysconfdir gitwebdir localedir
export prefix bindir sharedir sysconfdir gitwebdir perllibdir localedir

CC = cc
AR = ar
Expand Down Expand Up @@ -1525,9 +1523,6 @@ ifdef SHA1_MAX_BLOCK_SIZE
LIB_OBJS += compat/sha1-chunked.o
BASIC_CFLAGS += -DSHA1_MAX_BLOCK_SIZE="$(SHA1_MAX_BLOCK_SIZE)"
endif
ifdef NO_PERL_MAKEMAKER
export NO_PERL_MAKEMAKER
endif
ifdef NO_HSTRERROR
COMPAT_CFLAGS += -DNO_HSTRERROR
COMPAT_OBJS += compat/hstrerror.o
Expand Down Expand Up @@ -1714,8 +1709,10 @@ ETC_GITATTRIBUTES_SQ = $(subst ','\'',$(ETC_GITATTRIBUTES))
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
mandir_SQ = $(subst ','\'',$(mandir))
mandir_relative_SQ = $(subst ','\'',$(mandir_relative))
infodir_relative_SQ = $(subst ','\'',$(infodir_relative))
perllibdir_SQ = $(subst ','\'',$(perllibdir))
localedir_SQ = $(subst ','\'',$(localedir))
gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
Expand Down Expand Up @@ -1824,9 +1821,6 @@ all::
ifndef NO_TCLTK
$(QUIET_SUBDIR0)git-gui $(QUIET_SUBDIR1) gitexecdir='$(gitexec_instdir_SQ)' all
$(QUIET_SUBDIR0)gitk-git $(QUIET_SUBDIR1) all
endif
ifndef NO_PERL
$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' localedir='$(localedir_SQ)' all
endif
$(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'

Expand Down Expand Up @@ -1907,7 +1901,8 @@ common-cmds.h: $(wildcard Documentation/git-*.txt)

SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
$(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV)
$(gitwebdir_SQ):$(PERL_PATH_SQ):$(SANE_TEXT_GREP):$(PAGER_ENV):\
$(perllibdir_SQ)
define cmd_munge_script
$(RM) $@ $@+ && \
sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
Expand Down Expand Up @@ -1951,29 +1946,17 @@ git.res: git.rc GIT-VERSION-FILE
$(SCRIPT_PERL_GEN): GIT-BUILD-OPTIONS

ifndef NO_PERL
$(SCRIPT_PERL_GEN): perl/perl.mak

perl/perl.mak: perl/PM.stamp

perl/PM.stamp: FORCE
@$(FIND) perl -type f -name '*.pm' | sort >$@+ && \
$(PERL_PATH) -V >>$@+ && \
{ cmp $@+ $@ >/dev/null 2>/dev/null || mv $@+ $@; } && \
$(RM) $@+

perl/perl.mak: GIT-CFLAGS GIT-PREFIX perl/Makefile perl/Makefile.PL
$(QUIET_SUBDIR0)perl $(QUIET_SUBDIR1) PERL_PATH='$(PERL_PATH_SQ)' prefix='$(prefix_SQ)' $(@F)
$(SCRIPT_PERL_GEN):

PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ)
$(SCRIPT_PERL_GEN): % : %.perl perl/perl.mak GIT-PERL-DEFINES GIT-VERSION-FILE
PERL_DEFINES = $(PERL_PATH_SQ):$(PERLLIB_EXTRA_SQ):$(perllibdir_SQ)
$(SCRIPT_PERL_GEN): % : %.perl GIT-PERL-DEFINES GIT-VERSION-FILE
$(QUIET_GEN)$(RM) $@ $@+ && \
INSTLIBDIR=`MAKEFLAGS= $(MAKE) -C perl -s --no-print-directory instlibdir` && \
INSTLIBDIR_EXTRA='$(PERLLIB_EXTRA_SQ)' && \
INSTLIBDIR="$$INSTLIBDIR$${INSTLIBDIR_EXTRA:+:$$INSTLIBDIR_EXTRA}" && \
sed -e '1{' \
-e ' s|#!.*perl|#!$(PERL_PATH_SQ)|' \
-e ' h' \
-e ' s=.*=use lib (split(/$(pathsep)/, $$ENV{GITPERLLIB} || "'"$$INSTLIBDIR"'"));=' \
-e ' s=.*=use lib (split(/$(pathsep)/, $$ENV{GITPERLLIB} || "'"$$INSTLIBDIR"'" || "'"$(perllibdir_SQ)"'"));=' \
-e ' H' \
-e ' x' \
-e '}' \
Expand Down Expand Up @@ -2291,6 +2274,21 @@ endif
po/build/locale/%/LC_MESSAGES/git.mo: po/%.po
$(QUIET_MSGFMT)mkdir -p $(dir $@) && $(MSGFMT) -o $@ $<

PMFILES := $(wildcard perl/*.pm perl/*/*.pm perl/*/*/*.pm perl/*/*/*/*.pm)
PMCFILES := $(patsubst perl/%.pm,perl/build/lib/%.pmc,$(PMFILES))

ifndef NO_PERL
all:: $(PMCFILES)
endif

perl/build/lib/%.pmc: perl/%.pm
$(QUIET_GEN)mkdir -p $(dir $@) && \
sed -e 's|@@LOCALEDIR@@|$(localedir_SQ)|g' < $< > $@

perl/build/man/man3/Git.3pm: perl/Git.pm
$(QUIET_GEN)mkdir -p $(dir $@) && \
pod2man $< $@

FIND_SOURCE_FILES = ( \
git ls-files \
'*.[hcS]' \
Expand Down Expand Up @@ -2550,7 +2548,9 @@ ifndef NO_GETTEXT
(cd '$(DESTDIR_SQ)$(localedir_SQ)' && umask 022 && $(TAR) xof -)
endif
ifndef NO_PERL
$(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perllibdir_SQ)'
(cd perl/build/lib && $(TAR) cf - .) | \
(cd '$(DESTDIR_SQ)$(perllibdir_SQ)' && umask 022 && $(TAR) xof -)
$(MAKE) -C gitweb install
endif
ifndef NO_TCLTK
Expand Down Expand Up @@ -2600,12 +2600,17 @@ endif
install-gitweb:
$(MAKE) -C gitweb install

install-doc:
install-doc: install-man-perl
$(MAKE) -C Documentation install

install-man:
install-man: install-man-perl
$(MAKE) -C Documentation install-man

install-man-perl: perl/build/man/man3/Git.3pm
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mandir_SQ)/man3'
(cd perl/build/man/man3 && $(TAR) cf - .) | \
(cd '$(DESTDIR_SQ)$(mandir_SQ)/man3' && umask 022 && $(TAR) xof -)

install-html:
$(MAKE) -C Documentation install-html

Expand Down Expand Up @@ -2697,7 +2702,7 @@ clean: profile-clean coverage-clean
$(MAKE) -C Documentation/ clean
ifndef NO_PERL
$(MAKE) -C gitweb clean
$(MAKE) -C perl clean
$(RM) -r perl/build/
endif
$(MAKE) -C templates/ clean
$(MAKE) -C t/ clean
Expand Down
2 changes: 1 addition & 1 deletion contrib/examples/git-difftool.perl
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
use 5.008;
use strict;
use warnings;
use Error qw(:try);
use Git::Error qw(:try);
use File::Basename qw(dirname);
use File::Copy;
use File::Find;
Expand Down
2 changes: 1 addition & 1 deletion git-send-email.perl
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
use Term::ANSIColor;
use File::Temp qw/ tempdir tempfile /;
use File::Spec::Functions qw(catdir catfile);
use Error qw(:try);
use Git::Error qw(:try);
use Cwd qw(abs_path cwd);
use Git;
use Git::I18N;
Expand Down
9 changes: 1 addition & 8 deletions perl/.gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1 @@
perl.mak
perl.mak.old
MYMETA.json
MYMETA.yml
blib
blibdirs
pm_to_blib
PM.stamp
/build/
2 changes: 1 addition & 1 deletion perl/Git.pm
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ increase notwithstanding).


use Carp qw(carp croak); # but croak is bad - throw instead
use Error qw(:try);
use Git::Error qw(:try);
use Cwd qw(abs_path cwd);
use IPC::Open2 qw(open2);
use Fcntl qw(SEEK_SET SEEK_CUR);
Expand Down
46 changes: 46 additions & 0 deletions perl/Git/Error.pm
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package Git::Error;
use 5.008;
use strict;
use warnings;

=head1 NAME
Git::Error - Wrapper for the L<Error> module, in case it's not installed
=head1 DESCRIPTION
Wraps the import function for the L<Error> module.
This module is only intended to be used for code shipping in the
C<git.git> repository. Use it for anything else at your peril!
=cut

sub import {
shift;
my $caller = caller;

eval {
require Error;
1;
} or do {
my $error = $@ || "Zombie Error";

my $Git_Error_pm_path = $INC{"Git/Error.pm"} || die "BUG: Should have our own path from %INC!";

require File::Basename;
my $Git_Error_pm_root = File::Basename::dirname($Git_Error_pm_path) || die "BUG: Can't figure out lib/Git dirname from '$Git_Error_pm_path'!";

require File::Spec;
my $Git_pm_FromCPAN_root = File::Spec->catdir($Git_Error_pm_root, 'FromCPAN');
die "BUG: '$Git_pm_FromCPAN_root' should be a directory!" unless -d $Git_pm_FromCPAN_root;

local @INC = ($Git_pm_FromCPAN_root, @INC);
require Error;
};

local @_ = ($caller, @_);
goto &Error::import;
}

1;
File renamed without changes.
2 changes: 1 addition & 1 deletion perl/Git/I18N.pm
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ our @EXPORT_OK = @EXPORT;

sub __bootstrap_locale_messages {
our $TEXTDOMAIN = 'git';
our $TEXTDOMAINDIR = $ENV{GIT_TEXTDOMAINDIR} || '++LOCALEDIR++';
our $TEXTDOMAINDIR = $ENV{GIT_TEXTDOMAINDIR} || '@@LOCALEDIR@@';

require POSIX;
POSIX->import(qw(setlocale));
Expand Down
90 changes: 0 additions & 90 deletions perl/Makefile

This file was deleted.

Loading

0 comments on commit 20d2a30

Please sign in to comment.