From 099003b2500474b0828029ed3cea1bb3bab2584c Mon Sep 17 00:00:00 2001 From: Nikita Khromov Date: Wed, 15 Oct 2025 18:11:05 +0700 Subject: [PATCH 01/19] [jsdoc] Fix paths --- .../sdkjs_common/jsdoc/office-api/generate_docs_json.py | 5 ++++- scripts/sdkjs_common/jsdoc/office-api/generate_docs_md.py | 8 +++++++- .../jsdoc/office-api/generate_jsonl_dataset.py | 8 ++++++-- .../jsdoc/plugins/generate_docs_events_json.py | 5 ++++- .../sdkjs_common/jsdoc/plugins/generate_docs_events_md.py | 7 ++++++- .../jsdoc/plugins/generate_docs_methods_json.py | 5 ++++- .../jsdoc/plugins/generate_docs_methods_md.py | 7 ++++++- 7 files changed, 37 insertions(+), 8 deletions(-) diff --git a/scripts/sdkjs_common/jsdoc/office-api/generate_docs_json.py b/scripts/sdkjs_common/jsdoc/office-api/generate_docs_json.py index b175a44..b9cc080 100644 --- a/scripts/sdkjs_common/jsdoc/office-api/generate_docs_json.py +++ b/scripts/sdkjs_common/jsdoc/office-api/generate_docs_json.py @@ -5,7 +5,8 @@ import argparse import re import platform -root = '../../../../..' +script_path = os.path.abspath(__file__) +root = os.path.abspath(os.path.join(os.path.dirname(script_path), '../../../../..')) # Configuration files configs = [ @@ -23,6 +24,8 @@ editors_maps = { } def generate(output_dir, md=False): + os.chdir(os.path.dirname(script_path)) + if not os.path.exists(output_dir): os.makedirs(output_dir) diff --git a/scripts/sdkjs_common/jsdoc/office-api/generate_docs_md.py b/scripts/sdkjs_common/jsdoc/office-api/generate_docs_md.py index cafc8d2..6c5fc36 100644 --- a/scripts/sdkjs_common/jsdoc/office-api/generate_docs_md.py +++ b/scripts/sdkjs_common/jsdoc/office-api/generate_docs_md.py @@ -13,6 +13,10 @@ editors = { "forms": "form-api" } + +script_path = os.path.abspath(__file__) +root = os.path.abspath(os.path.join(os.path.dirname(script_path), '../../../../..')) + missing_examples = [] used_enumerations = set() @@ -550,6 +554,8 @@ def process_doclets(data, output_dir, editor_name): missing_examples.append(os.path.relpath(enum_file_path, output_dir)) def generate(output_dir): + os.chdir(os.path.dirname(script_path)) + print('Generating Markdown documentation...') generate_docs_json.generate(output_dir + 'tmp_json', md=True) @@ -576,7 +582,7 @@ if __name__ == "__main__": type=str, help="Destination directory for the generated documentation", nargs='?', # Indicates the argument is optional - default="../../../../../api.onlyoffice.com/site/docs/office-api/usage-api/" # Default value + default=f"{root}/api.onlyoffice.com/site/docs/office-api/usage-api/" # Default value ) args = parser.parse_args() generate(args.destination) diff --git a/scripts/sdkjs_common/jsdoc/office-api/generate_jsonl_dataset.py b/scripts/sdkjs_common/jsdoc/office-api/generate_jsonl_dataset.py index 5187d0d..ccad596 100644 --- a/scripts/sdkjs_common/jsdoc/office-api/generate_jsonl_dataset.py +++ b/scripts/sdkjs_common/jsdoc/office-api/generate_jsonl_dataset.py @@ -21,7 +21,9 @@ editors_names = { "forms": "Forms" } -root = '../../../../..' +script_path = os.path.abspath(__file__) +root = os.path.abspath(os.path.join(os.path.dirname(script_path), '../../../../..')) + missing_examples = [] def load_json(file_path): @@ -199,6 +201,8 @@ def process_doclets(doclets, output_entries, editor_name, model): output_entries.append(create_entry(system_message, comment, assistant_message, model)) def generate(output_dir, model): + os.chdir(os.path.dirname(script_path)) + print('Generating documentation JSONL dataset...') shutil.rmtree(output_dir, ignore_errors=True) @@ -228,7 +232,7 @@ if __name__ == "__main__": type=str, help="Destination directory for the generated documentation", nargs='?', # Indicates the argument is optional - default="../../../../../office-js-api/dataset" # Default value + default=f"{root}/office-js-api/dataset" # Default value ) parser.add_argument( "model", diff --git a/scripts/sdkjs_common/jsdoc/plugins/generate_docs_events_json.py b/scripts/sdkjs_common/jsdoc/plugins/generate_docs_events_json.py index 850aa14..7e6702f 100644 --- a/scripts/sdkjs_common/jsdoc/plugins/generate_docs_events_json.py +++ b/scripts/sdkjs_common/jsdoc/plugins/generate_docs_events_json.py @@ -13,9 +13,12 @@ configs = [ "./config/events/forms.json" ] -root = '../../../../..' +script_path = os.path.abspath(__file__) +root = os.path.abspath(os.path.join(os.path.dirname(script_path), '../../../../..')) def generate(output_dir, md=False): + os.chdir(os.path.dirname(script_path)) + if not os.path.exists(output_dir): os.makedirs(output_dir) diff --git a/scripts/sdkjs_common/jsdoc/plugins/generate_docs_events_md.py b/scripts/sdkjs_common/jsdoc/plugins/generate_docs_events_md.py index 12e0299..4140cea 100644 --- a/scripts/sdkjs_common/jsdoc/plugins/generate_docs_events_md.py +++ b/scripts/sdkjs_common/jsdoc/plugins/generate_docs_events_md.py @@ -14,6 +14,9 @@ editors = { "forms": "form-api" } +script_path = os.path.abspath(__file__) +root = os.path.abspath(os.path.join(os.path.dirname(script_path), '../../../../..')) + missing_examples = [] used_enumerations = set() @@ -372,6 +375,8 @@ def process_events(data, editor_dir): write_markdown_file(os.path.join(events_dir, "Events.md"), generate_events_summary(events)) def generate_events(output_dir): + os.chdir(os.path.dirname(script_path)) + if output_dir.endswith('/'): output_dir = output_dir[:-1] tmp = os.path.join(output_dir, 'tmp_json') @@ -391,7 +396,7 @@ if __name__ == "__main__": parser.add_argument( "destination", nargs="?", - default="../../../../../api.onlyoffice.com/site/docs/plugin-and-macros/interacting-with-editors/", + default=f"{root}/api.onlyoffice.com/site/docs/plugin-and-macros/interacting-with-editors/", help="Output directory" ) args = parser.parse_args() diff --git a/scripts/sdkjs_common/jsdoc/plugins/generate_docs_methods_json.py b/scripts/sdkjs_common/jsdoc/plugins/generate_docs_methods_json.py index 7f55b3c..44ac0bb 100644 --- a/scripts/sdkjs_common/jsdoc/plugins/generate_docs_methods_json.py +++ b/scripts/sdkjs_common/jsdoc/plugins/generate_docs_methods_json.py @@ -13,9 +13,12 @@ configs = [ "./config/methods/forms.json" ] -root = '../../../../..' +script_path = os.path.abspath(__file__) +root = os.path.abspath(os.path.join(os.path.dirname(script_path), '../../../../..')) def generate(output_dir, md=False): + os.chdir(os.path.dirname(script_path)) + if not os.path.exists(output_dir): os.makedirs(output_dir) diff --git a/scripts/sdkjs_common/jsdoc/plugins/generate_docs_methods_md.py b/scripts/sdkjs_common/jsdoc/plugins/generate_docs_methods_md.py index 65ab6c2..14635cc 100644 --- a/scripts/sdkjs_common/jsdoc/plugins/generate_docs_methods_md.py +++ b/scripts/sdkjs_common/jsdoc/plugins/generate_docs_methods_md.py @@ -13,6 +13,9 @@ editors = { "forms": "form-api" } +script_path = os.path.abspath(__file__) +root = os.path.abspath(os.path.join(os.path.dirname(script_path), '../../../../..')) + missing_examples = [] used_enumerations = set() @@ -614,6 +617,8 @@ def process_doclets(data, output_dir, editor_name): missing_examples.append(os.path.relpath(enum_file_path, output_dir)) def generate(output_dir): + os.chdir(os.path.dirname(script_path)) + print('Generating Markdown documentation...') if output_dir[-1] == '/': @@ -637,7 +642,7 @@ if __name__ == "__main__": type=str, help="Destination directory for the generated documentation", nargs='?', # Indicates the argument is optional - default="../../../../../api.onlyoffice.com/site/docs/plugin-and-macros/interacting-with-editors/" # Default value + default=f"{root}/api.onlyoffice.com/site/docs/plugin-and-macros/interacting-with-editors/" # Default value ) args = parser.parse_args() generate(args.destination) From 17ee00a04c7c83b40e9107c3306a1465caffc829 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 15 Oct 2025 17:25:47 +0300 Subject: [PATCH 02/19] Fix windows build --- scripts/core_common/modules/v8_89.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/core_common/modules/v8_89.py b/scripts/core_common/modules/v8_89.py index 9d642aa..7da03a2 100644 --- a/scripts/core_common/modules/v8_89.py +++ b/scripts/core_common/modules/v8_89.py @@ -16,7 +16,11 @@ def change_bootstrap(): content += "infra/3pp/tools/cpython/${platform} version:2@2.7.18.chromium.39\n\n" content += "@Subdir python3\n" - content += "infra/3pp/tools/cpython3/${platform} version:2@3.8.10.chromium.23\n\n" + + if ("windows" == base.host_platform()): + content += "infra/3pp/tools/cpython3/${platform} version:2@3.11.8.chromium.35\n\n" + else: + content += "infra/3pp/tools/cpython3/${platform} version:2@3.8.10.chromium.23\n\n" content += "@Subdir git\n" content += "infra/3pp/tools/git/${platform} version:2@2.41.0.chromium.11\n" From ec544ca9ab47dc534a5fdb6e8f442a0a176789b2 Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Thu, 16 Oct 2025 14:34:16 +0300 Subject: [PATCH 03/19] Developing --- scripts/base.py | 4 ++++ scripts/deploy_desktop.py | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/scripts/base.py b/scripts/base.py index b1f6cf5..0c18205 100644 --- a/scripts/base.py +++ b/scripts/base.py @@ -1978,6 +1978,10 @@ def create_x2t_js_cache(dir, product, platform): doctrenderer_lib = "libdoctrenderer.dylib" if is_file(dir + "/libdoctrenderer.dylib") else "doctrenderer.framework/doctrenderer" if os.path.getsize(dir + "/" + doctrenderer_lib) < 5*1024*1024: return + + # generating later in win arm qemu + if (platform == "win_arm64" and not is_os_arm()): + return if ((platform == "linux_arm64") and not is_os_arm()): cmd_in_dir_qemu(platform, dir, "./x2t", ["-create-js-snapshots"], True) diff --git a/scripts/deploy_desktop.py b/scripts/deploy_desktop.py index a5d6ec5..9861ed2 100644 --- a/scripts/deploy_desktop.py +++ b/scripts/deploy_desktop.py @@ -304,16 +304,39 @@ def make(): base.for_each_framework(root_dir, "mac", callbacks=[base.generate_plist], max_depth=2) base.mac_correct_rpath_desktop(root_dir) + themes_params = [] + if ("" != config.option("themesparams")): + themes_params = ["--params=\"" + config.option("themesparams") + "\""] if is_host_not_arm: - sdkjs_dir = root_dir + "/editors/sdkjs" - end_find_platform = sdkjs_dir.rfind("/" + platform + "/") - sdkjs_dir_64 = sdkjs_dir[0:end_find_platform] + "/" + host_platform + "/" + sdkjs_dir[end_find_platform+11:] - base.delete_dir(sdkjs_dir) - base.copy_dir(sdkjs_dir_64, sdkjs_dir) + if platform == "mac_arm64": + sdkjs_dir = root_dir + "/editors/sdkjs" + end_find_platform = sdkjs_dir.rfind("/" + platform + "/") + sdkjs_dir_64 = sdkjs_dir[0:end_find_platform] + "/" + host_platform + "/" + sdkjs_dir[end_find_platform+11:] + base.delete_dir(sdkjs_dir) + base.copy_dir(sdkjs_dir_64, sdkjs_dir) + if platform == "win_arm64": # create bat file and start qemu to execute win arm binaries + qemu_git_dir = f"\\\\10.0.2.2\\{os.path.basename(os.path.abspath(git_dir))}" + qemu_root_dir = qemu_git_dir + "\\out\\" + native_platform + "\\" + branding + "\\DesktopEditors" + + automate_bat_data = "" + automate_bat_data = f"call {qemu_root_dir}/converter/x2t -create-js-snapshots\n" + + automate_bat_data += f"call {qemu_root_dir}/converter/allfontsgen " + automate_bat_data += f"--use-system=\"1\" " + automate_bat_data += f"--input=\"{qemu_root_dir}/fonts\" " + automate_bat_data += f"--input=\"{qemu_git_dir}/core-fonts\" " + automate_bat_data += f"--allfonts=\"{qemu_root_dir}/converter/AllFonts.js\" " + automate_bat_data += f"--selection=\"{qemu_root_dir}/converter/font_selection.bin\"\n" + + automate_bat_data += f"call {qemu_root_dir}/converter/allthemesgen " + automate_bat_data += f"--converter-dir=\"{qemu_root_dir}/converter\" " + automate_bat_data += f"--src=\"{qemu_root_dir}/editors/sdkjs/slide/themes\" " + automate_bat_data += f"--allfonts=\"AllFonts.js\" " + automate_bat_data += f"--output=\"{qemu_root_dir}/editors/sdkjs/common/Images\" " + automate_bat_data += f"--params=\"{config.option("themesparams")}\"\n" + + base.writeFile(root_dir + "/automate.bat", automate_bat_data) else: - themes_params = [] - if ("" != config.option("themesparams")): - themes_params = ["--params=\"" + config.option("themesparams") + "\""] base.cmd_exe(root_dir + "/converter/allfontsgen", ["--use-system=\"1\"", "--input=\"" + root_dir + "/fonts\"", "--input=\"" + git_dir + "/core-fonts\"", "--allfonts=\"" + root_dir + "/converter/AllFonts.js\"", "--selection=\"" + root_dir + "/converter/font_selection.bin\""], True) base.cmd_exe(root_dir + "/converter/allthemesgen", ["--converter-dir=\"" + root_dir + "/converter\"", "--src=\"" + root_dir + "/editors/sdkjs/slide/themes\"", "--allfonts=\"AllFonts.js\"", "--output=\"" + root_dir + "/editors/sdkjs/common/Images\""] + themes_params, True) base.delete_file(root_dir + "/converter/AllFonts.js") From 668aa88c6eee1abcd0a91d021d95270f84d15686 Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Thu, 16 Oct 2025 16:58:43 +0300 Subject: [PATCH 04/19] Developing execution win arm qemu --- scripts/deploy_desktop.py | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/scripts/deploy_desktop.py b/scripts/deploy_desktop.py index 9861ed2..d8b0062 100644 --- a/scripts/deploy_desktop.py +++ b/scripts/deploy_desktop.py @@ -304,9 +304,10 @@ def make(): base.for_each_framework(root_dir, "mac", callbacks=[base.generate_plist], max_depth=2) base.mac_correct_rpath_desktop(root_dir) - themes_params = [] + themes_params = "" if ("" != config.option("themesparams")): - themes_params = ["--params=\"" + config.option("themesparams") + "\""] + themes_params = "--params=\"" + config.option("themesparams") + "\"" + if is_host_not_arm: if platform == "mac_arm64": sdkjs_dir = root_dir + "/editors/sdkjs" @@ -316,29 +317,32 @@ def make(): base.copy_dir(sdkjs_dir_64, sdkjs_dir) if platform == "win_arm64": # create bat file and start qemu to execute win arm binaries qemu_git_dir = f"\\\\10.0.2.2\\{os.path.basename(os.path.abspath(git_dir))}" - qemu_root_dir = qemu_git_dir + "\\out\\" + native_platform + "\\" + branding + "\\DesktopEditors" + qemu_root_dir = qemu_git_dir + "\\build_tools\\out\\" + native_platform + "\\" + branding + "\\DesktopEditors" automate_bat_data = "" - automate_bat_data = f"call {qemu_root_dir}/converter/x2t -create-js-snapshots\n" + automate_bat_data = f"call {qemu_root_dir}\\converter\\x2t -create-js-snapshots\n" - automate_bat_data += f"call {qemu_root_dir}/converter/allfontsgen " + automate_bat_data += f"call {qemu_root_dir}\\converter\\allfontsgen " automate_bat_data += f"--use-system=\"1\" " - automate_bat_data += f"--input=\"{qemu_root_dir}/fonts\" " - automate_bat_data += f"--input=\"{qemu_git_dir}/core-fonts\" " - automate_bat_data += f"--allfonts=\"{qemu_root_dir}/converter/AllFonts.js\" " - automate_bat_data += f"--selection=\"{qemu_root_dir}/converter/font_selection.bin\"\n" + automate_bat_data += f"--input=\"{qemu_root_dir}\\fonts\" " + automate_bat_data += f"--input=\"{qemu_git_dir}\\core-fonts\" " + automate_bat_data += f"--allfonts=\"{qemu_root_dir}\\converter\\AllFonts.js\" " + automate_bat_data += f"--selection=\"{qemu_root_dir}\\converter\\font_selection.bin\"\n" - automate_bat_data += f"call {qemu_root_dir}/converter/allthemesgen " - automate_bat_data += f"--converter-dir=\"{qemu_root_dir}/converter\" " - automate_bat_data += f"--src=\"{qemu_root_dir}/editors/sdkjs/slide/themes\" " + automate_bat_data += f"call {qemu_root_dir}\\converter\\allthemesgen " + automate_bat_data += f"--converter-dir=\"{qemu_root_dir}\\converter\" " + automate_bat_data += f"--src=\"{qemu_root_dir}\\editors\\sdkjs\\slide\\themes\" " automate_bat_data += f"--allfonts=\"AllFonts.js\" " - automate_bat_data += f"--output=\"{qemu_root_dir}/editors/sdkjs/common/Images\" " - automate_bat_data += f"--params=\"{config.option("themesparams")}\"\n" + automate_bat_data += f"--output=\"{qemu_root_dir}\\editors\\sdkjs\\common\\Images\" " + automate_bat_data += f"--params=\"{themes_params}\"\n" - base.writeFile(root_dir + "/automate.bat", automate_bat_data) + automate_bat_data += f"shutdown /s /f /t 10\n" + base.writeFile(git_dir + "/automate.bat", automate_bat_data) + start_qemu_bat_path = f"{git_dir}\\win-arm-tools\\start.bat" + base.cmd_exe(start_qemu_bat_path, []) else: base.cmd_exe(root_dir + "/converter/allfontsgen", ["--use-system=\"1\"", "--input=\"" + root_dir + "/fonts\"", "--input=\"" + git_dir + "/core-fonts\"", "--allfonts=\"" + root_dir + "/converter/AllFonts.js\"", "--selection=\"" + root_dir + "/converter/font_selection.bin\""], True) - base.cmd_exe(root_dir + "/converter/allthemesgen", ["--converter-dir=\"" + root_dir + "/converter\"", "--src=\"" + root_dir + "/editors/sdkjs/slide/themes\"", "--allfonts=\"AllFonts.js\"", "--output=\"" + root_dir + "/editors/sdkjs/common/Images\""] + themes_params, True) + base.cmd_exe(root_dir + "/converter/allthemesgen", ["--converter-dir=\"" + root_dir + "/converter\"", "--src=\"" + root_dir + "/editors/sdkjs/slide/themes\"", "--allfonts=\"AllFonts.js\"", "--output=\"" + root_dir + "/editors/sdkjs/common/Images\""] + [themes_params], True) base.delete_file(root_dir + "/converter/AllFonts.js") base.delete_file(root_dir + "/converter/font_selection.bin") base.delete_file(root_dir + "/converter/fonts.log") From aaa5096526e9a4c63e00afce3b7909ca8912ebf7 Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Thu, 16 Oct 2025 17:05:44 +0300 Subject: [PATCH 05/19] Fix bug --- scripts/deploy_desktop.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/deploy_desktop.py b/scripts/deploy_desktop.py index d8b0062..e7f3954 100644 --- a/scripts/deploy_desktop.py +++ b/scripts/deploy_desktop.py @@ -338,8 +338,12 @@ def make(): automate_bat_data += f"shutdown /s /f /t 10\n" base.writeFile(git_dir + "/automate.bat", automate_bat_data) - start_qemu_bat_path = f"{git_dir}\\win-arm-tools\\start.bat" - base.cmd_exe(start_qemu_bat_path, []) + + old_curr_dir = os.path.abspath(os.curdir) + os.chdir(git_dir + "/win-arm-tools") + start_qemu_bat_path = f"start.bat" + base.cmd(start_qemu_bat_path, []) + os.chdir(old_curr_dir) else: base.cmd_exe(root_dir + "/converter/allfontsgen", ["--use-system=\"1\"", "--input=\"" + root_dir + "/fonts\"", "--input=\"" + git_dir + "/core-fonts\"", "--allfonts=\"" + root_dir + "/converter/AllFonts.js\"", "--selection=\"" + root_dir + "/converter/font_selection.bin\""], True) base.cmd_exe(root_dir + "/converter/allthemesgen", ["--converter-dir=\"" + root_dir + "/converter\"", "--src=\"" + root_dir + "/editors/sdkjs/slide/themes\"", "--allfonts=\"AllFonts.js\"", "--output=\"" + root_dir + "/editors/sdkjs/common/Images\""] + [themes_params], True) From 8a70f3d14a7c76cf0439be1c122f5d0a23212ad6 Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Fri, 17 Oct 2025 14:03:13 +0300 Subject: [PATCH 06/19] Add generation for all products --- scripts/base.py | 31 +++++++++++++++++++++++++++++++ scripts/deploy_builder.py | 2 ++ scripts/deploy_core.py | 2 ++ scripts/deploy_desktop.py | 29 +---------------------------- scripts/deploy_server.py | 2 ++ 5 files changed, 38 insertions(+), 28 deletions(-) diff --git a/scripts/base.py b/scripts/base.py index 0c18205..90ccd8f 100644 --- a/scripts/base.py +++ b/scripts/base.py @@ -1972,6 +1972,37 @@ def get_autobuild_version(product, platform="", branch="", build=""): download_addon = download_branch + "/" + download_build + "/" + product + "-" + download_platform + ".7z" return "http://repo-doc-onlyoffice-com.s3.amazonaws.com/archive/" + download_addon +def create_artifacts_qemu_win_arm(git_dir, branding, product, only_snapshots=False, themes_params=""): + qemu_git_dir = f"\\\\10.0.2.2\\{os.path.basename(os.path.abspath(git_dir))}" + qemu_root_dir = qemu_git_dir + "\\build_tools\\out\\win_arm64\\" + branding + "\\" + product + + automate_bat_data = "" + automate_bat_data = f"call {qemu_root_dir}\\converter\\x2t -create-js-snapshots\n" + + if not only_snapshots: + automate_bat_data += f"call {qemu_root_dir}\\converter\\allfontsgen " + automate_bat_data += f"--use-system=\"1\" " + automate_bat_data += f"--input=\"{qemu_root_dir}\\fonts\" " + automate_bat_data += f"--input=\"{qemu_git_dir}\\core-fonts\" " + automate_bat_data += f"--allfonts=\"{qemu_root_dir}\\converter\\AllFonts.js\" " + automate_bat_data += f"--selection=\"{qemu_root_dir}\\converter\\font_selection.bin\"\n" + + automate_bat_data += f"call {qemu_root_dir}\\converter\\allthemesgen " + automate_bat_data += f"--converter-dir=\"{qemu_root_dir}\\converter\" " + automate_bat_data += f"--src=\"{qemu_root_dir}\\editors\\sdkjs\\slide\\themes\" " + automate_bat_data += f"--allfonts=\"AllFonts.js\" " + automate_bat_data += f"--output=\"{qemu_root_dir}\\editors\\sdkjs\\common\\Images\" " + automate_bat_data += f"--params=\"{themes_params}\"\n" + + automate_bat_data += f"shutdown /s /f /t 10\n" + writeFile(git_dir + "/automate.bat", automate_bat_data) + + old_curr_dir = os.path.abspath(os.curdir) + os.chdir(git_dir + "/win-arm-tools") + start_qemu_bat_path = f"start.bat" + cmd(start_qemu_bat_path, []) + os.chdir(old_curr_dir) + def create_x2t_js_cache(dir, product, platform): # mac if is_file(dir + "/libdoctrenderer.dylib") or is_dir(dir + "/doctrenderer.framework"): diff --git a/scripts/deploy_builder.py b/scripts/deploy_builder.py index 15fecfb..f8154b0 100644 --- a/scripts/deploy_builder.py +++ b/scripts/deploy_builder.py @@ -119,6 +119,8 @@ def make(): base.mac_correct_rpath_docbuilder(root_dir) base.create_x2t_js_cache(root_dir, "builder", platform) + if platform == "win_arm64": + base.create_artifacts_qemu_win_arm(git_dir, "builder", branding, True) base.create_dir(root_dir + "/fonts") base.copy_dir(git_dir + "/core-fonts/asana", root_dir + "/fonts/asana") diff --git a/scripts/deploy_core.py b/scripts/deploy_core.py index a9e78cf..d57de9e 100644 --- a/scripts/deploy_core.py +++ b/scripts/deploy_core.py @@ -75,6 +75,8 @@ def make(): # js cache base.generate_doctrenderer_config(archive_dir + "/DoctRenderer.config", "./", "builder", "", "./dictionaries") base.create_x2t_js_cache(archive_dir, "core", platform) + if platform == "win_arm64": + base.create_artifacts_qemu_win_arm(git_dir, "core", branding, True) base.delete_file(archive_dir + "/DoctRenderer.config") # dictionaries diff --git a/scripts/deploy_desktop.py b/scripts/deploy_desktop.py index e7f3954..c09f08a 100644 --- a/scripts/deploy_desktop.py +++ b/scripts/deploy_desktop.py @@ -316,34 +316,7 @@ def make(): base.delete_dir(sdkjs_dir) base.copy_dir(sdkjs_dir_64, sdkjs_dir) if platform == "win_arm64": # create bat file and start qemu to execute win arm binaries - qemu_git_dir = f"\\\\10.0.2.2\\{os.path.basename(os.path.abspath(git_dir))}" - qemu_root_dir = qemu_git_dir + "\\build_tools\\out\\" + native_platform + "\\" + branding + "\\DesktopEditors" - - automate_bat_data = "" - automate_bat_data = f"call {qemu_root_dir}\\converter\\x2t -create-js-snapshots\n" - - automate_bat_data += f"call {qemu_root_dir}\\converter\\allfontsgen " - automate_bat_data += f"--use-system=\"1\" " - automate_bat_data += f"--input=\"{qemu_root_dir}\\fonts\" " - automate_bat_data += f"--input=\"{qemu_git_dir}\\core-fonts\" " - automate_bat_data += f"--allfonts=\"{qemu_root_dir}\\converter\\AllFonts.js\" " - automate_bat_data += f"--selection=\"{qemu_root_dir}\\converter\\font_selection.bin\"\n" - - automate_bat_data += f"call {qemu_root_dir}\\converter\\allthemesgen " - automate_bat_data += f"--converter-dir=\"{qemu_root_dir}\\converter\" " - automate_bat_data += f"--src=\"{qemu_root_dir}\\editors\\sdkjs\\slide\\themes\" " - automate_bat_data += f"--allfonts=\"AllFonts.js\" " - automate_bat_data += f"--output=\"{qemu_root_dir}\\editors\\sdkjs\\common\\Images\" " - automate_bat_data += f"--params=\"{themes_params}\"\n" - - automate_bat_data += f"shutdown /s /f /t 10\n" - base.writeFile(git_dir + "/automate.bat", automate_bat_data) - - old_curr_dir = os.path.abspath(os.curdir) - os.chdir(git_dir + "/win-arm-tools") - start_qemu_bat_path = f"start.bat" - base.cmd(start_qemu_bat_path, []) - os.chdir(old_curr_dir) + base.create_artifacts_qemu_win_arm(git_dir, branding, "DesktopEditors", False, themes_params) else: base.cmd_exe(root_dir + "/converter/allfontsgen", ["--use-system=\"1\"", "--input=\"" + root_dir + "/fonts\"", "--input=\"" + git_dir + "/core-fonts\"", "--allfonts=\"" + root_dir + "/converter/AllFonts.js\"", "--selection=\"" + root_dir + "/converter/font_selection.bin\""], True) base.cmd_exe(root_dir + "/converter/allthemesgen", ["--converter-dir=\"" + root_dir + "/converter\"", "--src=\"" + root_dir + "/editors/sdkjs/slide/themes\"", "--allfonts=\"AllFonts.js\"", "--output=\"" + root_dir + "/editors/sdkjs/common/Images\""] + [themes_params], True) diff --git a/scripts/deploy_server.py b/scripts/deploy_server.py index 8912b34..a1ae9b9 100644 --- a/scripts/deploy_server.py +++ b/scripts/deploy_server.py @@ -123,6 +123,8 @@ def make(): base.delete_file(file) base.create_x2t_js_cache(converter_dir, "server", platform) + if platform == "win_arm64": + base.create_artifacts_qemu_win_arm(git_dir, "server", branding, True) # add embed worker code base.cmd_in_dir(git_dir + "/sdkjs/common/embed", "python", ["make.py", js_dir + "/web-apps/apps/api/documents/api.js"]) From b6b09d17f4528929e16fe2150715f83e54845f10 Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Fri, 17 Oct 2025 14:38:46 +0300 Subject: [PATCH 07/19] Add config option --- configure.py | 1 + scripts/base.py | 2 ++ scripts/deploy_builder.py | 2 +- scripts/deploy_core.py | 2 +- scripts/deploy_desktop.py | 2 +- scripts/deploy_server.py | 2 +- 6 files changed, 7 insertions(+), 4 deletions(-) diff --git a/configure.py b/configure.py index 5b31229..de8fe3c 100755 --- a/configure.py +++ b/configure.py @@ -43,6 +43,7 @@ parser.add_option("--vs-path", action="store", type="string", dest="vs-path", de parser.add_option("--siteUrl", action="store", type="string", dest="siteUrl", default="127.0.0.1", help="site url") parser.add_option("--multiprocess", action="store", type="string", dest="multiprocess", default="1", help="provides ability to specify single process for make") parser.add_option("--sysroot", action="store", type="string", dest="sysroot", default="0", help="provides ability to use sysroot (ubuntu 16.04) to build c++ code. If value is \"1\", then the sysroot from tools/linux/sysroot will be used, and if it is not there, it will download it and unpack it. You can also set value as the path to the your own sysroot (rarely used). Only for linux") +parser.add_option("--use-qemu", action="store", type="string", dest="use-qemu", default="0", help="Use qemu for win_arm64 cross build.") (options, args) = parser.parse_args(arguments) configOptions = vars(options) diff --git a/scripts/base.py b/scripts/base.py index 90ccd8f..59803b5 100644 --- a/scripts/base.py +++ b/scripts/base.py @@ -2002,6 +2002,8 @@ def create_artifacts_qemu_win_arm(git_dir, branding, product, only_snapshots=Fal start_qemu_bat_path = f"start.bat" cmd(start_qemu_bat_path, []) os.chdir(old_curr_dir) + + delete_file(git_dir + "/automate.bat") def create_x2t_js_cache(dir, product, platform): # mac diff --git a/scripts/deploy_builder.py b/scripts/deploy_builder.py index f8154b0..391735c 100644 --- a/scripts/deploy_builder.py +++ b/scripts/deploy_builder.py @@ -119,7 +119,7 @@ def make(): base.mac_correct_rpath_docbuilder(root_dir) base.create_x2t_js_cache(root_dir, "builder", platform) - if platform == "win_arm64": + if platform == "win_arm64" and not base.is_os_arm() and config.option("use-qemu") == "1": base.create_artifacts_qemu_win_arm(git_dir, "builder", branding, True) base.create_dir(root_dir + "/fonts") diff --git a/scripts/deploy_core.py b/scripts/deploy_core.py index d57de9e..2e4e3a0 100644 --- a/scripts/deploy_core.py +++ b/scripts/deploy_core.py @@ -75,7 +75,7 @@ def make(): # js cache base.generate_doctrenderer_config(archive_dir + "/DoctRenderer.config", "./", "builder", "", "./dictionaries") base.create_x2t_js_cache(archive_dir, "core", platform) - if platform == "win_arm64": + if platform == "win_arm64" and not base.is_os_arm() and config.option("use-qemu") == "1": base.create_artifacts_qemu_win_arm(git_dir, "core", branding, True) base.delete_file(archive_dir + "/DoctRenderer.config") diff --git a/scripts/deploy_desktop.py b/scripts/deploy_desktop.py index c09f08a..ff58060 100644 --- a/scripts/deploy_desktop.py +++ b/scripts/deploy_desktop.py @@ -315,7 +315,7 @@ def make(): sdkjs_dir_64 = sdkjs_dir[0:end_find_platform] + "/" + host_platform + "/" + sdkjs_dir[end_find_platform+11:] base.delete_dir(sdkjs_dir) base.copy_dir(sdkjs_dir_64, sdkjs_dir) - if platform == "win_arm64": # create bat file and start qemu to execute win arm binaries + if platform == "win_arm64" and config.option("use-qemu") == "1": # create bat file and start qemu to execute win arm binaries base.create_artifacts_qemu_win_arm(git_dir, branding, "DesktopEditors", False, themes_params) else: base.cmd_exe(root_dir + "/converter/allfontsgen", ["--use-system=\"1\"", "--input=\"" + root_dir + "/fonts\"", "--input=\"" + git_dir + "/core-fonts\"", "--allfonts=\"" + root_dir + "/converter/AllFonts.js\"", "--selection=\"" + root_dir + "/converter/font_selection.bin\""], True) diff --git a/scripts/deploy_server.py b/scripts/deploy_server.py index a1ae9b9..d43d49b 100644 --- a/scripts/deploy_server.py +++ b/scripts/deploy_server.py @@ -123,7 +123,7 @@ def make(): base.delete_file(file) base.create_x2t_js_cache(converter_dir, "server", platform) - if platform == "win_arm64": + if platform == "win_arm64" and not base.is_os_arm() and config.option("use-qemu") == "1": base.create_artifacts_qemu_win_arm(git_dir, "server", branding, True) # add embed worker code From 30e3202fd521c558b6c3701fe3b69c18cbff0985 Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Fri, 17 Oct 2025 17:40:35 +0300 Subject: [PATCH 08/19] Rewrite deploying --- configure.py | 2 +- scripts/base.py | 35 ++++++-------------------- scripts/deploy.py | 2 ++ scripts/deploy_builder.py | 2 -- scripts/deploy_core.py | 2 -- scripts/deploy_desktop.py | 2 -- scripts/deploy_server.py | 2 -- tools/win/qemu/automate.bat | 50 +++++++++++++++++++++++++++++++++++++ 8 files changed, 60 insertions(+), 37 deletions(-) create mode 100644 tools/win/qemu/automate.bat diff --git a/configure.py b/configure.py index de8fe3c..34b64b6 100755 --- a/configure.py +++ b/configure.py @@ -43,7 +43,7 @@ parser.add_option("--vs-path", action="store", type="string", dest="vs-path", de parser.add_option("--siteUrl", action="store", type="string", dest="siteUrl", default="127.0.0.1", help="site url") parser.add_option("--multiprocess", action="store", type="string", dest="multiprocess", default="1", help="provides ability to specify single process for make") parser.add_option("--sysroot", action="store", type="string", dest="sysroot", default="0", help="provides ability to use sysroot (ubuntu 16.04) to build c++ code. If value is \"1\", then the sysroot from tools/linux/sysroot will be used, and if it is not there, it will download it and unpack it. You can also set value as the path to the your own sysroot (rarely used). Only for linux") -parser.add_option("--use-qemu", action="store", type="string", dest="use-qemu", default="0", help="Use qemu for win_arm64 cross build.") +parser.add_option("--qemu-win-arm64-dir", action="store", type="string", dest="qemu-win-arm64-dir", default="", help="dir to qemu virtual machine for win_arm64 cross build. It should contains start.bat. More info in tools/win/qemu.") (options, args) = parser.parse_args(arguments) configOptions = vars(options) diff --git a/scripts/base.py b/scripts/base.py index 59803b5..a326f0b 100644 --- a/scripts/base.py +++ b/scripts/base.py @@ -1972,38 +1972,17 @@ def get_autobuild_version(product, platform="", branch="", build=""): download_addon = download_branch + "/" + download_build + "/" + product + "-" + download_platform + ".7z" return "http://repo-doc-onlyoffice-com.s3.amazonaws.com/archive/" + download_addon -def create_artifacts_qemu_win_arm(git_dir, branding, product, only_snapshots=False, themes_params=""): - qemu_git_dir = f"\\\\10.0.2.2\\{os.path.basename(os.path.abspath(git_dir))}" - qemu_root_dir = qemu_git_dir + "\\build_tools\\out\\win_arm64\\" + branding + "\\" + product - - automate_bat_data = "" - automate_bat_data = f"call {qemu_root_dir}\\converter\\x2t -create-js-snapshots\n" - - if not only_snapshots: - automate_bat_data += f"call {qemu_root_dir}\\converter\\allfontsgen " - automate_bat_data += f"--use-system=\"1\" " - automate_bat_data += f"--input=\"{qemu_root_dir}\\fonts\" " - automate_bat_data += f"--input=\"{qemu_git_dir}\\core-fonts\" " - automate_bat_data += f"--allfonts=\"{qemu_root_dir}\\converter\\AllFonts.js\" " - automate_bat_data += f"--selection=\"{qemu_root_dir}\\converter\\font_selection.bin\"\n" - - automate_bat_data += f"call {qemu_root_dir}\\converter\\allthemesgen " - automate_bat_data += f"--converter-dir=\"{qemu_root_dir}\\converter\" " - automate_bat_data += f"--src=\"{qemu_root_dir}\\editors\\sdkjs\\slide\\themes\" " - automate_bat_data += f"--allfonts=\"AllFonts.js\" " - automate_bat_data += f"--output=\"{qemu_root_dir}\\editors\\sdkjs\\common\\Images\" " - automate_bat_data += f"--params=\"{themes_params}\"\n" - - automate_bat_data += f"shutdown /s /f /t 10\n" - writeFile(git_dir + "/automate.bat", automate_bat_data) - +def create_artifacts_qemu_win_arm(): old_curr_dir = os.path.abspath(os.curdir) - os.chdir(git_dir + "/win-arm-tools") + qemu_dir = os.path.abspath(config.option("qemu-win-arm64-dir")) + if qemu_dir == "": + print("For deploying win_arm64 on non arm host you should provide qemu-win-arm64-dir. More info in tools/win/qemu/README.md") + return + + os.chdir(qemu_dir) start_qemu_bat_path = f"start.bat" cmd(start_qemu_bat_path, []) os.chdir(old_curr_dir) - - delete_file(git_dir + "/automate.bat") def create_x2t_js_cache(dir, product, platform): # mac diff --git a/scripts/deploy.py b/scripts/deploy.py index 2c53dde..14889b8 100644 --- a/scripts/deploy.py +++ b/scripts/deploy.py @@ -22,4 +22,6 @@ def make(): deploy_mobile.make() if config.check_option("module", "osign"): deploy_osign.make() + if config.option("platform").find("win_arm64") != -1 and not base.is_os_arm(): + base.create_artifacts_qemu_win_arm() return diff --git a/scripts/deploy_builder.py b/scripts/deploy_builder.py index 391735c..15fecfb 100644 --- a/scripts/deploy_builder.py +++ b/scripts/deploy_builder.py @@ -119,8 +119,6 @@ def make(): base.mac_correct_rpath_docbuilder(root_dir) base.create_x2t_js_cache(root_dir, "builder", platform) - if platform == "win_arm64" and not base.is_os_arm() and config.option("use-qemu") == "1": - base.create_artifacts_qemu_win_arm(git_dir, "builder", branding, True) base.create_dir(root_dir + "/fonts") base.copy_dir(git_dir + "/core-fonts/asana", root_dir + "/fonts/asana") diff --git a/scripts/deploy_core.py b/scripts/deploy_core.py index 2e4e3a0..a9e78cf 100644 --- a/scripts/deploy_core.py +++ b/scripts/deploy_core.py @@ -75,8 +75,6 @@ def make(): # js cache base.generate_doctrenderer_config(archive_dir + "/DoctRenderer.config", "./", "builder", "", "./dictionaries") base.create_x2t_js_cache(archive_dir, "core", platform) - if platform == "win_arm64" and not base.is_os_arm() and config.option("use-qemu") == "1": - base.create_artifacts_qemu_win_arm(git_dir, "core", branding, True) base.delete_file(archive_dir + "/DoctRenderer.config") # dictionaries diff --git a/scripts/deploy_desktop.py b/scripts/deploy_desktop.py index ff58060..95d0536 100644 --- a/scripts/deploy_desktop.py +++ b/scripts/deploy_desktop.py @@ -315,8 +315,6 @@ def make(): sdkjs_dir_64 = sdkjs_dir[0:end_find_platform] + "/" + host_platform + "/" + sdkjs_dir[end_find_platform+11:] base.delete_dir(sdkjs_dir) base.copy_dir(sdkjs_dir_64, sdkjs_dir) - if platform == "win_arm64" and config.option("use-qemu") == "1": # create bat file and start qemu to execute win arm binaries - base.create_artifacts_qemu_win_arm(git_dir, branding, "DesktopEditors", False, themes_params) else: base.cmd_exe(root_dir + "/converter/allfontsgen", ["--use-system=\"1\"", "--input=\"" + root_dir + "/fonts\"", "--input=\"" + git_dir + "/core-fonts\"", "--allfonts=\"" + root_dir + "/converter/AllFonts.js\"", "--selection=\"" + root_dir + "/converter/font_selection.bin\""], True) base.cmd_exe(root_dir + "/converter/allthemesgen", ["--converter-dir=\"" + root_dir + "/converter\"", "--src=\"" + root_dir + "/editors/sdkjs/slide/themes\"", "--allfonts=\"AllFonts.js\"", "--output=\"" + root_dir + "/editors/sdkjs/common/Images\""] + [themes_params], True) diff --git a/scripts/deploy_server.py b/scripts/deploy_server.py index d43d49b..8912b34 100644 --- a/scripts/deploy_server.py +++ b/scripts/deploy_server.py @@ -123,8 +123,6 @@ def make(): base.delete_file(file) base.create_x2t_js_cache(converter_dir, "server", platform) - if platform == "win_arm64" and not base.is_os_arm() and config.option("use-qemu") == "1": - base.create_artifacts_qemu_win_arm(git_dir, "server", branding, True) # add embed worker code base.cmd_in_dir(git_dir + "/sdkjs/common/embed", "python", ["make.py", js_dir + "/web-apps/apps/api/documents/api.js"]) diff --git a/tools/win/qemu/automate.bat b/tools/win/qemu/automate.bat new file mode 100644 index 0000000..879de95 --- /dev/null +++ b/tools/win/qemu/automate.bat @@ -0,0 +1,50 @@ +setlocal enabledelayedexpansion + +set "script_dir=%~dp0" +set "config_file=%script_dir%..\..\..\config" +set "git_dir=%script_dir%..\..\..\..\ + +set "module_list=" +set "branding_value=" +set "themesparams=" + +for /f "delims=" %%a in ('type "%config_file%"') do ( + set "line=%%a" + if "!line:~0,7!"=="module=" ( + set "module_list=!line:~7!" + set "module_list=!module_list:"=!" + ) + if "!line:~0,14!"=="branding-name=" ( + set "branding_value=!line:~14!" + set "branding_value=!branding_value:"=!" + ) + if "!line:~0,13!"=="themesparams=" ( + set "themesparams=!line:~13!" + set "themesparams=!branding_value:"=!" + ) +) + +if "!branding_value!"=="" ( + set "branding_value=onlyoffice" +) + +set "base_out_dir=%script_dir%..\..\..\out\win_arm64\%branding_value%" + +for %%m in (!module_list!) do ( + set "out_module_name=%%m" + if "%%m"=="desktop" ( + call %base_out_dir%\DesktopEditors\converter\x2t -create-js-snapshots + call %base_out_dir%\DesktopEditors\converter\allfontsgen --use-system="1" --input="%base_out_dir%\DesktopEditors\fonts" --input="%git_dir%\core-fonts" --allfonts="%base_out_dir%\DesktopEditors\converter\AllFonts.js" --selection="%base_out_dir%\DesktopEditors\converter\font_selection.bin" + call %base_out_dir%\DesktopEditors\converter\allthemesgen --converter-dir="%base_out_dir%\DesktopEditors\converter" --src="%base_out_dir%\DesktopEditors\editors\sdkjs\slide\themes" --allfonts="AllFonts.js" --output="%base_out_dir%\DesktopEditors\editors\sdkjs\common\Images" --params="%themesparams%" + ) + if "%%m"=="server" ( + call %base_out_dir%\documentserver\server\FileConverter\bin\x2t -create-js-snapshots + ) + if "%%m"=="builder" ( + call %base_out_dir%\DocumentBuilder\x2t -create-js-snapshots + ) + if "%%m"=="core" ( + call %base_out_dir%\core\x2t -create-js-snapshots + ) +) +pause \ No newline at end of file From 7fb05a51f918ed7beee14c3a686e995f0695aa14 Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Fri, 17 Oct 2025 17:51:27 +0300 Subject: [PATCH 09/19] Fix bug --- scripts/base.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/base.py b/scripts/base.py index a326f0b..6518dd1 100644 --- a/scripts/base.py +++ b/scripts/base.py @@ -1973,11 +1973,12 @@ def get_autobuild_version(product, platform="", branch="", build=""): return "http://repo-doc-onlyoffice-com.s3.amazonaws.com/archive/" + download_addon def create_artifacts_qemu_win_arm(): - old_curr_dir = os.path.abspath(os.curdir) - qemu_dir = os.path.abspath(config.option("qemu-win-arm64-dir")) - if qemu_dir == "": + if config.option("qemu-win-arm64-dir") == "": print("For deploying win_arm64 on non arm host you should provide qemu-win-arm64-dir. More info in tools/win/qemu/README.md") return + + old_curr_dir = os.path.abspath(os.curdir) + qemu_dir = os.path.abspath(config.option("qemu-win-arm64-dir")) os.chdir(qemu_dir) start_qemu_bat_path = f"start.bat" From 4f804ba0e6664a7fe96fb2e0624ebf8b2464bf39 Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Fri, 17 Oct 2025 18:02:16 +0300 Subject: [PATCH 10/19] Add shutdown --- tools/win/qemu/automate.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/win/qemu/automate.bat b/tools/win/qemu/automate.bat index 879de95..8efba49 100644 --- a/tools/win/qemu/automate.bat +++ b/tools/win/qemu/automate.bat @@ -47,4 +47,4 @@ for %%m in (!module_list!) do ( call %base_out_dir%\core\x2t -create-js-snapshots ) ) -pause \ No newline at end of file +shutdown /s /f /t 10 \ No newline at end of file From 2ec27065f82526ba28e5944e57353ced6f425cfd Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Fri, 17 Oct 2025 18:18:27 +0300 Subject: [PATCH 11/19] Add start.bat and gitignore --- tools/win/qemu/.gitignore | 5 +++++ tools/win/qemu/start.bat | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 tools/win/qemu/.gitignore create mode 100644 tools/win/qemu/start.bat diff --git a/tools/win/qemu/.gitignore b/tools/win/qemu/.gitignore new file mode 100644 index 0000000..86538f9 --- /dev/null +++ b/tools/win/qemu/.gitignore @@ -0,0 +1,5 @@ +* +!.gitignore +!README.md +!automate.bat +!start.bat \ No newline at end of file diff --git a/tools/win/qemu/start.bat b/tools/win/qemu/start.bat new file mode 100644 index 0000000..665a474 --- /dev/null +++ b/tools/win/qemu/start.bat @@ -0,0 +1,17 @@ +@echo off +REM ======================================================== +REM INSTALL Windows ARM64 VM (QEMU on Windows x64) +REM ======================================================== + +C:\msys64\mingw64\bin\qemu-system-aarch64 ^ + -M virt -m 8G -cpu max,pauth-impdef=on -smp 8 ^ + -bios ./QEMU_EFI.fd ^ + -accel tcg,thread=multi ^ + -device ramfb ^ + -device qemu-xhci -device usb-kbd -device usb-tablet ^ + -nic user,model=virtio-net-pci ^ + -device usb-storage,drive=install ^ + -drive if=none,id=install,format=raw,media=cdrom,file=./Win11_24H2_English_Arm64.iso ^ + -device usb-storage,drive=virtio-drivers ^ + -drive if=none,id=virtio-drivers,format=raw,media=cdrom,file=./virtio-win-0.1.271.iso ^ + -drive if=virtio,id=system,format=raw,file=./win11-arm64.img From 2fcdef2e007c0f179b278172a59402a194f631fe Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Fri, 17 Oct 2025 18:36:20 +0300 Subject: [PATCH 12/19] Add README.md --- tools/win/qemu/README.md | 102 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 tools/win/qemu/README.md diff --git a/tools/win/qemu/README.md b/tools/win/qemu/README.md new file mode 100644 index 0000000..a930b75 --- /dev/null +++ b/tools/win/qemu/README.md @@ -0,0 +1,102 @@ +# **Setting up QEMU Windows 11** + +## **0. Preparing for Installation** + +1) Install [**MSYS2**](https://www.msys2.org/). The following commands assume that the installation directory remains the default. +2) ```pacman -S mingw-w64-x86_64-qemu``` +3) Verify installation: ```C:\msys64\mingw64\bin\qemu-system-aarch64.exe --version``` +4) Create an image: ```C:\msys64\mingw64\bin\qemu-img create win11-arm64.img 40G``` +5) Download the Windows 11 ARM64 ISO (a VPN may be required): https://www.microsoft.com/en-us/software-download/windows11arm64 +6) Download the drivers: https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md +7) Download the bootloader: https://packages.debian.org/sid/qemu-efi-aarch64 + +```ar x qemu-efi-aarch64*.deb``` + +```tar xvf data.tar.xz``` + +```mv ./usr/share/qemu-efi-aarch64/QEMU_EFI.fd .``` + +8) Run _start.bat_ + +**Note:** If you plan to install the VM elsewhere, copy _start.bat_ to that same location. + +--- + +## **1. Installing and Configuring QEMU** + +1. To install QEMU and run a Windows ARM64 virtual machine, follow this tutorial: + [Windows ARM64 VM using qemu-system](https://linaro.atlassian.net/wiki/spaces/WOAR/pages/28914909194/windows-arm64+VM+using+qemu-system). + During installation, there may be no “Back” button (as was my case); if so, you need to set the required registry variables beforehand. + It is strongly recommended to select the **Pro** version — functionality is not guaranteed on the Home edition. +2. Installing connection drivers is essential; details are provided at the end of the tutorial. Other drivers are optional. + +--- + +## **2. Creating a Shared Folder** + +To share files between the host Windows and the guest OS, create a folder, for example **D:\shared**. +The _shared_ folder can also be a working repository folder; in that case, replace _shared_ with your folder name later on. + +1. Right-click the folder → **Properties**. +2. Go to **Sharing** → **Share**. +3. In the list, select **Everyone** (or a specific user), click **Add**, grant **Read/Write** permissions, and then click **Share**. + +You may also need to allow guest connections both on the host and in the guest OS. Instructions are available [here](https://learn.microsoft.com/en-us/windows-server/storage/file-server/enable-insecure-guest-logons-smb2-and-smb3?tabs=powershell). +Now the folder is accessible from the guest machine. + +--- + +## **3. Verification** + +After starting the virtual machine, open **Command Prompt** or **PowerShell** **without** administrator rights and run: + +``` +net use Z: \\10.0.2.2\shared /user:guest "" +dir Z: +``` + +These commands should complete without errors and display a list of directories and files in the shared folder. + +--- + +## **4. Installing VC_redist** + +Additional packages are required for running software. You can download them inside the guest machine, but that may take a long time, so it’s recommended to download them on the host, place them in the shared folder, and install them from there. + +Download from: +https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170 (choose ARM64 version). + +To install from the command line after connecting the shared folder: + +``` +.\Z:\VC_redist.arm64.exe +``` + +--- + +## **5. Setting Up Automatic Script Execution via Task Scheduler** + +Before creating a task, remove the password from your user account so that the system logs in automatically when the VM starts. + +### **Creating the Task** + +1. Open **Task Scheduler** → **Create Task...** +2. **General** tab: + - Name: Automate + - Run only when user is logged on + - Run with highest privileges +3. **Triggers** tab: + - New → **At log on** +4. **Actions** tab: + - Action: **Start a program** + - Program/script: + `\\10.0.2.2\shared\build_tools\tools\win\qemu\automate.bat` + +--- + +## **6. Config Setup** + +Finally, specify the path to the folder containing the VM and the _start.bat_ script in the configuration under +```qemu-win-arm64-dir```. + +You can do this either through `configure.py` or by editing the configuration file directly. From 10f7dcee1715c0db177bce50b12ebea16c304bb0 Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Fri, 17 Oct 2025 19:02:45 +0300 Subject: [PATCH 13/19] Add exe extension --- tools/win/qemu/automate.bat | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/win/qemu/automate.bat b/tools/win/qemu/automate.bat index 8efba49..0afadca 100644 --- a/tools/win/qemu/automate.bat +++ b/tools/win/qemu/automate.bat @@ -33,9 +33,9 @@ set "base_out_dir=%script_dir%..\..\..\out\win_arm64\%branding_value%" for %%m in (!module_list!) do ( set "out_module_name=%%m" if "%%m"=="desktop" ( - call %base_out_dir%\DesktopEditors\converter\x2t -create-js-snapshots - call %base_out_dir%\DesktopEditors\converter\allfontsgen --use-system="1" --input="%base_out_dir%\DesktopEditors\fonts" --input="%git_dir%\core-fonts" --allfonts="%base_out_dir%\DesktopEditors\converter\AllFonts.js" --selection="%base_out_dir%\DesktopEditors\converter\font_selection.bin" - call %base_out_dir%\DesktopEditors\converter\allthemesgen --converter-dir="%base_out_dir%\DesktopEditors\converter" --src="%base_out_dir%\DesktopEditors\editors\sdkjs\slide\themes" --allfonts="AllFonts.js" --output="%base_out_dir%\DesktopEditors\editors\sdkjs\common\Images" --params="%themesparams%" + call %base_out_dir%\DesktopEditors\converter\x2t.exe -create-js-snapshots + call %base_out_dir%\DesktopEditors\converter\allfontsgen.exe --use-system="1" --input="%base_out_dir%\DesktopEditors\fonts" --input="%git_dir%\core-fonts" --allfonts="%base_out_dir%\DesktopEditors\converter\AllFonts.js" --selection="%base_out_dir%\DesktopEditors\converter\font_selection.bin" + call %base_out_dir%\DesktopEditors\converter\allthemesgen.exe --converter-dir="%base_out_dir%\DesktopEditors\converter" --src="%base_out_dir%\DesktopEditors\editors\sdkjs\slide\themes" --allfonts="AllFonts.js" --output="%base_out_dir%\DesktopEditors\editors\sdkjs\common\Images" --params="%themesparams%" ) if "%%m"=="server" ( call %base_out_dir%\documentserver\server\FileConverter\bin\x2t -create-js-snapshots From 6fd500e55de7edef4b3cd32975f8feb9387792b2 Mon Sep 17 00:00:00 2001 From: Alexey Nagaev Date: Fri, 17 Oct 2025 19:07:17 +0300 Subject: [PATCH 14/19] Remove unused code --- tools/win/qemu/automate.bat | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/win/qemu/automate.bat b/tools/win/qemu/automate.bat index 0afadca..eeb2878 100644 --- a/tools/win/qemu/automate.bat +++ b/tools/win/qemu/automate.bat @@ -31,7 +31,6 @@ if "!branding_value!"=="" ( set "base_out_dir=%script_dir%..\..\..\out\win_arm64\%branding_value%" for %%m in (!module_list!) do ( - set "out_module_name=%%m" if "%%m"=="desktop" ( call %base_out_dir%\DesktopEditors\converter\x2t.exe -create-js-snapshots call %base_out_dir%\DesktopEditors\converter\allfontsgen.exe --use-system="1" --input="%base_out_dir%\DesktopEditors\fonts" --input="%git_dir%\core-fonts" --allfonts="%base_out_dir%\DesktopEditors\converter\AllFonts.js" --selection="%base_out_dir%\DesktopEditors\converter\font_selection.bin" From 0c8b3e5919d32865fc154a060054258c8ac5f45e Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Sat, 18 Oct 2025 11:44:05 +0300 Subject: [PATCH 15/19] Refactoring --- scripts/base.py | 17 +++++++++++++++++ scripts/deploy.py | 4 ++-- scripts/deploy_desktop.py | 38 ++++++++++++++++++------------------- tools/win/qemu/automate.bat | 3 +++ 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/scripts/base.py b/scripts/base.py index 6518dd1..f305686 100644 --- a/scripts/base.py +++ b/scripts/base.py @@ -1972,6 +1972,23 @@ def get_autobuild_version(product, platform="", branch="", build=""): download_addon = download_branch + "/" + download_build + "/" + product + "-" + download_platform + ".7z" return "http://repo-doc-onlyoffice-com.s3.amazonaws.com/archive/" + download_addon +def is_use_create_artifacts_qemu_any_platform(): + if config.check_option("platform", "win_arm64") and not base.is_os_arm(): + return True + return False + +def is_use_create_artifacts_qemu(platform): + if platform == "win_arm64" and not base.is_os_arm(): + return True + return False + +def create_artifacts_qemu_any_platform(): + if not is_use_create_artifacts_qemu_any_platform(): + return + if config.check_option("platform", "win_arm64"): + create_artifacts_qemu_win_arm() + return; + def create_artifacts_qemu_win_arm(): if config.option("qemu-win-arm64-dir") == "": print("For deploying win_arm64 on non arm host you should provide qemu-win-arm64-dir. More info in tools/win/qemu/README.md") diff --git a/scripts/deploy.py b/scripts/deploy.py index 14889b8..517b539 100644 --- a/scripts/deploy.py +++ b/scripts/deploy.py @@ -22,6 +22,6 @@ def make(): deploy_mobile.make() if config.check_option("module", "osign"): deploy_osign.make() - if config.option("platform").find("win_arm64") != -1 and not base.is_os_arm(): - base.create_artifacts_qemu_win_arm() + if base.is_use_create_artifacts_qemu_any_platform(): + base.create_artifacts_qemu_any_platform() return diff --git a/scripts/deploy_desktop.py b/scripts/deploy_desktop.py index 95d0536..0432e10 100644 --- a/scripts/deploy_desktop.py +++ b/scripts/deploy_desktop.py @@ -288,12 +288,12 @@ def make(): is_host_not_arm = False host_platform = "" - if (platform == "mac_arm64" or platform == "win_arm64") and not base.is_os_arm(): + + # TODO: fix this on mac_arm64 (qemu) + # on windows we are using qemu + if (platform == "mac_arm64") and not base.is_os_arm(): is_host_not_arm = True - if platform == "mac_arm64": - host_platform = "mac_64" - elif platform == "win_arm64": - host_platform = "win_64" + host_platform = "mac_64" # all themes generate ---- base.copy_exe(core_build_dir + "/bin/" + platform_postfix, root_dir + "/converter", "allfontsgen") @@ -304,28 +304,28 @@ def make(): base.for_each_framework(root_dir, "mac", callbacks=[base.generate_plist], max_depth=2) base.mac_correct_rpath_desktop(root_dir) - themes_params = "" - if ("" != config.option("themesparams")): - themes_params = "--params=\"" + config.option("themesparams") + "\"" - if is_host_not_arm: - if platform == "mac_arm64": - sdkjs_dir = root_dir + "/editors/sdkjs" - end_find_platform = sdkjs_dir.rfind("/" + platform + "/") - sdkjs_dir_64 = sdkjs_dir[0:end_find_platform] + "/" + host_platform + "/" + sdkjs_dir[end_find_platform+11:] - base.delete_dir(sdkjs_dir) - base.copy_dir(sdkjs_dir_64, sdkjs_dir) + sdkjs_dir = root_dir + "/editors/sdkjs" + str1 = "/" + platform + "/" + str2 = "/" + host_platform + "/" + sdkjs_dir_host = sdkjs_dir.replace(str1, str2) + base.delete_dir(sdkjs_dir) + base.copy_dir(sdkjs_dir_host, sdkjs_dir) else: + themes_params = [] + if ("" != config.option("themesparams")): + themes_params = ["--params=\"" + config.option("themesparams") + "\""] base.cmd_exe(root_dir + "/converter/allfontsgen", ["--use-system=\"1\"", "--input=\"" + root_dir + "/fonts\"", "--input=\"" + git_dir + "/core-fonts\"", "--allfonts=\"" + root_dir + "/converter/AllFonts.js\"", "--selection=\"" + root_dir + "/converter/font_selection.bin\""], True) - base.cmd_exe(root_dir + "/converter/allthemesgen", ["--converter-dir=\"" + root_dir + "/converter\"", "--src=\"" + root_dir + "/editors/sdkjs/slide/themes\"", "--allfonts=\"AllFonts.js\"", "--output=\"" + root_dir + "/editors/sdkjs/common/Images\""] + [themes_params], True) + base.cmd_exe(root_dir + "/converter/allthemesgen", ["--converter-dir=\"" + root_dir + "/converter\"", "--src=\"" + root_dir + "/editors/sdkjs/slide/themes\"", "--allfonts=\"AllFonts.js\"", "--output=\"" + root_dir + "/editors/sdkjs/common/Images\""] + themes_params, True) base.delete_file(root_dir + "/converter/AllFonts.js") base.delete_file(root_dir + "/converter/font_selection.bin") base.delete_file(root_dir + "/converter/fonts.log") - base.delete_exe(root_dir + "/converter/allfontsgen") - base.delete_exe(root_dir + "/converter/allthemesgen") + if (base.is_use_create_artifacts_qemu(platform)): + base.delete_exe(root_dir + "/converter/allfontsgen") + base.delete_exe(root_dir + "/converter/allthemesgen") if not isUseJSC: base.delete_file(root_dir + "/editors/sdkjs/slide/sdk-all.cache") - return + return \ No newline at end of file diff --git a/tools/win/qemu/automate.bat b/tools/win/qemu/automate.bat index eeb2878..168ec6b 100644 --- a/tools/win/qemu/automate.bat +++ b/tools/win/qemu/automate.bat @@ -35,6 +35,9 @@ for %%m in (!module_list!) do ( call %base_out_dir%\DesktopEditors\converter\x2t.exe -create-js-snapshots call %base_out_dir%\DesktopEditors\converter\allfontsgen.exe --use-system="1" --input="%base_out_dir%\DesktopEditors\fonts" --input="%git_dir%\core-fonts" --allfonts="%base_out_dir%\DesktopEditors\converter\AllFonts.js" --selection="%base_out_dir%\DesktopEditors\converter\font_selection.bin" call %base_out_dir%\DesktopEditors\converter\allthemesgen.exe --converter-dir="%base_out_dir%\DesktopEditors\converter" --src="%base_out_dir%\DesktopEditors\editors\sdkjs\slide\themes" --allfonts="AllFonts.js" --output="%base_out_dir%\DesktopEditors\editors\sdkjs\common\Images" --params="%themesparams%" + del %base_out_dir%\DesktopEditors\converter\allfontsgen.exe + del %base_out_dir%\DesktopEditors\converter\allthemesgen.exe + ) if "%%m"=="server" ( call %base_out_dir%\documentserver\server\FileConverter\bin\x2t -create-js-snapshots From 61bf2d9413a25e49674a3a89d5f01a2fa79ee7dd Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Sat, 18 Oct 2025 11:47:14 +0300 Subject: [PATCH 16/19] Fix typo --- scripts/base.py | 4 ---- scripts/deploy_desktop.py | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/scripts/base.py b/scripts/base.py index f305686..e428a9e 100644 --- a/scripts/base.py +++ b/scripts/base.py @@ -2009,10 +2009,6 @@ def create_x2t_js_cache(dir, product, platform): if os.path.getsize(dir + "/" + doctrenderer_lib) < 5*1024*1024: return - # generating later in win arm qemu - if (platform == "win_arm64" and not is_os_arm()): - return - if ((platform == "linux_arm64") and not is_os_arm()): cmd_in_dir_qemu(platform, dir, "./x2t", ["-create-js-snapshots"], True) return diff --git a/scripts/deploy_desktop.py b/scripts/deploy_desktop.py index 0432e10..ceefdcb 100644 --- a/scripts/deploy_desktop.py +++ b/scripts/deploy_desktop.py @@ -321,7 +321,7 @@ def make(): base.delete_file(root_dir + "/converter/font_selection.bin") base.delete_file(root_dir + "/converter/fonts.log") - if (base.is_use_create_artifacts_qemu(platform)): + if not base.is_use_create_artifacts_qemu(platform): base.delete_exe(root_dir + "/converter/allfontsgen") base.delete_exe(root_dir + "/converter/allthemesgen") From c45cf77747a5b85f900658cc2b77f2e58e821df6 Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Sun, 19 Oct 2025 20:41:21 +0300 Subject: [PATCH 17/19] Fix socket.io fetch --- scripts/core_common/modules/socket_io.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/core_common/modules/socket_io.py b/scripts/core_common/modules/socket_io.py index 8c86c2e..02d10b0 100644 --- a/scripts/core_common/modules/socket_io.py +++ b/scripts/core_common/modules/socket_io.py @@ -8,6 +8,11 @@ import os import subprocess import glob +def clean(): + if base.is_dir("socket.io-client-cpp"): + base.delete_dir_with_access_error("socket.io-client-cpp") + return + def correct_namespace(dir): folder = dir if ("/" != folder[-1:]): @@ -25,6 +30,12 @@ def correct_namespace(dir): def make(): base_dir = base.get_script_dir() + "/../../core/Common/3dParty/socketio" + + old_cur = os.getcwd() + os.chdir(base_dir) + base.common_check_version("socketio", "1", clean) + os.chdir(old_cur) + if not base.is_dir(base_dir + "/socket.io-client-cpp"): base.cmd_in_dir(base_dir, "git", ["clone", "https://github.com/socketio/socket.io-client-cpp.git"]) base.cmd_in_dir(base_dir + "/socket.io-client-cpp", "git", ["checkout", "da779141a7379cc30c870d48295033bc16a23c66"]) @@ -37,6 +48,7 @@ def make(): base.apply_patch(base_dir + "/socket.io-client-cpp/src/internal/sio_client_impl.cpp", base_dir + "/patches/sio_client_impl_fail.patch") base.apply_patch(base_dir + "/socket.io-client-cpp/src/internal/sio_client_impl.cpp", base_dir + "/patches/sio_client_impl_open.patch") base.apply_patch(base_dir + "/socket.io-client-cpp/src/internal/sio_client_impl.cpp", base_dir + "/patches/sio_client_impl_close_timeout.patch") + base.apply_patch(base_dir + "/socket.io-client-cpp/src/internal/sio_client_impl.cpp", base_dir + "/patches/sio_client_impl_encode.patch") # no tls realization (remove if socket.io fix this) dst_dir = base_dir + "/socket.io-client-cpp/src_no_tls" From 133192df355bdd1b676b5b128cdba93db175c74c Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Mon, 20 Oct 2025 21:14:13 +0300 Subject: [PATCH 18/19] Fix build --- scripts/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/base.py b/scripts/base.py index e428a9e..a8b71fc 100644 --- a/scripts/base.py +++ b/scripts/base.py @@ -1973,12 +1973,12 @@ def get_autobuild_version(product, platform="", branch="", build=""): return "http://repo-doc-onlyoffice-com.s3.amazonaws.com/archive/" + download_addon def is_use_create_artifacts_qemu_any_platform(): - if config.check_option("platform", "win_arm64") and not base.is_os_arm(): + if config.check_option("platform", "win_arm64") and not is_os_arm(): return True return False def is_use_create_artifacts_qemu(platform): - if platform == "win_arm64" and not base.is_os_arm(): + if platform == "win_arm64" and not is_os_arm(): return True return False From 0dbf009c6be7903ddfdf30a865b0bd9ce2903aa0 Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Mon, 27 Oct 2025 14:00:06 +0300 Subject: [PATCH 19/19] Fix build for mac_64 --- scripts/core_common/modules/v8_89.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/core_common/modules/v8_89.py b/scripts/core_common/modules/v8_89.py index 7da03a2..fd524e9 100644 --- a/scripts/core_common/modules/v8_89.py +++ b/scripts/core_common/modules/v8_89.py @@ -78,6 +78,9 @@ def make_args(args, platform, is_64=True, is_debug=False): if (platform == "windows"): args_copy.append("is_clang=false") + if (platform == "mac") and base.is_os_arm(): + args_copy.append("host_cpu=\\\"x64\\\"") + if linux_clang != True: args_copy.append("use_custom_libcxx=false")