def create_profile(folder, name, settings=None, scopes=None, package_settings=None, env=None, package_env=None): package_env = package_env or {} profile = Profile() profile._settings = settings or {} if scopes: profile.scopes = Scopes.from_list( ["%s=%s" % (key, value) for key, value in scopes.items()]) if package_settings: profile._package_settings = package_settings for package_name, envs in package_env.items(): for var_name, value in envs: profile.env_values.add(var_name, value, package_name) for var_name, value in env or {}: profile.env_values.add(var_name, value) save(os.path.join(folder, name), profile.dumps())
def update_profile(self, profile_name, key, value): first_key, rest_key = self._get_profile_keys(key) profile, _ = read_profile(profile_name, os.getcwd(), self._client_cache.profiles_path) if first_key == "settings": profile.settings[rest_key] = value elif first_key == "options": tmp = OptionsValues([(rest_key, value)]) profile.options.update(tmp) elif first_key == "env": profile.env_values.update( EnvValues.loads("%s=%s" % (rest_key, value))) elif first_key == "scopes": profile.update_scopes( Scopes.from_list(["%s=%s" % (rest_key, value)])) elif first_key == "build_requires": raise ConanException( "Edit the profile manually to change the build_requires") contents = profile.dumps() profile_path = get_profile_path(profile_name, self._client_cache.profiles_path, os.getcwd()) save(profile_path, contents)
def loads(text): obj = Profile() doc = ConfigParser(text, allowed_fields=["settings", "env", "scopes"]) for setting in doc.settings.splitlines(): setting = setting.strip() if setting and not setting.startswith("#"): if "=" not in setting: raise ConanException("Invalid setting line '%s'" % setting) name, value = setting.split("=") obj.settings[name.strip()] = value.strip() if doc.scopes: obj.scopes = Scopes.from_list(doc.scopes.splitlines()) for env in doc.env.splitlines(): env = env.strip() if env and not env.startswith("#"): if "=" not in env: raise ConanException("Invalid env line '%s'" % env) varname, value = env.split("=") obj.env[varname.strip()] = value.strip() obj._order() return obj
def _create_profile(self, name, settings, scopes=None, env=None): profile = Profile() profile.settings = settings or {} if scopes: profile.scopes = Scopes.from_list(["%s=%s" % (key, value) for key, value in scopes.items()]) profile.env = env or {} save(self.client.client_cache.profile_path(name), profile.dumps())
def loads(text): try: obj = Profile() doc = ConfigParser(text, allowed_fields=["settings", "env", "scopes"]) for setting in doc.settings.splitlines(): setting = setting.strip() if setting and not setting.startswith("#"): if "=" not in setting: raise ConanException("Invalid setting line '%s'" % setting) name, value = setting.split("=", 1) obj.settings[name.strip()] = _clean_value(value) if doc.scopes: obj.scopes = Scopes.from_list(doc.scopes.splitlines()) for env in doc.env.splitlines(): env = env.strip() if env and not env.startswith("#"): if "=" not in env: raise ConanException("Invalid env line '%s'" % env) varname, value = env.split("=", 1) obj.env[varname.strip()] = _clean_value(value) obj._order() return obj except ConanException: raise except Exception as exc: raise ConanException("Error parsing the profile text file: %s" % str(exc))
def _create_profile(self, name, settings, scopes=None, env=None): profile = Profile() profile._settings = settings or {} if scopes: profile.scopes = Scopes.from_list( ["%s=%s" % (key, value) for key, value in scopes.items()]) profile._env = env or {} save(self.client.client_cache.profile_path(name), profile.dumps())
def _create_profile(self, name, settings, scopes=None, env=None): env = env or {} profile = Profile() profile._settings = settings or {} if scopes: profile.scopes = Scopes.from_list(["%s=%s" % (key, value) for key, value in scopes.items()]) for varname, value in env.items(): profile.env_values.add(varname, value) save(os.path.join(self.client.client_cache.profiles_path, name), profile.dumps())
def install(self, *args): """ install in the local store the given requirements. Requirements can be defined in the command line or in a conanfile. EX: conan install opencv/2.4.10@lasote/testing """ parser = argparse.ArgumentParser(description=self.install.__doc__, prog="conan install", formatter_class=RawTextHelpFormatter) parser.add_argument("reference", nargs='?', default="", help='package recipe reference' 'e.g., MyPackage/1.2@user/channel or ./my_project/') parser.add_argument("--package", "-p", nargs=1, action=Extender, help='Force install specified package ID (ignore settings/options)') parser.add_argument("--all", action='store_true', default=False, help='Install all packages from the specified package recipe') parser.add_argument("--integrity", "-i", action='store_true', default=False, help='Check that the stored recipe or package manifests are correct') parser.add_argument("--file", "-f", help="specify conanfile filename") parser.add_argument("--update", "-u", action='store_true', default=False, help="update with new upstream packages") parser.add_argument("--scope", "-sc", nargs=1, action=Extender, help='Define scopes for packages') parser.add_argument("--generator", "-g", nargs=1, action=Extender, help='Generators to use') self._parse_args(parser) args = parser.parse_args(*args) current_path = os.getcwd() try: reference = ConanFileReference.loads(args.reference) except: reference = os.path.normpath(os.path.join(current_path, args.reference)) if args.all or args.package: # Install packages without settings (fixed ids or all) if args.all: args.package = [] if not args.reference or not isinstance(reference, ConanFileReference): raise ConanException("Invalid package recipe reference. " "e.g., MyPackage/1.2@user/channel") self._manager.download(reference, args.package, remote=args.remote) else: # Classic install, package chosen with settings and options # Get False or a list of patterns to check args.build = self._get_build_sources_parameter(args.build) options = self._get_tuples_list_from_extender_arg(args.options) settings = self._get_tuples_list_from_extender_arg(args.settings) scopes = Scopes.from_list(args.scope) if args.scope else None self._manager.install(reference=reference, current_path=current_path, remote=args.remote, options=options, settings=settings, build_mode=args.build, filename=args.file, update=args.update, integrity=args.integrity, scopes=scopes, generators=args.generator)
def _profile_parse_args(settings, options, envs, scopes): """ return a Profile object result of parsing raw data """ def _get_tuples_list_from_extender_arg(items): if not items: return [] # Validate the pairs for item in items: chunks = item.split("=", 1) if len(chunks) != 2: raise ConanException("Invalid input '%s', use 'name=value'" % item) return [(item[0], item[1]) for item in [item.split("=", 1) for item in items]] def _get_simple_and_package_tuples(items): """Parse items like "thing:item=value or item2=value2 and returns a tuple list for the simple items (name, value) and a dict for the package items {package: [(item, value)...)], ...} """ simple_items = [] package_items = defaultdict(list) tuples = _get_tuples_list_from_extender_arg(items) for name, value in tuples: if ":" in name: # Scoped items tmp = name.split(":", 1) ref_name = tmp[0] name = tmp[1] package_items[ref_name].append((name, value)) else: simple_items.append((name, value)) return simple_items, package_items def _get_env_values(env, package_env): env_values = EnvValues() for name, value in env: env_values.add(name, EnvValues.load_value(value)) for package, data in package_env.items(): for name, value in data: env_values.add(name, EnvValues.load_value(value), package) return env_values result = Profile() options = _get_tuples_list_from_extender_arg(options) result.options = OptionsValues(options) env, package_env = _get_simple_and_package_tuples(envs) env_values = _get_env_values(env, package_env) result.env_values = env_values settings, package_settings = _get_simple_and_package_tuples(settings) result.settings = OrderedDict(settings) for pkg, values in package_settings.items(): result.package_settings[pkg] = OrderedDict(values) result.scopes = Scopes.from_list(scopes) if scopes else Scopes() return result
def _apply_inner_profile(doc, base_profile): """ :param doc: ConfigParser object from the current profile (excluding includes and vars, and with values already replaced) :param base_profile: Profile inherited, it's used as a base profile to modify it. :return: None """ def get_package_name_value(item): """Parse items like package:name=value or name=value""" package_name = None if ":" in item: tmp = item.split(":", 1) package_name, item = tmp name, value = item.split("=", 1) name = name.strip() value = unquote(value) return package_name, name, value for setting in doc.settings.splitlines(): setting = setting.strip() if setting and not setting.startswith("#"): if "=" not in setting: raise ConanException("Invalid setting line '%s'" % setting) package_name, name, value = get_package_name_value(setting) if package_name: base_profile.package_settings[package_name][name] = value else: base_profile.settings[name] = value if doc.build_requires: # FIXME CHECKS OF DUPLICATED? for req in doc.build_requires.splitlines(): tokens = req.split(":", 1) if len(tokens) == 1: pattern, req_list = "*", req else: pattern, req_list = tokens req_list = [ ConanFileReference.loads(r.strip()) for r in req_list.split(",") ] base_profile.build_requires.setdefault(pattern, []).extend(req_list) if doc.scopes: base_profile.update_scopes(Scopes.from_list(doc.scopes.splitlines())) if doc.options: base_profile.options.update(OptionsValues.loads(doc.options)) base_profile.env_values.update(EnvValues.loads(doc.env))
def loads(text): def get_package_name_value(item): '''Parse items like package:name=value or name=value''' package_name = None if ":" in item: tmp = item.split(":", 1) package_name, item = tmp name, value = item.split("=", 1) name = name.strip() value = _clean_value(value) return package_name, name, value try: obj = Profile() doc = ConfigParser(text, allowed_fields=["settings", "env", "scopes"]) for setting in doc.settings.splitlines(): setting = setting.strip() if setting and not setting.startswith("#"): if "=" not in setting: raise ConanException("Invalid setting line '%s'" % setting) package_name, name, value = get_package_name_value(setting) if package_name: obj._package_settings[package_name][name] = value else: obj._settings[name] = value if doc.scopes: obj.scopes = Scopes.from_list(doc.scopes.splitlines()) for env in doc.env.splitlines(): env = env.strip() if env and not env.startswith("#"): if "=" not in env: raise ConanException("Invalid env line '%s'" % env) package_name, name, value = get_package_name_value(env) if package_name: obj._package_env[package_name][name] = value else: obj._env[name] = value obj._order() return obj except ConanException: raise except Exception as exc: raise ConanException("Error parsing the profile text file: %s" % str(exc))
def info(self, *args): """ Prints information about the requirements. Requirements can be defined in the command line or in a conanfile. EX: conan info opencv/2.4.10@lasote/testing """ parser = argparse.ArgumentParser(description=self.info.__doc__, prog="conan info", formatter_class=RawTextHelpFormatter) parser.add_argument("reference", nargs='?', default="", help='reference name or path to conanfile file, ' 'e.g., MyPackage/1.2@user/channel or ./my_project/') parser.add_argument("--file", "-f", help="specify conanfile filename") parser.add_argument("-r", "--remote", help='look for in the remote storage') parser.add_argument("--options", "-o", help='load options to build the package, e.g., -o with_qt=true', nargs=1, action=Extender) parser.add_argument("--settings", "-s", help='load settings to build the package, -s compiler:gcc', nargs=1, action=Extender) parser.add_argument("--only", "-n", help='show fields only') parser.add_argument("--integrity", "-i", action='store_true', default=False, help='Check that the stored recipe or package manifests are correct') parser.add_argument("--update", "-u", action='store_true', default=False, help="check updates exist from upstream remotes") parser.add_argument("--build_order", "-bo", help='given a modified reference, return ordered list to build (CI)', nargs=1, action=Extender) parser.add_argument("--scope", "-sc", nargs=1, action=Extender, help='Define scopes for packages') args = parser.parse_args(*args) options = self._get_tuples_list_from_extender_arg(args.options) settings = self._get_tuples_list_from_extender_arg(args.settings) current_path = os.getcwd() try: reference = ConanFileReference.loads(args.reference) except: reference = os.path.normpath(os.path.join(current_path, args.reference)) scopes = Scopes.from_list(args.scope) if args.scope else None self._manager.info(reference=reference, current_path=current_path, remote=args.remote, options=options, settings=settings, info=args.only or True, check_updates=args.update, integrity=args.integrity, filename=args.file, build_order=args.build_order, scopes=scopes)
def _apply_inner_profile(doc, base_profile): """ :param doc: ConfigParser object from the current profile (excluding includes and vars, and with values already replaced) :param base_profile: Profile inherited, it's used as a base profile to modify it. :return: None """ def get_package_name_value(item): """Parse items like package:name=value or name=value""" package_name = None if ":" in item: tmp = item.split(":", 1) package_name, item = tmp name, value = item.split("=", 1) name = name.strip() value = unquote(value) return package_name, name, value for setting in doc.settings.splitlines(): setting = setting.strip() if setting and not setting.startswith("#"): if "=" not in setting: raise ConanException("Invalid setting line '%s'" % setting) package_name, name, value = get_package_name_value(setting) if package_name: base_profile.package_settings[package_name][name] = value else: base_profile.settings[name] = value if doc.build_requires: # FIXME CHECKS OF DUPLICATED? for req in doc.build_requires.splitlines(): tokens = req.split(":", 1) if len(tokens) == 1: pattern, req_list = "*", req else: pattern, req_list = tokens req_list = [ConanFileReference.loads(r.strip()) for r in req_list.split(",")] base_profile.build_requires.setdefault(pattern, []).extend(req_list) if doc.scopes: base_profile.update_scopes(Scopes.from_list(doc.scopes.splitlines())) if doc.options: base_profile.options.update(OptionsValues.loads(doc.options)) base_profile.env_values.update(EnvValues.loads(doc.env))
def loads(text): def get_package_name_value(item): """Parse items like package:name=value or name=value""" package_name = None if ":" in item: tmp = item.split(":", 1) package_name, item = tmp name, value = item.split("=", 1) name = name.strip() value = _clean_value(value) return package_name, name, value try: obj = Profile() doc = ConfigParser(text, allowed_fields=["settings", "env", "scopes"]) for setting in doc.settings.splitlines(): setting = setting.strip() if setting and not setting.startswith("#"): if "=" not in setting: raise ConanException("Invalid setting line '%s'" % setting) package_name, name, value = get_package_name_value(setting) if package_name: obj._package_settings[package_name][name] = value else: obj._settings[name] = value if doc.scopes: obj.scopes = Scopes.from_list(doc.scopes.splitlines()) for env in doc.env.splitlines(): env = env.strip() if env and not env.startswith("#"): if "=" not in env: raise ConanException("Invalid env line '%s'" % env) package_name, name, value = get_package_name_value(env) if package_name: obj._package_env[package_name][name] = value else: obj._env[name] = value obj._order() return obj except ConanException: raise except Exception as exc: raise ConanException("Error parsing the profile text file: %s" % str(exc))
def info(self, *args): """ Prints information about the requirements. Requirements can be defined in the command line or in a conanfile. EX: conan info opencv/2.4.10@lasote/testing """ parser = argparse.ArgumentParser(description=self.info.__doc__, prog="conan info", formatter_class=RawTextHelpFormatter) parser.add_argument("reference", nargs='?', default="", help='reference name or path to conanfile file, ' 'e.g., MyPackage/1.2@user/channel or ./my_project/') parser.add_argument("--file", "-f", help="specify conanfile filename") parser.add_argument("-r", "--remote", help='look for in the remote storage') parser.add_argument("--options", "-o", help='load options to build the package, e.g., -o with_qt=true', nargs=1, action=Extender) parser.add_argument("--settings", "-s", help='load settings to build the package, -s compiler:gcc', nargs=1, action=Extender) parser.add_argument("--only", "-n", help='show fields only') parser.add_argument("--update", "-u", action='store_true', default=False, help="check updates exist from upstream remotes") parser.add_argument("--build_order", "-bo", help='given a modified reference, return ordered list to build (CI)', nargs=1, action=Extender) parser.add_argument("--scope", "-sc", nargs=1, action=Extender, help='Define scopes for packages') args = parser.parse_args(*args) options = self._get_tuples_list_from_extender_arg(args.options) settings = self._get_tuples_list_from_extender_arg(args.settings) current_path = os.getcwd() try: reference = ConanFileReference.loads(args.reference) except: reference = os.path.normpath(os.path.join(current_path, args.reference)) scopes = Scopes.from_list(args.scope) if args.scope else None self._manager.info(reference=reference, current_path=current_path, remote=args.remote, options=options, settings=settings, info=args.only or True, check_updates=args.update, filename=args.file, build_order=args.build_order, scopes=scopes)
def loads(text): """ Parse and return a Profile object from a text config like representation """ def get_package_name_value(item): '''Parse items like package:name=value or name=value''' package_name = None if ":" in item: tmp = item.split(":", 1) package_name, item = tmp name, value = item.split("=", 1) name = name.strip() value = unquote(value) return package_name, name, value try: obj = Profile() doc = ConfigParser(text, allowed_fields=["settings", "env", "scopes", "options"]) for setting in doc.settings.splitlines(): setting = setting.strip() if setting and not setting.startswith("#"): if "=" not in setting: raise ConanException("Invalid setting line '%s'" % setting) package_name, name, value = get_package_name_value(setting) if package_name: obj.package_settings[package_name][name] = value else: obj.settings[name] = value if doc.scopes: obj.scopes = Scopes.from_list(doc.scopes.splitlines()) if doc.options: obj.options = OptionsValues.loads(doc.options) obj.env_values = EnvValues.loads(doc.env) return obj except ConanException: raise except Exception as exc: raise ConanException("Error parsing the profile text file: %s" % str(exc))
def _create_profile(self, name, settings, scopes=None, package_settings=None, env=None, package_env=None): package_env = package_env or {} profile = Profile() profile._settings = settings or {} if scopes: profile.scopes = Scopes.from_list(["%s=%s" % (key, value) for key, value in scopes.items()]) if package_settings: profile._package_settings = package_settings for package_name, envs in package_env.items(): for var_name, value in envs: profile._package_env[package_name][var_name] = value for var_name, value in env or {}: profile._env[var_name] = value save(self.client.client_cache.profile_path(name), profile.dumps())
def create_profile(folder, name, settings=None, scopes=None, package_settings=None, env=None, package_env=None): package_env = package_env or {} profile = Profile() profile._settings = settings or {} if scopes: profile.scopes = Scopes.from_list(["%s=%s" % (key, value) for key, value in scopes.items()]) if package_settings: profile._package_settings = package_settings for package_name, envs in package_env.items(): for var_name, value in envs: profile._package_env[package_name][var_name] = value for var_name, value in env or {}: profile._env[var_name] = value save(os.path.join(folder, name), profile.dumps())
def from_list_test(self): scope = Scopes.from_list(["theroot:thescope=http://conan.io"]) self.assertEquals(scope["theroot"]["thescope"], "http://conan.io") self.assertEquals(scope.package_scope("theroot")["thescope"], "http://conan.io") scope = Scopes.from_list(["thescope=http://conan.io"]) self.assertEquals(scope["0CONAN_ROOT*"]["thescope"], "http://conan.io") scope = Scopes.from_list(["theroot:thescope=TRUE"]) self.assertTrue(scope["theroot"]["thescope"]) scope = Scopes.from_list(["theroot:thescope=true"]) self.assertTrue(scope["theroot"]["thescope"]) scope = Scopes.from_list(["theroot:thescope=FALSE"]) self.assertFalse(scope["theroot"]["thescope"]) scope = Scopes.from_list(["theroot:thescope=false"]) self.assertFalse(scope["theroot"]["thescope"])
def from_list_test(self): scope = Scopes.from_list(["theroot:thescope=http://conan.io"]) self.assertEquals(scope["theroot"]["thescope"], "http://conan.io") self.assertEquals( scope.package_scope("theroot")["thescope"], "http://conan.io") scope = Scopes.from_list(["thescope=http://conan.io"]) self.assertEquals(scope["0CONAN_ROOT*"]["thescope"], "http://conan.io") scope = Scopes.from_list(["theroot:thescope=TRUE"]) self.assertTrue(scope["theroot"]["thescope"]) scope = Scopes.from_list(["theroot:thescope=true"]) self.assertTrue(scope["theroot"]["thescope"]) scope = Scopes.from_list(["theroot:thescope=FALSE"]) self.assertFalse(scope["theroot"]["thescope"]) scope = Scopes.from_list(["theroot:thescope=false"]) self.assertFalse(scope["theroot"]["thescope"])
def test_package(self, *args): """ build and run your package test. Must have conanfile.py with "test" method and "test_package" subfolder with package consumer test project """ parser = argparse.ArgumentParser(description=self.test_package.__doc__, prog="conan test", formatter_class=RawTextHelpFormatter) parser.add_argument("path", nargs='?', default="", help='path to conanfile file, ' 'e.g. /my_project/') parser.add_argument("-f", "--folder", help='alternative test folder name') parser.add_argument("--scope", "-sc", nargs=1, action=Extender, help='Define scopes for packages') self._parse_args(parser) args = parser.parse_args(*args) root_folder = os.path.normpath(os.path.join(os.getcwd(), args.path)) if args.folder: test_folder_name = args.folder test_folder = os.path.join(root_folder, test_folder_name) test_conanfile = os.path.join(test_folder, "conanfile.py") if not os.path.exists(test_conanfile): raise ConanException("test folder '%s' not available, " "or it doesn't have a conanfile.py" % args.folder) else: for name in ["test_package", "test"]: test_folder_name = name test_folder = os.path.join(root_folder, test_folder_name) test_conanfile = os.path.join(test_folder, "conanfile.py") if os.path.exists(test_conanfile): break else: raise ConanException("test folder 'test_package' not available, " "or it doesn't have a conanfile.py") lib_to_test = self._detect_tested_library_name() # Get False or a list of patterns to check if args.build is None and lib_to_test: # Not specified, force build the tested library args.build = [lib_to_test] else: args.build = self._get_build_sources_parameter(args.build) options = args.options or [] settings = args.settings or [] sha = hashlib.sha1("".join(options + settings).encode()).hexdigest() build_folder = os.path.join(test_folder, "build", sha) rmdir(build_folder) # shutil.copytree(test_folder, build_folder) options = self._get_tuples_list_from_extender_arg(args.options) settings = self._get_tuples_list_from_extender_arg(args.settings) scopes = Scopes.from_list(args.scope) if args.scope else None self._manager.install(reference=test_folder, current_path=build_folder, remote=args.remote, options=options, settings=settings, build_mode=args.build, scopes=scopes) self._test_check(test_folder, test_folder_name) self._manager.build(test_folder, build_folder, test=True)
def install(self, *args): """ install in the local store the given requirements. Requirements can be defined in the command line or in a conanfile. EX: conan install opencv/2.4.10@lasote/testing """ parser = argparse.ArgumentParser(description=self.install.__doc__, prog="conan install", formatter_class=RawTextHelpFormatter) parser.add_argument("reference", nargs='?', default="", help='package recipe reference' 'e.g., MyPackage/1.2@user/channel or ./my_project/') parser.add_argument("--package", "-p", nargs=1, action=Extender, help='Force install specified package ID (ignore settings/options)') parser.add_argument("--all", action='store_true', default=False, help='Install all packages from the specified package recipe') parser.add_argument("--file", "-f", help="specify conanfile filename") parser.add_argument("--update", "-u", action='store_true', default=False, help="update with new upstream packages") parser.add_argument("--scope", "-sc", nargs=1, action=Extender, help='Define scopes for packages') parser.add_argument("--profile", "-pr", default=None, help='Define a profile') 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') # Manifests arguments default_manifest_folder = '.conan_manifests' parser.add_argument("--manifests", "-m", const=default_manifest_folder, nargs="?", help='Install dependencies manifests in folder for later verify.' ' Default folder is .conan_manifests, but can be changed') parser.add_argument("--manifests-interactive", "-mi", const=default_manifest_folder, nargs="?", help='Install dependencies manifests in folder for later verify, ' 'asking user for confirmation. ' 'Default folder is .conan_manifests, but can be changed') parser.add_argument("--verify", "-v", const=default_manifest_folder, nargs="?", help='Verify dependencies manifests against stored ones') self._parse_args(parser) args = parser.parse_args(*args) self._user_io.out.werror_active = args.werror current_path = os.getcwd() try: reference = ConanFileReference.loads(args.reference) except: reference = os.path.normpath(os.path.join(current_path, args.reference)) if args.all or args.package: # Install packages without settings (fixed ids or all) if args.all: args.package = [] if not args.reference or not isinstance(reference, ConanFileReference): raise ConanException("Invalid package recipe reference. " "e.g., MyPackage/1.2@user/channel") self._manager.download(reference, args.package, remote=args.remote) else: # Classic install, package chosen with settings and options # Get False or a list of patterns to check args.build = self._get_build_sources_parameter(args.build) options = self._get_tuples_list_from_extender_arg(args.options) settings = self._get_tuples_list_from_extender_arg(args.settings) scopes = Scopes.from_list(args.scope) if args.scope else None if args.manifests and args.manifests_interactive: raise ConanException("Do not specify both manifests and " "manifests-interactive arguments") if args.verify and (args.manifests or args.manifests_interactive): raise ConanException("Do not specify both 'verify' and " "'manifests' or 'manifests-interactive' arguments") manifest_folder = args.verify or args.manifests or args.manifests_interactive if manifest_folder: if not os.path.isabs(manifest_folder): if isinstance(reference, ConanFileReference): manifest_folder = os.path.join(current_path, manifest_folder) else: manifest_folder = os.path.join(reference, manifest_folder) manifest_verify = args.verify is not None manifest_interactive = args.manifests_interactive is not None else: manifest_verify = manifest_interactive = False self._manager.install(reference=reference, current_path=current_path, remote=args.remote, options=options, settings=settings, build_mode=args.build, filename=args.file, update=args.update, manifest_folder=manifest_folder, manifest_verify=manifest_verify, manifest_interactive=manifest_interactive, scopes=scopes, generators=args.generator, profile_name=args.profile)
def test_package(self, *args): """ build and run your package test. Must have conanfile.py with "test" method and "test_package" subfolder with package consumer test project """ parser = argparse.ArgumentParser(description=self.test_package.__doc__, prog="conan test_package", formatter_class=RawTextHelpFormatter) parser.add_argument("path", nargs='?', default="", help='path to conanfile file, ' 'e.g. /my_project/') parser.add_argument("-ne", "--not-export", default=False, action='store_true', help='Do not export the conanfile before test execution') parser.add_argument("-f", "--folder", help='alternative test folder name') parser.add_argument("--scope", "-sc", nargs=1, action=Extender, help='Define scopes for packages') parser.add_argument('--keep-source', '-k', default=False, action='store_true', help='Optional. Do not remove the source folder in local store. ' 'Use for testing purposes only') parser.add_argument("--update", "-u", action='store_true', default=False, help="update with new upstream packages") parser.add_argument("--profile", "-pr", default=None, help='Define a profile') self._parse_args(parser) args = parser.parse_args(*args) root_folder = os.path.normpath(os.path.join(os.getcwd(), args.path)) if args.folder: test_folder_name = args.folder test_folder = os.path.join(root_folder, test_folder_name) test_conanfile = os.path.join(test_folder, "conanfile.py") if not os.path.exists(test_conanfile): raise ConanException("test folder '%s' not available, " "or it doesn't have a conanfile.py" % args.folder) else: for name in ["test_package", "test"]: test_folder_name = name test_folder = os.path.join(root_folder, test_folder_name) test_conanfile = os.path.join(test_folder, "conanfile.py") if os.path.exists(test_conanfile): break else: raise ConanException("test folder 'test_package' not available, " "or it doesn't have a conanfile.py") options = args.options or [] settings = args.settings or [] sha = hashlib.sha1("".join(options + settings).encode()).hexdigest() build_folder = os.path.join(test_folder, "build", sha) rmdir(build_folder) # shutil.copytree(test_folder, build_folder) options = self._get_tuples_list_from_extender_arg(args.options) settings = self._get_tuples_list_from_extender_arg(args.settings) scopes = Scopes.from_list(args.scope) if args.scope else None manager = self._manager loader = manager._loader(None, settings, options, scopes) conanfile = loader.load_conan(test_conanfile, self._user_io.out, consumer=True) try: # convert to list from ItemViews required for python3 reqs = list(conanfile.requires.items()) first_dep = reqs[0][1].conan_reference except Exception: raise ConanException("Unable to retrieve first requirement of test conanfile.py") # Forcing an export! if not args.not_export: self._user_io.out.info("Exporting package recipe") user_channel = "%s/%s" % (first_dep.user, first_dep.channel) self._manager.export(user_channel, root_folder, keep_source=args.keep_source) lib_to_test = first_dep.name + "*" # Get False or a list of patterns to check if args.build is None and lib_to_test: # Not specified, force build the tested library args.build = [lib_to_test] else: args.build = self._get_build_sources_parameter(args.build) self._manager.install(reference=test_folder, current_path=build_folder, remote=args.remote, options=options, settings=settings, build_mode=args.build, scopes=scopes, update=args.update, profile_name=args.profile) self._test_check(test_folder, test_folder_name) self._manager.build(test_folder, build_folder, test=True, profile_name=args.profile)
def install(self, *args): """ install in the local store the given requirements. Requirements can be defined in the command line or in a conanfile. EX: conan install opencv/2.4.10@lasote/testing """ parser = argparse.ArgumentParser(description=self.install.__doc__, prog="conan install", formatter_class=RawTextHelpFormatter) parser.add_argument( "reference", nargs='?', default="", help='package recipe reference' 'e.g., MyPackage/1.2@user/channel or ./my_project/') parser.add_argument( "--package", "-p", nargs=1, action=Extender, help='Force install specified package ID (ignore settings/options)' ) parser.add_argument( "--all", action='store_true', default=False, help='Install all packages from the specified package recipe') parser.add_argument( "--integrity", "-i", action='store_true', default=False, help='Check that the stored recipe or package manifests are correct' ) parser.add_argument("--file", "-f", help="specify conanfile filename") parser.add_argument("--update", "-u", action='store_true', default=False, help="update with new upstream packages") parser.add_argument("--scope", "-sc", nargs=1, action=Extender, help='Define scopes for packages') parser.add_argument("--generator", "-g", nargs=1, action=Extender, help='Generators to use') self._parse_args(parser) args = parser.parse_args(*args) current_path = os.getcwd() try: reference = ConanFileReference.loads(args.reference) except: reference = os.path.normpath( os.path.join(current_path, args.reference)) if args.all or args.package: # Install packages without settings (fixed ids or all) if args.all: args.package = [] if not args.reference or not isinstance(reference, ConanFileReference): raise ConanException("Invalid package recipe reference. " "e.g., MyPackage/1.2@user/channel") self._manager.download(reference, args.package, remote=args.remote) else: # Classic install, package chosen with settings and options # Get False or a list of patterns to check args.build = self._get_build_sources_parameter(args.build) options = self._get_tuples_list_from_extender_arg(args.options) settings = self._get_tuples_list_from_extender_arg(args.settings) scopes = Scopes.from_list(args.scope) if args.scope else None self._manager.install(reference=reference, current_path=current_path, remote=args.remote, options=options, settings=settings, build_mode=args.build, filename=args.file, update=args.update, integrity=args.integrity, scopes=scopes, generators=args.generator)
def loads(text): """ Parse and return a Profile object from a text config like representation """ def get_package_name_value(item): """Parse items like package:name=value or name=value""" package_name = None if ":" in item: tmp = item.split(":", 1) package_name, item = tmp name, value = item.split("=", 1) name = name.strip() value = unquote(value) return package_name, name, value try: obj = Profile() doc = ConfigParser(text, allowed_fields=[ "build_requires", "settings", "env", "scopes", "options" ]) for setting in doc.settings.splitlines(): setting = setting.strip() if setting and not setting.startswith("#"): if "=" not in setting: raise ConanException("Invalid setting line '%s'" % setting) package_name, name, value = get_package_name_value(setting) if package_name: obj.package_settings[package_name][name] = value else: obj.settings[name] = value if doc.build_requires: # FIXME CHECKS OF DUPLICATED? for req in doc.build_requires.splitlines(): tokens = req.split(":", 1) if len(tokens) == 1: pattern, req_list = "*", req else: pattern, req_list = tokens req_list = [ ConanFileReference.loads(r.strip()) for r in req_list.split(",") ] obj.build_requires.setdefault(pattern, []).extend(req_list) if doc.scopes: obj.scopes = Scopes.from_list(doc.scopes.splitlines()) if doc.options: obj.options = OptionsValues.loads(doc.options) obj.env_values = EnvValues.loads(doc.env) return obj except ConanException: raise except Exception as exc: raise ConanException("Error parsing the profile text file: %s" % str(exc))
def test_package(self, *args): """ build and run your package test. Must have conanfile.py with "test" method and "test_package" subfolder with package consumer test project """ parser = argparse.ArgumentParser(description=self.test_package.__doc__, prog="conan test", formatter_class=RawTextHelpFormatter) parser.add_argument("path", nargs='?', default="", help='path to conanfile file, ' 'e.g. /my_project/') parser.add_argument("-f", "--folder", help='alternative test folder name') parser.add_argument("--scope", "-sc", nargs=1, action=Extender, help='Define scopes for packages') self._parse_args(parser) args = parser.parse_args(*args) root_folder = os.path.normpath(os.path.join(os.getcwd(), args.path)) if args.folder: test_folder_name = args.folder test_folder = os.path.join(root_folder, test_folder_name) test_conanfile = os.path.join(test_folder, "conanfile.py") if not os.path.exists(test_conanfile): raise ConanException("test folder '%s' not available, " "or it doesn't have a conanfile.py" % args.folder) else: for name in ["test_package", "test"]: test_folder_name = name test_folder = os.path.join(root_folder, test_folder_name) test_conanfile = os.path.join(test_folder, "conanfile.py") if os.path.exists(test_conanfile): break else: raise ConanException( "test folder 'test_package' not available, " "or it doesn't have a conanfile.py") lib_to_test = self._detect_tested_library_name() # Get False or a list of patterns to check if args.build is None and lib_to_test: # Not specified, force build the tested library args.build = [lib_to_test] else: args.build = self._get_build_sources_parameter(args.build) options = args.options or [] settings = args.settings or [] sha = hashlib.sha1("".join(options + settings).encode()).hexdigest() build_folder = os.path.join(test_folder, "build", sha) rmdir(build_folder) # shutil.copytree(test_folder, build_folder) options = self._get_tuples_list_from_extender_arg(args.options) settings = self._get_tuples_list_from_extender_arg(args.settings) scopes = Scopes.from_list(args.scope) if args.scope else None self._manager.install(reference=test_folder, current_path=build_folder, remote=args.remote, options=options, settings=settings, build_mode=args.build, scopes=scopes) self._test_check(test_folder, test_folder_name) self._manager.build(test_folder, build_folder, test=True)