config: repo-level make.defaults/package.use
authorZac Medico <zmedico@gentoo.org>
Tue, 21 Jun 2011 01:08:59 +0000 (18:08 -0700)
committerZac Medico <zmedico@gentoo.org>
Tue, 21 Jun 2011 01:08:59 +0000 (18:08 -0700)
This completes the implementation of bug #370693.

cnf/make.globals
man/ebuild.5
man/make.conf.5
man/portage.5
pym/portage/package/ebuild/_config/UseManager.py
pym/portage/package/ebuild/config.py

index 2258fd2f26625d6568916cc2bf7ad96eebe4147b..2892d50896e8ccbd089b15c77a63d9dcecaa19bc 100644 (file)
@@ -106,7 +106,7 @@ CONFIG_PROTECT="/etc"
 CONFIG_PROTECT_MASK="/etc/env.d"
 
 # Disable auto-use
-USE_ORDER="env:pkg:conf:defaults:pkginternal:env.d"
+USE_ORDER="env:pkg:conf:defaults:pkginternal:repo:env.d"
 
 # Default ownership of installed files.
 PORTAGE_INST_UID="0"
index bc5680fc9e09a8b914a0f3c9f5c1d1bb7a9493de..20117e08dcb1ae25f05d9d589cda3852275cfadf 100644 (file)
@@ -246,8 +246,9 @@ is possible to prefix flags with + or - in order to create default settings
 that respectively enable or disable the corresponding \fBUSE\fR flags. For
 details about \fBUSE\fR flag stacking order, refer to the \fBUSE_ORDER\fR
 variable in \fBmake.conf\fR(5). Given the default \fBUSE_ORDER\fR setting,
-negative IUSE default settings are ineffective since profile and user
-configuration settings override them.
+negative IUSE default settings are effective only for negation of
+repo\-level USE settings, since profile and user configuration settings
+override them.
 .TP
 \fBDEPEND\fR
 This should contain a list of all packages that are required for the
index 86ac46231769919cada83ed142b74d66ae4a9782..fcb0954eadcaf0aad47e2a55bf35222c5753d464 100644 (file)
@@ -838,7 +838,7 @@ in USE="foo_bar foo_bla".
 Names of \fBUSE_EXPAND\fR variables that should not be shown in the verbose merge
 list output of the \fBemerge\fR(1) command.
 .TP
-\fBUSE_ORDER\fR = \fI"env:pkg:conf:defaults:pkginternal:env.d"\fR
+\fBUSE_ORDER\fR = \fI"env:pkg:conf:defaults:pkginternal:repo:env.d"\fR
 Determines the precedence of layers in the incremental stacking of the USE
 variable. Precedence decreases from left to right such that env overrides
 pkg, pkg overrides conf, and so forth.
@@ -866,6 +866,9 @@ USE from make.defaults and package.use in the profile (see \fBportage\fR(5))
 .B pkginternal
 USE from \fBebuild\fR(5) IUSE defaults
 .TP
+.B repo
+USE from make.defaults and package.use in the repo (see \fBportage\fR(5))
+.TP
 .B env.d
 USE from the environment variables defined by files in \fI/etc/env.d/\fR
 .RE
index 61f46230979fccbe4b1bddc6361f1a3080b7ffa2..b2b0eb12cc255709efee9d0751025d3feaf8f890 100644 (file)
@@ -81,8 +81,10 @@ categories
 info_pkgs
 info_vars
 license_groups
+make.defaults
 package.mask
 package.unmask
+package.use
 package.use.force
 package.use.mask
 profiles.desc
index 3905f4fa16205229343e06cdb8531ada7d9afb94..de18500a92f4ff0b042f4c3284ba9c4647a61a4e 100644 (file)
@@ -53,6 +53,7 @@ class UseManager(object):
                self._repo_useforce_dict = self._parse_repository_files_to_dict_of_tuples("use.force", repositories)
                self._repo_pusemask_dict = self._parse_repository_files_to_dict_of_dicts("package.use.mask", repositories)
                self._repo_puseforce_dict = self._parse_repository_files_to_dict_of_dicts("package.use.force", repositories)
+               self._repo_puse_dict = self._parse_repository_files_to_dict_of_dicts("package.use", repositories)
 
                self._usemask_list = self._parse_profile_files_to_tuple_of_tuples("use.mask", profiles)
                self._useforce_list = self._parse_profile_files_to_tuple_of_tuples("use.force", profiles)
index b75a1771606559315ddd70fc3d5b7938dd6e9145..6b7af51e93e39e57901703f7e30494e4cd632e6f 100644 (file)
@@ -206,6 +206,7 @@ class config(object):
                        self.repositories = clone.repositories
                        self._iuse_implicit_match = clone._iuse_implicit_match
                        self._non_user_variables = clone._non_user_variables
+                       self._repo_make_defaults = clone._repo_make_defaults
                        self.usemask = clone.usemask
                        self.useforce = clone.useforce
                        self.puse = clone.puse
@@ -229,6 +230,7 @@ class config(object):
                        self.configdict = copy.deepcopy(clone.configdict)
                        self.configlist = [
                                self.configdict['env.d'],
+                               self.configdict['repo'],
                                self.configdict['pkginternal'],
                                self.configdict['globals'],
                                self.configdict['defaults'],
@@ -318,6 +320,9 @@ class config(object):
                        self.configlist.append({})
                        self.configdict["env.d"] = self.configlist[-1]
 
+                       self.configlist.append({})
+                       self.configdict["repo"] = self.configlist[-1]
+
                        self.configlist.append({})
                        self.configdict["pkginternal"] = self.configlist[-1]
 
@@ -509,6 +514,14 @@ class config(object):
 
                        locations_manager.set_port_dirs(self["PORTDIR"], self["PORTDIR_OVERLAY"])
 
+                       self._repo_make_defaults = {}
+                       for repo in self.repositories.repos_with_profiles():
+                               d = getconfig(os.path.join(repo.location, "profiles", "make.defaults"),
+                                       expand=self.configdict["globals"].copy()) or {}
+                               for blacklisted in self._env_blacklist:
+                                       d.pop(blacklisted, None)
+                               self._repo_make_defaults[repo.name] = d
+
                        #Read package.keywords and package.accept_keywords.
                        self._keywords_manager = KeywordsManager(self.profiles, abs_user_config, \
                                local_config, global_accept_keywords=self.configdict["defaults"].get("ACCEPT_KEYWORDS", ""))
@@ -629,7 +642,7 @@ class config(object):
                        # reasonable defaults; this is important as without USE_ORDER,
                        # USE will always be "" (nothing set)!
                        if "USE_ORDER" not in self:
-                               self.backupenv["USE_ORDER"] = "env:pkg:conf:defaults:pkginternal:env.d"
+                               self.backupenv["USE_ORDER"] = "env:pkg:conf:defaults:pkginternal:repo:env.d"
 
                        self["PORTAGE_GID"] = str(portage_gid)
                        self.backup_changes("PORTAGE_GID")
@@ -890,6 +903,7 @@ class config(object):
                        del self._penv[:]
                        self.configdict["pkg"].clear()
                        self.configdict["pkginternal"].clear()
+                       self.configdict["repo"].clear()
                        self.configdict["defaults"]["USE"] = \
                                " ".join(self.make_defaults_use)
                        self.usemask = self._use_manager.getUseMask()
@@ -1065,6 +1079,7 @@ class config(object):
 
                pkg_configdict["CATEGORY"] = cat
                pkg_configdict["PF"] = pf
+               repository = None
                if mydb:
                        if not hasattr(mydb, "aux_get"):
                                for k in aux_keys:
@@ -1109,6 +1124,34 @@ class config(object):
                        self.configdict["pkginternal"]["USE"] = pkginternaluse
                        has_changed = True
 
+               repo_env = []
+               repo_env_empty = True
+               if repository and repository != Package.UNKNOWN_REPO:
+                       for repo in [repo.name for
+                               repo in self.repositories[repository].masters] + [repository]:
+                               d = self._repo_make_defaults.get(repo)
+                               if d is None:
+                                       d = {}
+                               else:
+                                       # make a copy, since we might modify it with
+                                       # package.use settings
+                                       d = d.copy()
+                               repo_env.append(d)
+                               cpdict = self._use_manager._repo_puse_dict.get(repo, {}).get(cp)
+                               if cpdict:
+                                       repo_puse = ordered_by_atom_specificity(cpdict, pkg)
+                                       if repo_puse:
+                                               for x in repo_puse:
+                                                       d["USE"] = d.get("USE", "") + " " + " ".join(x)
+                               if d:
+                                       repo_env_empty = False
+
+               if not repo_env_empty or self.configdict["repo"]:
+                       self.configdict["repo"].clear()
+                       self.configdict["repo"].update(stack_dicts(repo_env,
+                               incrementals=self.incrementals))
+                       has_changed = True
+
                defaults = []
                for i, pkgprofileuse_dict in enumerate(self._use_manager._pkgprofileuse):
                        if self.make_defaults_use[i]: