Skip to content
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

AutotoolsToolchain: empty None values from self fields + Refactor #11678

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
78 changes: 42 additions & 36 deletions conan/tools/gnu/autotoolstoolchain.py
Expand Up @@ -22,10 +22,10 @@ def __init__(self, conanfile, namespace=None):
self.make_args = []

# Flags
self.cxxflags = []
self.cflags = []
self.ldflags = []
self.defines = []
self.extra_cxxflags = []
self.extra_cflags = []
self.extra_ldflags = []
self.extra_defines = []

# Defines
self.gcc_cxx11_abi = self._get_cxx11_abi_define()
Expand Down Expand Up @@ -122,46 +122,52 @@ def _get_libcxx_flag(self):
def _filter_list_empty_fields(v):
return list(filter(bool, v))

def _get_extra_flags(self):
# Now, it's time to get all the flags defined by the user
cxxflags = self._conanfile.conf.get("tools.build:cxxflags", default=[], check_type=list)
cflags = self._conanfile.conf.get("tools.build:cflags", default=[], check_type=list)
sharedlinkflags = self._conanfile.conf.get("tools.build:sharedlinkflags", default=[], check_type=list)
exelinkflags = self._conanfile.conf.get("tools.build:exelinkflags", default=[], check_type=list)
defines = self._conanfile.conf.get("tools.build:defines", default=[], check_type=list)
return {
"cxxflags": cxxflags,
"cflags": cflags,
"defines": defines,
"ldflags": sharedlinkflags + exelinkflags
}

def environment(self):
env = Environment()

@property
def cxxflags(self):
fpic = "-fPIC" if self.fpic else None
ret = [self.libcxx, self.cppstd, self.arch_flag, fpic, self.msvc_runtime_flag,
self.sysroot_flag]
apple_flags = [self.apple_isysroot_flag, self.apple_arch_flag, self.apple_min_version_flag]
conf_flags = self._conanfile.conf.get("tools.build:cxxflags", default=[], check_type=list)
ret = ret + self.build_type_flags + apple_flags + conf_flags + self.extra_cxxflags
return self._filter_list_empty_fields(ret)

@property
def cflags(self):
fpic = "-fPIC" if self.fpic else None
extra_flags = self._get_extra_flags()
ret = [self.arch_flag, fpic, self.msvc_runtime_flag, self.sysroot_flag]
apple_flags = [self.apple_isysroot_flag, self.apple_arch_flag, self.apple_min_version_flag]
conf_flags = self._conanfile.conf.get("tools.build:cflags", default=[], check_type=list)
ret = ret + self.build_type_flags + apple_flags + conf_flags + self.extra_cflags
return self._filter_list_empty_fields(ret)

self.cxxflags.extend([self.libcxx, self.cppstd,
self.arch_flag, fpic, self.msvc_runtime_flag, self.sysroot_flag]
+ self.build_type_flags + apple_flags + extra_flags["cxxflags"])
self.cflags.extend([self.arch_flag, fpic, self.msvc_runtime_flag, self.sysroot_flag]
+ self.build_type_flags + apple_flags + extra_flags["cflags"])
self.ldflags.extend([self.arch_flag, self.sysroot_flag] + self.build_type_link_flags
+ apple_flags + extra_flags["ldflags"])
self.defines.extend([self.ndebug, self.gcc_cxx11_abi] + extra_flags["defines"])
@property
def ldflags(self):
ret = [self.arch_flag, self.sysroot_flag]
apple_flags = [self.apple_isysroot_flag, self.apple_arch_flag, self.apple_min_version_flag]
conf_flags = self._conanfile.conf.get("tools.build:sharedlinkflags", default=[],
check_type=list)
conf_flags.extend(self._conanfile.conf.get("tools.build:exelinkflags", default=[],
check_type=list))
ret = ret + apple_flags + conf_flags + self.build_type_link_flags + self.extra_ldflags
return self._filter_list_empty_fields(ret)

@property
def defines(self):
conf_flags = self._conanfile.conf.get("tools.build:defines", default=[], check_type=list)
ret = [self.ndebug, self.gcc_cxx11_abi] + conf_flags + self.extra_defines
return self._filter_list_empty_fields(ret)

def environment(self):
env = Environment()
if is_msvc(self._conanfile):
env.define("CXX", "cl")
env.define("CC", "cl")

env.append("CPPFLAGS", ["-D{}".format(d) for d in self._filter_list_empty_fields(self.defines)])
env.append("CXXFLAGS", self._filter_list_empty_fields(self.cxxflags))
env.append("CFLAGS", self._filter_list_empty_fields(self.cflags))
env.append("LDFLAGS", self._filter_list_empty_fields(self.ldflags))
env.append("CPPFLAGS", ["-D{}".format(d) for d in self.defines])
env.append("CXXFLAGS", self.cxxflags)
env.append("CFLAGS", self.cflags)
env.append("LDFLAGS", self.ldflags)
env.prepend_path("PKG_CONFIG_PATH", self._conanfile.generators_folder)

return env

def vars(self):
Expand Down
25 changes: 25 additions & 0 deletions conans/test/integration/toolchains/gnu/test_autotoolstoolchain.py
Expand Up @@ -42,3 +42,28 @@ def test_extra_flags_via_conf():
assert 'export CXXFLAGS="$CXXFLAGS -O3 -s --flag1 --flag2"' in toolchain
assert 'export CFLAGS="$CFLAGS -O3 -s --flag3 --flag4"' in toolchain
assert 'export LDFLAGS="$LDFLAGS --flag5 --flag6"' in toolchain


def test_not_none_values():

conanfile = textwrap.dedent("""
from conan import ConanFile
from conan.tools.gnu import AutotoolsToolchain

class Foo(ConanFile):
name = "foo"
version = "1.0"

def generate(self):
tc = AutotoolsToolchain(self)
assert None not in tc.defines
assert None not in tc.cxxflags
assert None not in tc.cflags
assert None not in tc.ldflags

""")

client = TestClient()
client.save({"conanfile.py": conanfile})
client.run("install .")

Expand Up @@ -364,7 +364,12 @@ def test_custom_defines():
"os.version": "14",
"arch": "armv8"})
be = AutotoolsToolchain(conanfile)
be.defines = ["MyDefine1", "MyDefine2"]
be.extra_defines = ["MyDefine1", "MyDefine2"]

assert "MyDefine1" in be.defines
assert "MyDefine2" in be.defines
assert "NDEBUG" in be.defines

env = be.vars()
assert "-DMyDefine1" in env["CPPFLAGS"]
assert "-DMyDefine2" in env["CPPFLAGS"]
Expand All @@ -380,7 +385,14 @@ def test_custom_cxxflags():
"os.version": "14",
"arch": "armv8"})
be = AutotoolsToolchain(conanfile)
be.cxxflags = ["MyFlag1", "MyFlag2"]
be.extra_cxxflags = ["MyFlag1", "MyFlag2"]

assert "MyFlag1" in be.cxxflags
assert "MyFlag2" in be.cxxflags
assert "-mios-version-min=14" in be.cxxflags
assert "MyFlag" not in be.cflags
assert "MyFlag" not in be.ldflags

env = be.vars()
assert "MyFlag1" in env["CXXFLAGS"]
assert "MyFlag2" in env["CXXFLAGS"]
Expand All @@ -399,7 +411,14 @@ def test_custom_cflags():
"os.version": "14",
"arch": "armv8"})
be = AutotoolsToolchain(conanfile)
be.cflags = ["MyFlag1", "MyFlag2"]
be.extra_cflags = ["MyFlag1", "MyFlag2"]

assert "MyFlag1" in be.cflags
assert "MyFlag2" in be.cflags
assert "-mios-version-min=14" in be.cflags
assert "MyFlag" not in be.cxxflags
assert "MyFlag" not in be.ldflags

env = be.vars()
assert "MyFlag1" in env["CFLAGS"]
assert "MyFlag2" in env["CFLAGS"]
Expand All @@ -418,7 +437,14 @@ def test_custom_ldflags():
"os.version": "14",
"arch": "armv8"})
be = AutotoolsToolchain(conanfile)
be.ldflags = ["MyFlag1", "MyFlag2"]
be.extra_ldflags = ["MyFlag1", "MyFlag2"]

assert "MyFlag1" in be.ldflags
assert "MyFlag2" in be.ldflags
assert "-mios-version-min=14" in be.ldflags
assert "MyFlag" not in be.cxxflags
assert "MyFlag" not in be.cflags

env = be.vars()
assert "MyFlag1" in env["LDFLAGS"]
assert "MyFlag2" in env["LDFLAGS"]
Expand Down