1
0
mirror of https://gitlab.com/kelteseth/ScreenPlay.git synced 2024-09-18 16:32:33 +02:00
ScreenPlay/Tools/setup.py
Elias Steurer c18bdbb398 Refator universal builds again...
Looks like the earlier solution only
worked if all packages used cmake.
We now simply build vcpkg twice and
combine it into a universal binary. Then
we use this when compiling our universal binary.

Change qt tools installation to only install ifw. We do install things like
cmake, ninja and others via
choco, brew, vcpkg or apt
2023-11-29 08:02:15 +01:00

179 lines
6.4 KiB
Python
Executable File

#!/usr/bin/python3
# SPDX-License-Identifier: LicenseRef-EliasSteurerTachiom OR AGPL-3.0-only
from platform import system
from pathlib import Path
from execute_util import execute
import download_ffmpeg
import defines
import argparse
import util
import macos_make_universal
import datetime
import setup_godot
from sys import stdout
stdout.reconfigure(encoding='utf-8')
class commands_list():
def __init__(self):
self.commands = []
def add(self, command, cwd=".", ignore_error=False, use_shell=True, print_command=True):
self.commands.append({
"command": command,
"cwd": cwd,
"ignore_error": ignore_error,
"use_shell": use_shell,
"print_command": print_command
})
def get_commands(self):
return self.commands
def execute_commands(self):
'''
This function execute all commands added to the list.
'''
for command in self.commands:
# Check if the command if a string.
if isinstance(command["command"], str):
execute(command["command"], command["cwd"], command["ignore_error"],
command["use_shell"], command["print_command"])
else:
# Function call
command["command"]()
def download(aqt_path: Path, qt_platform: Path):
qt_packages = ""
if system() == "Windows":
os = "windows"
elif system() == "Darwin":
os = "mac"
elif system() == "Linux":
qt_packages = "qtwaylandcompositor "
os = "linux"
# Windows: python -m aqt list-qt windows desktop --modules 6.6.0 win64_msvc2019_64
# Linux: python3 -m aqt list-qt linux desktop --modules 6.6.0 gcc_64
qt_packages += "qt3d qtquick3d qtconnectivity qt5compat qtimageformats qtmultimedia qtshadertools qtwebchannel qtwebengine qtwebsockets qtwebview qtpositioning"
print(f"Downloading: {qt_packages} to {aqt_path}")
execute(f"{defines.PYTHON_EXECUTABLE} -m aqt install-qt -O {aqt_path} {os} desktop {defines.QT_VERSION} {qt_platform} -m {qt_packages}")
# Tools can only be installed one at the time:
# see: python -m aqt list-tool windows desktop
tools = ["tools_ifw"]
for tool in tools:
execute(
f"{defines.PYTHON_EXECUTABLE} -m aqt install-tool -O {aqt_path} {os} desktop {tool}")
def setup_qt():
aqt_path = defines.QT_PATH
print(f"Setup Qt via aqt at {aqt_path}")
if system() == "Windows":
qt_platform = "win64_msvc2019_64"
elif system() == "Darwin":
qt_platform = "clang_64"
elif system() == "Linux":
qt_platform = "gcc_64"
qt_base_path = aqt_path.joinpath(defines.QT_VERSION).resolve()
qt_path = qt_base_path.joinpath(qt_platform).resolve()
if not qt_path.exists():
download(aqt_path, qt_platform)
else:
# Betas & RCs are technically the same version. So limit download to x days
days = 30
folder_creation_date: datetime = datetime.datetime.fromtimestamp(
qt_base_path.stat().st_mtime, tz=datetime.timezone.utc)
now: datetime = datetime.datetime.now(tz=datetime.timezone.utc)
two_weeks_ago: datetime = now - datetime.timedelta(days=days)
if (folder_creation_date < two_weeks_ago):
print(
f"qt version at `{qt_base_path}` older than {days} days ({folder_creation_date}), redownload!")
download(aqt_path, qt_platform)
else:
print(f"Qt {defines.QT_VERSION} is up to date and ready ")
def main():
parser = argparse.ArgumentParser(
description='Build and Package ScreenPlay')
parser.add_argument('--skip-aqt', action="store_true", dest="skip_aqt",
help="Downloads QtCreator and needed binaries Windows: C:\\aqt\\nLinux & macOS:~/aqt/.")
args = parser.parse_args()
root_path = Path(util.cd_repo_root_path())
project_source_parent_path = root_path.joinpath("../").resolve()
vcpkg_path = project_source_parent_path.joinpath("vcpkg").resolve()
vcpkg_packages_list = defines.VCPKG_BASE_PACKAGES
if system() != "Darwin":
if not setup_godot.execute():
raise RuntimeError("Unable to download godot")
if not download_ffmpeg.execute():
raise RuntimeError("Unable to download ffmpeg")
if system() == "Windows":
vcpkg_command = "vcpkg.exe"
vcpkg_packages_list.append("infoware[d3d]")
vcpkg_packages_list.append("sentry-native[transport]")
platform_command = commands_list()
platform_command.add("bootstrap-vcpkg.bat", vcpkg_path, False)
vcpkg_triplet = ["x64-windows"]
elif system() == "Darwin":
vcpkg_command = "./vcpkg"
# vcpkg_packages_list.append("infoware[opencl]") does not work with arm
vcpkg_packages_list.append("curl") # Hidden dependency from sentry
platform_command = commands_list()
platform_command.add("chmod +x bootstrap-vcpkg.sh", vcpkg_path)
platform_command.add("./bootstrap-vcpkg.sh", vcpkg_path, False)
platform_command.add("chmod +x vcpkg", vcpkg_path)
vcpkg_triplet = ["x64-osx","arm64-osx"]
elif system() == "Linux":
vcpkg_command = "./vcpkg"
# vcpkg_packages_list.append("infoware[opengl]")
platform_command = commands_list()
platform_command.add("chmod +x bootstrap-vcpkg.sh", vcpkg_path)
platform_command.add("./bootstrap-vcpkg.sh", vcpkg_path, False)
platform_command.add("chmod +x vcpkg", vcpkg_path)
vcpkg_triplet = ["x64-linux"]
else:
raise NotImplementedError("Unknown system: {}".format(system()))
print(f"Clone into {vcpkg_path}")
execute("git clone https://github.com/microsoft/vcpkg vcpkg",
project_source_parent_path, True)
execute("git fetch", vcpkg_path)
execute(f"git checkout {defines.VCPKG_VERSION}", vcpkg_path)
# Setup vcpkg via boostrap script first
platform_command.execute_commands() # Execute platform specific commands.
execute(f"{vcpkg_command} remove --outdated --recurse", vcpkg_path, False)
for triplet in vcpkg_triplet:
vcpkg_packages = " ".join(vcpkg_packages_list)
execute(
f"{vcpkg_command} install {vcpkg_packages} --triplet {triplet} --recurse", vcpkg_path, False)
# Combine x64 and arm
if system() == "Darwin":
macos_make_universal.execute()
if not args.skip_aqt:
setup_qt()
if __name__ == "__main__":
main()