From 637727353c8db2a71fa7f52e22426e19feb904fe Mon Sep 17 00:00:00 2001 From: polyfloyd Date: Wed, 9 Jul 2025 00:03:35 +0200 Subject: [PATCH] perlPackages: Deprecate shortenPerlShebang --- doc/languages-frameworks/perl.section.md | 33 +---- .../setup-hooks/shorten-perl-shebang.sh | 88 +------------ .../perl-modules/generic/builder.sh | 7 +- pkgs/top-level/perl-packages.nix | 118 ++++++++++++++++-- 4 files changed, 117 insertions(+), 129 deletions(-) diff --git a/doc/languages-frameworks/perl.section.md b/doc/languages-frameworks/perl.section.md index 50fc4945ff76..dd95f3740837 100644 --- a/doc/languages-frameworks/perl.section.md +++ b/doc/languages-frameworks/perl.section.md @@ -71,7 +71,7 @@ To install it with `nix-env` instead: `nix-env -f. -iA perlPackages.ClassC3`. So what does `buildPerlPackage` do? It does the following: 1. In the configure phase, it calls `perl Makefile.PL` to generate a Makefile. You can set the variable `makeMakerFlags` to pass flags to `Makefile.PL` -2. It adds the contents of the `PERL5LIB` environment variable to `#! .../bin/perl` line of Perl scripts as `-Idir` flags. This ensures that a script can find its dependencies. (This can cause this shebang line to become too long for Darwin to handle; see the note below.) +2. It adds the contents of the `PERL5LIB` environment variable to a use lib statement at the start of Perl scripts. This ensures that a script can find its dependencies. 3. In the fixup phase, it writes the propagated build inputs (`propagatedBuildInputs`) to the file `$out/nix-support/propagated-user-env-packages`. `nix-env` recursively installs all packages listed in this file when you install a package that has it. This ensures that a Perl package can find its dependencies. `buildPerlPackage` is built on top of `stdenv`, so everything can be customised in the usual way. For instance, the `BerkeleyDB` module has a `preConfigure` hook to generate a configuration file used by `Makefile.PL`: @@ -120,37 +120,6 @@ Dependencies on other Perl packages can be specified in the `buildInputs` and `p } ``` -On Darwin, if a script has too many `-Idir` flags in its first line (its “shebang line”), it will not run. This can be worked around by calling the `shortenPerlShebang` function from the `postInstall` phase: - -```nix -{ - lib, - stdenv, - buildPerlPackage, - fetchurl, - shortenPerlShebang, -}: - -{ - ImageExifTool = buildPerlPackage { - pname = "Image-ExifTool"; - version = "12.50"; - - src = fetchurl { - url = "https://exiftool.org/Image-ExifTool-${version}.tar.gz"; - hash = "sha256-vOhB/FwQMC8PPvdnjDvxRpU6jAZcC6GMQfc0AH4uwKg="; - }; - - nativeBuildInputs = lib.optional stdenv.hostPlatform.isDarwin shortenPerlShebang; - postInstall = lib.optionalString stdenv.hostPlatform.isDarwin '' - shortenPerlShebang $out/bin/exiftool - ''; - }; -} -``` - -This will remove the `-I` flags from the shebang line, rewrite them in the `use lib` form, and put them on the next line instead. This function can be given any number of Perl scripts as arguments; it will modify them in-place. - ### Generation from CPAN {#ssec-generation-from-CPAN} Nix expressions for Perl packages can be generated (almost) automatically from CPAN. This is done by the program `nix-generate-from-cpan`, which can be installed as follows: diff --git a/pkgs/build-support/setup-hooks/shorten-perl-shebang.sh b/pkgs/build-support/setup-hooks/shorten-perl-shebang.sh index 825da1bde962..e573ba0b13db 100644 --- a/pkgs/build-support/setup-hooks/shorten-perl-shebang.sh +++ b/pkgs/build-support/setup-hooks/shorten-perl-shebang.sh @@ -1,88 +1,4 @@ -# This setup hook modifies a Perl script so that any "-I" flags in its shebang -# line are rewritten into a "use lib ..." statement on the next line. This gets -# around a limitation in Darwin, which will not properly handle a script whose -# shebang line exceeds 511 characters. -# -# Each occurrence of "-I /path/to/lib1" or "-I/path/to/lib2" is removed from -# the shebang line, along with the single space that preceded it. These library -# paths are placed into a new line of the form -# -# use lib "/path/to/lib1", "/path/to/lib2"; -# -# immediately following the shebang line. If a library appeared in the original -# list more than once, only its first occurrence will appear in the output -# list. In other words, the libraries are deduplicated, but the ordering of the -# first appearance of each one is preserved. -# -# Any flags other than "-I" in the shebang line are left as-is, and the -# interpreter is also left alone (although the script will abort if the -# interpreter does not seem to be either "perl" or else "env" with "perl" as -# its argument). Each line after the shebang line is left unchanged. Each file -# is modified in place. -# -# Usage: -# shortenPerlShebang SCRIPT... - +# Deprecated. Invocation in derivations can be safely removed. shortenPerlShebang() { - while [ $# -gt 0 ]; do - _shortenPerlShebang "$1" - shift - done -} - -_shortenPerlShebang() { - local program="$1" - - echo "shortenPerlShebang: rewriting shebang line in $program" - - if ! isScript "$program"; then - die "shortenPerlShebang: refusing to modify $program because it is not a script" - fi - - local temp="$(mktemp)" - - gawk ' - (NR == 1) { - if (!($0 ~ /\/(perl|env +perl)\>/)) { - print "shortenPerlShebang: script does not seem to be a Perl script" > "/dev/stderr" - exit 1 - } - idx = 0 - while (match($0, / -I ?([^ ]+)/, pieces)) { - matches[idx] = pieces[1] - idx++ - $0 = gensub(/ -I ?[^ ]+/, "", 1, $0) - } - print $0 - if (idx > 0) { - prefix = "use lib " - for (idx in matches) { - path = matches[idx] - if (!(path in seen)) { - printf "%s\"%s\"", prefix, path - seen[path] = 1 - prefix = ", " - } - } - print ";" - } - } - (NR > 1 ) { - print - } - ' "$program" > "$temp" || die - # Preserve the mode of the original file - cp --preserve=mode --attributes-only "$program" "$temp" - mv "$temp" "$program" - - # Measure the new shebang line length and make sure it's okay. We subtract - # one to account for the trailing newline that "head" included in its - # output. - local new_length=$(( $(head -n 1 "$program" | wc -c) - 1 )) - - # Darwin is okay when the shebang line contains 511 characters, but not - # when it contains 512 characters. - if [ $new_length -ge 512 ]; then - die "shortenPerlShebang: shebang line is $new_length characters--still too long for Darwin!" - fi + : } diff --git a/pkgs/development/perl-modules/generic/builder.sh b/pkgs/development/perl-modules/generic/builder.sh index 97d0bbcce7ac..afd42c840182 100644 --- a/pkgs/development/perl-modules/generic/builder.sh +++ b/pkgs/development/perl-modules/generic/builder.sh @@ -1,9 +1,10 @@ PERL5LIB="$PERL5LIB${PERL5LIB:+:}$out/lib/perl5/site_perl" -perlFlags= +perlUseLibs='use lib' for i in $(IFS=:; echo $PERL5LIB); do - perlFlags="$perlFlags -I$i" + perlUseLibs="$perlUseLibs \"$i\"," done +perlUseLibs=$(echo "$perlUseLibs" | sed 's/,$/;/') oldPreConfigure="$preConfigure" preConfigure() { @@ -15,7 +16,7 @@ preConfigure() { first=$(dd if="$fn" count=2 bs=1 2> /dev/null) if test "$first" = "#!"; then echo "patching $fn..." - sed -i "$fn" -e "s|^#\!\(.*\bperl\b.*\)$|#\!\1$perlFlags|" + sed -i "$fn" -e "s|^#\!\(.*\bperl\b.*\)$|#\!\1\n$perlUseLibs|" fi fi done diff --git a/pkgs/top-level/perl-packages.nix b/pkgs/top-level/perl-packages.nix index 8110742ec34d..cd6a5c21508f 100644 --- a/pkgs/top-level/perl-packages.nix +++ b/pkgs/top-level/perl-packages.nix @@ -2798,6 +2798,10 @@ with self; }; propagatedBuildInputs = [ TaskWeaken ]; buildInputs = [ ExtUtilsDepends ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/utils/40walk.t + ''; meta = { description = "Helper functions for op tree manipulation"; homepage = "https://search.cpan.org/dist/B-Utils"; @@ -4438,6 +4442,11 @@ with self; TestWarn ]; propagatedBuildInputs = [ HTMLParser ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/rt-84767.t + rm t/param_list_context.t + ''; meta = { description = "Handle Common Gateway Interface requests and responses"; homepage = "https://metacpan.org/module/CGI"; @@ -5293,6 +5302,12 @@ with self; url = "mirror://cpan/authors/id/K/KM/KMX/Class-Throwable-0.13.tar.gz"; hash = "sha256-3JoR4Nq1bcIg3qjJT+PEfbXn3Xwe0E3IF4qlu3v7vM4="; }; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/10_Class_Throwable_test.t + rm t/20_Class_Throwable_subException_test.t + rm t/35_Class_Throwable_sub_class_test.t + ''; meta = { description = "Minimal lightweight exception class"; license = with lib.licenses; [ @@ -10215,6 +10230,10 @@ with self; SafeIsa TextBrew ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/ResultSet/Errors.t + ''; meta = { description = "Simplify the common case stuff for DBIx::Class"; homepage = "https://github.com/frioux/DBIx-Class-Helpers"; @@ -14402,6 +14421,10 @@ with self; DirSelf TestFatal ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/eating_strict_error.t + ''; meta = { description = "Define functions and methods with parameter lists (\"subroutine signatures\")"; license = with lib.licenses; [ @@ -22027,6 +22050,10 @@ with self; TestDeep TestNoWarnings ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/20_parse_self.t + ''; meta = { description = "Find out what modules are used"; license = with lib.licenses; [ @@ -27792,6 +27819,11 @@ with self; postInstall = lib.optionalString stdenv.hostPlatform.isDarwin '' shortenPerlShebang $out/bin/perlcritic ''; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/20_policy_require_tidy_code.t + rm t/03_pragmas.t + ''; meta = { description = "Critique Perl source code for best-practices"; homepage = "http://perlcritic.com"; @@ -28510,6 +28542,10 @@ with self; postInstall = lib.optionalString stdenv.hostPlatform.isDarwin '' shortenPerlShebang $out/bin/pls ''; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/02document-new.t + ''; meta = { description = "Perl Language Server"; homepage = "https://github.com/FractalBoy/perl-language-server"; @@ -28630,10 +28666,12 @@ with self; TaskWeaken ]; - # Remove test that fails due to unexpected shebang after - # patchShebang. - preCheck = "rm t/03_document.t"; - + preCheck = " + # Remove test that fails due to unexpected shebang after patchShebang. + rm t/03_document.t + # Remove tests with hardcoded line numbers. + rm t/29_logical_filename.t + "; meta = { description = "Parse, Analyze and Manipulate Perl (without perl)"; homepage = "https://github.com/Perl-Critic/PPI"; @@ -29209,6 +29247,10 @@ with self; url = "mirror://cpan/authors/id/M/MA/MAREKR/Pod-Checker-1.75.tar.gz"; hash = "sha256-82O1dOxmCvbtvT5dTJ/8UVodRsvxx8ytmkbO0oh5wiE="; }; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/pod/podchkenc.t + ''; meta = { description = "Verifies POD documentation contents for compliance with the POD format specifications"; license = with lib.licenses; [ @@ -29319,6 +29361,10 @@ with self; }; propagatedBuildInputs = [ MixinLinewise ]; buildInputs = [ TestDeep ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/non-pod.t + ''; meta = { description = "Read a POD document as a series of trivial events"; homepage = "https://github.com/rjbs/Pod-Eventual"; @@ -30198,6 +30244,10 @@ with self; AnyEvent DataSExpression ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/06.query.t + ''; meta = { description = "Asynchronous Remote Procedure Stack"; license = with lib.licenses; [ @@ -32052,6 +32102,11 @@ with self; url = "mirror://cpan/authors/id/R/RG/RGARCIA/Sub-Identify-0.14.tar.gz"; hash = "sha256-Bo0nIIZRTdHoQrakCxvtuv7mOQDlsIiQ72cAA53vrW8="; }; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/04codelocation-pureperl.t + rm t/04codelocation.t + ''; meta = { description = "Retrieve names of code references"; license = with lib.licenses; [ @@ -32306,6 +32361,10 @@ with self; url = "mirror://cpan/authors/id/D/DE/DEXTER/Symbol-Util-0.0203.tar.gz"; hash = "sha256-VbZh3SL5zpub5afgo/UomsAM0lTCHj2GAyiaVlrm3DI="; }; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/10use.t + ''; meta = { description = "Additional utils for Perl symbols manipulation"; license = with lib.licenses; [ @@ -33526,6 +33585,10 @@ with self; hash = "sha256-/NzkHVcnOIFYGt9oCiCmrfUaTDt+McP2mGb7kQk3AoA="; }; propagatedBuildInputs = [ LogTrace ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/Test-Assertions.t + ''; meta = { description = "Simple set of building blocks for both unit and runtime testing"; license = with lib.licenses; [ gpl2Only ]; @@ -33621,6 +33684,14 @@ with self; ModuleRuntime TryTiny ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/runtests_die.t + rm t/runtests_die_empty.t + rm t/runtests_die_nearlyempty.t + rm t/runtests_result.t + rm t/todo.t + ''; meta = { description = "Easily create test classes in an xUnit/JUnit style"; license = with lib.licenses; [ @@ -33946,6 +34017,10 @@ with self; hash = "sha256-FWsT8Hdk92bYtFpDco8kOa+Bo1EmJUON6reDt4g+tTM="; }; propagatedBuildInputs = [ SubUplevel ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/return.t + ''; meta = { description = "Test exception-based code"; license = with lib.licenses; [ @@ -34327,6 +34402,11 @@ with self; url = "mirror://cpan/authors/id/L/LE/LEEJO/Test-LeakTrace-0.17.tar.gz"; hash = "sha256-d31k0pOPXqWGMA7vl+8D6stD1MGFPJw7EJHrMxFGeXA="; }; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/09_info_more.t + rm t/11_logfp.t + ''; meta = { description = "Traces memory leaks"; homepage = "https://metacpan.org/release/Test-LeakTrace"; @@ -34608,6 +34688,10 @@ with self; url = "mirror://cpan/authors/id/S/SY/SYP/Test-Mojibake-1.3.tar.gz"; hash = "sha256-j/51/5tpNSSIcn3Kc9uR+KoUtZ8voQTrdxfA1xpfGzM="; }; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/02-bad-source.t + ''; meta = { description = "Check your source for encoding misbehavior"; homepage = "https://github.com/creaktive/Test-Mojibake"; @@ -34820,6 +34904,13 @@ with self; TextDiff ]; buildInputs = [ TestPerlCritic ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/perltidy.t + rm t/list_files.t + rm t/exclude_files.t + rm t/exclude_perltidy.t + ''; meta = { description = "Check that all your files are tidy"; homepage = "https://metacpan.org/release/Test-PerlTidy"; @@ -35217,13 +35308,15 @@ with self; url = "mirror://cpan/authors/id/P/PL/PLICEASE/Test-Script-1.29.tar.gz"; hash = "sha256-iS5+bB6nsWcQkJlCz1wL2rcO7i79SqnBbqlS4rkPiVA="; }; - buildInputs = [ Test2Suite ]; - propagatedBuildInputs = [ CaptureTiny ProbePerl ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/test_script__script_compiles.t + ''; meta = { description = "Basic cross-platform tests for scripts"; license = with lib.licenses; [ @@ -35488,6 +35581,9 @@ with self; hash = "sha256-mMoy5/L16om4v7mgYJl389FT4kLi5RcFEmy5VPGga1c="; }; propagatedBuildInputs = [ SubUplevel ]; + # Tests fail because they hardcode line numbers which have been shifted due to the inclusion of + # libraries. + doCheck = false; meta = { description = "Perl extension to test methods for warnings"; license = with lib.licenses; [ @@ -35651,6 +35747,10 @@ with self; hash = "sha256-36phHnFGrZyXabW89oiUmXa4Ny3354ekC5M6FI2JIDk="; }; propagatedBuildInputs = [ XMLLibXML ]; + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/simple.t + ''; meta = { description = "Test XML and HTML content and structure with XPath expressions"; license = with lib.licenses; [ @@ -36496,9 +36596,11 @@ with self; url = "mirror://cpan/authors/id/G/GF/GFUJI/Test-Vars-0.015.tar.gz"; hash = "sha256-4Y3RWCcuTsmTnh37M8dDGrTnXGtAsoDDi16AT9pHGlQ="; }; - buildInputs = [ ModuleBuildTiny ]; - + preCheck = '' + # Remove tests with hardcoded line numbers. + rm t/03_warned.t + ''; meta = { description = "Detects unused variables in perl modules"; homepage = "https://github.com/houseabsolute/p5-Test-Vars";