BLD Fix overwriting package optflags via clfags etc in meta.yaml (#1287)

This commit is contained in:
Roman Yurchak 2021-03-02 19:48:57 +01:00 committed by GitHub
parent a1241301dc
commit cd470ec36a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 24 deletions

View File

@ -264,12 +264,26 @@ def handle_command(line, args, dryrun=False):
elif new_args[0] == "em++":
new_args.extend(args.cflags.split() + args.cxxflags.split())
optflags_valid = [f"-O{tok}" for tok in "01234sz"]
optflag = None
# Identify the optflag (e.g. -O3) in cflags/cxxflags/ldflags. Last one has
# priority.
for arg in new_args[::-1]:
if arg in optflags_valid:
optflag = arg
break
lapack_dir = None
used_libs = set()
# Go through and adjust arguments
for arg in line[1:]:
if arg in optflags_valid and optflag is not None and arg != optflag:
# There are multiple contradictory optflags provided, use the one
# from cflags/cxxflags/ldflags
continue
if arg.startswith("-I"):
if (
str(Path(arg[2:]).resolve()).startswith(sys.prefix + "/include/python")

View File

@ -1,7 +1,9 @@
from collections import namedtuple
from pathlib import Path
import sys
import argparse
from dataclasses import dataclass
import pytest
sys.path.append(str(Path(__file__).parents[2]))
@ -10,6 +12,18 @@ from pyodide_build.pywasmcross import f2c # noqa: E402
from pyodide_build.pywasmcross import make_parser
@dataclass
class BuildArgs:
"""An object to hold build arguments"""
cflags: str = ""
cxxflags: str = ""
ldflags: str = ""
host: str = ""
replace_libs: str = ""
install_dir: str = ""
def _args_wrapper(func):
"""Convert function to take as input / return a string instead of a
list of arguments
@ -33,12 +47,7 @@ f2c_wrap = _args_wrapper(f2c)
def test_handle_command():
Args = namedtuple(
"args", ["cflags", "cxxflags", "ldflags", "host", "replace_libs", "install_dir"]
)
args = Args(
cflags="", cxxflags="", ldflags="", host="", replace_libs="", install_dir=""
)
args = BuildArgs()
assert handle_command_wrap("gcc -print-multiarch", args) is None
assert handle_command_wrap("gcc test.c", args) == "emcc test.c"
assert (
@ -47,13 +56,10 @@ def test_handle_command():
)
# check cxxflags injection and cpp detection
args = Args(
args = BuildArgs(
cflags="-I./lib2",
cxxflags="-std=c++11",
ldflags="-lm",
host="",
replace_libs="",
install_dir="",
)
assert (
handle_command_wrap("gcc -I./lib1 test.cpp -o test.o", args)
@ -61,7 +67,7 @@ def test_handle_command():
)
# check ldflags injection
args = Args(
args = BuildArgs(
cflags="", cxxflags="", ldflags="-lm", host="", replace_libs="", install_dir=""
)
assert (
@ -70,13 +76,8 @@ def test_handle_command():
)
# check library replacement and removal of double libraries
args = Args(
cflags="",
cxxflags="",
ldflags="",
host="",
args = BuildArgs(
replace_libs="bob=fred",
install_dir="",
)
assert (
handle_command_wrap("gcc -shared test.o -lbob -ljim -ljim -o test.so", args)
@ -87,6 +88,25 @@ def test_handle_command():
assert handle_command_wrap("gcc /usr/file.c", args) is None
@pytest.mark.parametrize(
"in_ext, out_ext, executable, flag_name",
[
(".c", ".o", "emcc", "cflags"),
(".cpp", ".o", "em++", "cxxflags"),
(".c", ".so", "emcc", "ldflags"),
],
)
def test_handle_command_optflags(in_ext, out_ext, executable, flag_name):
# Make sure that when multiple optflags are present those in cflags,
# cxxflags, or ldflags has priority
args = BuildArgs(**{flag_name: "-Oz"})
assert (
handle_command_wrap(f"gcc -O3 test.{in_ext} -o test.{out_ext}", args)
== f"{executable} -Oz test.{in_ext} -o test.{out_ext}"
)
def test_f2c():
assert f2c_wrap("gfortran test.f") == "gfortran test.c"
assert f2c_wrap("gcc test.c") is None
@ -98,12 +118,7 @@ def test_f2c():
def test_conda_compiler_compat():
Args = namedtuple(
"args", ["cflags", "cxxflags", "ldflags", "host", "replace_libs", "install_dir"]
)
args = Args(
cflags="", cxxflags="", ldflags="", host="", replace_libs="", install_dir=""
)
args = BuildArgs()
assert handle_command_wrap(
"gcc -shared -c test.o -B /compiler_compat -o test.so", args
) == ("emcc -c test.o -o test.so")