# Copyright 1999-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# System-wide defaults for the Portage system

#            *****************************
#            **  DO NOT EDIT THIS FILE  **
# ***************************************************
# **** CHANGES TO make.conf *OVERRIDE* THIS FILE ****
# ***************************************************
# ** Incremental Variables Accumulate Across Files **
# **  USE, CONFIG_*, and FEATURES are incremental  **
# ***************************************************

# When compiler flags are unset, many packages will substitute their own
# implicit flags. For uniformity, use an empty string as the default.
CFLAGS=""
CXXFLAGS=""
LDFLAGS=""
FFLAGS=""
FCFLAGS=""

# Default distfiles mirrors. This rotation has multiple hosts and is reliable.
# Approved by the mirror-admin team.
GENTOO_MIRRORS="http://distfiles.gentoo.org"

ACCEPT_LICENSE="* -@EULA"
ACCEPT_PROPERTIES="*"
ACCEPT_RESTRICT="*"

# Miscellaneous paths
DISTDIR="${EPREFIX}/usr/portage/distfiles"
PKGDIR="${EPREFIX}/usr/portage/packages"
RPMDIR="${EPREFIX}/usr/portage/rpm"

# Temporary build directory
PORTAGE_TMPDIR="${EPREFIX}/var/tmp"

# Fetching command (3 tries, passive ftp for firewall compatibility)
FETCHCOMMAND="wget -t 3 -T 60 --passive-ftp -O \"\${DISTDIR}/\${FILE}\" \"\${URI}\""
RESUMECOMMAND="wget -c -t 3 -T 60 --passive-ftp -O \"\${DISTDIR}/\${FILE}\" \"\${URI}\""

FETCHCOMMAND_RSYNC="rsync -avP \"\${URI}\" \"\${DISTDIR}/\${FILE}\""
RESUMECOMMAND_RSYNC="rsync -avP \"\${URI}\" \"\${DISTDIR}/\${FILE}\""

# NOTE: rsync will evaluate quotes embedded inside PORTAGE_SSH_OPTS
FETCHCOMMAND_SSH="bash -c \"x=\\\${2#ssh://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port=22 ; exec rsync --rsh=\\\"ssh -p\\\${port} \\\${3}\\\" -avP \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" rsync \"\${DISTDIR}/\${FILE}\" \"\${URI}\" \"\${PORTAGE_SSH_OPTS}\""
RESUMECOMMAND_SSH=${FETCHCOMMAND_SSH}

# NOTE: bash eval is used to evaluate quotes embedded inside PORTAGE_SSH_OPTS
FETCHCOMMAND_SFTP="bash -c \"x=\\\${2#sftp://} ; host=\\\${x%%/*} ; port=\\\${host##*:} ; host=\\\${host%:*} ; [[ \\\${host} = \\\${port} ]] && port=22 ; eval \\\"declare -a ssh_opts=(\\\${3})\\\" ; exec sftp -P \\\${port} \\\"\\\${ssh_opts[@]}\\\" \\\"\\\${host}:/\\\${x#*/}\\\" \\\"\\\$1\\\"\" sftp \"\${DISTDIR}/\${FILE}\" \"\${URI}\" \"\${PORTAGE_SSH_OPTS}\""

# Default user options
FEATURES="assume-digests binpkg-logs
          config-protect-if-modified distlocks ebuild-locks
          fixlafiles merge-sync news parallel-fetch preserve-libs protect-owned
          sandbox sfperms strict unknown-features-warn unmerge-logs
          unmerge-orphans userfetch userpriv usersandbox usersync"

# Ignore file collisions in /lib/modules since files inside this directory
# are never unmerged, and therefore collisions must be ignored in order for
# FEATURES=protect-owned to operate smoothly in all cases.
# Ignore file collisions for unowned *.pyo and *.pyc files, this helps during
# transition from compiling python modules in live file system to compiling
# them in src_install() function.
COLLISION_IGNORE="/lib/modules/* *.py[co] *\$py.class"
UNINSTALL_IGNORE="/lib/modules/*"

# Prefix: we want preserve-libs, not sure how mainline goes about this
FEATURES="${FEATURES} preserve-libs"

# Force EPREFIX, ED and EROOT to exist in all EAPIs, not just 3 and up
FEATURES="${FEATURES} force-prefix"

# Avoid problems due to case-insensitivity, bug #524236
FEATURES="${FEATURES} case-insensitive-fs"

# By default wait 5 secs before cleaning a package
CLEAN_DELAY="5"

# By default wait 10 secs on an important warning
EMERGE_WARNING_DELAY="10"

# Automatically clean installed packages after they are updated.
# This option will be removed and forced to yes.
AUTOCLEAN="yes"

PORTAGE_BZIP2_COMMAND="bzip2"

# Don't compress files with these suffixes.
PORTAGE_COMPRESS_EXCLUDE_SUFFIXES="css gif htm[l]? jp[e]?g js pdf png"

# Number of mirrors to try when a downloaded file has an incorrect checksum.
PORTAGE_FETCH_CHECKSUM_TRY_MIRRORS="5"

# Minimum size of existing file for RESUMECOMMAND to be called.
PORTAGE_FETCH_RESUME_MIN_SIZE="350K"

# Number of times 'emerge --sync' will run before giving up.
PORTAGE_RSYNC_RETRIES="-1"

# Number of seconds rsync will wait before timing out.
#RSYNC_TIMEOUT="180"

PORTAGE_RSYNC_OPTS="--recursive --links --safe-links --perms --times --omit-dir-times --compress --force --whole-file --delete --stats --human-readable --timeout=180 --exclude=/distfiles --exclude=/local --exclude=/packages"

# The number of days after the last `emerge --sync` that a warning
# message should be produced.
PORTAGE_SYNC_STALE="30"

# Executed before emerge exit if FEATURES=clean-logs is enabled.
PORT_LOGDIR_CLEAN="find \"\${PORT_LOGDIR}\" -type f ! -name \"summary.log*\" -mtime +7 -delete"

# Minimal CONFIG_PROTECT
# NOTE: in Prefix, these are NOT prefixed on purpose, because the
# profiles define them too
CONFIG_PROTECT="/etc"
CONFIG_PROTECT_MASK="/etc/env.d"

# Disable auto-use
USE_ORDER="env:pkg:conf:defaults:pkginternal:repo:env.d"

# Default portage user/group
#PORTAGE_USER=
#PORTAGE_GROUP=
#PORTAGE_ROOT_USER=

# Default ownership of installed files.
#PORTAGE_INST_UID=
#PORTAGE_INST_GID=

# Default PATH for ebuild env
DEFAULT_PATH="${EPREFIX}/usr/sbin:${EPREFIX}/usr/bin:${EPREFIX}/sbin:${EPREFIX}/bin"
# Any extra PATHs to add to the ebuild environment's PATH (if any)
EXTRA_PATH=""

# The offset prefix this Portage was configured with (not used by
# Portage itself)
CONFIGURE_EPREFIX="${EPREFIX}"

# Mode bits for ${WORKDIR} (see ebuild.5).
PORTAGE_WORKDIR_MODE="0700"

# Some defaults for elog
PORTAGE_ELOG_CLASSES="log warn error"
PORTAGE_ELOG_SYSTEM="save_summary:log,warn,error,qa echo"

PORTAGE_ELOG_MAILURI="localhost"
PORTAGE_ELOG_MAILSUBJECT="[portage] ebuild log for \${PACKAGE} on \${HOST}"
PORTAGE_ELOG_MAILFROM="nobody@localhost"

# Signing command used by repoman
PORTAGE_GPG_SIGNING_COMMAND="gpg --sign --digest-algo SHA256 --clearsign --yes --default-key \"\${PORTAGE_GPG_KEY}\" --homedir \"\${PORTAGE_GPG_DIR}\" \"\${FILE}\""

# Security labels are special, see bug #461868.
# system.nfs4_acl attributes are irrelevant, see bug #475496.
PORTAGE_XATTR_EXCLUDE="security.* system.nfs4_acl"

# Writeable paths for Mac OS X seatbelt sandbox
#
# If path ends in a slash (/), access will recursively be allowed to directory
# contents (using a regex), not the directory itself. Without a slash, access
# to the directory or file itself will be allowed (using a literal), so it can
# be created, removed and changed. If both is needed, the directory needs to be
# given twice, once with and once without the slash. Obviously this only makes
# sense for directories, not files.
#
# An empty value for either variable will disable all restrictions on the
# corresponding operation.
MACOSSANDBOX_PATHS="/dev/fd/ /private/tmp/ /private/var/tmp/ @@PORTAGE_BUILDDIR@@/ @@PORTAGE_ACTUAL_DISTDIR@@/"
MACOSSANDBOX_PATHS_CONTENT_ONLY="/dev/null /dev/dtracehelper /dev/tty /private/var/run/syslog"

#            *****************************
#            **  DO NOT EDIT THIS FILE  **
# ***************************************************
# **** CHANGES TO make.conf *OVERRIDE* THIS FILE ****
# ***************************************************
# ** Incremental Variables Accumulate Across Files **
# **  USE, CONFIG_*, and FEATURES are incremental  **
# ***************************************************
