function _fix_overlong_make_recipe(package)
    -- In the MSYS environment, the make recipe can be too long to execute.
    -- This patch is adapted from OpenSSL 3.
    -- For more details, see: https://github.com/openssl/openssl/issues/12116
    io.gsub("Configurations/00-base-templates.conf", -- replace default AR

            "DEFAULTS%s-=>%s-{" ..
               "(.-)"..
                [[AR%s-=>%s-"%S-"%s-,]].. 	-- AR		=> "ar",
            "(.-)}",

            "DEFAULTS => {"..
                "%1"..
                [[AR => "(unused)",]] ..
            "%2}")
    io.gsub("Configurations/00-base-templates.conf", -- replace default ARFLAGS

            "DEFAULTS%s-=>%s-{" ..
               "(.-)"..
                [[ARFLAGS%s-=>%s-"%S-"%s-,]].. --	ARFLAGS		=> "r",
            "(.-)}",

            "DEFAULTS => {"..
                "%1"..
                [[ARFLAGS => "(unused)",]] ..
            "%2}")
    io.gsub("Configurations/00-base-templates.conf", -- replace BASE_unix ARFLAGS

            "BASE_unix%s-=>%s-{" ..
               "(.-)"..
                [[ARFLAGS%s-=>%s-"%S-"%s-,]].. -- ARFLAGS         => "r",
            "(.-)}",

            "BASE_unix => {"..
                "%1"..
                [[ARFLAGS => "qc",]] ..
            "%2}")
    io.gsub("Configurations/unix-Makefile.tmpl", -- insert fill_lines function

            "(sub%s-dependmagic%s-{)" ..
               "(.-)"..
            "}%s-'';",

            "%1"..
                "%2"..
            "}\n"..
            [[
            sub fill_lines {
                my $item_sep = shift;                  # string
                my $line_length = shift;               # number of chars

                my @result = ();
                my $resultpos = 0;

                foreach (@_) {
                    my $fill_line = $result[$resultpos] // '';
                    my $newline =
                        ($fill_line eq '' ? '' : $fill_line . $item_sep) . $_;

                    if (length($newline) > $line_length) {
                        # If this is a single item and the intended result line
                        # is empty, we put it there anyway
                        if ($fill_line eq '') {
                            $result[$resultpos++] = $newline;
                        } else {
                            $result[++$resultpos] = $_;
                        }
                    } else {
                        $result[$resultpos] = $newline;
                    }
                }
                return @result;
            }
            ]]..
            [['';]])

    io.gsub("Configurations/unix-Makefile.tmpl", -- change the way we handle dependencies

            "sub%s-libobj2shlib%s-{" ..
               "(.-)"..
                [[my%s-%$objs.-;]].. -- my $objs = join(" ", @objs);
            "(.-)}",

            "sub libobj2shlib {"..
                "%1"..
                [[my $objs =
                    join(" \\\n\t\t", fill_lines(' ', $COLUMNS - 16, @objs));]] ..
            "%2}")
    io.gsub("Configurations/unix-Makefile.tmpl", -- change the way we handle dependencies

            "sub%s-libobj2shlib%s-{" ..
               "(.-)"..
                [[my%s-%$deps.-;]].. -- my $deps = join(" ", @objs, @defs, @deps);
            "(.-)}",

            "sub libobj2shlib {"..
                "%1"..
                [[my @fulldeps = (@objs, @defs, @deps);
                  my $fulldeps =
                    join(" \\\n" . ' ' x (length($full) + 2),
                        fill_lines(' ', $COLUMNS - length($full) - 2, @fulldeps));]] ..
            "%2}")
    io.gsub("Configurations/unix-Makefile.tmpl",

            "sub%s-libobj2shlib%s-{" ..
               "(.-)"..
                [[%$target:%s-%$deps]].. -- $target: $deps
            "(.-)}",

            "sub libobj2shlib {"..
                "%1"..
                [[$target: $fulldeps]] ..
            "%2}")
    io.gsub("Configurations/unix-Makefile.tmpl",

            "sub%s-obj2lib%s-{" ..
               "(.-)"..
                [[my%s-%$objs.-;]].. -- my $objs = join(" ", @objs);
            "(.-)}",

            "sub obj2lib {"..
                "%1"..
                [[my $deps = join(" \\\n" . ' ' x (length($lib) + 2),
                      fill_lines(' ', $COLUMNS - length($lib) - 2, @objs));
                my $max_per_call = 250;
                my @objs_grouped;
                push @objs_grouped, join(" ", splice @objs, 0, $max_per_call) while @objs;
                my $fill_lib =
                    join("\n\t", (map { "\$(AR) \$(ARFLAGS) $lib$libext $_" } @objs_grouped));]] ..
            "%2}")
    io.gsub("Configurations/unix-Makefile.tmpl",

            "sub%s-obj2lib%s-{" ..
               "(.-)"..
                [[%$lib%$libext:.-]].. -- $lib$libext: $objs
            "EOF",

            "sub obj2lib {"..
                "%1"..
                "$lib$libext: $deps\n" ..
                '\t' .. [[\$(RM) $lib$libext]] ..'\n' ..
                '\t' .. [[$fill_lib]] ..'\n' ..
                '\t' .. [[\$(RANLIB) \$\@ || echo Never mind.]] .. '\n' ..
            "EOF")
end

function _remove_unused_pod_usage(package)
    -- Perl in "Git for Windows" lacks Pod::Usage, which is only used for help messages in the Configure script.
    -- It is not needed for the build and can be safely removed to avoid errors from the missing module.
    if package:version():le("1.1.0") then
        return
    end
    io.replace("Configure", "use Pod::Usage;", "", {plain = true})
    io.replace("Configure", "pod2usage.-;", "")
end

function _replace_NUL_with_null(package)
    -- The Configure script uses "NUL" to redirect output on Windows when checking NASM.
    -- Creating a file named "NUL" can cause issues because "NUL" is a reserved name in Windows.
    if package:version():le("1.1.0") then
        return
    end
    io.replace("Configurations/10-main.conf", "NUL", "null", {plain = true})
end

function main(package)
    _remove_unused_pod_usage(package)
    _replace_NUL_with_null(package)
    _fix_overlong_make_recipe(package)
end
