Python tooling improvements #44

Merged
MartinFouilleul merged 4 commits from python-improvements into main 2023-08-18 14:50:32 +00:00
6 changed files with 124 additions and 38 deletions

1
.gitignore vendored
View File

@ -28,7 +28,6 @@ src/orca_surface.c
src/graphics/orca_gl31.h src/graphics/orca_gl31.h
*bind_gen.c *bind_gen.c
*_stubs.c *_stubs.c
gles_gen.log
.vscode/launch.json .vscode/launch.json
.vscode/settings.json .vscode/settings.json

41
orca
View File

@ -7,24 +7,45 @@ import os
import sys import sys
root = True if __name__ != "__main__":
print("why are you importing the orca command-line tool as a Python module, you absolute goofball")
exit(1)
# If you modify this, be sure to modify the version in scripts/dev.py as well.
def check_if_source():
def path_is_in_orca_source(path):
dir = path
while True:
try: try:
os.stat(".orcaroot") os.stat(os.path.join(dir, ".orcaroot"))
return (True, dir)
except FileNotFoundError: except FileNotFoundError:
root = False pass
if root: newdir = os.path.dirname(dir)
# Running from Orca source checkout; use local source's scripts. if newdir == dir:
bvisness marked this conversation as resolved Outdated

oops wait I need to test this

oops wait I need to test this
return (False, None)
dir = newdir
scriptdir = os.path.dirname(os.path.abspath(__file__)) in_source, current_source_dir = path_is_in_orca_source(os.getcwd())
if scriptdir != os.getcwd(): script_is_source, script_source_dir = path_is_in_orca_source(os.path.dirname(os.path.abspath(__file__)))
# Only print this warning if running the system-installed Orca.
# It's annoying to see this if you run ./orca from the source. use_source = in_source or script_is_source
source_dir = current_source_dir or script_source_dir
return (use_source, source_dir, script_is_source)
use_source, source_dir, is_source = check_if_source()
if use_source:
# Use the source checkout's scripts instead of the system-installed scripts.
if not is_source:
print("The Orca tool is running from a local source checkout and will") print("The Orca tool is running from a local source checkout and will")
print("use that instead of the system Orca installation.") print("use that instead of the system Orca installation.")
print() print()
sys.path.append(os.getcwd()) sys.path.append(source_dir)
import scripts.orca import scripts.orca
else: else:
# Running from outside Orca source checkout; use system Orca install. # Running from outside Orca source checkout; use system Orca install.

View File

@ -1,4 +1,3 @@
import argparse
from datetime import datetime from datetime import datetime
import glob import glob
import os import os
@ -20,9 +19,9 @@ ANGLE_VERSION = "2023-07-05"
def attach_dev_commands(subparsers): def attach_dev_commands(subparsers):
dev_cmd = subparsers.add_parser("dev", help="Commands for building Orca itself. Must be run from the root of an Orca source checkout.") dev_cmd = subparsers.add_parser("dev", help="Commands for building Orca itself. Must be run from the root of an Orca source checkout.")
dev_cmd.set_defaults(func=orca_root_only) dev_cmd.set_defaults(func=orca_source_only)
dev_sub = dev_cmd.add_subparsers(required=is_orca_root(), title='commands') dev_sub = dev_cmd.add_subparsers(required=is_orca_source(), title='commands')
build_cmd = dev_sub.add_parser("build-runtime", help="Build the Orca runtime from source.") build_cmd = dev_sub.add_parser("build-runtime", help="Build the Orca runtime from source.")
build_cmd.add_argument("--release", action="store_true", help="compile Orca in release mode (default is debug)") build_cmd.add_argument("--release", action="store_true", help="compile Orca in release mode (default is debug)")
@ -36,15 +35,39 @@ def attach_dev_commands(subparsers):
install_cmd.set_defaults(func=dev_shellish(install)) install_cmd.set_defaults(func=dev_shellish(install))
def is_orca_root(): # Checks if the Orca tool should use a source checkout of Orca instead of a system install.
# This is copy-pasted to the command-line tool so it can work before loading anything.
#
# Returns: (use source, source directory, is actually the source's tool)
def check_if_source():
def path_is_in_orca_source(path):
dir = path
while True:
try: try:
os.stat(".orcaroot") os.stat(os.path.join(dir, ".orcaroot"))
return True return (True, dir)
except FileNotFoundError: except FileNotFoundError:
return False pass
newdir = os.path.dirname(dir)
if newdir == dir: # TODO: Verify on Windows (it will probably not work)
return (False, None)
dir = newdir
in_source, current_source_dir = path_is_in_orca_source(os.getcwd())
script_is_source, script_source_dir = path_is_in_orca_source(os.path.dirname(os.path.abspath(__file__)))
use_source = in_source or script_is_source
source_dir = current_source_dir or script_source_dir
return (use_source, source_dir, script_is_source)
def orca_root_only(args): def is_orca_source():
use_source, _, _ = check_if_source()
return use_source
def orca_source_only(args):
print("The Orca dev commands can only be run from an Orca source checkout.") print("The Orca dev commands can only be run from an Orca source checkout.")
print() print()
print("If you want to build Orca yourself, download the source here:") print("If you want to build Orca yourself, download the source here:")
@ -53,7 +76,14 @@ def orca_root_only(args):
def dev_shellish(func): def dev_shellish(func):
return shellish(func) if is_orca_root() else orca_root_only use_source, source_dir, _ = check_if_source()
if not use_source:
return orca_source_only
def func_from_source(args):
os.chdir(source_dir)
func(args)
return shellish(func_from_source)
def build_runtime(args): def build_runtime(args):
@ -485,6 +515,17 @@ def yeet(path):
shutil.rmtree(path) shutil.rmtree(path)
def prompt(msg):
while True:
answer = input(f"{msg} (y/n)> ")
if answer.lower() in ["y", "yes"]:
return True
elif answer.lower() in ["n", "no"]:
return False
else:
print("Please enter \"yes\" or \"no\" and press return.")
def install(args): def install(args):
if platform.system() == "Windows": if platform.system() == "Windows":
dest = os.path.join(os.getenv("LOCALAPPDATA"), "orca") dest = os.path.join(os.getenv("LOCALAPPDATA"), "orca")
@ -495,31 +536,42 @@ def install(args):
print("The Orca command-line tools will be installed to:") print("The Orca command-line tools will be installed to:")
print(dest) print(dest)
print() print()
while True: if not prompt("Proceed with the installation?"):
answer = input("Proceed with the installation? (y/n) >")
if answer.lower() in ["y", "yes"]:
break
elif answer.lower() in ["n", "no"]:
return return
else:
print("Please enter \"yes\" or \"no\" and press return.")
bin_dir = os.path.join(dest, "bin") bin_dir = os.path.join(dest, "bin")
yeet(bin_dir) yeet(bin_dir)
# The MS Store version of Python does some really stupid stuff with AppData:
# https://git.handmade.network/hmn/orca/issues/32
#
# Any new files and folders created in AppData actually get created in a special
# folder specific to the Python version. However, if the files or folders already
# exist, the redirect does not happen. So, if we first use the shell to create the
# paths we need, the following scripts work regardless of Python install.
#
# Also apparently you can't just do mkdir in a subprocess call here, hence the
# trivial batch script.
if platform.system() == "Windows":
subprocess.run(["scripts\\mkdir.bat", bin_dir], check=True)
shutil.copytree("scripts", os.path.join(bin_dir, "sys_scripts")) shutil.copytree("scripts", os.path.join(bin_dir, "sys_scripts"))
shutil.copy("orca", bin_dir) shutil.copy("orca", bin_dir)
if platform.system() == "Windows": if platform.system() == "Windows":
shutil.copy("orca.bat", bin_dir) shutil.copy("orca.bat", bin_dir)
# TODO: Customize these instructions for Windows
print() print()
if platform.system() == "Windows": if platform.system() == "Windows":
print("The Orca tools have been installed. Make sure the Orca tools are on your PATH by") print("The Orca tools have been installed to the following directory:")
print("adding the following path to your system PATH variable:")
print()
print(bin_dir) print(bin_dir)
print() print()
print("You can do this in the Windows settings by searching for \"environment variables\".") print("The tools will need to be on your PATH in order to actually use them.")
if prompt("Would you like to automatically add Orca to your PATH?"):
subprocess.run(["powershell", "scripts\\updatepath.ps1", bin_dir], check=True)
print("Orca has been added to your PATH. Restart any open terminals to use it.")
else:
print("No worries. You can manually add Orca to your PATH in the Windows settings")
print("this in the Windows settings by searching for \"environment variables\".")
else: else:
print("The Orca tools have been installed. Make sure the Orca tools are on your PATH by") print("The Orca tools have been installed. Make sure the Orca tools are on your PATH by")
print("adding the following to your shell config:") print("adding the following to your shell config:")

View File

@ -32,7 +32,7 @@ def gen_gles_header(spec, filename):
tree = et.parse(spec) tree = et.parse(spec)
reg.loadElementTree(tree) reg.loadElementTree(tree)
logFile = open('./gles_gen.log', 'w') logFile = open('./build/gles_gen.log', 'w')
gen = COutputGenerator(diagFile=logFile) gen = COutputGenerator(diagFile=logFile)
reg.setGenerator(gen) reg.setGenerator(gen)
reg.apiGen(genOpts) reg.apiGen(genOpts)

3
scripts/mkdir.bat Normal file
View File

@ -0,0 +1,3 @@
@echo off
mkdir %1
exit /b %errorlevel%

11
scripts/updatepath.ps1 Normal file
View File

@ -0,0 +1,11 @@
param (
[parameter(Mandatory=$true)]
[string]$orcaPath
)
$arrPath = [System.Environment]::GetEnvironmentVariable('PATH', 'User') -split ';'
$arrPath = $arrPath | Where-Object { $_ -ne $orcaPath } | Where-Object { $_ -ne '' }
$newPath = ($arrPath + $orcaPath) -join ';'
[System.Environment]::SetEnvironmentVariable('PATH', $newPath, 'User')
# echo $newPath