Repository: conan-io/conan

Issue:
CMAKE_SKIP_INSTALL_RPATH is not set on macOS
Hi,

According to the docs `conan_basic_setup()` sets `CMAKE_SKIP_RPATH 1` on macOS.
However, `otool -L my_installed_lib.dylib` gives the following output:

>@rpath/libmy_installed_lib.dylib (compatibility version 0.0.0, current version 0.0.0)

Whereas the one in the build folder doesn't have the `@rpath/` prefix.

Is this intended? I'm kind of a n00b with rpaths.

EDIT: setting `cmake.definitions["CMAKE_SKIP_INSTALL_RPATH"] = "ON"` in my recipe fixes the issue.
EDIT2: that's weird though, the CMake doc says that CMAKE_SKIP_RPATH includes CMAKE_SKIP_INSTALL_RPATH...

Discussion:
codecov-io: # [Codecov](https://codecov.io/gh/conan-io/conan/pull/2118?src=pr&el=h1) Report
> Merging [#2118](https://codecov.io/gh/conan-io/conan/pull/2118?src=pr&el=desc) into [develop](https://codecov.io/gh/conan-io/conan/commit/ad94635b286e94e2468d2add00ba9081ad4be895?src=pr&el=desc) will **decrease** coverage by `0.01%`.
> The diff coverage is `77.27%`.


```diff
@@             Coverage Diff             @@
##           develop    #2118      +/-   ##
===========================================
- Coverage    95.88%   95.87%   -0.02%     
===========================================
  Files          350      350              
  Lines        27833    27837       +4     
===========================================
- Hits         26689    26688       -1     
- Misses        1144     1149       +5
```


Patch:
diff --git a/conans/client/cmd/new.py b/conans/client/cmd/new.py
index 20e3f01a7..9717ec679 100644
--- a/conans/client/cmd/new.py
+++ b/conans/client/cmd/new.py
@@ -138,7 +138,7 @@ class {package_name}TestConan(ConanFile):
     def build(self):
         cmake = CMake(self)
         # Current dir is "test_package/build/<build_id>" and CMakeLists.txt is in "test_package"
-        cmake.configure(source_dir=self.conanfile_directory, build_dir="./")
+        cmake.configure()
         cmake.build()
 
     def imports(self):
diff --git a/conans/client/command.py b/conans/client/command.py
index 6e3d0ee50..ebb6fc319 100644
--- a/conans/client/command.py
+++ b/conans/client/command.py
@@ -172,8 +172,6 @@ class Command(object):
         parser.add_argument('--keep-source', '-k', default=False, action='store_true',
                             help='Optional. Do not remove the source folder in local cache. '
                                  'Use for testing purposes only')
-        parser.add_argument("--werror", action='store_true', default=False,
-                            help='Error instead of warnings for graph inconsistencies')
 
         _add_manifests_arguments(parser)
         _add_common_install_arguments(parser, build_help=_help_build_policies)
@@ -187,7 +185,7 @@ class Command(object):
                                   args.build, args.keep_source, args.verify, args.manifests,
                                   args.manifests_interactive, args.remote, args.update,
                                   conan_file_path=args.cwd, name=name, version=version, user=user,
-                                  channel=channel, filename=args.file, werror=args.werror)
+                                  channel=channel, filename=args.file)
 
     def download(self, *args):
         """Downloads recipe and binaries to the local cache, without using settings.
@@ -229,8 +227,6 @@ class Command(object):
         parser.add_argument("--file", "-f", help="specify conanfile filename", action=OnceArgument)
         parser.add_argument("--generator", "-g", nargs=1, action=Extender,
                             help='Generators to use')
-        parser.add_argument("--werror", action='store_true', default=False,
-                            help='Error instead of warnings for graph inconsistencies')
         parser.add_argument("--install-folder", "--install_folder", "-if", action=OnceArgument,
                             help='Use this directory as the directory where to put the generator'
                                  'files, conaninfo/conanbuildinfo.txt etc.')
@@ -250,7 +246,7 @@ class Command(object):
             return self._conan.install(path=args.path,
                                        settings=args.settings, options=args.options,
                                        env=args.env,
-                                       remote=args.remote, werror=args.werror,
+                                       remote=args.remote,
                                        verify=args.verify, manifests=args.manifests,
                                        manifests_interactive=args.manifests_interactive,
                                        build=args.build, profile_name=args.profile,
@@ -261,7 +257,7 @@ class Command(object):
             return self._conan.install_reference(reference, settings=args.settings,
                                                  options=args.options,
                                                  env=args.env,
-                                                 remote=args.remote, werror=args.werror,
+                                                 remote=args.remote,
                                                  verify=args.verify, manifests=args.manifests,
                                                  manifests_interactive=args.manifests_interactive,
                                                  build=args.build, profile_name=args.profile,
@@ -337,6 +333,12 @@ class Command(object):
         parser.add_argument("--graph", "-g", action=OnceArgument,
                             help='Creates file with project dependencies graph. It will generate '
                             'a DOT or HTML file depending on the filename extension')
+        parser.add_argument("--install-folder", "-if", action=OnceArgument,
+                            help="local folder containing the conaninfo.txt and conanbuildinfo.txt "
+                            "files (from a previous conan install execution). Defaulted to "
+                            "current folder, unless --profile, -s or -o is specified. If you "
+                            "specify both install-folder and any setting/option "
+                            "it will raise an error.")
         build_help = 'given a build policy (same install command "build" parameter), return an ' \
                      'ordered list of  ' \
                      'packages that would be built from sources in install command (simulation)'
@@ -344,6 +346,10 @@ class Command(object):
         _add_common_install_arguments(parser, build_help=build_help)
         args = parser.parse_args(*args)
 
+        if args.install_folder and (args.profile or args.settings or args.options or args.env):
+            raise ArgumentError(None,
+                                "--install-folder cannot be used together with -s, -o, -e or -pr")
+
         # BUILD ORDER ONLY
         if args.build_order:
             ret = self._conan.info_build_order(args.reference, settings=args.settings,
@@ -352,7 +358,8 @@ class Command(object):
                                                profile_name=args.profile,
                                                filename=args.file, remote=args.remote,
                                                build_order=args.build_order,
-                                               check_updates=args.update)
+                                               check_updates=args.update,
+                                               install_folder=args.install_folder)
             if args.json:
                 json_arg = True if args.json == "1" else args.json
                 self._outputer.json_build_order(ret, json_arg, os.getcwd())
@@ -367,7 +374,8 @@ class Command(object):
                                                        profile_name=args.profile,
                                                        filename=args.file,
                                                        remote=args.remote,
-                                                       check_updates=args.update)
+                                                       check_updates=args.update,
+                                                       install_folder=args.install_folder)
             self._outputer.nodes_to_build(nodes)
         # INFO ABOUT DEPS OF CURRENT PROJECT OR REFERENCE
         else:
@@ -375,7 +383,8 @@ class Command(object):
                                               settings=args.settings,
                                               options=args.options, env=args.env,
                                               profile_name=args.profile, update=args.update,
-                                              filename=args.file)
+                                              filename=args.file,
+                                              install_folder=args.install_folder)
             deps_graph, graph_updates_info, project_reference = data
             only = args.only
             if args.only == ["None"]:
diff --git a/conans/client/conan_api.py b/conans/client/conan_api.py
index 84516984a..82c0556e8 100644
--- a/conans/client/conan_api.py
+++ b/conans/client/conan_api.py
@@ -199,12 +199,11 @@ class ConanAPIV1(object):
                keep_source=False, verify=None,
                manifests=None, manifests_interactive=None,
                remote=None, update=False, conan_file_path=None, filename=None,
-               user=None, channel=None, name=None, version=None, werror=False):
+               user=None, channel=None, name=None, version=None):
 
         settings = settings or []
         options = options or []
         env = env or []
-        self._user_io.out.werror_active = werror
 
         cwd = os.getcwd()
         conanfile_folder = self._abs_relative_to(conan_file_path, cwd, default=cwd)
@@ -272,14 +271,6 @@ class ConanAPIV1(object):
                 raise ConanException("The specified --install-folder doesn't contain '%s' and '%s' "
                                      "files" % (CONANINFO, BUILD_INFO))
 
-    @staticmethod
-    def _validate_one_settings_source(install_folder, profile_name, settings, options, env):
-        if install_folder and existing_info_files(install_folder) and \
-           (profile_name or settings or options or env):
-            raise ConanException("%s and %s are found, at '%s' folder, so specifying profile, "
-                                 "settings, options or env is not allowed" % (CONANINFO, BUILD_INFO,
-                                                                              install_folder))
-
     @api_method
     def export_pkg(self, path, name, channel, source_folder=None, build_folder=None,
                    install_folder=None, profile_name=None, settings=None, options=None,
@@ -299,7 +290,12 @@ class ConanAPIV1(object):
         source_folder = self._abs_relative_to(source_folder, cwd, default=build_folder)
 
         # Checks that no both settings and info files are specified
-        self._validate_one_settings_source(install_folder, profile_name, settings, options, env)
+        if install_folder and existing_info_files(install_folder) and \
+        (profile_name or settings or options or env):
+            raise ConanException("%s and %s are found, at '%s' folder, so specifying profile, "
+                                 "settings, options or env is not allowed" % (CONANINFO, BUILD_INFO,
+                                                                              install_folder))
+
 
         infos_present = existing_info_files(install_folder)
         if not infos_present:
@@ -332,11 +328,10 @@ class ConanAPIV1(object):
 
     @api_method
     def install_reference(self, reference, settings=None, options=None, env=None,
-                          remote=None, werror=False, verify=None, manifests=None,
+                          remote=None, verify=None, manifests=None,
                           manifests_interactive=None, build=None, profile_name=None,
                           update=False, generators=None, install_folder=None):
 
-        self._user_io.out.werror_active = werror
         cwd = os.getcwd()
         install_folder = self._abs_relative_to(install_folder, cwd, default=cwd)
 
@@ -360,13 +355,11 @@ class ConanAPIV1(object):
 
     @api_method
     def install(self, path="", settings=None, options=None, env=None,
-                remote=None, werror=False, verify=None, manifests=None,
+                remote=None, verify=None, manifests=None,
                 manifests_interactive=None, build=None, profile_name=None,
                 update=False, generators=None, no_imports=False, filename=None,
                 install_folder=None):
 
-        self._user_io.out.werror_active = werror
-
         cwd = os.getcwd()
         install_folder = self._abs_relative_to(install_folder, cwd, default=cwd)
         conanfile_folder = self._abs_relative_to(path, cwd, default=cwd)
@@ -411,19 +404,29 @@ class ConanAPIV1(object):
         from conans.client.conf.config_installer import configuration_install
         return configuration_install(item, self._client_cache, self._user_io.out, self._runner)
 
+    def _info_get_profile(self, install_folder, profile_name, settings, options, env):
+        cwd = os.getcwd()
+
+        if install_folder or not (profile_name or settings or options or env):
+            # When not install folder is specified but neither any setting, we try to read the
+            # info from cwd
+            install_folder = self._abs_relative_to(install_folder, cwd, default=cwd)
+            if existing_info_files(install_folder):
+                return read_conaninfo_profile(install_folder)
+
+        return profile_from_args(profile_name, settings, options, env=env,
+                                 cwd=cwd, client_cache=self._client_cache)
+
     @api_method
     def info_build_order(self, reference, settings=None, options=None, env=None,
                          profile_name=None, filename=None, remote=None, build_order=None,
-                         check_updates=None, build_folder=None):
-
-        current_path = os.getcwd()
+                         check_updates=None, install_folder=None):
         try:
             reference = ConanFileReference.loads(reference)
         except ConanException:
-            reference = os.path.normpath(os.path.join(current_path, reference))
+            reference = os.path.normpath(os.path.join(os.getcwd(), reference))
 
-        profile = profile_from_args(profile_name, settings, options, env, build_folder,
-                                    self._client_cache)
+        profile = self._info_get_profile(install_folder, profile_name, settings, options, env)
         graph = self._manager.info_build_order(reference, profile, filename, build_order,
                                                remote, check_updates)
         return graph
@@ -431,16 +434,13 @@ class ConanAPIV1(object):
     @api_method
     def info_nodes_to_build(self, reference, build_modes, settings=None, options=None, env=None,
                             profile_name=None, filename=None, remote=None,
-                            check_updates=None, build_folder=None):
-
-        current_path = os.getcwd()
+                            check_updates=None, install_folder=None):
         try:
             reference = ConanFileReference.loads(reference)
         except ConanException:
-            reference = os.path.normpath(os.path.join(current_path, reference))
+            reference = os.path.normpath(os.path.join(os.getcwd(), reference))
 
-        profile = profile_from_args(profile_name, settings, options, env, build_folder,
-                                    self._client_cache)
+        profile = self._info_get_profile(install_folder, profile_name, settings, options, env)
         ret = self._manager.info_nodes_to_build(reference, profile, filename, build_modes, remote,
                                                 check_updates)
         ref_list, project_reference = ret
@@ -449,16 +449,13 @@ class ConanAPIV1(object):
     @api_method
     def info_get_graph(self, reference, remote=None, settings=None, options=None, env=None,
                        profile_name=None, update=False, filename=None,
-                       build_folder=None):
-
-        current_path = os.getcwd()
+                       install_folder=None):
         try:
             reference = ConanFileReference.loads(reference)
         except ConanException:
-            reference = os.path.normpath(os.path.join(current_path, reference))
+            reference = os.path.normpath(os.path.join(os.getcwd(), reference))
 
-        profile = profile_from_args(profile_name, settings, options, env, build_folder,
-                                    self._client_cache)
+        profile = self._info_get_profile(install_folder, profile_name, settings, options, env)
         ret = self._manager.info_get_graph(reference=reference,
                                            remote=remote, profile=profile, check_updates=update,
                                            filename=filename)
diff --git a/conans/client/deps_builder.py b/conans/client/deps_builder.py
index da3934ad2..facfdf0f2 100644
--- a/conans/client/deps_builder.py
+++ b/conans/client/deps_builder.py
@@ -337,12 +337,12 @@ class DepsGraphBuilder(object):
             else:  # a public node already exist with this name
                 previous_node, closure = previous
                 if previous_node.conan_ref != require.conan_reference:
-                    self._output.werror("Conflict in %s\n"
-                                        "    Requirement %s conflicts with already defined %s\n"
-                                        "    Keeping %s\n"
-                                        "    To change it, override it in your base requirements"
-                                        % (conanref, require.conan_reference,
-                                           previous_node.conan_ref, previous_node.conan_ref))
+                    raise ConanException("Conflict in %s\n"
+                                         "    Requirement %s conflicts with already defined %s\n"
+                                         "    Keeping %s\n"
+                                         "    To change it, override it in your base requirements"
+                                         % (conanref, require.conan_reference,
+                                            previous_node.conan_ref, previous_node.conan_ref))
                 dep_graph.add_edge(node, previous_node)
                 # RECURSION!
                 if closure is None:
diff --git a/conans/client/generators/__init__.py b/conans/client/generators/__init__.py
index 2e8a35a6f..679f4ae5c 100644
--- a/conans/client/generators/__init__.py
+++ b/conans/client/generators/__init__.py
@@ -68,36 +68,36 @@ def write_generators(conanfile, path, output):
     """ produces auxiliary files, required to build a project or a package.
     """
     for generator_name in conanfile.generators:
-        if generator_name not in registered_generators:
-            output.warn("Invalid generator '%s'. Available types: %s" %
-                        (generator_name, ", ".join(registered_generators.available)))
-        else:
+        try:
             generator_class = registered_generators[generator_name]
-            try:
-                generator = generator_class(conanfile)
-            except TypeError:
-                # To allow old-style generator packages to work (e.g. premake)
-                output.warn("Generator %s failed with new __init__(), trying old one")
-                generator = generator_class(conanfile.deps_cpp_info, conanfile.cpp_info)
+        except KeyError:
+            raise ConanException("Invalid generator '%s'. Available types: %s" %
+                                 (generator_name, ", ".join(registered_generators.available)))
+        try:
+            generator = generator_class(conanfile)
+        except TypeError:
+            # To allow old-style generator packages to work (e.g. premake)
+            output.warn("Generator %s failed with new __init__(), trying old one")
+            generator = generator_class(conanfile.deps_cpp_info, conanfile.cpp_info)
 
-            try:
-                generator.output_path = path
-                content = generator.content
-                if isinstance(content, dict):
-                    if generator.filename:
-                        output.warn("Generator %s is multifile. Property 'filename' not used"
-                                    % (generator_name,))
-                    for k, v in content.items():
-                        v = normalize(v)
-                        output.info("Generator %s created %s" % (generator_name, k))
-                        save(join(path, k), v)
-                else:
-                    content = normalize(content)
-                    output.info("Generator %s created %s" % (generator_name, generator.filename))
-                    save(join(path, generator.filename), content)
-            except Exception as e:
-                if get_env("CONAN_VERBOSE_TRACEBACK", False):
-                    output.error(traceback.format_exc())
-                output.error("Generator %s(file:%s) failed\n%s"
-                             % (generator_name, generator.filename, str(e)))
-                raise ConanException(e)
+        try:
+            generator.output_path = path
+            content = generator.content
+            if isinstance(content, dict):
+                if generator.filename:
+                    output.warn("Generator %s is multifile. Property 'filename' not used"
+                                % (generator_name,))
+                for k, v in content.items():
+                    v = normalize(v)
+                    output.info("Generator %s created %s" % (generator_name, k))
+                    save(join(path, k), v)
+            else:
+                content = normalize(content)
+                output.info("Generator %s created %s" % (generator_name, generator.filename))
+                save(join(path, generator.filename), content)
+        except Exception as e:
+            if get_env("CONAN_VERBOSE_TRACEBACK", False):
+                output.error(traceback.format_exc())
+            output.error("Generator %s(file:%s) failed\n%s"
+                         % (generator_name, generator.filename, str(e)))
+            raise ConanException(e)
diff --git a/conans/client/generators/cmake_common.py b/conans/client/generators/cmake_common.py
index c8c3aef22..cf8b16b0e 100644
--- a/conans/client/generators/cmake_common.py
+++ b/conans/client/generators/cmake_common.py
@@ -247,7 +247,8 @@ macro(conan_set_rpath)
         set(CMAKE_SKIP_RPATH 1)  # AVOID RPATH FOR *.dylib, ALL LIBS BETWEEN THEM AND THE EXE
                                  # SHOULD BE ON THE LINKER RESOLVER PATH (./ IS ONE OF THEM)
         # Policy CMP0068
-        set(CMAKE_SKIP_INSTALL_RPATH 1) # In previous versions to 3.9 it is explicitly necessary
+        # We want the old behavior, in CMake >= 3.9 CMAKE_SKIP_RPATH won't affect the install_name in OSX
+        set(CMAKE_INSTALL_NAME_DIR "")
     endif()
 endmacro()
 
@@ -452,7 +453,7 @@ endmacro()
 
 cmake_macros = """
 macro(conan_basic_setup)
-    set(options TARGETS NO_OUTPUT_DIRS SKIP_RPATH)
+    set(options TARGETS NO_OUTPUT_DIRS SKIP_RPATH KEEP_RPATHS)
     cmake_parse_arguments(ARGUMENTS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
     if(CONAN_EXPORTED)
         message(STATUS "Conan: called by CMake conan helper")
@@ -469,7 +470,12 @@ macro(conan_basic_setup)
         message(STATUS "Conan: Using cmake targets configuration")
         conan_define_targets()
     endif()
-    if(NOT ARGUMENTS_SKIP_RPATH)
+    if(ARGUMENTS_SKIP_RPATH)
+        # Change by "DEPRECATION" or "SEND_ERROR" when we are ready
+        message(WARNING "Conan: SKIP_RPATH is deprecated, it has been renamed to KEEP_RPATHS")
+    endif()
+    if(NOT ARGUMENTS_SKIP_RPATH AND NOT ARGUMENTS_KEEP_RPATHS)
+        # Parameter has renamed, but we keep the compatibility with old SKIP_RPATH
         message(STATUS "Conan: Adjusting default RPATHs Conan policies")
         conan_set_rpath()
     endif()
diff --git a/conans/client/generators/virtualenv.py b/conans/client/generators/virtualenv.py
index 35cb37378..687edab1a 100644
--- a/conans/client/generators/virtualenv.py
+++ b/conans/client/generators/virtualenv.py
@@ -84,7 +84,7 @@ class VirtualEnvGenerator(Generator):
 
     def _ps1_lines(self, venv_name):
         deactivate_lines = []
-        activate_lines = ["function global:_old_conan_prompt {\"\"}",]
+        activate_lines = ["function global:_old_conan_prompt {\"\"}"]
         activate_lines.append("$function:_old_conan_prompt = $function:prompt")
         activate_lines.append(
             "function global:prompt { write-host \"(%s) \" -nonewline; & $function:_old_conan_prompt }" % venv_name)
diff --git a/conans/client/output.py b/conans/client/output.py
index cf7897025..c5511ebe0 100644
--- a/conans/client/output.py
+++ b/conans/client/output.py
@@ -44,7 +44,6 @@ class ConanOutput(object):
     def __init__(self, stream, color=False):
         self._stream = stream
         self._color = color
-        self.werror_active = False
 
     @property
     def is_terminal(self):
@@ -85,12 +84,6 @@ class ConanOutput(object):
     def warn(self, data):
         self.writeln("WARN: " + data, Color.BRIGHT_YELLOW)
 
-    def werror(self, data):
-        if self.werror_active:
-            raise ConanException(data)
-        else:
-            self.warn(data)
-
     def error(self, data):
         self.writeln("ERROR: " + data, Color.BRIGHT_RED)
 
@@ -114,7 +107,6 @@ class ScopedOutput(ConanOutput):
         self.scope = scope
         self._stream = output._stream
         self._color = output._color
-        self.werror_active = output.werror_active
 
     def write(self, data, front=None, back=None, newline=False):
         super(ScopedOutput, self).write("%s: " % self.scope, front, back, False)
diff --git a/conans/client/require_resolver.py b/conans/client/require_resolver.py
index cfcf5e545..a75bc4f95 100644
--- a/conans/client/require_resolver.py
+++ b/conans/client/require_resolver.py
@@ -36,9 +36,9 @@ class RequireResolver(object):
             ref = require.conan_reference
             resolved = self._resolve_version(version_range, [ref])
             if not resolved:
-                self._output.werror("Version range '%s' required by '%s' not valid for "
-                                    "downstream requirement '%s'"
-                                    % (version_range, base_conanref, str(ref)))
+                raise ConanException("Version range '%s' required by '%s' not valid for "
+                                     "downstream requirement '%s'"
+                                     % (version_range, base_conanref, str(ref)))
             else:
                 self._output.success("Version range '%s' required by '%s' valid for "
                                      "downstream requirement '%s'"
diff --git a/conans/model/options.py b/conans/model/options.py
index e61326f45..f3c5d7757 100644
--- a/conans/model/options.py
+++ b/conans/model/options.py
@@ -112,10 +112,10 @@ class PackageOptionValues(object):
             modified = self._modified.get(name)
             if modified is not None:
                 modified_value, modified_ref = modified
-                output.werror("%s tried to change %s option %s:%s to %s\n"
-                              "but it was already assigned to %s by %s"
-                              % (down_ref, own_ref, package_name, name, value,
-                                 modified_value, modified_ref))
+                raise ConanException("%s tried to change %s option %s:%s to %s\n"
+                                     "but it was already assigned to %s by %s"
+                                     % (down_ref, own_ref, package_name, name, value,
+                                        modified_value, modified_ref))
             else:
                 self._modified[name] = (value, down_ref)
                 self._dict[name] = value
@@ -433,9 +433,9 @@ class PackageOptions(object):
             modified = self._modified.get(name)
             if modified is not None:
                 modified_value, modified_ref = modified
-                output.werror("%s tried to change %s option %s to %s\n"
-                              "but it was already assigned to %s by %s"
-                              % (down_ref, own_ref, name, value, modified_value, modified_ref))
+                raise ConanException("%s tried to change %s option %s to %s\n"
+                                     "but it was already assigned to %s by %s"
+                                     % (down_ref, own_ref, name, value, modified_value, modified_ref))
             else:
                 if ignore_unknown:
                     if name in self._data:


Test patch:
diff --git a/conans/test/build_helpers/cmake_test.py b/conans/test/build_helpers/cmake_test.py
index 2dac92708..45310e0f0 100644
--- a/conans/test/build_helpers/cmake_test.py
+++ b/conans/test/build_helpers/cmake_test.py
@@ -196,7 +196,6 @@ class CMakeTest(unittest.TestCase):
               '-DCONAN_COMPILER="Visual Studio" -DCONAN_COMPILER_VERSION="12" -Wno-dev',
               "--config Debug")
 
-
     def deleted_os_test(self):
         partial_settings = """
 os: [Linux]
diff --git a/conans/test/command/create_test.py b/conans/test/command/create_test.py
index 4949e08af..68c49d79b 100644
--- a/conans/test/command/create_test.py
+++ b/conans/test/command/create_test.py
@@ -96,7 +96,7 @@ class Pkg(ConanFile):
 class Pkg(ConanFile):
     requires = "LibB/0.1@user/channel", "LibC/0.1@user/channel"
         """})
-        error = client.run("create Consumer/0.1@lasote/testing --werror", ignore_error=True)
+        error = client.run("create Consumer/0.1@lasote/testing", ignore_error=True)
         self.assertTrue(error)
         self.assertIn("ERROR: Conflict in LibC/0.1@user/channel",
                       client.out)
diff --git a/conans/test/command/info_test.py b/conans/test/command/info_test.py
index 613d8aad1..35e815814 100644
--- a/conans/test/command/info_test.py
+++ b/conans/test/command/info_test.py
@@ -48,6 +48,46 @@ class InfoTest(unittest.TestCase):
             self.client.run("export lasote/stable")
             self.assertNotIn("WARN: Conanfile doesn't have 'url'", self.client.user_io.out)
 
+    def install_folder_test(self):
+
+        conanfile = """from conans import ConanFile
+from conans.util.files import save
+
+class MyTest(ConanFile):
+    name = "Pkg"
+    version = "0.1"
+    settings = "build_type"
+
+"""
+        client = TestClient()
+        client.save({"conanfile.py": conanfile})
+        client.run("info -s build_type=Debug")
+        self.assertNotIn("ID: 4024617540c4f240a6a5e8911b0de9ef38a11a72", client.user_io.out)
+        self.assertIn("ID: 5a67a79dbc25fd0fa149a0eb7a20715189a0d988", client.user_io.out)
+
+        client.run('install -s build_type=Debug')
+        client.run("info")  # Re-uses debug from curdir
+        self.assertNotIn("ID: 4024617540c4f240a6a5e8911b0de9ef38a11a72", client.user_io.out)
+        self.assertIn("ID: 5a67a79dbc25fd0fa149a0eb7a20715189a0d988", client.user_io.out)
+
+        client.run('install -s build_type=Release --install-folder=MyInstall')
+        client.run("info --install-folder=MyInstall")  # Re-uses debug from MyInstall folder
+
+        self.assertIn("ID: 4024617540c4f240a6a5e8911b0de9ef38a11a72", client.user_io.out)
+        self.assertNotIn("ID: 5a67a79dbc25fd0fa149a0eb7a20715189a0d988", client.user_io.out)
+
+        client.run('install -s build_type=Debug --install-folder=MyInstall')
+        client.run("info --install-folder=MyInstall")  # Re-uses debug from MyInstall folder
+
+        self.assertNotIn("ID: 4024617540c4f240a6a5e8911b0de9ef38a11a72", client.user_io.out)
+        self.assertIn("ID: 5a67a79dbc25fd0fa149a0eb7a20715189a0d988", client.user_io.out)
+
+        # Both should raise
+        error = client.run("info --install-folder=MyInstall -s build_type=Release",
+                           ignore_error=True)  # Re-uses debug from MyInstall folder
+        self.assertTrue(error)
+        self.assertIn("--install-folder cannot be used together with -s, -o, -e or -pr", client.out)
+
     def graph_test(self):
         self.client = TestClient()
 
diff --git a/conans/test/functional/cmake_skip_rpath_test.py b/conans/test/functional/cmake_skip_rpath_test.py
index 699259217..ee362da6f 100644
--- a/conans/test/functional/cmake_skip_rpath_test.py
+++ b/conans/test/functional/cmake_skip_rpath_test.py
@@ -1,3 +1,4 @@
+import platform
 import unittest
 from conans.test.utils.tools import TestClient
 
@@ -21,10 +22,10 @@ project(MyHello CXX)
 cmake_minimum_required(VERSION 2.8.12)
 
 include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
-conan_basic_setup(TARGETS SKIP_RPATH)
+conan_basic_setup(TARGETS %s)
 
 IF(APPLE AND CMAKE_SKIP_RPATH)
-    MESSAGE(FATAL_ERROR "RPath was not skipped")
+    MESSAGE(FATAL_ERROR "RPath was skipped")
 ENDIF()
 """
 
@@ -32,31 +33,36 @@ ENDIF()
 class CMakeSkipRpathTest(unittest.TestCase):
 
     def test_skip_flag(self):
-        client = TestClient()
-        client.save({"conanfile.py": conanfile_py})
-        client.run("export lasote/testing")
-        client.save({"conanfile.txt": conanfile,
-                     "CMakeLists.txt": cmake}, clean_first=True)
-
-        client.run('install -g cmake --build')
-        client.runner("cmake .", cwd=client.current_folder)
-        self.assertNotIn("Conan: Adjusting default RPATHs Conan policies", client.user_io.out)
-        self.assertIn("Build files have been written", client.user_io.out)
-
-        client.save({"conanfile.txt": conanfile,
-                     "CMakeLists.txt": cmake.replace("TARGETS SKIP_RPATH", "SKIP_RPATH")},
-                    clean_first=True)
-
-        client.run('install -g cmake --build')
-        client.runner("cmake .", cwd=client.current_folder)
-        self.assertNotIn("Conan: Adjusting default RPATHs Conan policies", client.user_io.out)
-        self.assertIn("Build files have been written", client.user_io.out)
-
-        client.save({"conanfile.txt": conanfile,
-                     "CMakeLists.txt": cmake.replace("SKIP_RPATH", "")},
-                    clean_first=True)
-
-        client.run('install -g cmake --build')
-        client.runner("cmake .", cwd=client.current_folder)
-        self.assertIn("Conan: Adjusting default RPATHs Conan policies", client.user_io.out)
-        self.assertIn("Build files have been written", client.user_io.out)
+        for way_to_skip in ("SKIP_RPATH", "KEEP_RPATHS"):
+            client = TestClient()
+            client.save({"conanfile.py": conanfile_py})
+            client.run("export lasote/testing")
+            client.save({"conanfile.txt": conanfile,
+                         "CMakeLists.txt": cmake % way_to_skip}, clean_first=True)
+            client.run('install -g cmake --build')
+            client.runner("cmake .", cwd=client.current_folder)
+            self.assertNotIn("Conan: Adjusting default RPATHs Conan policies", client.out)
+            self.assertIn("Build files have been written", client.out)
+            if way_to_skip == "SKIP_RPATH":
+                self.assertIn("Conan: SKIP_RPATH is deprecated, it has been renamed to KEEP_RPATHS",
+                              client.out)
+
+            client.save({"conanfile.txt": conanfile,
+                         "CMakeLists.txt": (cmake % way_to_skip).replace("TARGETS", "")},
+                        clean_first=True)
+
+            client.run('install -g cmake --build')
+            client.runner("cmake .", cwd=client.current_folder)
+            self.assertNotIn("Conan: Adjusting default RPATHs Conan policies", client.out)
+            self.assertIn("Build files have been written", client.out)
+
+            client.save({"conanfile.txt": conanfile,
+                         "CMakeLists.txt": (cmake % "").replace("FATAL_ERROR", "INFO")},
+                        clean_first=True)
+
+            if platform.system() == "Darwin":
+                client.run('install -g cmake --build')
+                client.runner("cmake .", cwd=client.current_folder)
+                self.assertIn("Conan: Adjusting default RPATHs Conan policies", client.out)
+                self.assertIn("Build files have been written", client.out)
+                self.assertIn("RPath was skipped", client.out)
diff --git a/conans/test/generators/cmake_test.py b/conans/test/generators/cmake_test.py
index 85214df86..0ceb4530c 100644
--- a/conans/test/generators/cmake_test.py
+++ b/conans/test/generators/cmake_test.py
@@ -97,7 +97,7 @@ class CMakeGeneratorTest(unittest.TestCase):
         # extract the conan_basic_setup macro
         macro = self._extract_macro("conan_basic_setup", aux_cmake_test_setup)
         self.assertEqual("""macro(conan_basic_setup)
-    set(options TARGETS NO_OUTPUT_DIRS SKIP_RPATH)
+    set(options TARGETS NO_OUTPUT_DIRS SKIP_RPATH KEEP_RPATHS)
     cmake_parse_arguments(ARGUMENTS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
     if(CONAN_EXPORTED)
         message(STATUS "Conan: called by CMake conan helper")
@@ -114,7 +114,12 @@ class CMakeGeneratorTest(unittest.TestCase):
         message(STATUS "Conan: Using cmake targets configuration")
         conan_define_targets()
     endif()
-    if(NOT ARGUMENTS_SKIP_RPATH)
+    if(ARGUMENTS_SKIP_RPATH)
+        # Change by "DEPRECATION" or "SEND_ERROR" when we are ready
+        message(WARNING "Conan: SKIP_RPATH is deprecated, it has been renamed to KEEP_RPATHS")
+    endif()
+    if(NOT ARGUMENTS_SKIP_RPATH AND NOT ARGUMENTS_KEEP_RPATHS)
+        # Parameter has renamed, but we keep the compatibility with old SKIP_RPATH
         message(STATUS "Conan: Adjusting default RPATHs Conan policies")
         conan_set_rpath()
     endif()
diff --git a/conans/test/generators/generators_test.py b/conans/test/generators/generators_test.py
index eab8e6256..7393586c4 100644
--- a/conans/test/generators/generators_test.py
+++ b/conans/test/generators/generators_test.py
@@ -6,6 +6,17 @@ from conans.util.files import load
 
 class GeneratorsTest(unittest.TestCase):
 
+    def test_error(self):
+        base = '''
+[generators]
+unknown
+'''
+        client = TestClient()
+        client.save({"conanfile.txt": base})
+        error = client.run("install --build", ignore_error=True)
+        self.assertTrue(error)
+        self.assertIn("ERROR: Invalid generator 'unknown'. Available types:", client.out)
+
     def test_base(self):
         base = '''
 [generators]
diff --git a/conans/test/integration/conflict_diamond_test.py b/conans/test/integration/conflict_diamond_test.py
index f2f043fdb..c7a47c8fe 100644
--- a/conans/test/integration/conflict_diamond_test.py
+++ b/conans/test/integration/conflict_diamond_test.py
@@ -32,10 +32,7 @@ class HelloReuseConan(ConanFile):
         self._export("Hello3", "0.1", ["Hello1/0.1@lasote/stable", "Hello2/0.1@lasote/stable"],
                      export=False)
 
-        self.client.run("install . --build missing")
-        self.assertIn("WARN: Conflict in Hello2/0.1@lasote/stable", self.client.user_io.out)
-        self.assertIn("PROJECT: Generated conaninfo.txt", self.client.user_io.out)
-
-        self.client.run("install . --build missing --werror", ignore_error=True)
-        self.assertIn("ERROR: Conflict in Hello2/0.1@lasote/stable", self.client.user_io.out)
+        error = self.client.run("install . --build missing", ignore_error=True)
+        self.assertTrue(error)
+        self.assertIn("Conflict in Hello2/0.1@lasote/stable", self.client.user_io.out)
         self.assertNotIn("PROJECT: Generated conaninfo.txt", self.client.user_io.out)
diff --git a/conans/test/integration/package_info_test.py b/conans/test/integration/package_info_test.py
new file mode 100644
index 000000000..36dc1b3c6
--- /dev/null
+++ b/conans/test/integration/package_info_test.py
@@ -0,0 +1,48 @@
+import unittest
+
+from conans.paths import CONANFILE, CONANFILE_TXT
+from conans.test.utils.tools import TestClient
+
+
+class TestPackageInfo(unittest.TestCase):
+
+    def package_info_called_in_local_cache_test(self):
+        client = TestClient()
+        conanfile_tmp = '''
+from conans import ConanFile
+import os
+
+class HelloConan(ConanFile):
+    name = "%s"
+    version = "1.0"
+    build_policy = "missing"
+    options = {"switch": ["1",  "0"]}
+    default_options = "switch=0"
+    %s
+    
+    def build(self):
+        self.output.warn("Env var MYVAR={0}.".format(os.getenv("MYVAR", "")))
+
+    def package_info(self):
+        if self.options.switch == "0": 
+            self.env_info.MYVAR = "foo"
+        else:
+            self.env_info.MYVAR = "bar"
+
+'''
+        for index in range(4):
+            requires = "requires = 'Lib%s/1.0@conan/stable'" % index if index > 0 else ""
+            conanfile = conanfile_tmp % ("Lib%s" % (index + 1), requires)
+            client.save({CONANFILE: conanfile}, clean_first=True)
+            client.run("create conan/stable")
+
+        txt = "[requires]\nLib4/1.0@conan/stable"
+        client.save({CONANFILE_TXT: txt}, clean_first=True)
+        client.run("install . -o *:switch=1")
+        self.assertIn("Lib1/1.0@conan/stable: WARN: Env var MYVAR=.", client.out)
+        self.assertIn("Lib2/1.0@conan/stable: WARN: Env var MYVAR=bar.", client.out)
+        self.assertIn("Lib3/1.0@conan/stable: WARN: Env var MYVAR=bar.", client.out)
+        self.assertIn("Lib4/1.0@conan/stable: WARN: Env var MYVAR=bar.", client.out)
+
+        client.run("install . -o *:switch=0 --build Lib3")
+        self.assertIn("Lib3/1.0@conan/stable: WARN: Env var MYVAR=foo", client.out)
diff --git a/conans/test/integration/version_ranges_conflict_test.py b/conans/test/integration/version_ranges_conflict_test.py
index ab8b33c4a..a1d31b654 100644
--- a/conans/test/integration/version_ranges_conflict_test.py
+++ b/conans/test/integration/version_ranges_conflict_test.py
@@ -18,14 +18,8 @@ class VersionRangesConflictTest(unittest.TestCase):
         add("MyPkg2", "0.1", ["MyPkg1/[~0.1]@user/testing"])
         add("MyPkg3", "0.1", ["MyPkg1/[~0.2]@user/testing", "MyPkg2/[~0.1]@user/testing"])
 
-    def werror_warn_test(self):
-        self.client.run("info")
-        self.assertIn("WARN: Version range '~0.1' required by 'MyPkg2/0.1@user/testing' "
-                      "not valid for downstream requirement 'MyPkg1/0.2.0@user/testing'",
-                      self.client.user_io.out)
-
     def werror_fail_test(self):
-        error = self.client.run("install --build --werror", ignore_error=True)
+        error = self.client.run("install --build", ignore_error=True)
         self.assertTrue(error)
         self.assertNotIn("WARN: Version range '~0.1' required", self.client.user_io.out)
         self.assertIn("ERROR: Version range '~0.1' required by 'MyPkg2/0.1@user/testing' "
diff --git a/conans/test/model/options_test.py b/conans/test/model/options_test.py
index 983482614..816e3d7e0 100644
--- a/conans/test/model/options_test.py
+++ b/conans/test/model/options_test.py
@@ -111,19 +111,11 @@ class OptionsTest(unittest.TestCase):
                     "Poco": poco_values,
                     "Hello1": hello1_values}
         down_ref = ConanFileReference.loads("Hello2/0.1@diego/testing")
-        self.sut.propagate_upstream(options2, down_ref, own_ref, output)
-        self.assertIn("""WARN: Hello2/0.1@diego/testing tried to change Hello1/0.1@diego/testing option optimized to 2
-but it was already assigned to 4 by Hello0/0.1@diego/testing
-WARN: Hello2/0.1@diego/testing tried to change Hello1/0.1@diego/testing option static to True
-but it was already assigned to False by Hello0/0.1@diego/testing
-WARN: Hello2/0.1@diego/testing tried to change Hello1/0.1@diego/testing option Boost:static to 2
-but it was already assigned to False by Hello0/0.1@diego/testing
-WARN: Hello2/0.1@diego/testing tried to change Hello1/0.1@diego/testing option Boost:thread to Any
-but it was already assigned to True by Hello0/0.1@diego/testing
-WARN: Hello2/0.1@diego/testing tried to change Hello1/0.1@diego/testing option Boost:thread.multi to on
-but it was already assigned to off by Hello0/0.1@diego/testing
-WARN: Hello2/0.1@diego/testing tried to change Hello1/0.1@diego/testing option Poco:deps_bundled to What
-but it was already assigned to True by Hello0/0.1@diego/testing""", str(output))
+
+        with self.assertRaisesRegexp(ConanException, "Hello2/0.1@diego/testing tried to change "
+                                     "Hello1/0.1@diego/testing option optimized to 2"):
+            self.sut.propagate_upstream(options2, down_ref, own_ref, output)
+
         self.assertEqual(self.sut.values.dumps(),
                          """optimized=4
 path=NOTDEF
@@ -182,7 +174,6 @@ Poco:deps_bundled=True""")
         own_ref = ConanFileReference.loads("Boost.Assert/0.1@diego/testing")
         down_ref = ConanFileReference.loads("Consumer/0.1@diego/testing")
         output = TestBufferConanOutput()
-        output.werror_active = True
         with self.assertRaises(ConanException):
             self.sut.propagate_upstream(options, down_ref, own_ref, output)
 
diff --git a/conans/test/model/transitive_reqs_test.py b/conans/test/model/transitive_reqs_test.py
index 831458b9e..c12d51ff6 100644
--- a/conans/test/model/transitive_reqs_test.py
+++ b/conans/test/model/transitive_reqs_test.py
@@ -429,7 +429,6 @@ class ChatConan(ConanFile):
         self.retriever.conan(say_ref2, say_content2)
         self.retriever.conan(hello_ref, hello_content)
         self.retriever.conan(bye_ref, bye_content2)
-        self.output.werror_active = True
         with self.assertRaisesRegexp(ConanException, "Conflict in Bye/0.2@user/testing"):
             self.root(chat_content)
 
@@ -446,46 +445,9 @@ class ChatConan(ConanFile):
         self.retriever.conan(say_ref2, say_content2)
         self.retriever.conan(hello_ref, hello_content)
         self.retriever.conan(bye_ref, bye_content2)
-        deps_graph = self.root(chat_content)
-
-        self.assertIn("""Conflict in Bye/0.2@user/testing
-    Requirement Say/0.2@user/testing conflicts with already defined Say/0.1@user/testing
-    Keeping Say/0.1@user/testing
-    To change it, override it in your base requirements""", self.output)
-        self.assertEqual(4, len(deps_graph.nodes))
-        hello = _get_nodes(deps_graph, "Hello")[0]
-        bye = _get_nodes(deps_graph, "Bye")[0]
-        say = _get_nodes(deps_graph, "Say")[0]
-        chat = _get_nodes(deps_graph, "Chat")[0]
-        self.assertEqual(_get_edges(deps_graph), {Edge(hello, say), Edge(chat, hello),
-                                                  Edge(bye, say), Edge(chat, bye)})
 
-        self.assertEqual(hello.conan_ref, hello_ref)
-        self.assertEqual(say.conan_ref, say_ref)
-        self.assertEqual(bye.conan_ref, bye_ref)
-
-        self._check_say(say.conanfile)
-        self._check_hello(hello, say_ref)
-
-        conanfile = chat.conanfile
-        self.assertEqual(conanfile.version, "2.3")
-        self.assertEqual(conanfile.name, "Chat")
-        self.assertEqual(conanfile.options.values.dumps(), "")
-        self.assertEqual(conanfile.settings.fields, [])
-        self.assertEqual(conanfile.settings.values.dumps(), "")
-        self.assertEqual(conanfile.requires, Requirements(str(hello_ref),
-                                                          str(bye_ref)))
-
-        conaninfo = conanfile.info
-        self.assertEqual(conaninfo.settings.dumps(), "")
-        self.assertEqual(conaninfo.full_settings.dumps(), "")
-        self.assertEqual(conaninfo.options.dumps(), "")
-        self.assertEqual(conaninfo.full_options.dumps(), "")
-        self.assertEqual(conaninfo.requires.dumps(), "Bye/0.2\nHello/1.Y.Z")
-        self.assertEqual(conaninfo.full_requires.dumps(),
-                         "Bye/0.2@user/testing:0b09634eb446bffb8d3042a3f19d813cfc162b9d\n"
-                         "Hello/1.2@user/testing:0b09634eb446bffb8d3042a3f19d813cfc162b9d\n"
-                         "Say/0.1@user/testing:5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9")
+        with self.assertRaisesRegexp(ConanException, "Conflict in Bye/0.2@user/testing"):
+            deps_graph = self.root(chat_content)
 
     def test_diamond_conflict_solved(self):
         chat_content = """
@@ -909,55 +871,9 @@ class ChatConan(ConanFile):
         self.retriever.conan(hello_ref, hello_content)
         self.retriever.conan(bye_ref, bye_content)
 
-        self.output.werror_active = True
         with self.assertRaisesRegexp(ConanException, "tried to change"):
             self.root(chat_content)
 
-        self.output.werror_active = False
-        deps_graph = self.root(chat_content)
-
-        self.assertEqual(4, len(deps_graph.nodes))
-        hello = _get_nodes(deps_graph, "Hello")[0]
-        bye = _get_nodes(deps_graph, "Bye")[0]
-        say = _get_nodes(deps_graph, "Say")[0]
-        chat = _get_nodes(deps_graph, "Chat")[0]
-        self.assertEqual(_get_edges(deps_graph), {Edge(hello, say), Edge(chat, hello),
-                                                  Edge(bye, say), Edge(chat, bye)})
-
-        self._check_say(say.conanfile, options="myoption=234")
-        self.assertIn("Bye/0.2@user/testing tried to change Say/0.1@user/testing "
-                      "option myoption to 123 but it was already assigned to 234 "
-                      "by Hello/1.2@user/testing", str(self.output).replace("\n", " "))
-        self.assertEqual(4, len(deps_graph.nodes))
-        hello = _get_nodes(deps_graph, "Hello")[0]
-        bye = _get_nodes(deps_graph, "Bye")[0]
-        say = _get_nodes(deps_graph, "Say")[0]
-        chat = _get_nodes(deps_graph, "Chat")[0]
-        self.assertEqual(_get_edges(deps_graph), {Edge(hello, say), Edge(chat, hello),
-                                                  Edge(bye, say), Edge(chat, bye)})
-
-        self._check_say(say.conanfile, options="myoption=234")
-
-        conanfile = chat.conanfile
-        self.assertEqual(conanfile.version, "2.3")
-        self.assertEqual(conanfile.name, "Chat")
-        self.assertEqual(conanfile.options.values.dumps(), "Say:myoption=234")
-        self.assertEqual(conanfile.settings.fields, [])
-        self.assertEqual(conanfile.settings.values.dumps(), "")
-        self.assertEqual(conanfile.requires, Requirements(str(hello_ref),
-                                                          str(bye_ref)))
-
-        conaninfo = conanfile.info
-        self.assertEqual(conaninfo.settings.dumps(), "")
-        self.assertEqual(conaninfo.full_settings.dumps(), "")
-        self.assertEqual(conaninfo.options.dumps(), "")
-        self.assertEqual(conaninfo.full_options.dumps(), "Say:myoption=234")
-        self.assertEqual(conaninfo.requires.dumps(), "Bye/0.2\nHello/1.Y.Z")
-        self.assertEqual(conaninfo.full_requires.dumps(),
-                         "Bye/0.2@user/testing:0b09634eb446bffb8d3042a3f19d813cfc162b9d\n"
-                         "Hello/1.2@user/testing:0b09634eb446bffb8d3042a3f19d813cfc162b9d\n"
-                         "Say/0.1@user/testing:48bb3c5cbdb4822ae87914437ca3cceb733c7e1d")
-
     def test_diamond_conflict_options_solved(self):
         say_content = """
 from conans import ConanFile
@@ -1621,12 +1537,12 @@ class LibDConan(ConanFile):
         libd_ref = ConanFileReference.loads("LibD/0.1@user/testing")
         self.retriever.conan(libd_ref, libd_content)
 
-        self.root(self.consumer_content)
+        with self.assertRaisesRegexp(ConanException, "Conflict in LibB/0.1@user/testing"):
+            self.root(self.consumer_content)
         self.assertIn("LibB/0.1@user/testing requirement LibA/0.1@user/testing overriden by "
                       "LibD/0.1@user/testing to LibA/0.2@user/testing", str(self.output))
-        self.assertIn("WARN: Conflict in LibB/0.1@user/testing", str(self.output))
-        self.assertEqual(2, str(self.output).count("LibA requirements()"))
-        self.assertEqual(2, str(self.output).count("LibA configure()"))
+        self.assertEqual(1, str(self.output).count("LibA requirements()"))
+        self.assertEqual(1, str(self.output).count("LibA configure()"))
 
     def test_expand_requirements_direct(self):
         libd_content = """
@@ -1640,12 +1556,10 @@ class LibDConan(ConanFile):
         libd_ref = ConanFileReference.loads("LibD/0.1@user/testing")
         self.retriever.conan(libd_ref, libd_content)
 
-        self.root(self.consumer_content)
-        self.assertIn("LibB/0.1@user/testing requirement LibA/0.1@user/testing overriden by "
-                      "LibD/0.1@user/testing to LibA/0.2@user/testing", str(self.output))
-        self.assertIn("WARN: Conflict in LibB/0.1@user/testing", str(self.output))
-        self.assertEqual(3, str(self.output).count("LibA requirements()"))
-        self.assertEqual(3, str(self.output).count("LibA configure()"))
+        with self.assertRaisesRegexp(ConanException, "Conflict in LibB/0.1@user/testing"):
+            self.root(self.consumer_content)
+        self.assertEqual(1, str(self.output).count("LibA requirements()"))
+        self.assertEqual(1, str(self.output).count("LibA configure()"))
 
     def test_expand_options(self):
         """ if only one path changes the default option, it has to be expanded
@@ -1696,9 +1610,10 @@ class LibDConan(ConanFile):
         libc_ref = ConanFileReference.loads("LibC/0.1@user/testing")
         self.retriever.conan(libc_ref, libc_content)
 
-        self.root(self.consumer_content)
-        self.assertIn("WARN: LibD/0.1@user/testing tried to change LibB/0.1@user/testing "
-                      "option LibA:shared to True", str(self.output))
+        with self.assertRaisesRegexp(ConanException, "LibD/0.1@user/testing tried to change LibB/0.1@user/testing "
+                                     "option LibA:shared to True"):
+            self.root(self.consumer_content)
+
         self.assertEqual(1, str(self.output).count("LibA requirements()"))
         self.assertEqual(1, str(self.output).count("LibA configure()"))
 
diff --git a/conans/test/model/version_ranges_test.py b/conans/test/model/version_ranges_test.py
index b71c0777a..0aac1c8a5 100644
--- a/conans/test/model/version_ranges_test.py
+++ b/conans/test/model/version_ranges_test.py
@@ -14,6 +14,7 @@ from conans.client.require_resolver import RequireResolver, satisfying
 import re
 from nose_parameterized import parameterized
 from conans.model.profile import Profile
+from conans.errors import ConanException
 
 
 class BasicMaxVersionTest(unittest.TestCase):
@@ -247,6 +248,10 @@ class ChatConan(ConanFile):
     version = "2.3"
     requires = "Hello/1.2@memsharded/testing", %s
 """
+        if valid is False:
+            with self.assertRaisesRegexp(ConanException, "not valid"):
+                self.root(chat_content % version_range)
+            return
 
         deps_graph = self.root(chat_content % version_range)
         hello = _get_nodes(deps_graph, "Hello")[0]