Skip to content

Commit

Permalink
Merge pull request #184 from hramrach/main
Browse files Browse the repository at this point in the history
Revert "Modernize build system"
  • Loading branch information
arighi authored Oct 17, 2024
2 parents fedefac + 1d7fb3a commit 18b5f15
Show file tree
Hide file tree
Showing 8 changed files with 108 additions and 65 deletions.
21 changes: 6 additions & 15 deletions .github/workflows/pylint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,17 @@ jobs:
matrix:
python-version: ["3.8", "3.9", "3.10"]
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
set -euxo pipefail
python -m pip install --upgrade pip
# Both build and runtime deps. This is the price of using pip.
pip install 'argparse-manpage[setuptools]' argcomplete requests
pip install pylint flake8
pip install -r requirements.txt
pip install pylint
pip install flake8
- name: Analysing the code with pylint
run: |
set -euxo pipefail
pylint vng '**/*.py'
flake8 vng
find . -name '*.py' | xargs flake8
python setup.py lint
1 change: 1 addition & 0 deletions MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include requirements.txt
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ GIT_DESCRIBE := $(shell git describe --always --long --dirty)
install: install_from_source
install_from_source:
@echo "Version: $(GIT_DESCRIBE)"
BUILD_VIRTME_NG_INIT=1 pip3 install --verbose $(INSTALL_ARGS) .
BUILD_VIRTME_NG_INIT=1 pip3 install --verbose -r requirements.txt $(INSTALL_ARGS) .

install_only_top:
@echo "Version: $(GIT_DESCRIBE)"
BUILD_VIRTME_NG_INIT=0 pip3 install --verbose $(INSTALL_ARGS) .
BUILD_VIRTME_NG_INIT=0 pip3 install --verbose -r requirements.txt $(INSTALL_ARGS) .
11 changes: 5 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,19 +79,18 @@ To install virtme-ng from source you can clone this git repository and build a
standalone virtme-ng running the following commands:
```
$ git clone --recurse-submodules https://github.com/arighi/virtme-ng.git
$ BUILD_VIRTME_NG_INIT=1 pip3 install .
$ BUILD_VIRTME_NG_INIT=1 pip3 install --verbose -r requirements.txt .
```

If you are in Debian/Ubuntu you may need to install the following packages to
build virtme-ng from source properly:
```
$ sudo apt install python3-pip flake8 pylint cargo rustc qemu-system-x86
$ sudo apt install python3-pip python3-argcomplete flake8 pylint \
cargo rustc qemu-system-x86
```

If you'd prefer to use `uv`:
```
$ BUILD_VIRTME_NG_INIT=1 uv tool install .
```
In recent versions of pip3 you may need to specify `--break-system-packages` to
properly install virtme-ng in your system from source.

* Run from source

Expand Down
22 changes: 0 additions & 22 deletions pyproject.toml

This file was deleted.

5 changes: 5 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
argcomplete
argparse-manpage
requests
setuptools

98 changes: 82 additions & 16 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
#!/usr/bin/env python3

import os
import platform
import sys
import platform
import sysconfig
from subprocess import check_call
from build_manpages import build_manpages, get_build_py_cmd, get_install_cmd
from setuptools import setup
from glob import glob
from shutil import which
from subprocess import check_call, CalledProcessError
from setuptools import setup, Command
from setuptools.command.build_py import build_py
from setuptools.command.egg_info import egg_info
from virtme_ng.version import get_version_string
Expand Down Expand Up @@ -34,6 +35,56 @@
os.environ['PYTHONPATH'] = sysconfig.get_paths()['purelib']


def is_arm_32bit():
arch = platform.machine()
return arch.startswith("arm") and platform.architecture()[0] == "32bit"


def parse_requirements(filename):
with open(filename, 'r', encoding="utf-8") as file:
lines = file.readlines()
return [line.strip() for line in lines if line.strip() and not line.startswith('#')]


class LintCommand(Command):
description = "Run coding style checks"
user_options = []

def initialize_options(self):
pass

def finalize_options(self):
pass

def run(self):
try:
for cmd in ("flake8", "pylint"):
command = [cmd]
for pattern in (
"vng",
"*.py",
"virtme/*.py",
"virtme/*/*.py",
"virtme_ng/*.py",
):
command += glob(pattern)
check_call(command)
except CalledProcessError:
sys.exit(1)


man_command = f"""
argparse-manpage \
--pyfile ./virtme_ng/run.py --function make_parser \
--prog vng --version v{VERSION} \
--author "virtme-ng is written by Andrea Righi <andrea.righi@canonical.com>" \
--author "Based on virtme by Andy Lutomirski <luto@kernel.org>" \
--project-name virtme-ng --manual-title virtme-ng \
--description "Quickly run kernels inside a virtualized snapshot of your live system" \
--url https://github.com/arighi/virtme-ng > vng.1
"""


class BuildPy(build_py):
def run(self):
print(f"BUILD_VIRTME_NG_INIT: {build_virtme_ng_init}")
Expand All @@ -56,6 +107,23 @@ def run(self):
["strip", os.path.join(root, "bin", "virtme-ng-init")],
cwd=cwd,
)
# Generate manpage
if which('argparse-manpage'):
env = os.environ.copy()
env["PYTHONPATH"] = os.path.dirname(os.path.abspath(__file__))
check_call(man_command, shell=True, env=env)

# Generate bash autocompletion scripts
completion_command = ''
if which("register-python-argcomplete"):
completion_command = "register-python-argcomplete"
elif which("register-python-argcomplete3"):
completion_command = "register-python-argcomplete3"
else:
print("ERROR: 'register-python-argcomplete' or 'register-python-argcomplete3' not found.")
sys.exit(1)
check_call(completion_command + ' virtme-ng > virtme-ng-prompt', shell=True)
check_call(completion_command + ' vng > vng-prompt', shell=True)

# Run the rest of virtme-ng build
build_py.run(self)
Expand Down Expand Up @@ -98,28 +166,26 @@ def run(self):

data_files = [
("/etc", ["cfg/virtme-ng.conf"]),
("/usr/share/bash-completion/completions", ["virtme-ng-prompt"]),
("/usr/share/bash-completion/completions", ["vng-prompt"]),
]

if which('argparse-manpage'):
data_files.append(("/usr/share/man/man1", ["vng.1"]))

setup(
name="virtme-ng",
version=VERSION,
author="Andrea Righi",
author_email="arighi@nvidia.com",
description="Build and run a kernel inside a virtualized snapshot of your live system",
url="https://github.com/arighi/virtme-ng",
url="https://git.launchpad.net/~arighi/+git/virtme-ng",
license="GPLv2",
long_description=open(
os.path.join(os.path.dirname(__file__), "README.md"), "r", encoding="utf-8"
).read(),
long_description_content_type="text/markdown",
install_requires=[
'argcomplete',
'requests',
# `pkg_resources` is removed in python 3.12, moved to setuptools.
#
# TODO: replace pkg_resources with importlib. # pylint: disable=fixme
'setuptools',
],
install_requires=parse_requirements('requirements.txt'),
entry_points={
"console_scripts": [
"vng = virtme_ng.run:main",
Expand All @@ -130,13 +196,13 @@ def run(self):
]
},
cmdclass={
"build_manpages": build_manpages,
"build_py": get_build_py_cmd(BuildPy),
"install": get_install_cmd(),
"build_py": BuildPy,
"egg_info": EggInfo,
"lint": LintCommand,
},
packages=packages,
package_data={"virtme.guest": package_files},
data_files=data_files,
scripts=[
"bin/virtme-prep-kdir-mods",
],
Expand Down
11 changes: 7 additions & 4 deletions virtme_ng/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,12 @@
)
from select import select
from pathlib import Path

import argcomplete
try:
from argcomplete import autocomplete
except ModuleNotFoundError:
def autocomplete(*args, **kwargs):
# pylint: disable=unused-argument
pass

from virtme.util import SilentError, get_username
from virtme_ng.utils import CONF_FILE, spinner_decorator
Expand Down Expand Up @@ -75,7 +79,6 @@ def make_parser():
"""Main virtme-ng command line parser."""

parser = argparse.ArgumentParser(
prog="vng",
formatter_class=argparse.RawTextHelpFormatter,
description="Build and run kernels inside a virtualized snapshot of your live system",
epilog="""\
Expand Down Expand Up @@ -1242,7 +1245,7 @@ def dump(kern_source, args):

def do_it() -> int:
"""Main body."""
argcomplete.autocomplete(_ARGPARSER)
autocomplete(_ARGPARSER)
args = _ARGPARSER.parse_args()

kern_source = KernelSource()
Expand Down

0 comments on commit 18b5f15

Please sign in to comment.