diff options
Diffstat (limited to 'dev-python/pyinstaller/pyinstaller-3.2.ebuild')
-rw-r--r-- | dev-python/pyinstaller/pyinstaller-3.2.ebuild | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/dev-python/pyinstaller/pyinstaller-3.2.ebuild b/dev-python/pyinstaller/pyinstaller-3.2.ebuild new file mode 100644 index 0000000..1228ebb --- /dev/null +++ b/dev-python/pyinstaller/pyinstaller-3.2.ebuild @@ -0,0 +1,186 @@ +# Copyright 1999-2015 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=( python{2_7,3_3,3_4,3_5} ) + +# "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 +} |