iced/build/build-python

246 lines
4.8 KiB
Bash
Executable File

#!/bin/sh
set -e
root_dir=$(dirname "$0")
root_dir=$(cd "$root_dir/.." && pwd)
if [ ! -f "$root_dir/LICENSE.txt" ]; then
echo "Couldn't find the root dir"
exit 1
fi
pysrc_dir="$root_dir/src/rust/iced-x86-py"
cargo_toml="$pysrc_dir/Cargo.toml"
if [ "$OSTYPE" = "msys" ]; then
is_windows=y
else
is_windows=n
fi
if [ "$is_windows" = "y" ]; then
python=python
else
python=python3
fi
full_check=y
gen_docs=y
sdist_only=n
set_rustflags=y
new_func() {
echo
echo "****************************************************************"
echo "$1"
echo "****************************************************************"
echo
}
patchci_verify_not_patched() {
# msys grep fails if we use $
if ! grep -E '^#pathci' "$cargo_toml" 2>&1 > /dev/null; then
echo "Cargo.toml is patched"
exit 1
fi
}
patchci_verify_patched() {
# msys grep fails if we use $
if grep -E '^#pathci' "$cargo_toml" 2>&1 > /dev/null; then
echo "Cargo.toml is not patched"
exit 1
fi
}
# We must reference the current iced-x86 code so we can't use the crates.io crate
# since it hasn't been pushed yet. We patch py/Cargo.toml to point to the current
# source code.
#
# The sdist's Cargo.toml must be the original file though or they won't be able
# to build it once it's been published.
patchci_patch() {
patchci_verify_not_patched
curr_dir=$(pwd)
cd "$root_dir"
if [ "$OSTYPE" = "msys" ]; then
iced_x86_dir="$(pwd -W)/src/rust/iced-x86"
else
iced_x86_dir="$(pwd)/src/rust/iced-x86"
fi
if [ ! -d "$iced_x86_dir" ]; then
echo "Dir does not exist: $iced_x86_dir"
exit 1
fi
sed -i -e "s&^#pathci$&path = \"$iced_x86_dir\"&" "$cargo_toml"
cd "$curr_dir"
}
patchci_undo_patch() {
git checkout "$cargo_toml"
}
generate_sdist() {
new_func "Generate sdist"
curr_dir=$(pwd)
cd "$pysrc_dir"
patchci_verify_not_patched
$python setup.py sdist
cd "$curr_dir"
}
verify_license_file() {
if [ ! -f "$pysrc_dir/LICENSE.txt" ]; then
echo "Missing license file"
exit 1
fi
cp "$root_dir/LICENSE.txt" "$pysrc_dir/"
git diff --exit-code
}
generate_wheel() {
new_func "Generate wheel"
curr_dir=$(pwd)
cd "$pysrc_dir"
patchci_verify_patched
$python setup.py bdist_wheel
cd "$curr_dir"
}
test_wheel() {
new_func "Test wheel"
curr_dir=$(pwd)
cd "$pysrc_dir"
patchci_verify_patched
#TODO: use venv
$python -m pip install --break-system-packages iced-x86 --no-index -f dist --only-binary iced-x86
$python -m pytest --color=yes --code-highlight=yes
$python -m pip uninstall -y --break-system-packages iced-x86
cd "$curr_dir"
}
generate_docs() {
new_func "Generate docs"
curr_dir=$(pwd)
cd "$pysrc_dir"
patchci_verify_patched
# Depends on generate_wheel output.
if [ ! -f "$(ls build/lib*/iced_x86/_iced_x86_py.*.*)" ]; then
echo "Couldn't find the built _iced_x86_py.*.* file"
exit 1
fi
echo "Generating HTML files"
#TODO: enable -W again, fails in GitHub Actions (py3.8) but not locally (py3.11)
$python -m sphinx --color -n --keep-going -b html docs docs/_build
echo "Running doc tests"
$python -m sphinx --color -n -W --keep-going -b doctest docs docs/_build
cd "$curr_dir"
}
misc_tests() {
new_func "clippy, fmt, pylint, mypy"
curr_dir=$(pwd)
cd "$pysrc_dir"
patchci_verify_patched
echo "==== CLIPPY RELEASE ===="
cargo clippy --color always --release
echo "==== FORMAT CHECK ===="
cargo fmt -- --color always --check
echo "mypy"
$python -m mypy --version
$python -m mypy --strict src/iced_x86
#TODO: use venv
$python -m pip install --break-system-packages iced-x86 --no-index -f dist --only-binary iced-x86
$python -m mypy --strict tests/
$python -m pip uninstall -y --break-system-packages iced-x86
echo "pylint"
# It will fail to load _iced_x86_py since it's not in the correct dir, so disable the error
$python -m pylint --version
$python -m pylint src/iced_x86 -d import-error --rcfile="$pysrc_dir/../pylintrc"
cd "$curr_dir"
}
while [ "$#" -gt 0 ]; do
case $1 in
--quick-check) full_check=n ;;
--sdist-only) sdist_only=y ;;
--python) shift; python=$1 ;;
--no-docs) gen_docs=n ;;
--no-set-rustflags) set_rustflags=n ;;
*) echo "Unknown arg: $1"; exit 1 ;;
esac
shift
done
echo
echo "=================================================="
echo "Python build"
echo "=================================================="
echo
if [ "$set_rustflags" = "y" ]; then
export RUSTFLAGS="-D warnings"
fi
echo "rustup show"
rustup show
echo "cargo version"
cargo --version
echo "Rust version"
rustc --version
echo "Python version"
$python --version
verify_license_file
if [ "$sdist_only" = "y" ]; then
generate_sdist
exit 0
fi
echo "pytest version"
$python -m pytest --version
if [ "$full_check" = "y" ] && [ "$gen_docs" = "y" ]; then
echo "sphinx version"
$python -m sphinx --version
fi
generate_sdist
patchci_patch
generate_wheel
test_wheel
if [ "$full_check" = "y" ]; then
misc_tests
if [ "$gen_docs" = "y" ]; then
generate_docs
fi
fi
patchci_undo_patch