-
-
Notifications
You must be signed in to change notification settings - Fork 417
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
OpenSSL: improve MinGW support on Windows #6079
Changes from all commits
4a58502
4556226
17ea9ac
abe12e9
79e98d4
79c6f04
0e4066b
d5e12bc
661f083
2121619
2cf58d8
43c7fb9
0de6b83
aeecc86
a7144ca
409ef37
6d5fbd8
d6a3f76
c86fa6e
dbe0b01
977b69c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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 |
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} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. use lua table as argv and call There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I encountered an issue where the
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. because buildenvs.CFLAGS has been merged to string. not lua table. |
||
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we need to remove tmpfile after running this script
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK