chore: Remove unused install deps scripts and related parts
This commit is contained in:
7
Brewfile
7
Brewfile
@ -1,7 +0,0 @@
|
||||
brew 'make'
|
||||
brew 'cmake'
|
||||
brew 'openssl'
|
||||
brew 'ninja'
|
||||
brew 'googletest'
|
||||
brew 'tomlplusplus'
|
||||
brew 'cli11'
|
||||
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<!-- install with: choco install Chocolatey.config -y -->
|
||||
<packages>
|
||||
<package id="wixtoolset" />
|
||||
<package id="visualstudio2022buildtools"
|
||||
packageParameters="--includeRecommended --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Workload.VCTools " />
|
||||
</packages>
|
||||
205
config.yaml
205
config.yaml
@ -1,205 +0,0 @@
|
||||
config:
|
||||
windows:
|
||||
dependencies:
|
||||
# We only run `choco` when not in CI env because it's pretty unreliable and slow.
|
||||
# The Chocolatey mirror cannot be 100% reliable (according to docs) so it will often fail
|
||||
# with an error `503 (Service Unavailable: Back-end server is at capacity)` which causes
|
||||
# the nightly CI to fail intermittently.
|
||||
command-elevated: if not defined CI (choco install Chocolatey.config -y)
|
||||
|
||||
# We only run `winget` when not in CI env; it's not available on the GitHub Windows runner.
|
||||
# It's simpler to solve dependencies like Ninja with a GitHub workflow action, and cmake is
|
||||
# already installed on the Windows runner.
|
||||
command: if not defined CI (winget install ninja-build.ninja cmake)
|
||||
qt:
|
||||
version: 6.7.2
|
||||
mirror: https://qt.mirror.constant.com/
|
||||
base-dir: ./deps/qt
|
||||
|
||||
mac:
|
||||
dependencies:
|
||||
command: brew bundle --file=Brewfile
|
||||
qt:
|
||||
version: 6.7.2
|
||||
mirror: https://qt.mirror.constant.com/
|
||||
base-dir: ./deps/qt
|
||||
|
||||
linux:
|
||||
debian: &debian
|
||||
dependencies:
|
||||
command-pre: sudo apt-get update
|
||||
command: |
|
||||
sudo apt-get install -y \
|
||||
cmake \
|
||||
make \
|
||||
ninja-build \
|
||||
g++ \
|
||||
file \
|
||||
xorg-dev \
|
||||
libx11-dev \
|
||||
libxtst-dev \
|
||||
libssl-dev \
|
||||
libglib2.0-dev \
|
||||
libgdk-pixbuf-2.0-dev \
|
||||
libnotify-dev \
|
||||
libxkbfile-dev \
|
||||
qt6-base-dev \
|
||||
qt6-tools-dev \
|
||||
libgtk-3-dev \
|
||||
libgtest-dev \
|
||||
libgmock-dev \
|
||||
libpugixml-dev \
|
||||
libei-dev \
|
||||
libportal-dev \
|
||||
libtomlplusplus-dev \
|
||||
libcli11-dev
|
||||
optional: [libei-dev, libportal-dev, libtomlplusplus-dev]
|
||||
|
||||
linuxmint:
|
||||
<<: *debian
|
||||
|
||||
ubuntu:
|
||||
<<: *debian
|
||||
|
||||
fedora: &fedora
|
||||
dependencies: &fedora_deps
|
||||
command-pre: sudo dnf check-update
|
||||
command: |
|
||||
sudo dnf install -y \
|
||||
cmake \
|
||||
make \
|
||||
ninja-build \
|
||||
gcc-c++ \
|
||||
rpm-build \
|
||||
openssl-devel \
|
||||
glib2-devel \
|
||||
gdk-pixbuf2-devel \
|
||||
libXtst-devel \
|
||||
libnotify-devel \
|
||||
libxkbfile-devel \
|
||||
qt6-qtbase-devel \
|
||||
qt6-qttools-devel \
|
||||
gtk3-devel \
|
||||
gtest-devel \
|
||||
gmock-devel \
|
||||
pugixml-devel \
|
||||
libei-devel \
|
||||
libportal-devel \
|
||||
tomlplusplus-devel \
|
||||
cli11-devel
|
||||
optional: [libei-devel, libportal-devel]
|
||||
|
||||
# RHEL is not actually supported yet, since it doesn't have Qt6 libs.
|
||||
# We simply use it as a base for Alma Linux and Rocky Linux.
|
||||
rhel: &rhel
|
||||
<<: *fedora
|
||||
dependencies: &rhel_deps
|
||||
<<: *fedora_deps
|
||||
command-pre: |
|
||||
sudo dnf check-update;
|
||||
sudo dnf install -y epel-release;
|
||||
dnf config-manager --set-enabled crb
|
||||
|
||||
rocky:
|
||||
<<: *rhel
|
||||
dependencies:
|
||||
<<: *rhel_deps
|
||||
|
||||
almalinux:
|
||||
<<: *rhel
|
||||
dependencies:
|
||||
<<: *rhel_deps
|
||||
|
||||
opensuse-tumbleweed: &opensuse-tumbleweed
|
||||
dependencies:
|
||||
command-pre: sudo zypper refresh
|
||||
command: sudo zypper install -y --force-resolution \
|
||||
cmake \
|
||||
make \
|
||||
ninja \
|
||||
gcc-c++ \
|
||||
rpm-build \
|
||||
libopenssl-devel \
|
||||
glib2-devel \
|
||||
gdk-pixbuf-devel \
|
||||
libXtst-devel \
|
||||
libnotify-devel \
|
||||
libxkbfile-devel \
|
||||
qt6-base-devel \
|
||||
qt6-tools-devel \
|
||||
gtk3-devel \
|
||||
googletest-devel \
|
||||
googlemock-devel \
|
||||
pugixml-devel \
|
||||
libei-devel \
|
||||
libportal-devel \
|
||||
tomlplusplus-devel \
|
||||
cli11-devel
|
||||
|
||||
arch: &arch
|
||||
dependencies:
|
||||
command: sudo pacman -Syu --noconfirm \
|
||||
base-devel \
|
||||
cmake \
|
||||
ninja \
|
||||
gcc \
|
||||
openssl \
|
||||
glib2 \
|
||||
gdk-pixbuf2 \
|
||||
libxtst \
|
||||
libnotify \
|
||||
libxkbfile \
|
||||
gtest \
|
||||
pugixml \
|
||||
libei \
|
||||
libportal \
|
||||
qt6-base \
|
||||
qt6-tools \
|
||||
gtk3 \
|
||||
tomlplusplus \
|
||||
cli11
|
||||
|
||||
manjaro:
|
||||
<<: *arch
|
||||
|
||||
subprojects:
|
||||
libei:
|
||||
dependencies:
|
||||
debian: &debian_libei |
|
||||
sudo apt-get install -y \
|
||||
python3-attr \
|
||||
python3-jinja2 \
|
||||
libsystemd-dev &&
|
||||
pip install attrs jinja2
|
||||
|
||||
ubuntu: *debian_libei
|
||||
linuxmint: *debian_libei
|
||||
|
||||
fedora: &fedora_libei |
|
||||
sudo dnf install -y \
|
||||
python3-attrs \
|
||||
python3-jinja2 \
|
||||
systemd-devel &&
|
||||
pip install attrs jinja2
|
||||
|
||||
rhel: *fedora_libei
|
||||
rocky: *fedora_libei
|
||||
almalinux: *fedora_libei
|
||||
|
||||
libportal:
|
||||
dependencies:
|
||||
debian: &debian_libportal |
|
||||
sudo apt-get install -y \
|
||||
python3-dbusmock \
|
||||
python3-pytest \
|
||||
valac \
|
||||
protobuf-c-compiler \
|
||||
protobuf-compiler \
|
||||
libglib2.0 \
|
||||
libgtk-3-dev \
|
||||
libprotobuf-c-dev \
|
||||
libsystemd-dev \
|
||||
libgirepository1.0-dev
|
||||
|
||||
ubuntu: *debian_libportal
|
||||
linuxmint: *debian_libportal
|
||||
@ -1,274 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Deskflow -- mouse and keyboard sharing utility
|
||||
# Copyright (C) 2024 Symless Ltd.
|
||||
#
|
||||
# This package is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# found in the file LICENSE that should have accompanied this file.
|
||||
#
|
||||
# This package is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os, sys, argparse, traceback
|
||||
import lib.env as env
|
||||
import lib.cmd_utils as cmd_utils
|
||||
import lib.qt_utils as qt_utils
|
||||
import lib.github as github
|
||||
|
||||
path_env_var = "PATH"
|
||||
cmake_prefix_env_var = "CMAKE_PREFIX_PATH"
|
||||
|
||||
|
||||
def main():
|
||||
is_ci = os.getenv("CI") is not None
|
||||
if is_ci:
|
||||
print("CI environment detected")
|
||||
|
||||
args = parse_args(is_ci)
|
||||
if args.lock_file:
|
||||
env.persist_lock_file(args.lock_file)
|
||||
|
||||
try:
|
||||
run(args)
|
||||
except Exception:
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
||||
finally:
|
||||
if env.is_windows() and args.pause_on_exit:
|
||||
# Allow the rest of the install to continue while sitting at the pause.
|
||||
if args.lock_file:
|
||||
env.remove_lock_file(args.lock_file)
|
||||
|
||||
# Useful on Windows, when elevated, Python is opened in a new window and closes
|
||||
# immediately after the script finishes. This keeps the script window open so that
|
||||
# the user can see the output.
|
||||
print()
|
||||
input("Press enter to continue...")
|
||||
|
||||
|
||||
def parse_args(is_ci):
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
parser.add_argument(
|
||||
"--ci-env",
|
||||
action="store_true",
|
||||
help="Useful for faking CI env (defaults to true in CI env)",
|
||||
default=is_ci,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--lock-file",
|
||||
type=str,
|
||||
help="Create a file to indicate script is running",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--only-python", action="store_true", help="Only install Python dependencies"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--skip-python",
|
||||
action="store_true",
|
||||
help="Do not install Python dependencies",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--skip-system",
|
||||
action="store_true",
|
||||
help="Do not install system dependencies (apt, dnf, etc)",
|
||||
)
|
||||
|
||||
if env.is_windows():
|
||||
parser.add_argument(
|
||||
"--skip-vcpkg",
|
||||
action="store_true",
|
||||
help="Windows only: Do not install vcpkg dependencies",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--skip-elevated",
|
||||
action="store_true",
|
||||
help="Windows only: Do not run elevated command",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--only-elevated",
|
||||
action="store_true",
|
||||
help="Windows only: Only run elevated command",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--pause-on-exit",
|
||||
action="store_true",
|
||||
help="Windows only: Useful to prevent elevated window from closing",
|
||||
)
|
||||
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def run(args):
|
||||
env.ensure_dependencies()
|
||||
env.ensure_in_venv(__file__, create_venv=True)
|
||||
|
||||
if not args.skip_python:
|
||||
env.install_requirements()
|
||||
|
||||
colors = env.import_colors()
|
||||
|
||||
if args.only_python:
|
||||
print()
|
||||
print(colors.SUCCESS_TEXT + " Only Python dependencies installed")
|
||||
return
|
||||
|
||||
try:
|
||||
install(args)
|
||||
|
||||
print()
|
||||
print(f"\n{colors.SUCCESS_TEXT} Dependencies installed")
|
||||
|
||||
# On Windows and macOS, we set env vars for cmake, but for them to be picked up,
|
||||
# either the shell needs to be restarted or the env vars need to be re-sourced.
|
||||
# Restarting the shell is easier for most people.
|
||||
if not env.is_linux():
|
||||
print(
|
||||
f"{colors.WARNING_TEXT} You may need to restart your terminal "
|
||||
"or IDE to use new env vars"
|
||||
)
|
||||
except Exception:
|
||||
traceback.print_exc()
|
||||
print()
|
||||
print(f"\n{colors.ERROR_TEXT} Failed to install dependencies")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def install(args):
|
||||
if not args.skip_system:
|
||||
deps = Dependencies(args)
|
||||
deps.install()
|
||||
|
||||
# Only install vcpkg dependencies on Windows, since on other OS it's not needed (yet).
|
||||
# We probably won't ever need this on macOS and Linux since brew and apt/dnf/etc do a
|
||||
# good job of providing dependencies. Where they don't, we can use Meson.
|
||||
if env.is_windows() and not args.skip_vcpkg:
|
||||
import lib.vcpkg as vcpkg
|
||||
|
||||
vcpkg.install(args.ci_env)
|
||||
|
||||
|
||||
class Dependencies:
|
||||
|
||||
def __init__(self, args):
|
||||
from lib.config import Config
|
||||
|
||||
self.config = Config()
|
||||
self.args = args
|
||||
self.ci_env = args.ci_env
|
||||
|
||||
def install(self):
|
||||
"""Installs dependencies for the current platform."""
|
||||
|
||||
if env.is_windows():
|
||||
self.windows()
|
||||
elif env.is_mac():
|
||||
self.mac()
|
||||
elif env.is_linux():
|
||||
self.linux()
|
||||
else:
|
||||
raise RuntimeError(f"Unsupported platform: {os}")
|
||||
|
||||
def windows(self):
|
||||
"""Installs dependencies on Windows."""
|
||||
import lib.windows as windows
|
||||
|
||||
if not self.args.skip_elevated:
|
||||
if windows.is_admin():
|
||||
|
||||
# The choco command should run from the elevated command.
|
||||
choco = windows.WindowsChoco()
|
||||
choco.ensure_choco_installed()
|
||||
command_elevated = self.config.get_os_deps_command("command-elevated")
|
||||
cmd_utils.run(command_elevated, shell=True, print_cmd=True)
|
||||
|
||||
if self.args.only_elevated:
|
||||
sys.exit(0)
|
||||
else:
|
||||
windows.run_elevated(
|
||||
__file__, "--only-elevated --skip-python", wait_for_exit=True
|
||||
)
|
||||
|
||||
qt = qt_utils.WindowsQt(*self.config.get_qt_config())
|
||||
qt.install()
|
||||
|
||||
if self.ci_env:
|
||||
github.set_env_var(cmake_prefix_env_var, qt.get_install_dir())
|
||||
else:
|
||||
windows.set_env_var(cmake_prefix_env_var, qt.get_install_dir())
|
||||
|
||||
command = self.config.get_os_deps_command()
|
||||
|
||||
cmd_utils.run(command, shell=True, print_cmd=True)
|
||||
|
||||
def mac(self):
|
||||
"""Installs dependencies on macOS."""
|
||||
import lib.mac as mac
|
||||
|
||||
# On macOS, brew does have a Qt package available, but it is always built against the
|
||||
# current macOS version and the brew version also does some really weird stuff with the
|
||||
# library symbols, which confuses the heck out of `macqtdeploy`. So, using the official
|
||||
# Qt library binaries seems to be the most reliable option for distribution.
|
||||
qt = qt_utils.MacQt(*self.config.get_qt_config())
|
||||
qt.install()
|
||||
|
||||
qt_dir = qt.get_install_dir()
|
||||
qt_bin_dir = os.path.join(qt_dir, "bin")
|
||||
env_vars_set = 0
|
||||
if self.ci_env:
|
||||
github.set_env_var(cmake_prefix_env_var, qt_dir)
|
||||
github.add_to_path(qt_bin_dir)
|
||||
else:
|
||||
env_vars_set += mac.set_env_var(cmake_prefix_env_var, qt_dir)
|
||||
env_vars_set += mac.set_env_var(path_env_var, qt_bin_dir)
|
||||
|
||||
command = self.config.get_os_deps_command()
|
||||
cmd_utils.run(command, shell=True, print_cmd=True)
|
||||
|
||||
if env_vars_set:
|
||||
print(f"To load env vars, run: source {mac.SHELL_RC}")
|
||||
|
||||
def linux(self):
|
||||
"""Installs dependencies on Linux."""
|
||||
import lib.linux as linux
|
||||
|
||||
distro, distro_like, _distro_version = env.get_linux_distro()
|
||||
if not distro:
|
||||
raise RuntimeError("Unable to detect Linux distro")
|
||||
|
||||
command_pre = self.config.get_os_deps_command_pre(
|
||||
linux_distro=distro, required=False
|
||||
)
|
||||
if command_pre:
|
||||
print("Running dependencies prerequisites command")
|
||||
|
||||
check = True
|
||||
if distro == "fedora" or (distro_like and "fedora" in distro_like):
|
||||
print(
|
||||
"Fedora-like detected, "
|
||||
"ignoring return code on dependencies prerequisites command"
|
||||
)
|
||||
# On Fedora-like, dnf update returns code 100 when updates are available.
|
||||
check = False
|
||||
|
||||
linux.run_command(command_pre, check)
|
||||
|
||||
command = self.config.get_os_deps_command(linux_distro=distro)
|
||||
optional = self.config.get_os_deps_value(
|
||||
"optional", linux_distro=distro, required=False
|
||||
)
|
||||
for optional_package in optional or []:
|
||||
if not linux.is_package_available(optional_package):
|
||||
print(f"Optional package not found, stripping: {optional_package}")
|
||||
command = command.replace(optional_package, "")
|
||||
|
||||
linux.run_command(command, check=True)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@ -1,78 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
SUDO=$(which sudo > /dev/null 2>&1 && echo "sudo" || echo "")
|
||||
|
||||
install_deps() {
|
||||
uname_out="$(uname -s)"
|
||||
case "${uname_out}" in
|
||||
FreeBSD*) install_freebsd ;;
|
||||
OpenBSD*) install_openbsd ;;
|
||||
NetBSD*) install_netbsd ;;
|
||||
DragonFly*) install_dragonfly ;;
|
||||
SunOS*) install_solaris ;;
|
||||
*) install_other $@ ;;
|
||||
esac
|
||||
}
|
||||
|
||||
install_freebsd() {
|
||||
run_cmd pkg install -y \
|
||||
cmake \
|
||||
ninja \
|
||||
gmake \
|
||||
gcc10 \
|
||||
openssl \
|
||||
glib \
|
||||
gdk-pixbuf2 \
|
||||
libX11 \
|
||||
libXtst \
|
||||
libnotify \
|
||||
libxkbfile \
|
||||
qt6-base \
|
||||
qt6-tools \
|
||||
gtk3 \
|
||||
googletest \
|
||||
pugixml \
|
||||
tomlplusplus \
|
||||
cli11
|
||||
}
|
||||
|
||||
install_openbsd() {
|
||||
# Patches welcome!
|
||||
# pkg_add error:
|
||||
# Can't find libX11
|
||||
# Can't find libXtst
|
||||
echo "Sorry, OpenBSD is not supported yet."
|
||||
}
|
||||
|
||||
install_netbsd() {
|
||||
# Patches welcome!
|
||||
# pkg_add error:
|
||||
# pkg_add: no pkg found for 'libX11', sorry.
|
||||
# pkg_add: no pkg found for 'libXtst', sorry.
|
||||
echo "Sorry, NetBSD is not supported yet."
|
||||
}
|
||||
|
||||
install_dragonfly() {
|
||||
# Patches welcome!
|
||||
# The C++ version on DragonFly BSD seems to be too old.
|
||||
echo "Sorry, DragonFly BSD is not supported yet."
|
||||
}
|
||||
|
||||
install_solaris() {
|
||||
# Patches welcome!
|
||||
echo "Sorry, Solaris is not supported yet."
|
||||
}
|
||||
|
||||
install_other() {
|
||||
# TODO: Port the .py script to shell script to make the deps installation lighter on
|
||||
# Linux and macOS. The .py script is probably only really needed to deal with Windows.
|
||||
./scripts/install_deps.py $@
|
||||
}
|
||||
|
||||
run_cmd() {
|
||||
cmd="${SUDO:+$SUDO }$@"
|
||||
echo "Running: $cmd"
|
||||
$cmd
|
||||
}
|
||||
|
||||
install_deps $@
|
||||
@ -1,129 +0,0 @@
|
||||
# Deskflow -- mouse and keyboard sharing utility
|
||||
# Copyright (C) 2024 Symless Ltd.
|
||||
#
|
||||
# This package is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# found in the file LICENSE that should have accompanied this file.
|
||||
#
|
||||
# This package is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import yaml
|
||||
import lib.env as env
|
||||
import lib.cmd_utils as cmd_utils
|
||||
|
||||
config_file = "config.yaml"
|
||||
root_key = "config"
|
||||
deps_key = "dependencies"
|
||||
command_key = "command"
|
||||
command_pre_key = "command-pre"
|
||||
subprojects_key = "subprojects"
|
||||
arrow = " ➤ "
|
||||
|
||||
|
||||
class ConfigKeyError(RuntimeError):
|
||||
def __init__(self, config_file, key):
|
||||
self.config_file = config_file
|
||||
self.key = key
|
||||
|
||||
def __str__(self):
|
||||
return f"Not found in {self.config_file}: {self.key}"
|
||||
|
||||
|
||||
def _get(dict, key, key_parent=None, required=True):
|
||||
value = dict.get(key)
|
||||
|
||||
if required and not value:
|
||||
key_path = f"{root_key}{arrow}{key_parent}{arrow}{key}" if key_parent else key
|
||||
raise ConfigKeyError(config_file, key_path)
|
||||
|
||||
return value
|
||||
|
||||
|
||||
class Config:
|
||||
"""Reads the project configuration YAML file."""
|
||||
|
||||
def __init__(self):
|
||||
|
||||
with open(config_file, "r") as f:
|
||||
data = yaml.safe_load(f)
|
||||
|
||||
self.os_name = env.get_os()
|
||||
|
||||
print("Config for OS:", self.os_name)
|
||||
self.root = _get(data, root_key)
|
||||
self.os = _get(self.root, self.os_name)
|
||||
|
||||
def get_os_value(self, key, required=True, linux_distro=None):
|
||||
if linux_distro:
|
||||
# recurse with the linux distro as the key parameter to get the base distro key.
|
||||
distro = self.get_os_value(key=linux_distro)
|
||||
return _get(distro, key, f"{self.os_name}{arrow}{linux_distro}", required)
|
||||
else:
|
||||
return _get(self.os, key, self.os_name, required)
|
||||
|
||||
def get_qt_config(self):
|
||||
qt_key = "qt"
|
||||
qt = self.get_os_deps_value(qt_key)
|
||||
|
||||
parent_key = f"{self.os_name}{arrow}{deps_key}"
|
||||
mirror_url = _get(qt, "mirror", parent_key)
|
||||
version = _get(qt, "version", parent_key)
|
||||
base_dir = _get(qt, "base-dir", parent_key)
|
||||
modules = _get(qt, "modules", parent_key, required=False)
|
||||
|
||||
return mirror_url, version, base_dir, modules
|
||||
|
||||
def get_os_deps_value(self, key, required=True, linux_distro=None):
|
||||
deps = self.get_os_value(deps_key, required, linux_distro)
|
||||
if linux_distro:
|
||||
key_parent = f"{self.os_name}{arrow}{linux_distro}{arrow}{deps_key}"
|
||||
else:
|
||||
key_parent = f"{self.os_name}{arrow}{deps_key}"
|
||||
return _get(deps, key, key_parent, required)
|
||||
|
||||
def get_os_deps_command(self, key=command_key, required=True, linux_distro=None):
|
||||
command = self.get_os_deps_value(key, required, linux_distro)
|
||||
if command:
|
||||
return cmd_utils.strip_continuation_sequences(command)
|
||||
else:
|
||||
return None
|
||||
|
||||
def get_os_subprojects(self):
|
||||
distro, _distro_like, _distro_version = env.get_linux_distro()
|
||||
return self.get_os_value(subprojects_key, linux_distro=distro, required=False)
|
||||
|
||||
def get_subproject_deps_command(self, subproject_name):
|
||||
subprojects = _get(self.root, subprojects_key)
|
||||
subproject = _get(subprojects, subproject_name, subprojects_key)
|
||||
deps_parent = f"{subprojects_key}{arrow}{subproject_name}"
|
||||
deps = _get(subproject, deps_key, deps_parent)
|
||||
|
||||
if env.is_linux():
|
||||
distro, _distro_like, _distro_version = env.get_linux_distro()
|
||||
if not distro:
|
||||
raise RuntimeError("Unable to detect Linux distro")
|
||||
|
||||
command = _get(deps, distro, f"{deps_parent}{arrow}{deps_key}")
|
||||
else:
|
||||
command = _get(deps, self.os_name, f"{deps_parent}{arrow}{deps_key}")
|
||||
|
||||
return cmd_utils.strip_continuation_sequences(command)
|
||||
|
||||
def get_os_deps_command_pre(self, required=True, linux_distro=None):
|
||||
return self.get_os_deps_command(command_pre_key, required, linux_distro)
|
||||
|
||||
def get_windows_ci_config(self):
|
||||
choco_ci_key = "ci"
|
||||
choco_ci = self.get_os_deps_value(choco_ci_key)
|
||||
|
||||
choco_ci_path = f"{self.os_name}{arrow}{deps_key}{arrow}{choco_ci_key}"
|
||||
edit_config = _get(choco_ci, "edit-config", choco_ci_path)
|
||||
skip_packages = _get(choco_ci, "skip-packages", choco_ci_path)
|
||||
|
||||
return edit_config, skip_packages
|
||||
@ -1,88 +0,0 @@
|
||||
# Deskflow -- mouse and keyboard sharing utility
|
||||
# Copyright (C) 2024 Symless Ltd.
|
||||
#
|
||||
# This package is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# found in the file LICENSE that should have accompanied this file.
|
||||
#
|
||||
# This package is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os, sys
|
||||
import lib.cmd_utils as cmd_utils
|
||||
import glob
|
||||
|
||||
|
||||
class Qt:
|
||||
def __init__(
|
||||
self, mirror_url, version, base_dir, modules, os_name, compiler, tool_dir
|
||||
):
|
||||
self.mirror_url = mirror_url
|
||||
self.version = version
|
||||
self.base_dir = base_dir
|
||||
self.modules = modules
|
||||
self.os_name = os_name
|
||||
self.compiler = compiler
|
||||
self.tool_dir = tool_dir
|
||||
self.dir_pattern = f"{self.base_dir}{os.sep}{self.version}*/{self.tool_dir}"
|
||||
|
||||
def get_install_dir(self):
|
||||
match = glob.glob(self.dir_pattern)
|
||||
return os.path.abspath(match[0]) if match else None
|
||||
|
||||
def install(self):
|
||||
"""Install Qt."""
|
||||
|
||||
if self.get_install_dir():
|
||||
print(f"Skipping Qt, already installed at: {self.dir_pattern}")
|
||||
return
|
||||
|
||||
args = [sys.executable, "-m", "aqt", "install-qt"]
|
||||
args.extend(["--outputdir", self.base_dir])
|
||||
args.extend(["--base", self.mirror_url])
|
||||
args.extend([self.os_name, "desktop", str(self.version), self.compiler])
|
||||
|
||||
if self.modules:
|
||||
args.extend(["-m"] + self.modules)
|
||||
|
||||
print(args)
|
||||
cmd_utils.run(
|
||||
args,
|
||||
print_cmd=True,
|
||||
)
|
||||
|
||||
if not self.get_install_dir():
|
||||
raise RuntimeError(
|
||||
f"Qt was not installed, path not found: {self.dir_pattern}"
|
||||
)
|
||||
|
||||
|
||||
class WindowsQt(Qt):
|
||||
def __init__(self, mirror_url, version, base_dir, modules):
|
||||
super().__init__(
|
||||
mirror_url,
|
||||
version,
|
||||
base_dir,
|
||||
modules,
|
||||
"windows",
|
||||
"win64_msvc2019_64",
|
||||
"msvc2019_64",
|
||||
)
|
||||
|
||||
|
||||
class MacQt(Qt):
|
||||
def __init__(self, mirror_url, version, base_dir, modules):
|
||||
super().__init__(
|
||||
mirror_url,
|
||||
version,
|
||||
base_dir,
|
||||
modules,
|
||||
"mac",
|
||||
"clang_64",
|
||||
"macos",
|
||||
)
|
||||
@ -1,65 +0,0 @@
|
||||
# Deskflow -- mouse and keyboard sharing utility
|
||||
# Copyright (C) 2024 Symless Ltd.
|
||||
#
|
||||
# This package is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# found in the file LICENSE that should have accompanied this file.
|
||||
#
|
||||
# This package is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
import git # type: ignore
|
||||
import lib.env as env
|
||||
import lib.cmd_utils as cmd_utils
|
||||
|
||||
GIT_REPO = "https://github.com/microsoft/vcpkg.git"
|
||||
|
||||
|
||||
def install(ci_env):
|
||||
vcpkg_bin = ensure_vcpkg(ci_env)
|
||||
|
||||
cmd_utils.run([vcpkg_bin, "install"], print_cmd=True)
|
||||
|
||||
|
||||
def ensure_vcpkg(ci_env):
|
||||
# Don't use the local vcpkg if we're in CI, since this makes caching complicated.
|
||||
if not ci_env and cmd_utils.has_command("vcpkg"):
|
||||
print("Using system vcpkg")
|
||||
return "vcpkg"
|
||||
|
||||
if not os.path.exists("vcpkg"):
|
||||
get_vcpkg()
|
||||
else:
|
||||
print("Updating vcpkg...")
|
||||
repo = git.Repo("vcpkg")
|
||||
repo.remotes.origin.pull()
|
||||
|
||||
if env.is_windows():
|
||||
vcpkg_bin = "vcpkg/vcpkg.exe"
|
||||
else:
|
||||
vcpkg_bin = "vcpkg/vcpkg"
|
||||
|
||||
if not os.path.exists(vcpkg_bin):
|
||||
raise RuntimeError(f"Path not found: {vcpkg_bin}")
|
||||
|
||||
return vcpkg_bin
|
||||
|
||||
|
||||
def get_vcpkg():
|
||||
print("Downloading vcpkg...")
|
||||
git.Repo.clone_from(GIT_REPO, "vcpkg")
|
||||
|
||||
os.chdir("vcpkg")
|
||||
try:
|
||||
if env.is_windows():
|
||||
cmd_utils.run("bootstrap-vcpkg.bat", shell=True, print_cmd=True)
|
||||
else:
|
||||
cmd_utils.run("./bootstrap-vcpkg.sh", shell=True, print_cmd=True)
|
||||
finally:
|
||||
os.chdir("..")
|
||||
@ -196,36 +196,6 @@ class WindowsPackager:
|
||||
run_codesign(path, cert_base64, cert_password)
|
||||
|
||||
|
||||
class WindowsChoco:
|
||||
"""Chocolatey for Windows."""
|
||||
|
||||
def ensure_choco_installed(self):
|
||||
if cmd_utils.has_command("choco"):
|
||||
return
|
||||
|
||||
if not cmd_utils.has_command("winget"):
|
||||
print(
|
||||
"The winget command was not found, please install Chocolatey manually",
|
||||
file=sys.stderr,
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
print("The choco command was not found, installing Chocolatey...")
|
||||
cmd_utils.run(
|
||||
"winget install chocolatey",
|
||||
check=False,
|
||||
shell=True,
|
||||
print_cmd=True,
|
||||
)
|
||||
|
||||
if not cmd_utils.has_command("choco"):
|
||||
print(
|
||||
"The choco command was still not found, please re-run this script...",
|
||||
file=sys.stderr,
|
||||
)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
class WindowsService:
|
||||
def __init__(self, script, args):
|
||||
self.script = script
|
||||
|
||||
@ -8,8 +8,7 @@ dependencies = [
|
||||
"python-dotenv",
|
||||
"pyyaml",
|
||||
"dmgbuild; sys_platform == 'darwin'",
|
||||
"aqtinstall; sys_platform == 'win32' or sys_platform == 'darwin'",
|
||||
"colorama",
|
||||
"meson",
|
||||
"gitpython",
|
||||
"psutil",
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user