diff --git a/infra/portable/README.md b/infra/portable/README.md index 058fab2b..b2ae6b15 100644 --- a/infra/portable/README.md +++ b/infra/portable/README.md @@ -2,3 +2,7 @@ - This directory contains files and scripts to make portable *.zip* packages of Thorium for Linux and Windows. - Run a script with `--help` to see usage. + - For `make_portable_win.py`, make sure + [7-zip](https://www.7-zip.org/download.html) is installed on the device and + the installation directory of 7-zip needs to be placed in the environment + variable. diff --git a/infra/portable/make_portable_win.py b/infra/portable/make_portable_win.py new file mode 100644 index 00000000..2eb409de --- /dev/null +++ b/infra/portable/make_portable_win.py @@ -0,0 +1,100 @@ +# Copyright (c) 2024 Alex313031 and gz83. + +# This file is the equivalent of make_portable_win.py. + + +import os +import shutil +import subprocess +import sys +import time +import zipfile + + +def fail(msg): + print(f"{sys.argv[0]}: {msg}", file=sys.stderr) + sys.exit(111) + + +def try_run(command): + result = subprocess.run(command, shell=True) + if result.returncode != 0: + fail(f"Failed {command}") + + +def display_help(): + print("\nScript to make a portable Thorium .zip for Windows.\n") + print("\nPlease place the thorium_mini_installer.exe file in this directory before running.\n") + +if '--help' in sys.argv: + display_help() + sys.exit(0) + + +def copy_installer(): + cr_src_dir = os.getenv('CR_DIR', r'C:/src/chromium/src') + src_path = os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium', 'thorium_mini_installer.exe')) + dest_path = os.path.normpath(os.path.join(os.getcwd(), 'thorium_mini_installer.exe')) + + if not os.path.exists(src_path): + fail(f"thorium_mini_installer.exe not found at {src_path}") + + print(f"Copying thorium_mini_installer.exe from {src_path} to {dest_path}...\n") + shutil.copy(src_path, dest_path) + + +def extract_and_copy_files(): + # Extract and copy files + os.makedirs('./temp/USER_DATA', exist_ok=True) + try_run('7z x thorium_mini_installer.exe') + try_run('7z x chrome.7z') + shutil.move('Chrome-bin', './temp/BIN') + shutil.copy('./README.win', './temp/README.txt') + shutil.copy('./THORIUM.BAT', './temp/') + shutil.copy('./THORIUM_SHELL.BAT', './temp/') + +def zip_files(): + # Create zip archive + with zipfile.ZipFile('thorium_portable.zip', 'w', zipfile.ZIP_DEFLATED) as zf: + for root, _, files in os.walk('./temp'): + for file in files: + file_path = os.path.join(root, file) + zf.write(file_path, os.path.relpath(file_path, './temp')) + +def clean_up(): + # Cleanup extracted files + try: + os.remove('chrome.7z') + shutil.rmtree('temp') + except FileNotFoundError: + pass + +def main(): + + print("\nNOTE: You must place the thorium .exe file in this directory before running.") + print(" AND you must have 7-Zip installed and in your PATH.") + print(" Make sure to rename the .zip properly as per the release instructions.") + print(" AND make sure to edit the THORIUM_SHELL.BAT to match the version number of this release.\n") + + copy_installer() + + input("Press Enter to continue or Ctrl + C to abort.") + + print("Extracting & Copying files from thorium .exe file...\n") + time.sleep(2) + + extract_and_copy_files() + + print("\nZipping up...\n") + zip_files() + + print("\nCleaning up...\n") + time.sleep(2) + + clean_up() + + print("\nDone! Zip is at ./thorium_portable.zip") + print("Remember to rename it with the version before distributing it.\n") + +if __name__ == "__main__": + main() diff --git a/win_scripts/README.md b/win_scripts/README.md index 28d9d398..bc78ec19 100644 --- a/win_scripts/README.md +++ b/win_scripts/README.md @@ -2,8 +2,6 @@ -This directory contains batch files for building Thorium natively on Windows. +This directory contains python files for building Thorium natively on Windows. -The "bin" subdirectory contains useful "aliases" for cmd.exe. One can copy this folder somewhere or leave it where it is and then add it to your PATH. - -Also recommended is Clink > https://mridgers.github.io/clink/ +Before running the Python files in this directory, please strictly follow the instructions in [BUILDING_WIN](https://github.com/Alex313031/thorium/blob/main/docs/BUILDING_WIN.md). diff --git a/win_scripts/build_win.py b/win_scripts/build_win.py new file mode 100644 index 00000000..50fcd26a --- /dev/null +++ b/win_scripts/build_win.py @@ -0,0 +1,48 @@ +# Copyright (c) 2024 Alex313031 and gz83. + +# This file is the equivalent of build_win.sh in the parent directory. + +import os +import subprocess +import sys + +# Error handling functions +def fail(msg): + # Print error message and exit + print(f"{sys.argv[0]}: {msg}", file=sys.stderr) + sys.exit(111) + + +def try_run(command): + if subprocess.call(command, shell=True) != 0: + fail(f"Failed {command}") + + +# Help function +def display_help(): + print("\nScript to build Thorium for Windows.\n") + print("Usage: python win_scripts\build_win.py # (where # is number of jobs)\n") + +if '--help' in sys.argv: + display_help() + sys.exit(0) + + +# Set chromium/src dir from Windows environment variable +cr_src_dir = os.getenv('CR_DIR', r'C:/src/chromium/src') + +print("\nBuilding Thorium for Windows\n") + +# Change directory and run build commands +os.chdir(cr_src_dir) +# Determine the number of threads to use +jobs = sys.argv[1] if len(sys.argv) > 1 else str(os.cpu_count()) + +try_run(f'autoninja -C out/thorium thorium_all -j{jobs}') + +# Move the installer +installer_src = os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium', 'mini_installer.exe')) +installer_dest = os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium', 'thorium_mini_installer.exe')) +os.rename(installer_src, installer_dest) + +print(f"Build Completed. Installer at '{installer_dest}'") diff --git a/win_scripts/clean.py b/win_scripts/clean.py new file mode 100644 index 00000000..b7ddc630 --- /dev/null +++ b/win_scripts/clean.py @@ -0,0 +1,64 @@ +# Copyright (c) 2024 Alex313031 and gz83. + +""" +This file is the equivalent of clean.sh in the parent directory, but it directly +deletes //out/thorium and unneeded PGO files. +""" + +import os +import shutil +import sys +import subprocess + +def fail(msg): + print(f"{sys.argv[0]}: {msg}", file=sys.stderr) + sys.exit(111) + + +def try_run(command): + try: + subprocess.run(command, shell=True, check=True) + except subprocess.CalledProcessError: + fail(f"Failed {command}") + + +def clean_files(directory): + for filename in os.listdir(directory): + file_path = os.path.join(directory, filename) + if os.path.isfile(file_path): + try: + os.remove(file_path) + print(f"Removed: {file_path}") + except Exception as e: + fail(f"Failed to remove {file_path}: {e}") + + +def delete_directory(directory): + if os.path.exists(directory): + try: + shutil.rmtree(directory) + print(f"Removed directory: {directory}") + except Exception as e: + fail(f"Failed to remove directory {directory}: {e}") + + +def display_help(): + print("\nScript to remove unneeded artifacts\n") + +if '--help' in sys.argv: + display_help() + sys.exit(0) + + +# Set chromium/src dir from Windows environment variable +cr_src_dir = os.getenv('CR_DIR', r'C:/src/chromium/src') + +print("\nCleaning up unneeded artifacts\n") + +profiles_dir = os.path.normpath(os.path.join(cr_src_dir, "chrome", "build", "pgo_profiles")) +clean_files(profiles_dir) + +thorium_dir = os.path.normpath(os.path.join(cr_src_dir, "out", "thorium")) +delete_directory(thorium_dir) + +print("\nDone cleaning artifacts\n") diff --git a/win_scripts/bin/c.bat b/win_scripts/old/bin/c.bat similarity index 100% rename from win_scripts/bin/c.bat rename to win_scripts/old/bin/c.bat diff --git a/win_scripts/bin/g.bat b/win_scripts/old/bin/g.bat similarity index 100% rename from win_scripts/bin/g.bat rename to win_scripts/old/bin/g.bat diff --git a/win_scripts/bin/gfetch.bat b/win_scripts/old/bin/gfetch.bat similarity index 100% rename from win_scripts/bin/gfetch.bat rename to win_scripts/old/bin/gfetch.bat diff --git a/win_scripts/bin/gsync.bat b/win_scripts/old/bin/gsync.bat similarity index 100% rename from win_scripts/bin/gsync.bat rename to win_scripts/old/bin/gsync.bat diff --git a/win_scripts/bin/nigw.bat b/win_scripts/old/bin/nigw.bat similarity index 100% rename from win_scripts/bin/nigw.bat rename to win_scripts/old/bin/nigw.bat diff --git a/win_scripts/bin/origin.bat b/win_scripts/old/bin/origin.bat similarity index 100% rename from win_scripts/bin/origin.bat rename to win_scripts/old/bin/origin.bat diff --git a/win_scripts/bin/pgow.bat b/win_scripts/old/bin/pgow.bat similarity index 100% rename from win_scripts/bin/pgow.bat rename to win_scripts/old/bin/pgow.bat diff --git a/win_scripts/bin/rebase.bat b/win_scripts/old/bin/rebase.bat similarity index 100% rename from win_scripts/bin/rebase.bat rename to win_scripts/old/bin/rebase.bat diff --git a/win_scripts/bin/runhooks.bat b/win_scripts/old/bin/runhooks.bat similarity index 100% rename from win_scripts/bin/runhooks.bat rename to win_scripts/old/bin/runhooks.bat diff --git a/win_scripts/build.bat b/win_scripts/old/build.bat similarity index 100% rename from win_scripts/build.bat rename to win_scripts/old/build.bat diff --git a/win_scripts/clean.bat b/win_scripts/old/clean.bat similarity index 100% rename from win_scripts/clean.bat rename to win_scripts/old/clean.bat diff --git a/win_scripts/make_zip.bat b/win_scripts/old/make_zip.bat similarity index 100% rename from win_scripts/make_zip.bat rename to win_scripts/old/make_zip.bat diff --git a/win_scripts/setup.bat b/win_scripts/old/setup.bat similarity index 100% rename from win_scripts/setup.bat rename to win_scripts/old/setup.bat diff --git a/win_scripts/trunk.bat b/win_scripts/old/trunk.bat similarity index 100% rename from win_scripts/trunk.bat rename to win_scripts/old/trunk.bat diff --git a/win_scripts/reset_depot_tools.py b/win_scripts/reset_depot_tools.py new file mode 100644 index 00000000..2e15aa70 --- /dev/null +++ b/win_scripts/reset_depot_tools.py @@ -0,0 +1,88 @@ +# Copyright (c) 2024 Alex313031, midzer and gz83. + +""" +This file is the equivalent of reset_depot_tools.py in the parent folder, but we +do not need to deal with the .vpython_cipd_cache. +This file may prompt "Access denied" and other prompts during the operation, but +in fact it seems that the files we need to delete have been deleted. +""" + +# TODO(gz83): Suppress false positives during operation? + +import os +import shutil +import subprocess +import sys + + +def fail(msg): + print(f"{sys.argv[0]}: {msg}", file=sys.stderr) + sys.exit(111) + + +def try_run(command): + try: + subprocess.run(command, shell=True, check=True) + except subprocess.CalledProcessError: + fail(f"Failed {command}") + + +def remove(item_path): + if os.path.exists(item_path): + if os.path.isdir(item_path): + try: + # Try to unlock and delete the directory + unlock_and_delete(item_path) + print(f"removed '{item_path}'") + except PermissionError as e: + print(f"Failed to remove '{item_path}': {e}") + else: + os.remove(item_path) + print(f"removed '{item_path}'") + + +def unlock_and_delete(path): + """Attempts to unlock and delete a directory using cmd commands.""" + if sys.platform == "win32": + # Use the Windows command line tools to unlock the directory + try: + # Use the command 'del' to delete all files recursively + subprocess.run(f'del /S /Q "{path}\\*"', shell=True, check=True) + # Use the command 'rmdir' to delete the directory + subprocess.run(f'rmdir /S /Q "{path}"', shell=True, check=True) + except subprocess.CalledProcessError as e: + print(f"Failed to unlock and delete directory '{path}' via CMD: {e}") + raise PermissionError(f"Failed to unlock and delete directory '{path}' via CMD: {e}") + else: + # For other platforms, just use shutil.rmtree + shutil.rmtree(path) + + +def display_help(): + print("\nScript to reset depot_tools on Windows.\n") + print("This will remove depot_tools, .gsutil, and .vpython-root") + print("from your disk, and then re-clone depot_tools.") + print("\n") + +if '--help' in sys.argv: + display_help() + sys.exit(0) + + +depot_tools_dir = os.getenv('DEPOT_TOOLS_DIR', r"C:\src\depot_tools") +gsutil_dir = os.path.expandvars(os.getenv('GSUTIL_DIR', r'%USERPROFILE%\.gsutil')) +vpython_root_dir = os.path.expandvars(os.getenv('VPYTHON_ROOT_DIR', r'%LOCALAPPDATA%\.vpython-root')) + +print("\nRemoving depot_tools, etc\n") + +remove(depot_tools_dir) +remove(gsutil_dir) +remove(vpython_root_dir) + +print("\nRe-clone depot_tools\n") + +os.chdir(os.path.dirname(depot_tools_dir)) +try_run(f"git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git") + +print(f"\nCompleted. You can now use the depot_tools installed at: {depot_tools_dir}\n") +print("\nYou can now run trunk.py\n") diff --git a/win_scripts/setup.py b/win_scripts/setup.py new file mode 100644 index 00000000..c52c7fd1 --- /dev/null +++ b/win_scripts/setup.py @@ -0,0 +1,386 @@ +# Copyright (c) 2024 Alex313031 and gz83. + +""" +This file is the equivalent of setup.sh in the parent folder, but only for +Windows builds. +""" + +import os +import shutil +import subprocess +import sys + + +def fail(msg): + # Print error message and exit + print(f"{sys.argv[0]}: {msg}", file=sys.stderr) + sys.exit(111) + + +def try_run(command): + # Execute a command and die on failure + try: + subprocess.run(command, shell=True, check=True) + except subprocess.CalledProcessError: + fail(f"Failed {command}") + + +def copy(src, dst): + # Copy a file and print verbose output like cp -v + try: + print(f"Copying {src} to {dst}") + shutil.copy(src, dst) + except FileNotFoundError as e: + fail(f"File copy failed: {e}") + + +def copy_directory(source_dir, destination_dir): + if not os.path.exists(destination_dir): + os.makedirs(destination_dir) + print(f"Created directory {destination_dir}") + for item in os.listdir(source_dir): + s = os.path.join(source_dir, item) + d = os.path.join(destination_dir, item) + if os.path.isdir(s): + print(f"Copying directory {s} to {d}") + shutil.copytree(s, d, dirs_exist_ok=True) + else: + copy(s, d) + + +# --help +def display_help(): + print("\nScript to copy Thorium source files over the Chromium source tree\n") + print("\nThis should be done AFTER running this setup.py\n") + print("Use the --woa flag for Windows on ARM builds.") + print("Use the --avx512 flag for AVX-512 Builds.") + print("Use the --avx2 flag for AVX2 Builds.") + print("Use the --sse4 flag for SSE4.1 Builds.") + print("Use the --sse3 flag for SSE3 Builds.") + print("Use the --sse2 flag for 32-bit SSE2 Builds.") + print("\n") + +if '--help' in sys.argv: + display_help() + sys.exit(0) + +# Set chromium/src dir from Windows environment variable +cr_src_dir = os.getenv('CR_DIR', r'C:/src/chromium/src') +# Set Thorium dir from Windows environment variable +thor_src_dir = os.path.expandvars(os.getenv('THOR_DIR', r'%USERPROFILE%/thorium')) + + +print("\nCreating build output directory...\n") +os.makedirs(f"{cr_src_dir}/out/thorium/", exist_ok=True) + +print("\nCopying Thorium source files over the Chromium tree\n") + +# Copy libjxl src +copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'thorium-libjxl/src/')), + os.path.normpath(os.path.join(cr_src_dir)) +) + +# Copy src/BUILD.gn +copy( + os.path.normpath(os.path.join(thor_src_dir, 'src', 'BUILD.gn')), + os.path.normpath(os.path.join(cr_src_dir)) +) + +# Copy Thorium sources +thorium_sources = [ + 'src/ash', + 'src/build', + 'src/chrome', + 'src/chromeos', + 'src/components', + 'src/content', + 'src/extensions', + 'src/google_apis', + 'src/media', + 'src/net', + 'src/sandbox', + 'src/services', + 'src/third_party', + 'src/tools', + 'src/ui', + 'src/v8' +] + +for source in thorium_sources: + relative_path = source.replace('src/', '', 1) + copy_directory( + os.path.normpath(os.path.join(thor_src_dir, source)), + os.path.normpath(os.path.join(cr_src_dir, relative_path)) + ) + +copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'thorium_shell')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium')) +) +copy( + os.path.normpath(os.path.join(thor_src_dir, 'pak_src', 'binaries', 'pak')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium')) +) +copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'pak_src', 'binaries', 'pak-win')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium')) +) + + +patches = [ + 'other/fix-policy-templates.patch', + 'other/ftp-support-thorium.patch', + 'other/thorium-2024-ui.patch', +] +for patch in patches: + relative_path = patch.replace('other/', '', 1) + os.path.normpath(os.path.join(cr_src_dir, os.path.dirname(relative_path))) + copy( + os.path.normpath(os.path.join(thor_src_dir, patch)), + os.path.normpath(os.path.join(cr_src_dir, relative_path)) + ) + + +print( "\nPatching FFMPEG for HEVC\n") +copy( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'add-hevc-ffmpeg-decoder-parser.patch')), + os.path.normpath(os.path.join(cr_src_dir, 'third_party', 'ffmpeg')) +) +# Change directory to ffmpeg_dir and run commands +ffmpeg_dir = os.path.join(cr_src_dir, 'third_party', 'ffmpeg') +os.chdir(ffmpeg_dir) +try_run(f'git apply --reject add-hevc-ffmpeg-decoder-parser.patch') + + +print( "\nPatching policy templates\n") +# Change directory to cr_src_dir and run commands +os.chdir(cr_src_dir) +try_run(f'git apply --reject fix-policy-templates.patch') + + +print( "\nPatching FTP support\n") +# Change directory to cr_src_dir and run commands +os.chdir(cr_src_dir) +try_run(f'git apply --reject ftp-support-thorium.patch') + + +print( "\nPatching for Thorium 2024 UI\n") +# Change directory to cr_src_dir and run commands +os.chdir(cr_src_dir) +try_run(f'git apply --reject thorium-2024-ui.patch') + + +if '--woa' not in sys.argv: + print("\nPatching FFMPEG for AC3 & E-AC3\n") + copy( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'ffmpeg_hevc_ac3.patch')), + os.path.normpath(os.path.join(cr_src_dir, 'third_party', 'ffmpeg')) + ) + # Change directory to ffmpeg_dir and run commands + ffmpeg_dir = os.path.join(cr_src_dir, 'third_party', 'ffmpeg') + os.chdir(ffmpeg_dir) + try_run(f'git apply --reject ffmpeg_hevc_ac3.patch') +else: + print("\nSkipping patching FFMPEG for AC3 & E-AC3 due to --woa option.\n") + + +print("\nCopying other files to out/thorium\n") +# Copying additional files +os.makedirs(f"{cr_src_dir}/out/thorium/default_apps", exist_ok=True) +copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'infra', 'default_apps')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium', 'default_apps')) +) +copy( + os.path.normpath(os.path.join(thor_src_dir, 'infra', 'initial_preferences')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium')) +) +copy( + os.path.normpath(os.path.join(thor_src_dir, 'infra', 'thor_ver')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium')) +) + +# Copy Windows on Arm files +def copy_woa(): + print("\nCopying Windows on Arm build files\n") + copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'arm', 'build')), + os.path.normpath(os.path.join(cr_src_dir, 'build')) + ) + copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'arm', 'third_party')), + os.path.normpath(os.path.join(cr_src_dir, 'third_party')) + ) + os.chdir(cr_src_dir) + print("\nDownloading PGO Profiles for Windows on Arm\n") + try_run( + 'python3 tools/update_pgo_profiles.py --target=win-arm64 ' + 'update --gs-url-base=chromium-optimization-profiles/pgo_profiles' + ) + print("\nDownloading PGO Profile for V8\n") + try_run( + 'python3 v8/tools/builtins-pgo/download_profiles.py ' + '--depot-tools=third_party/depot_tools --force download' + ) + + +if '--woa' in sys.argv: + copy_woa() + + +# Copy AVX512 build files +def copy_avx512(): + print("\nCopying AVX-512 build files\n") + copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'AVX512', 'build')), + os.path.normpath(os.path.join(cr_src_dir, 'build')) + ) + copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'AVX512', 'third_party')), + os.path.normpath(os.path.join(cr_src_dir, 'third_party')) + ) + copy( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'AVX512', 'thor_ver')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium')) + ) + os.chdir(cr_src_dir) + print("\nDownloading PGO Profiles for Windows x64\n") + try_run( + 'python3 tools/update_pgo_profiles.py --target=win64 ' + 'update --gs-url-base=chromium-optimization-profiles/pgo_profiles' + ) + print("\nDownloading PGO Profile for V8\n") + try_run( + 'python3 v8/tools/builtins-pgo/download_profiles.py ' + '--depot-tools=third_party/depot_tools --force download' + ) + + +if '--avx512' in sys.argv: + copy_avx512() + + +# Copy AVX2 build files +def copy_avx2(): + print("\nCopying AVX2 build files\n") + copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'AVX2', 'build')), + os.path.normpath(os.path.join(cr_src_dir, 'build')) + ) + copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'AVX2', 'third_party')), + os.path.normpath(os.path.join(cr_src_dir, 'third_party')) + ) + copy( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'AVX2', 'thor_ver')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium')) + ) + os.chdir(cr_src_dir) + print("\nDownloading PGO Profiles for Windows x64\n") + try_run( + 'python3 tools/update_pgo_profiles.py --target=win64 ' + 'update --gs-url-base=chromium-optimization-profiles/pgo_profiles' + ) + print("\nDownloading PGO Profile for V8\n") + try_run( + 'python3 v8/tools/builtins-pgo/download_profiles.py ' + '--depot-tools=third_party/depot_tools --force download' + ) + + +if '--avx2' in sys.argv: + copy_avx2() + + +# Copy SSE4.1 build files +def copy_sse4(): + print("\nCopying SSE4.1 build files\n") + copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'SSE4.1', 'build')), + os.path.normpath(os.path.join(cr_src_dir, 'build')) + ) + copy( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'SSE4.1', 'thor_ver')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium')) + ) + os.chdir(cr_src_dir) + print("\nDownloading PGO Profiles for Windows x64\n") + try_run( + 'python3 tools/update_pgo_profiles.py --target=win64 ' + 'update --gs-url-base=chromium-optimization-profiles/pgo_profiles' + ) + print("\nDownloading PGO Profile for V8\n") + try_run( + 'python3 v8/tools/builtins-pgo/download_profiles.py ' + '--depot-tools=third_party/depot_tools --force download' + ) + + +if '--sse4' in sys.argv: + copy_sse4() + + +# Copy SSE3 build files +def copy_sse3(): + print("\nCopying SSE3 build files\n") + copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'SSE3', 'build')), + os.path.normpath(os.path.join(cr_src_dir, 'build')) + ) + copy( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'SSE3', 'thor_ver')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium')) + ) + os.chdir(cr_src_dir) + print("\nDownloading PGO Profiles for Windows x64\n") + try_run( + 'python3 tools/update_pgo_profiles.py --target=win64 ' + 'update --gs-url-base=chromium-optimization-profiles/pgo_profiles' + ) + print("\nDownloading PGO Profiles for Windows x86\n") + try_run( + 'python3 tools/update_pgo_profiles.py --target=win32 ' + 'update --gs-url-base=chromium-optimization-profiles/pgo_profiles' + ) + print("\nDownloading PGO Profile for V8\n") + try_run( + 'python3 v8/tools/builtins-pgo/download_profiles.py ' + '--depot-tools=third_party/depot_tools --force download' + ) + + +if '--sse3' in sys.argv: + copy_sse3() + + +# Copy SSE2 build files +def copy_sse2(): + print("\nCopying SSE2 build files\n") + copy_directory( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'SSE2', 'build')), + os.path.normpath(os.path.join(cr_src_dir, 'build')) + ) + copy( + os.path.normpath(os.path.join(thor_src_dir, 'other', 'SSE2', 'thor_ver')), + os.path.normpath(os.path.join(cr_src_dir, 'out', 'thorium')) + ) + os.chdir(cr_src_dir) + print("\nDownloading PGO Profiles for Windows x86\n") + try_run( + 'python3 tools/update_pgo_profiles.py --target=win32 ' + 'update --gs-url-base=chromium-optimization-profiles/pgo_profiles' + ) + print("\nDownloading PGO Profile for V8\n") + try_run( + 'python3 v8/tools/builtins-pgo/download_profiles.py ' + '--depot-tools=third_party/depot_tools --force download' + ) + + +if '--sse2' in sys.argv: + copy_sse2() + + +print("\nDone!\n") +print("\nEnjoy Thorium!\n") diff --git a/win_scripts/tot.py b/win_scripts/tot.py new file mode 100644 index 00000000..c9fc401d --- /dev/null +++ b/win_scripts/tot.py @@ -0,0 +1,74 @@ +# Copyright (c) 2024 Alex313031 and gz83. + +""" +This file is used to sync commits in Chromium's Tip-of-tree branch and does not +contain any Thorium-specific files. +""" + + +import os +import subprocess +import sys + + +# Error handling function +def fail(msg): + # Print error message and exit + print(f"{sys.argv[0]}: {msg}", file=sys.stderr) + sys.exit(111) + + +def try_run(command): + # Execute a command and die on failure + try: + subprocess.run(command, shell=True, check=True) + except subprocess.CalledProcessError: + fail(f"Failed {command}") + + +# --help +def display_help(): + print(f"\nScript to Rebase/Sync Chromium repo to Tip of Tree.\n") + +if '--help' in sys.argv: + display_help() + sys.exit(0) + + +# Set chromium/src dir from Windows environment variable +cr_src_dir = os.getenv('CR_DIR', r'C:/src/chromium/src') + + +def main(): + + print("\nScript to Rebase/Sync Chromium repo to Tip of Tree.\n") + print( + f"Rebasing/Syncing to `origin/main` and running hooks in {cr_src_dir}\n" + ) + + # Change directory to cr_src_dir and run commands + os.chdir(cr_src_dir) + + # Commands to run + commands = [ + 'cd v8 && git restore . && git clean -ffd', + 'cd third_party/devtools-frontend/src && git restore . && git clean -ffd', + 'cd third_party/ffmpeg && git restore . && git clean -ffd', + 'git checkout -f origin/main', + 'git clean -ffd', + 'git rebase-update', + 'git fetch --tags', + 'gclient sync --with_branch_heads --with_tags -f -R -D', + 'git clean -ffd', + 'gclient runhooks' + ] + + # Run each command with error handling + for cmd in commands: + try_run(cmd) + + print("\nDone!\n") + + +if __name__ == "__main__": + main() diff --git a/win_scripts/trunk.py b/win_scripts/trunk.py new file mode 100644 index 00000000..e863f1f0 --- /dev/null +++ b/win_scripts/trunk.py @@ -0,0 +1,85 @@ +# Copyright (c) 2024 Alex313031, midzer and gz83. + +""" +This file is the equivalent of trunk.sh in the parent folder, but for native +builds on Windows, we do not need to deal with the vs artifacts hash. +""" + +import os +import shutil +import subprocess +import sys + + +def fail(msg): + # Print error message and exit + print(f"{sys.argv[0]}: {msg}", file=sys.stderr) + sys.exit(111) + + +def try_run(command): + # Execute a command and exit on failure + try: + subprocess.run(command, shell=True, check=True) + except subprocess.CalledProcessError: + fail(f"Failed {command}") + + +def safe_rmtree(path): + # Remove a directory if it exists + path = os.path.normpath(path) + if os.path.exists(path): + print(f"Removing: {path}") + shutil.rmtree(path) + + +# --help +def display_help(): + print(f"\nScript to Rebase/Sync the Chromium repo.\n") + +if '--help' in sys.argv: + display_help() + sys.exit(0) + + +# Set chromium/src dir from Windows environment variable +cr_src_dir = os.getenv('CR_DIR', r'C:/src/chromium/src') +# Thorium-specific directory that need to be deleted +pak_dir = os.path.normpath(os.path.join(cr_src_dir, "third_party", "pak")) + + +def main(): + + print("\nScript to Rebase/Sync the Chromium repo.\n") + print(f"Rebasing/Syncing and running hooks in {cr_src_dir}\n") + + # Change directory to cr_src_dir and run commands + os.chdir(cr_src_dir) + + # Remove Thorium-specific directory if it exists + safe_rmtree(pak_dir) + + # Commands to run + commands = [ + 'cd v8 && git restore . && git clean -ffd', + 'cd third_party/devtools-frontend/src && git restore . && git clean -ffd', + 'cd third_party/ffmpeg && git restore . && git clean -ffd', + 'git checkout -f origin/main', + 'git clean -ffd', + 'git clean -ffd', + 'git rebase-update', + 'git fetch --tags', + 'gclient sync --with_branch_heads --with_tags -f -R -D', + 'git clean -ffd', + 'gclient runhooks' + ] + + # Run each command with error handling + for cmd in commands: + try_run(cmd) + + print("\nDone! You can now run version.py.\n") + + +if __name__ == "__main__": + main() diff --git a/win_scripts/upstream_version.py b/win_scripts/upstream_version.py new file mode 100644 index 00000000..b88e0c94 --- /dev/null +++ b/win_scripts/upstream_version.py @@ -0,0 +1,70 @@ +# Copyright (c) 2024 Alex313031 and gz83. + +""" +This file is the equivalent of upstream_version.sh in the parent folder, but for native +builds on Windows, we do not need to deal with the vs artifacts hash and linux +sysroot. At the same time, download only the PGO file for win64. +""" + +import os +import shutil +import subprocess +import sys + + +def fail(msg): + # Print error message and exit + print(f"{sys.argv[0]}: {msg}", file=sys.stderr) + sys.exit(111) + + +def try_run(command): + # Execute a command and die on failure + try: + subprocess.run(command, shell=True, check=True) + except subprocess.CalledProcessError: + fail(f"Failed {command}") + + +# --help +def display_help(): + print(f"\nScript to check out Chromium tag of current Thorium version.\n") + print(f"\nNOTE: You may need to run trunk.py before using this script\n") + +if '--help' in sys.argv: + display_help() + sys.exit(0) + + +# Set chromium/src dir from Windows environment variable +cr_src_dir = os.getenv('CR_DIR', r'C:/src/chromium/src') + + +# Set cr_ver +cr_ver = "128.0.6613.194" + + +print(f"\nCurrent Chromium version is: {cr_ver}\n") +print(f"\nNOTE: Checking out tags/{cr_ver} in {cr_src_dir}\n") + +# Change directory to cr_src_dir and run commands +os.chdir(cr_src_dir) + +try_run(f'git checkout -f tags/{cr_ver}') + +# Commands to run +commands = [ + 'git clean -ffd', + 'git clean -ffd', + 'gclient sync --with_branch_heads --with_tags -f -R -D', + 'gclient runhooks', +] + +# Run each command with error handling +for cmd in commands: + try_run(cmd) + + +print(f"\nChromium tree is checked out at tag: {cr_ver}\n") + +print("\nDone!\n") diff --git a/win_scripts/version.py b/win_scripts/version.py new file mode 100644 index 00000000..29d38dde --- /dev/null +++ b/win_scripts/version.py @@ -0,0 +1,94 @@ +# Copyright (c) 2024 Alex313031 and gz83. + +""" +This file is the equivalent of version.sh in the parent folder, but for native +builds on Windows, we do not need to deal with the vs artifacts hash and linux +sysroot. At the same time, download only the PGO file for win64. +""" + +import os +import shutil +import subprocess +import sys + + +def fail(msg): + # Print error message and exit + print(f"{sys.argv[0]}: {msg}", file=sys.stderr) + sys.exit(111) + + +def try_run(command): + # Execute a command and die on failure + try: + subprocess.run(command, shell=True, check=True) + except subprocess.CalledProcessError: + fail(f"Failed {command}") + + +def copy(src, dst): + # Copy a file and print verbose output like cp -v + try: + print(f"Copying {src} to {dst}") + shutil.copy(src, dst) + except FileNotFoundError as e: + fail(f"File copy failed: {e}") + + +# --help +def display_help(): + print(f"\nScript to check out Chromium tag of current Thorium version.\n") + print(f"\nNOTE: You may need to run trunk.py before using this script\n") + +if '--help' in sys.argv: + display_help() + sys.exit(0) + + +# Set chromium/src dir from Windows environment variable +cr_src_dir = os.getenv('CR_DIR', r'C:/src/chromium/src') +# Set Thorium dir from Windows environment variable +thor_src_dir = os.path.expandvars(os.getenv('THOR_DIR', r'%USERPROFILE%/thorium')) + + +# Set thor_ver +thor_ver = "128.0.6613.194" + + +print(f"\nCurrent Thorium version is: {thor_ver}\n") +print(f"\nNOTE: Checking out tags/{thor_ver} in {cr_src_dir}\n") + +# Change directory to cr_src_dir and run commands +os.chdir(cr_src_dir) + +try_run(f'git checkout -f tags/{thor_ver}') + +# Copy files using shutil +copy( + os.path.normpath(os.path.join(thor_src_dir, 'thorium-libjxl/src/DEPS')), + os.path.normpath(os.path.join(cr_src_dir, 'DEPS')) +) +copy( + os.path.normpath(os.path.join(thor_src_dir, 'thorium-libjxl/src/.gitmodules')), + os.path.normpath(os.path.join(cr_src_dir, '.gitmodules')) +) +copy( + os.path.normpath(os.path.join(thor_src_dir, 'thorium-libjxl/src/third_party/.gitignore')), + os.path.normpath(os.path.join(cr_src_dir, 'third_party/.gitignore')) +) + +# Commands to run +commands = [ + 'git clean -ffd', + 'git clean -ffd', + 'gclient sync --with_branch_heads --with_tags -f -R -D', + 'gclient runhooks', +] + +# Run each command with error handling +for cmd in commands: + try_run(cmd) + +print(f"\nChromium tree is checked out at tag: {thor_ver}\n") + +print("\nDone! You can now run setup.py\n")