Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
Lawrence Amer authored Aug 22, 2018
1 parent c2b7689 commit b906c72
Show file tree
Hide file tree
Showing 2 changed files with 188 additions and 0 deletions.
1 change: 1 addition & 0 deletions dev-python/pyinstaller/Manifest
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DIST PyInstaller-3.2.tar.gz 2775557 BLAKE2B fe928632c58b4c0c50b7491e26f1cf2dc58da197f0f709cef1e117b14b220f6f9e3d5996ad84cdf85cd93c3fa16be2c3458879981072d04b9c33a6ec819bac03 SHA512 568facc21e9ee06ff3f505c4e413d3a17329cfa219e62dca0a06ffe746e969b29137e8478113408f8db9c05b9ca69c6fc23bd8bf1396a9d821a911a60bb62e6b
187 changes: 187 additions & 0 deletions dev-python/pyinstaller/pyinstaller-3.2.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
# Copyright 1999-2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id$

EAPI=5

# PyInstaller assumes CPython internals and is hence currently incompatible with
# alternative interpreters (e.g., PyPy).
PYTHON_COMPAT=( python2_7 python3_{4,5,6} )

# "waf" requires a threading-enabled Python interpreter.
PYTHON_REQ_USE='threads(+)'

# Order of operations is significant here. Since we explicitly call "waf-utils"
# but *NOT* "distutils-r1" phase functions, ensure the latter remain the default
# by inheriting the latter *AFTER* the former.
inherit waf-utils distutils-r1

DESCRIPTION="Program converting Python programs into stand-alone executables"
HOMEPAGE="http://www.pyinstaller.org"

LICENSE="pyinstaller"
SLOT="0"

IUSE="clang debug doc leak-detector"
REQUIRED_USE="${PYTHON_REQUIRED_USE}"

#FIXME: Interestingly, PyInstaller itself has no hard or soft dependencies
#excluding the expected build-time dependency of "setuptools". Its unit tests,
#however, require an elaborate set of pure-Python packages, C-based Python
#extensions, and system-wide shared libraries. It's fairly extreme --
#sufficiently extreme, in fact, that we do *NOT* currently bother. For an
#exhaustive list of such dependencies, see "tests/test-requirements.txt".

RDEPEND="${PYTHON_DEPS}"
DEPEND="${RDEPEND}
leak-detector? ( dev-libs/boehm-gc )
clang? ( sys-devel/clang )
!clang? ( sys-devel/gcc )
"

# While the typical "waf" project permits "waf" to be run from outside the
# directory containing "waf", PyInstaller requires "waf" to be run from inside
# such directory in a relative manner. Ensure this.
WAF_BINARY="./waf"

# Since the "waf" script bundled with PyInstaller does *NOT* support the
# conventionel "--libdir" option, prevent such option from being passed.
NO_WAF_LIBDIR=1

if [[ ${PV} == 9999 ]]; then
inherit git-r3

EGIT_REPO_URI="https://github.com/pyinstaller/pyinstaller"
EGIT_BRANCH="develop"
SRC_URI=""
KEYWORDS=""
else
MY_PN="PyInstaller"
MY_P="${MY_PN}-${PV}"
SRC_URI="https://github.com/pyinstaller/pyinstaller/releases/download/v${PV}/${MY_P}.tar.gz"
KEYWORDS="~amd64 ~x86"
S="${WORKDIR}/${MY_P}"
fi

python_prepare_all() {
#FIXME: This is almost certainly wrong. We almost certainly want to use
#actual USE flags instead: e.g.,
#
# local arch_word_size
# if use amd64; then
# arch_word_size=64
# elif use x86; then
# arch_word_size=32
# else
# die "Architecture \"${ARCH}\" unsupported."
# fi

# Word size for the current architecture. (There simply *MUST* be a more
# Gentooish way of determining this. I couldn't find it. While we should
# arguably test "[[ "$(getconf LONG_BIT)" == 64 ]]" instead, such magic is
# arguably even kludgier. Your mileage may vary.)
local arch_word_size
case "${ARCH}" in
amd64) arch_word_size=64;;
*) arch_word_size=32;;
esac

# Install only the Linux bootloader specific to:
#
# * The architecture of the current machine.
# * The release type requested for the current installation. Specifically:
# * If the "debug" USE flag is enabled, only install the "run_d" binary.
# * Else, only install the "run" binary.
local bootloader_basename='run'
use debug && bootloader_basename+='_d'
sed -i \
-e '/.*bootloader\/\*\/*.*/s~\*/\*~Linux-'${arch_word_size}'bit/'${bootloader_basename}'~' \
setup.py || die '"sed" failed.'

# Prevent badness during compilation. Specifically (in order):
#
# * Avoid stripping bootloader binaries.
# * Prevent the bootloader from being compiled under:
# * Hard-coded ${CFLAGS}.
# * gcc option "-Werror", converting compiler warnings to errors and hence
# failing on the first (inevitable) warning.
sed -i \
-e "s~\\(\\s*\\)features\\s*=\\s*'strip'$~\\1pass~" \
-e "s~\\(\\s*\\)ctx.env.append_value('CFLAGS', '-O2')$~\\1pass~" \
-e "/'CFLAGS',\\s*'-Werror'/d" \
bootloader/wscript || die '"sed" failed.'

# Continue with the default behaviour.
distutils-r1_python_prepare_all
}

python_configure() {
# CLI options to be passed to the "waf configure" command run below.
local -a waf_configure_options; waf_configure_options=(
# Since Gentoo is *NOT* LSB-compliant, a non-LSB-compliant bootloader
# must be built. Sadly, doing so could reduce the portability of the
# resulting bootloader and hence applications frozen under that
# bootloader. Until Gentoo supplies an ebuild for building at least
# version 4.0 of the LSB tools, there's little we can do here.
--no-lsb
)
use debug && waf_configure_options+=( --debug )
use clang && waf_configure_options+=( --clang )
use leak-detector && waf_configure_options+=( --leak-detector )

# Configure the Linux bootloader.
cd bootloader
waf-utils_src_configure "${waf_configure_options[@]}"

# Continue with the default behaviour.
cd "${S}"
distutils-r1_python_configure
}

python_compile() {
# Compile the non-debug Linux bootloader. Ideally, we would simply call
# waf-utils_src_compile() to do so. Unfortunately, that function attempts to
# run the "build" WAF task, which for PyInstaller *ALWAYS* fails with the
# following fatal error:
#
# Call "python waf all" to compile all bootloaders.
#
# Since the "waf-utils" eclass does *NOT* support running of alternative
# tasks, we reimplement waf-utils_src_compile() to do so. (Since this is
# lame, we should probably file a feature request with the author of the
# "waf-utils" eclass.)
cd bootloader
local _mywafconfig
[[ "${WAF_VERBOSE}" ]] && _mywafconfig="--verbose"
local jobs="--jobs=$(makeopts_jobs)"
echo "\"${WAF_BINARY}\" build_release ${_mywafconfig} ${jobs}"
"${WAF_BINARY}" build_release ${_mywafconfig} ${jobs} ||
die "Bootloader compilation failed."

# Move the binaries for such bootloader to "PyInstaller/bootloader" *BEFORE*
# compiling the non-bootloader portion of PyInstaller, which requires such
# binaries. (Note that the "install_release" task does *NOT* install files
# to ${IMAGE}, despite the "install" in such task name.)
"${WAF_BINARY}" install_release || die "Bootloader installation failed."

# Continue with the default behaviour.
cd "${S}"
distutils-r1_python_compile
}

python_install_all() {
distutils-r1_python_install_all

# Install plaintext documentation.
dodoc README.rst doc/*.rst

# If requested, install non-plaintext documentation as well.
if use doc; then
# Install HTML documentation.
dohtml -r doc/*

# Install PDF documentation.
docinto pdf
dodoc doc/*.pdf
fi
}

0 comments on commit b906c72

Please sign in to comment.