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

Raise error when a generator is defined in generators and generate() #12722

Merged
9 changes: 9 additions & 0 deletions conan/tools/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
from conans.errors import ConanException

CONAN_TOOLCHAIN_ARGS_FILE = "conanbuild.conf"
CONAN_TOOLCHAIN_ARGS_SECTION = "toolchain"


def _check_duplicated_generator(generator, conanfile):
if generator.__class__.__name__ in conanfile.generators:
raise ConanException(f"{generator.__class__.__name__} is declared in the generators "
"attribute, but was also instantiated in the generate() method. "
"It should only be present in one of them.")
1 change: 0 additions & 1 deletion conan/tools/apple/apple.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import os

from conans.errors import ConanException
from conans.util.runners import check_output_runner
from conan.tools.build import cmd_args_to_string
from conans.errors import ConanException
Expand Down
2 changes: 0 additions & 2 deletions conan/tools/apple/xcodebuild.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import os

from conan.tools.apple import to_apple_arch
from conans.errors import ConanException

Expand Down
2 changes: 2 additions & 0 deletions conan/tools/apple/xcodedeps.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from jinja2 import Template

from conan.tools import _check_duplicated_generator
from conans.errors import ConanException
from conans.model.dependencies import get_transitive_requires
from conans.util.files import load, save
Expand Down Expand Up @@ -105,6 +106,7 @@ class XcodeDeps(object):
""")

def __init__(self, conanfile):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self.configuration = conanfile.settings.get_safe("build_type")
arch = conanfile.settings.get_safe("arch")
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/apple/xcodetoolchain.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import textwrap

from conan.tools import _check_duplicated_generator
from conan.tools.apple.apple import to_apple_arch
from conan.tools.apple.xcodedeps import GLOBAL_XCCONFIG_FILENAME, GLOBAL_XCCONFIG_TEMPLATE, \
_add_includes_to_file_or_create, _xcconfig_settings_filename, _xcconfig_conditional
Expand Down Expand Up @@ -32,6 +33,7 @@ class XcodeToolchain(object):
""")

def __init__(self, conanfile):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
arch = conanfile.settings.get_safe("arch")
self.architecture = to_apple_arch(self._conanfile, default=arch)
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/cmake/cmakedeps/cmakedeps.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os

from conan.tools import _check_duplicated_generator
from conan.tools.cmake.cmakedeps import FIND_MODE_CONFIG, FIND_MODE_NONE, FIND_MODE_BOTH, \
FIND_MODE_MODULE
from conan.tools.cmake.cmakedeps.templates.config import ConfigTemplate
Expand All @@ -15,6 +16,7 @@
class CMakeDeps(object):

def __init__(self, conanfile):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self.arch = self._conanfile.settings.get_safe("arch")
self.configuration = str(self._conanfile.settings.build_type)
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/cmake/toolchain/toolchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from jinja2 import Template

from conan.tools import _check_duplicated_generator
from conan.tools.build import use_win_mingw
from conan.tools.cmake.presets import write_cmake_presets
from conan.tools.cmake.toolchain import CONAN_TOOLCHAIN_FILENAME
Expand Down Expand Up @@ -115,6 +116,7 @@ class CMakeToolchain(object):
""")

def __init__(self, conanfile, generator=None):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self.generator = self._get_generator(generator)
self.variables = Variables()
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/env/virtualbuildenv.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from conan.tools import _check_duplicated_generator
from conan.tools.env import Environment
from conan.tools.env.virtualrunenv import runenv_from_cpp_info

Expand All @@ -8,6 +9,7 @@ class VirtualBuildEnv:
"""

def __init__(self, conanfile):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self._conanfile.virtualbuildenv = False
self.basename = "conanbuildenv"
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/env/virtualrunenv.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os

from conan.tools import _check_duplicated_generator
from conan.tools.env import Environment


Expand Down Expand Up @@ -33,6 +34,7 @@ def __init__(self, conanfile):

:param conanfile: The current recipe object. Always use ``self``.
"""
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self._conanfile.virtualrunenv = False
self.basename = "conanrunenv"
Expand Down
1 change: 0 additions & 1 deletion conan/tools/files/files.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import configparser
import errno
import gzip
import hashlib
import os
import platform
import shutil
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/gnu/autotoolsdeps.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from conan.tools import _check_duplicated_generator
from conan.tools.env import Environment
from conan.tools.gnu.gnudeps_flags import GnuDepsFlags
from conans.model.build_info import CppInfo


class AutotoolsDeps:
def __init__(self, conanfile):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self._environment = None
self._ordered_deps = []
Expand Down
4 changes: 3 additions & 1 deletion conan/tools/gnu/autotoolstoolchain.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from conan.tools import _check_duplicated_generator
from conan.tools.apple.apple import apple_min_version_flag, to_apple_arch
from conan.tools.apple.apple import get_apple_sdk_fullname
from conan.tools.build import cmd_args_to_string
Expand All @@ -6,7 +7,7 @@
from conan.tools.env import Environment
from conan.tools.files.files import save_toolchain_args
from conan.tools.gnu.get_gnu_triplet import _get_gnu_triplet
from conan.tools.microsoft import VCVars, is_msvc, msvc_runtime_flag
from conan.tools.microsoft import VCVars, msvc_runtime_flag
from conans.errors import ConanException


Expand All @@ -23,6 +24,7 @@ def __init__(self, conanfile, namespace=None, prefix="/"):
helper so that it reads the information from the proper file.
:param prefix: Folder to use for ``--prefix`` argument ("/" by default).
"""
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self._namespace = namespace
self._prefix = prefix
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/gnu/pkgconfigdeps.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from jinja2 import Template, StrictUndefined

from conan.tools import _check_duplicated_generator
from conan.tools.gnu.gnudeps_flags import GnuDepsFlags
from conans.errors import ConanException
from conans.util.files import save
Expand Down Expand Up @@ -360,6 +361,7 @@ def _update_pc_files(info):
class PkgConfigDeps:

def __init__(self, conanfile):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
# Activate the build *.pc files for the specified libraries
self.build_context_activated = []
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/google/bazeldeps.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@

from jinja2 import Template

from conan.tools import _check_duplicated_generator
from conans.errors import ConanException
from conans.util.files import save


class BazelDeps(object):
def __init__(self, conanfile):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile

def generate(self):
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/google/toolchain.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from conan.tools import _check_duplicated_generator
from conan.tools.files.files import save_toolchain_args


class BazelToolchain(object):

def __init__(self, conanfile, namespace=None):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self._namespace = namespace

Expand Down
2 changes: 2 additions & 0 deletions conan/tools/intel/intel_cc.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import platform
import textwrap

from conan.tools import _check_duplicated_generator
from conans.errors import ConanException


Expand All @@ -39,6 +40,7 @@ class IntelCC:

def __init__(self, conanfile):
# Let's check the compatibility
_check_duplicated_generator(self, conanfile)
compiler_version = conanfile.settings.get_safe("compiler.version")
mode = conanfile.settings.get_safe("compiler.mode")
if _is_using_intel_oneapi(compiler_version):
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/meson/mesondeps.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from jinja2 import Template

from conan.tools import _check_duplicated_generator
from conan.tools.gnu.gnudeps_flags import GnuDepsFlags
from conan.tools.meson.helpers import to_meson_value
from conans.model.build_info import CppInfo
Expand All @@ -22,6 +23,7 @@ class MesonDeps:
""")

def __init__(self, conanfile):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self._ordered_deps = []
# constants
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/meson/toolchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from jinja2 import Template

from conan.tools import _check_duplicated_generator
from conan.tools.apple.apple import to_apple_arch, is_apple_os, apple_min_version_flag
from conan.tools.build.cross_building import cross_building
from conan.tools.build.flags import libcxx_flags
Expand Down Expand Up @@ -93,6 +94,7 @@ def __init__(self, conanfile, backend=None):
:param conanfile: ``< ConanFile object >`` The current recipe object. Always use ``self``.
:param backend: ``str`` ``backend`` Meson variable value. By default, ``ninja``.
"""
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self._os = self._conanfile.settings.get_safe("os")
self._is_apple_system = is_apple_os(self._conanfile)
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/microsoft/msbuilddeps.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

from jinja2 import Template

from conan.tools import _check_duplicated_generator
from conans.errors import ConanException
from conans.model.dependencies import get_transitive_requires
from conans.util.files import load, save
Expand Down Expand Up @@ -92,6 +93,7 @@ def __init__(self, conanfile):
"""
:param conanfile: ``< ConanFile object >`` The current recipe object. Always use ``self``.
"""
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
#: Defines the build type. By default, ``settings.build_type``.
self.configuration = conanfile.settings.build_type
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/microsoft/nmakedeps.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import os

from conan.tools import _check_duplicated_generator
from conan.tools.env import Environment
from conans.model.build_info import CppInfo

Expand All @@ -10,6 +11,7 @@ def __init__(self, conanfile):
"""
:param conanfile: ``< ConanFile object >`` The current recipe object. Always use ``self``.
"""
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self._environment = None

Expand Down
2 changes: 2 additions & 0 deletions conan/tools/microsoft/nmaketoolchain.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from conan.tools import _check_duplicated_generator
from conan.tools.build.flags import build_type_flags, cppstd_flag
from conan.tools.env import Environment

Expand All @@ -14,6 +15,7 @@ def __init__(self, conanfile):
"""
:param conanfile: ``< ConanFile object >`` The current recipe object. Always use ``self``.
"""
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
self._environment = None

Expand Down
2 changes: 2 additions & 0 deletions conan/tools/microsoft/toolchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from jinja2 import Template

from conan.tools import _check_duplicated_generator
from conan.tools.build import build_jobs
from conan.tools.intel.intel_cc import IntelCC
from conan.tools.microsoft.visual import VCVars, msvc_version_to_toolset_version
Expand Down Expand Up @@ -49,6 +50,7 @@ def __init__(self, conanfile):
"""
:param conanfile: ``< ConanFile object >`` The current recipe object. Always use ``self``.
"""
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile
#: Dict-like that defines the preprocessor definitions
self.preprocessor_definitions = {}
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/microsoft/visual.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import os
import textwrap

from conan.tools import _check_duplicated_generator
from conans.client.conf.detect_vs import vs_installation_path
from conans.errors import ConanException, ConanInvalidConfiguration
from conan.tools.scm import Version
Expand Down Expand Up @@ -80,6 +81,7 @@ def __init__(self, conanfile):
"""
:param conanfile: ``< ConanFile object >`` The current recipe object. Always use ``self``.
"""
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile

def generate(self, scope="build"):
Expand Down
2 changes: 2 additions & 0 deletions conan/tools/premake/premakedeps.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from conan.tools import _check_duplicated_generator
from conans.model.build_info import CppInfo
from conans.util.files import save

Expand Down Expand Up @@ -38,6 +39,7 @@ def __init__(self, deps_cpp_info):
class PremakeDeps(object):

def __init__(self, conanfile):
_check_duplicated_generator(self, conanfile)
self._conanfile = conanfile

def generate(self):
Expand Down
3 changes: 3 additions & 0 deletions conan/tools/qbs/qbsprofile.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

from io import StringIO
from jinja2 import Template

from conan.tools import _check_duplicated_generator
from conans.errors import ConanException
from conans.util.files import save

Expand Down Expand Up @@ -259,6 +261,7 @@ class QbsProfile(object):
''')

def __init__(self, conanfile):
_check_duplicated_generator(self, conanfile)
_check_for_compiler(conanfile)
self._conanfile = conanfile
_setup_toolchains(conanfile)
Expand Down
11 changes: 9 additions & 2 deletions conans/client/generators/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,12 @@ def write_generators(conanfile, hook_manager):

if conanfile.generators:
conanfile.output.info(f"Writing generators to {new_gen_folder}")
for generator_name in set(conanfile.generators):
# generators check that they are not present in the generators field,
# to avoid duplicates between the generators attribute and the generate() method
# They would raise an exception here if we don't invalidate the field while we call them
old_generators = set(conanfile.generators)
conanfile.generators = []
for generator_name in old_generators:
generator_class = _get_generator_class(generator_name)
if generator_class:
try:
Expand All @@ -107,7 +112,9 @@ def write_generators(conanfile, hook_manager):
# When a generator fails, it is very useful to have the whole stacktrace
conanfile.output.error(traceback.format_exc())
raise ConanException("Error in generator '{}': {}".format(generator_name, str(e)))

# restore the generators attribute, so it can be checked and raise
# if the user tries to instantiate a generator present in generators
conanfile.generators = old_generators
if hasattr(conanfile, "generate"):
conanfile.output.highlight("Calling generate()")
mkdir(new_gen_folder)
Expand Down
Loading