diff --git a/README.md b/README.md index d206a2b73b..cc9d69c5ac 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ Requirements ------------ Pype will run on most typical hardware configurations commonly found in studios around the world. It is installed on artist computer and can take up 3Gb of space depending on number of versions -and other dependencies. +and other dependencies. -For well functioning [ftrack](https://www.ftrack.com/en/) event server, we recommend a +For well functioning [ftrack](https://www.ftrack.com/en/) event server, we recommend a linux virtual server with [Ubuntu](https://ubuntu.com/) or [CentosOS](https://www.centos.org/). CPU and RAM allocation need differ based on the studio size, but a 2GB of RAM, with a dual core CPU and around 4GB of storage should suffice. @@ -57,6 +57,27 @@ it will install it on current computer. Pype is build using [CX_Freeze](https://cx-freeze.readthedocs.io/en/latest) to freeze itself and all dependencies. +### MacOS + +You will need [Python 3.7 and newer](https://www.python.org/downloads/) and [git](https://git-scm.com/downloads). You'll need also other tools to build +some Pype dependencies like [CMake](https://cmake.org/) and **XCode Command Line Tools** (or some other build system). + +You can install **XCode Command Line Tools** from Terminal: +```sh +xcode-select --install +``` + +Before building Pype be sure to make **CMake** available in `PATH`: +```sh +export PATH=$PATH:/Applications/CMake.app/Contents/bin +``` + +#### To build Pype: + +1) Run `.\tools\create_env.sh` to create virtual environment in `.\venv` +2) Run `.\tools\build.sh` to build Pype executables in `.\build\` + + Running Pype ------------ @@ -103,4 +124,4 @@ Running tests To run tests, execute `.\tools\run_tests.ps1`. -**Note that it needs existing virtual environment.** \ No newline at end of file +**Note that it needs existing virtual environment.** diff --git a/requirements.txt b/requirements.txt index b3dee18b26..9f128c9e1b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,8 +14,9 @@ ffmpeg-python google-api-python-client jsonschema keyring +jinxed log4mongo -git+https://github.com/pypeclub/OpenTimelineIO.git@develop +git+https://github.com/PixarAnimationStudios/OpenTimelineIO.git pathlib2 Pillow pyblish-base diff --git a/setup.py b/setup.py index 3a782a8d72..7199f82d1e 100644 --- a/setup.py +++ b/setup.py @@ -53,8 +53,7 @@ include_files = [ "schema", "vendor", "LICENSE", - "README.md", - "pype/version.py" + "README.md" ] if sys.platform == "win32": @@ -75,7 +74,7 @@ executables = [ Executable("start.py", base=None, target_name="pype_console", icon=icon_path.as_posix()), Executable("start.py", base=base, - target_name="pype", icon=icon_path.as_posix()) + target_name="pype_gui", icon=icon_path.as_posix()) ] setup( diff --git a/tools/build.sh b/tools/build.sh old mode 100644 new mode 100755 index 61f8943931..38b7acdc51 --- a/tools/build.sh +++ b/tools/build.sh @@ -1,4 +1,10 @@ #!/usr/bin/env bash + +# This script will detect Python installation, create venv and install +# all necessary packages from `requirements.txt` needed by Pype to be +# included during application freeze on Unix. + + art () { cat <<-EOF ____________ @@ -47,70 +53,6 @@ BICyan='\033[1;96m' # Cyan BIWhite='\033[1;97m' # White -############################################################################### -# Test if Xcode Command Line tools are installed in MacOS -############################################################################### -have_command_line_tools() { - [[ -e "/Library/Developer/CommandLineTools/usr/bin/git" ]] -} - -############################################################################### -# Get command any key from user -############################################################################### -getc() { - local save_state - save_state=$(/bin/stty -g) - /bin/stty raw -echo - IFS= read -r -n 1 -d '' "$@" - /bin/stty "$save_state" -} - -############################################################################### -# Test if we have access via sudo -# Used in MacOS -############################################################################### -have_sudo_access() { - if [[ -z "${HAVE_SUDO_ACCESS-}" ]]; then - /usr/bin/sudo -l mkdir &>/dev/null - HAVE_SUDO_ACCESS="$?" - fi - - if [[ "$HAVE_SUDO_ACCESS" -ne 0 ]]; then - echo -e "${BIRed}!!!${RST} Need sudo access on MacOS" - return 1 - fi - - return "$HAVE_SUDO_ACCESS" -} - -############################################################################### -# Execute command and report failure -############################################################################### -execute() { - if ! "$@"; then - echo -e "${BIRed}!!!${RST} Failed execution of ${BIWhite}[ $@ ]${RST}" - fi -} - -############################################################################### -# Execute command using sudo -# This is used on MacOS to handle Xcode command line tools installation -############################################################################### -execute_sudo() { - local -a args=("$@") - if [[ -n "${SUDO_ASKPASS-}" ]]; then - args=("-A" "${args[@]}") - fi - if have_sudo_access; then - echo -e "${BIGreen}>->${RST} sudo: [${BIWhite} ${args[@]} ${RST}]" - execute "/usr/bin/sudo" "${args[@]}" - else - echo -e "${BIGreen}>->${RST} [${BIWhite} ${args[@]} ${RST}]" - execute "${args[@]}" - fi -} - - ############################################################################## # Detect required version of python # Globals: @@ -122,7 +64,7 @@ execute_sudo() { # None ############################################################################### detect_python () { - echo -e "${BIYellow}>>>${RST} Forced using python at [ ${BIWhite}[ $PYPE_PYTHON_EXE ]${RST} ... \c" + echo -e "${BIGreen}>>>${RST} Using Python \c" local version_command="import sys;print('{0}.{1}'.format(sys.version_info[0], sys.version_info[1]))" local python_version="$(python3 <<< ${version_command})" oIFS="$IFS" @@ -130,7 +72,7 @@ detect_python () { set -- $python_version IFS="$oIFS" if [ "$1" -ge "3" ] && [ "$2" -ge "6" ] ; then - echo -e "${BIGreen}$1.$2${RST}" + echo -e "${BIWhite}[${RST} ${BIGreen}$1.$2${RST} ${BIWhite}]${RST}" PYTHON="python3" else command -v python3 >/dev/null 2>&1 || { echo -e "${BIRed}FAILED${RST} ${BIYellow} Version [${RST}${BICyan}$1.$2${RST}]${BIYellow} is old and unsupported${RST}"; return 1; } @@ -147,27 +89,40 @@ detect_python () { # None ############################################################################### clean_pyc () { - path=${1:-$PYPE_SETUP_PATH} - echo -e "${IGreen}>>>${RST} Cleaning pyc at [ ${BIWhite}$path${RST} ] ... \c" + path=${1:-$pype_root} + echo -e "${BIGreen}>>>${RST} Cleaning pyc at [ ${BIWhite}$path${RST} ] ... \c" find "$path" -regex '^.*\(__pycache__\|\.py[co]\)$' -delete echo -e "${BIGreen}DONE${RST}" } +realpath () { + echo $(cd $(dirname "$1"); pwd)/$(basename "$1") +} + # Main art detect_python || return 1 -version_command="import version;print(version.__version__)" -pype_version="$(python3 <<< ${version_command})" -echo -e "${IGreen}>>>${RST} Building Pype [${IGreen} v$pype_version ${RST}]" -echo -e "${IGreen}>>>${RST} Creating virtual env ..." -python3 -m venv venv -echo -e "${IGreen}>>>${RST} Entering venv ..." +# Directories +current_dir=$(realpath "$(pwd)") +pype_root=$(realpath "${BASH_SOURCE[0]}") +pushd "$pype_root" > /dev/null + +version_command="from pathlib import Path;version = {};pype_root = '$pype_root';with open(pype_root / 'pype' / 'version.py') as fp exec(fp.read(), version);print(version['__version__'])" +# pype_version="$(python3 <<< ${version_command})" + +echo -e "${BIYellow}---${RST} Cleaning build directory ..." +rm -rf "$pype_root/build" && mkdir "$pype_root/build" > /dev/null + +# echo -e "${BIGreen}>>>${RST} Building Pype [${IGreen} v$pype_version ${RST}]" +echo -e "${BIGreen}>>>${RST} Entering venv ..." source venv/bin/activate -echo -e "${IGreen}>>>${RST} Installing packages to new venv ..." -pip install -r requirements.txt -echo -e "${IGreen}>>>${RST} Cleaning cache files ..." +echo -e "${BIGreen}>>>${RST} Cleaning cache files ..." clean_pyc -echo -e "${IGreen}>>>${RST} Building ..." -python setup.py build +echo -e "${BIGreen}>>>${RST} Building ..." +python "$pype_root/setup.py" build > "$pype_root/build/build.log" +python -B "$pype_root/tools/build_dependencies.py" +echo -e "${BIGreen}>>>${RST} Deactivating venv ..." deactivate +echo -e "${BICyan}>>>${RST} All done. You will find Pype and build log in \c" +echo -e "${BIWhite}$pype_root/build${RST} directory." diff --git a/tools/create_env.sh b/tools/create_env.sh new file mode 100755 index 0000000000..b973951b51 --- /dev/null +++ b/tools/create_env.sh @@ -0,0 +1,183 @@ +#!/usr/bin/env bash + +# This script will detect Python installation, create venv and install +# all necessary packages from `requirements.txt` needed by Pype to be +# included during application freeze on Unix. + + +art () { + cat <<-EOF + ____________ +/\\ \\ +\\ \\ --- \\ + \\ \\ _____/ ______ + \\ \\ \\___/ /\\ \\ + \\ \\____\\ \\ \\_____\\ + \\/____/ \\/_____/ PYPE Club . + +EOF +} + +# Colors for terminal + +RST='\033[0m' # Text Reset + +# Regular Colors +Black='\033[0;30m' # Black +Red='\033[0;31m' # Red +Green='\033[0;32m' # Green +Yellow='\033[0;33m' # Yellow +Blue='\033[0;34m' # Blue +Purple='\033[0;35m' # Purple +Cyan='\033[0;36m' # Cyan +White='\033[0;37m' # White + +# Bold +BBlack='\033[1;30m' # Black +BRed='\033[1;31m' # Red +BGreen='\033[1;32m' # Green +BYellow='\033[1;33m' # Yellow +BBlue='\033[1;34m' # Blue +BPurple='\033[1;35m' # Purple +BCyan='\033[1;36m' # Cyan +BWhite='\033[1;37m' # White + +# Bold High Intensity +BIBlack='\033[1;90m' # Black +BIRed='\033[1;91m' # Red +BIGreen='\033[1;92m' # Green +BIYellow='\033[1;93m' # Yellow +BIBlue='\033[1;94m' # Blue +BIPurple='\033[1;95m' # Purple +BICyan='\033[1;96m' # Cyan +BIWhite='\033[1;97m' # White + + +############################################################################### +# Test if Xcode Command Line tools are installed in MacOS +############################################################################### +have_command_line_tools() { + [[ -e "/Library/Developer/CommandLineTools/usr/bin/git" ]] +} + +############################################################################### +# Get command any key from user +############################################################################### +getc() { + local save_state + save_state=$(/bin/stty -g) + /bin/stty raw -echo + IFS= read -r -n 1 -d '' "$@" + /bin/stty "$save_state" +} + +############################################################################### +# Test if we have access via sudo +# Used in MacOS +############################################################################### +have_sudo_access() { + if [[ -z "${HAVE_SUDO_ACCESS-}" ]]; then + /usr/bin/sudo -l mkdir &>/dev/null + HAVE_SUDO_ACCESS="$?" + fi + + if [[ "$HAVE_SUDO_ACCESS" -ne 0 ]]; then + echo -e "${BIRed}!!!${RST} Need sudo access on MacOS" + return 1 + fi + + return "$HAVE_SUDO_ACCESS" +} + +############################################################################### +# Execute command and report failure +############################################################################### +execute() { + if ! "$@"; then + echo -e "${BIRed}!!!${RST} Failed execution of ${BIWhite}[ $@ ]${RST}" + fi +} + +############################################################################### +# Execute command using sudo +# This is used on MacOS to handle Xcode command line tools installation +############################################################################### +execute_sudo() { + local -a args=("$@") + if [[ -n "${SUDO_ASKPASS-}" ]]; then + args=("-A" "${args[@]}") + fi + if have_sudo_access; then + echo -e "${BIGreen}>->${RST} sudo: [${BIWhite} ${args[@]} ${RST}]" + execute "/usr/bin/sudo" "${args[@]}" + else + echo -e "${BIGreen}>->${RST} [${BIWhite} ${args[@]} ${RST}]" + execute "${args[@]}" + fi +} + + +############################################################################## +# Detect required version of python +# Globals: +# colors +# PYTHON +# Arguments: +# None +# Returns: +# None +############################################################################### +detect_python () { + echo -e "${BIGreen}>>>${RST} Using python \c" + local version_command="import sys;print('{0}.{1}'.format(sys.version_info[0], sys.version_info[1]))" + local python_version="$(python3 <<< ${version_command})" + oIFS="$IFS" + IFS=. + set -- $python_version + IFS="$oIFS" + if [ "$1" -ge "3" ] && [ "$2" -ge "6" ] ; then + echo -e "${BIWhite}[${RST} ${BIGreen}$1.$2${RST} ${BIWhite}]${RST}" + PYTHON="python3" + else + command -v python3 >/dev/null 2>&1 || { echo -e "${BIRed}FAILED${RST} ${BIYellow} Version [${RST}${BICyan}$1.$2${RST}]${BIYellow} is old and unsupported${RST}"; return 1; } + fi +} + +############################################################################## +# Clean pyc files in specified directory +# Globals: +# None +# Arguments: +# Optional path to clean +# Returns: +# None +############################################################################### +clean_pyc () { + path=${1:-$pype_root} + echo -e "${IGreen}>>>${RST} Cleaning pyc at [ ${BIWhite}$path${RST} ] ... \c" + find "$path" -regex '^.*\(__pycache__\|\.py[co]\)$' -delete + echo -e "${BIGreen}DONE${RST}" +} + +# Main +art +detect_python || return 1 + +# Directories +current_dir="$(pwd)" +pype_root=`dirname $(dirname "${BASH_SOURCE[0]}")` +pushd "$pype_root" > /dev/null + +echo -e "${BIYellow}---${RST} Cleaning venv directory ..." +rm -rf "$pype_root/venv" && mkdir "$pype_root/venv" + +echo -e "${BIGreen}>>>${RST} Creating venv ..." +python3 -m venv "$pype_root/venv" + +echo -e "${BIGreen}>>>${RST} Entering venv ..." +source "$pype_root/venv/bin/activate" +echo -e "${BIGreen}>>>${RST} Installing packages to new venv ..." +pip install -r "$pype_root/requirements.txt" +echo -e "${BIGreen}>>>${RST} Cleaning cache files ..." +clean_pyc +deactivate