On Wed, 22 Nov 2017, Ævar Arnfjörð Bjarmason wrote: > > The latter case concerns me here. If the "Config" module is loading local > > system paths, then the relative pathing between "$Config{installsitelib}" > > and "$Config{siteprefixexp}" may not be consistent between systems, so an > > archive built from one system may not have a compatible relative > > directory structure when resolved with the Config module on another > > system. > > I don't see how this is different from any other option we build git > with. When we dynamically link to e.g. PCRE under RUNTIME_PREFIX*=Yes > you can move the installed git from /tmp/git to /tmp/git2, but it'll > still expect the specific version of the *.so libraries to be in > /usr/lib or whatever. PCRE brings up a good point. When I build Git for Chromium, I am actually statically linking in PCRE and most other runtime dependencies, so this is the sort of portability that I am targetting. The set of configuration options for full static linking, however, are too use-case-specific to build into Git, so this patch set merely seeks to fundamentally enable relocatability as an option for users to customize as they need. > Similarly we under the default MakeMaker path add the perl version to > the directories we have, you can move git from /tmp/git to /tmp/git2 no > problem, since that won't change the perl version, but if you upgrade > the global perl itself from 5.20 to 5.24 you'll need to re-build. As you note below, the Git PERL code below, doesn't include any compiled binary files. As far as I can tell, it's highly portable, with no real dependencies outside of PERL 5. To that end, I very much do want to transplant a Git distribution built on Machine-A w/ PERL 5.20 and dump it onto Machine-B w/ PERL 5.24 and have things work. My inclination is to follow your previous advice and export an installation path to MakeMaker. I found that "INSTALLSITELIB" did what I wanted. My working version exports a version-neutral installation path, "$(prefix)/share/perl5", to MakeMaker. I can then hard-code that relative path into the PERL header and use it for resolution, similar to what my previous patch is doing. NO_PERL_MAKEMAKER emitted a neutral library path, "$(prefix)/lib", and that was one of the things that made it an appealing option in my previous patch, but prescribing the path also works fine. At the end of the day, we're hard-coding "instlibdir" into the generated header, so it doesn't *really* matter if we use "$(prefix)/share/perl5/5.2.4" or "$(prefix)/share/perl5"; however, as a matter of preference, I would like to avoid naming the build system's PERL version into the deployable bundle when RUNTIME_PREFIX_PERL is set, so I'd opt for the latter. > [...] > If it's not neede dwe can just do "$p/lib". ATM my working code does (pseudocode and filling in values): 1) $gitexecpath = "libexec/git-core"; 2) $perllibpath = "share/perl5" 3) Assert that $FindBin::Bin ends with $gitexecpath (or die). 4) Strip $gitexecpath, result stored as $prefix. 5) Use File->concat($prefix, $perllibpath); This behaves similarly to how the C code resolves things, and seems adequate for this purpose. > Having said the above, I don't understand why we're using MakeMaker at > all and I think we should just get rid of it. > > I think the best way to proceed is probalby to just start getting rid of > the perl/* make stuff as discussed above. > > Is that something you're interested in / have time for, otherwise I > could see if I could find some time, but I don't have a lot these days. Once thought on why MakeMaker may have value is that third-party PERL tooling may want to import Git's PERL libraries. If this is something Git supports, we probably need something like MakeMaker to know where the system PERL library installation path is so it can put the Git library in the right place in standard (non-RUNTIME_PREFIX_PERL) installations. I agree that it shouldn't block this effort. My general judgement tends to be that that a patch set should not sway far from a single purpose, else it becomes hard to review and/or revert if it is problematic. Removing MakeMaker seems like an independent cleanup task, so I'd inclined to do that work in a separate patch set. Having dived this deeply into things, I wouldn't mind working on this if a block of time presents itself. Is there an issue tracker that the Git project uses where I could add this as a backburner/cleanup task, so it's not forgotten? Would it be appropriate to add a "TODO" comment in "perl/Makefile"? > [...] I could see if I could find some time, but I don't have a lot these > days. Thanks again for taking the time to work this out with me. -Dan