-
-
Notifications
You must be signed in to change notification settings - Fork 418
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
OpenSSL: improve MinGW support on Windows (#6079)
* openssl: enhance test * openssl: improve cross-build support on Windows * openssl: Remove always-true `if` condition * openssl: handle mismatched Perl * openssl: fix Lua script * openssl: fix removing DLL import libraries unexpectedly * openssl: fix BSD platform * openssl: fix wrong config * openssl: skip building tests * openssl: improve Perl dependency handling for Windows * openssl: fix overlong make recipe * openssl: trim trailing whitespace * openssl: improve Perl platform compatibility warning message * openssl: ensure ARFLAGS is not overridden with an empty string * openssl: restore the check for precompiled packages * openssl: add LLVM resource compiler support for MinGW * openssl: remove temporary file after use * openssl: add try-catch to configuration and Makefile patch functions * openssl: improve compatibility with older versions * openssl: add warning for building versions earlier than 1.1.1 * openssl: improve version checks
- Loading branch information
Showing
3 changed files
with
331 additions
and
60 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,170 @@ | ||
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
function _patch_for_llvm_rc(package, opt) | ||
if package:is_plat("mingw") and package:has_tool("mrc", "llvm_rc", "llvm-rc", "rc") then | ||
local cc = package:build_getenv("cc") | ||
local cflags = opt.buildenvs.CFLAGS | ||
local tmpfile = path.unix(os.tmpfile() .. ".c") | ||
io.writefile(tmpfile, "int main(void) { return 0; }\n") | ||
local compile_out, compile_err = try {function() return os.iorun(format("%s -v %s %s", cc, cflags, tmpfile)) end} | ||
os.tryrm(tmpfile) | ||
local include_dirs = {} | ||
local in_include_section = false | ||
for _, verbose_command in ipairs({compile_out, compile_err}) do | ||
if verbose_command then | ||
for line in verbose_command:gmatch("[^\r\n]+") do | ||
if line:find("#include.*search") then | ||
in_include_section = true | ||
elseif line:find("End.*search") then | ||
in_include_section = false | ||
elseif in_include_section and not line:find("#include.*search") then | ||
table.insert(include_dirs, line:match("^%s*(.-)%s*$")) | ||
end | ||
end | ||
end | ||
end | ||
local include_directive = "" | ||
for _, include_dir in ipairs(include_dirs) do | ||
include_directive = include_directive .. format([[ -I "%s"]], include_dir) | ||
end | ||
-- $(RC) $(RCFLAGS) -o $@ libcrypto.rc => $(RC) -I inc_dir -I inc_dir -FO $@ libcrypto.rc | ||
io.gsub("Makefile", [[%$%(RC%).-%$@%s+(%S+)]], format("$(RC) %s -FO $@ ", include_directive).."%1") | ||
io.gsub("Makefile", "(%S+).res.o", "%1.res") | ||
end | ||
end | ||
|
||
function main(package, opt) | ||
try {function() return _patch_for_llvm_rc(package, opt) end} | ||
end |
Oops, something went wrong.