-
Notifications
You must be signed in to change notification settings - Fork 977
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
New AutotoolsDeps, AutotoolsToolchain helpers in conan.tools.gnu #8457
Changes from all commits
a841c9b
062c3f9
7330385
a92a2cb
08e7144
e41792c
03a4bbf
74e9198
3292aec
087f030
fd18ee9
b33cd92
cc5c8b3
9b997f8
cf97406
79675af
dfda73e
c6226b6
c2b7e63
36bf481
642b3fe
38b4dd3
96d0334
6fe2b2f
49cb4da
0b62989
d2de553
837ab8f
ccdd17c
4f3642c
14c308a
6d4ea51
ff0543e
bcd08d1
35ced48
c512f37
9ec6582
d5d238e
75ff512
99f3f91
3a585e5
5f323b1
16863a1
3fd4633
de6787e
7f86beb
49dfb47
7d98f08
7507507
f77726b
e4e280e
ab0375f
b4fbb64
99a3ae9
d3f065f
0fe4307
59800d8
b1de1f4
5aee77f
42c4dfc
fba1ede
e0e9c9c
58776e5
67d2275
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 |
---|---|---|
@@ -1 +1,5 @@ | ||
from .make import MakeToolchain | ||
from conan.tools.gnu.autotoolstoolchain import AutotoolsToolchain | ||
from conan.tools.gnu.autotoolsdeps import AutotoolsDeps | ||
from conan.tools.gnu.autotools import Autotools | ||
from conan.tools.gnu.autotoolsgen import AutotoolsGen |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
import platform | ||
|
||
from conan.tools._compilers import use_win_mingw | ||
|
||
|
||
class Autotools(object): | ||
|
||
def __init__(self, conanfile): | ||
""" | ||
FIXME: include_rpath_flags CONAN 2.0 to default True? Could break many packages in center | ||
""" | ||
self._conanfile = conanfile | ||
self._win_bash = False | ||
self._include_rpath_flags = False | ||
self._os = conanfile.settings.get_safe("os") | ||
self._os_version = conanfile.settings.get_safe("os.version") | ||
self._os_sdk = conanfile.settings.get_safe("os.sdk") | ||
self._os_subsystem = conanfile.settings.get_safe("os.subsystem") | ||
self._arch = conanfile.settings.get_safe("arch") | ||
self._build_type = conanfile.settings.get_safe("build_type") | ||
self._compiler = conanfile.settings.get_safe("compiler") | ||
self._compiler_version = conanfile.settings.get_safe("compiler.version") | ||
|
||
# Precalculate build, host, target triplets | ||
# TODO self.build, self.host, self.target = self._get_host_build_target_flags() | ||
|
||
def configure(self): | ||
""" | ||
http://jingfenghanmax.blogspot.com.es/2010/09/configure-with-host-target-and-build.html | ||
https://gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html | ||
""" | ||
if not self._conanfile.should_configure: | ||
return | ||
configure_dir = "." | ||
|
||
# TODO: Management of build, host, target triplet | ||
# TODO: Management of PKG_CONFIG_PATH | ||
# TODO: Implement management of --prefix, bindir, sbindir, libexecdir, libdir, includedir | ||
|
||
cmd = "%s/configure" % configure_dir | ||
self._conanfile.output.info("Calling:\n > %s" % cmd) | ||
self._conanfile.run(cmd) | ||
|
||
def make(self): | ||
"""if not self._build_type: | ||
raise ConanException("build_type setting should be defined.") | ||
with environment_append(vars or self.vars): | ||
str_args = args_to_string(args) | ||
cpu_count_option = (("-j%s" % cpu_count(output=self._conanfile.output)) | ||
if ("-j" not in str_args and "nmake" not in make_program.lower()) | ||
else None) | ||
self._conanfile.run("%s" % join_arguments([make_program, target, str_args, | ||
cpu_count_option]), | ||
win_bash=self._win_bash, subsystem=self.subsystem)""" | ||
|
||
make_program = self._conanfile.conf["tools.gnu"].make_program | ||
if make_program is None: | ||
make_program = "mingw32-make" if use_win_mingw(self._conanfile) else "make" | ||
# Need to activate the buildenv if existing | ||
command = make_program | ||
self._conanfile.run(command) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
from conan.tools.env import Environment | ||
from conans.model.build_info import DepCppInfo | ||
|
||
|
||
class AutotoolsDeps: | ||
def __init__(self, conanfile): | ||
# Set the generic objects before mapping to env vars to let the user | ||
# alter some value | ||
self._conanfile = conanfile | ||
|
||
self.libs = [] | ||
self.system_libs = [] | ||
self.include_paths = [] | ||
self.lib_paths = [] | ||
self.defines = [] | ||
self.cflags = [] | ||
self.cxxflags = [] | ||
self.sharedlinkflags = [] | ||
self.exelinkflags = [] | ||
self.frameworks = [] | ||
self.framework_paths = [] | ||
self.sysroot = None | ||
|
||
def merge_lists(seq1, seq2): | ||
return [s for s in seq1 if s not in seq2] + seq2 | ||
|
||
def merge(dep): | ||
dep_cpp_info = DepCppInfo(dep.cpp_info) # To deal with components | ||
self.system_libs = merge_lists(self.system_libs, dep_cpp_info.system_libs) | ||
self.include_paths = merge_lists(self.include_paths, dep_cpp_info.include_paths) | ||
self.lib_paths = merge_lists(self.lib_paths, dep_cpp_info.lib_paths) | ||
self.framework_paths = merge_lists(self.framework_paths, dep_cpp_info.framework_paths) | ||
self.libs = merge_lists(self.libs, dep_cpp_info.libs) | ||
self.frameworks = merge_lists(self.frameworks, dep_cpp_info.frameworks) | ||
|
||
# Note these are in reverse order | ||
self.defines = merge_lists(dep_cpp_info.defines, self.defines) | ||
self.cxxflags = merge_lists(dep_cpp_info.cxxflags, self.cxxflags) | ||
self.cflags = merge_lists(dep_cpp_info.cflags, self.cflags) | ||
self.sharedlinkflags = merge_lists(dep_cpp_info.sharedlinkflags, self.sharedlinkflags) | ||
self.exelinkflags = merge_lists(dep_cpp_info.exelinkflags, self.exelinkflags) | ||
|
||
if not self.sysroot: | ||
self.sysroot = dep_cpp_info.sysroot | ||
|
||
def _apply_transitive_runenv(next_requires): | ||
# TODO: This visitor is same as VirtualEnv runenv_info one, extract | ||
all_requires = [] | ||
while next_requires: | ||
new_requires = [] | ||
for require in next_requires: | ||
# The explicit has more priority | ||
merge(require) | ||
all_requires.append(require) | ||
|
||
for transitive in require.dependencies.requires: | ||
# Avoid duplication/repetitions | ||
if transitive not in new_requires and transitive not in all_requires: | ||
new_requires.append(transitive) | ||
next_requires = new_requires | ||
|
||
_apply_transitive_runenv(self._conanfile.dependencies.requires) | ||
|
||
def environment(self): | ||
# cpp_flags | ||
cpp_flags = [] | ||
include_paths = ['-I"%s"' % p for p in self.include_paths] | ||
cpp_flags.extend(include_paths) | ||
cpp_flags.extend(["-D%s" % define for define in self.defines]) | ||
|
||
# Libs | ||
libs = ["-l%s" % library for library in self.libs] | ||
|
||
# Ldflags | ||
# TODO: Discuss, should the helper filter frameworks based on compiler? | ||
frameworks = ["-framework %s" % framework for framework in self.frameworks] | ||
frameworks_paths = ["-F %s" % framework_path for framework_path in self.framework_paths] | ||
ldflags = self.sharedlinkflags | ||
ldflags.extend(self.exelinkflags) | ||
ldflags.extend(frameworks) | ||
ldflags.extend(frameworks_paths) | ||
lib_paths = ['-L"%s"' % p for p in self.lib_paths] | ||
ldflags.extend(lib_paths) | ||
|
||
# cflags | ||
cflags = self.cflags | ||
cxxflags = self.cxxflags | ||
|
||
if self.sysroot: | ||
srf = '--sysroot={}'.format(self.sysroot) | ||
cflags.append(srf) | ||
cxxflags.append(srf) | ||
ldflags.append(srf) | ||
|
||
env = Environment() | ||
env.append("CPPFLAGS", cpp_flags) | ||
env.append("LIBS", libs) | ||
env.append("LDFLAGS", ldflags) | ||
env.append("CXXFLAGS", cxxflags) | ||
env.append("CFLAGS", cflags) | ||
return env | ||
|
||
def generate(self): | ||
env = self.environment() | ||
env.save_sh("conanautotoolsdeps.sh") | ||
env.save_bat("conanautotoolsdeps.bat") |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
import platform | ||
|
||
from conan.tools.env import VirtualEnv | ||
from conan.tools.gnu import AutotoolsToolchain, AutotoolsDeps | ||
|
||
|
||
class AutotoolsGen: | ||
def __init__(self, conanfile): | ||
self.toolchain = AutotoolsToolchain(conanfile) | ||
self.deps = AutotoolsDeps(conanfile) | ||
self.env = VirtualEnv(conanfile) | ||
|
||
def build_environment(self): | ||
envtoolchain = self.toolchain.environment() | ||
envdeps = self.deps.environment() | ||
build_env = self.env.build_environment() | ||
build_env.compose(envtoolchain) | ||
build_env.compose(envdeps) | ||
return build_env | ||
|
||
def run_environment(self): | ||
run_env = self.env.run_environment() | ||
return run_env | ||
|
||
def generate(self): | ||
build_env = self.build_environment() | ||
run_env = self.run_environment() | ||
# FIXME: Use settings, not platform Not always defined :( | ||
# os_ = self._conanfile.settings_build.get_safe("os") | ||
if platform.system() == "Windows": | ||
build_env.save_bat("conanbuildenv.bat") | ||
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. name is too generic? may overwrite other generators, if multiple are used together... 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.
Ideas welcome, any suggestion of other filename? 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 am not sure if I got the idea. what if we add similar generator e.g. for premake, which will also need 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.
|
||
run_env.save_bat("conanrunenv.bat") | ||
else: | ||
build_env.save_sh("conanbuildenv.sh") | ||
run_env.save_sh("conanrunenv.sh") |
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.
I vote to keep the least possible logic in these helpers. if some filtering has to be done, it doesn't belong here. and IMO it's the responsibility of the recipe author to ensure the correct CppInfo is built for the given configuration.