Compare commits

...

225 Commits

Author SHA1 Message Date
b2ce2bbcad Merge pull request 'release/v9.1.0' (#143) from release/v9.1.0 into hotfix/v9.2.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/143
2025-10-21 20:20:48 +00:00
133192df35 Fix build 2025-10-20 21:14:13 +03:00
c45cf77747 Fix socket.io fetch 2025-10-19 20:41:21 +03:00
9f898d6873 Merge pull request 'feature/win-arm-qemu' (#142) from feature/win-arm-qemu into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/142
2025-10-18 08:48:04 +00:00
61bf2d9413 Fix typo 2025-10-18 11:47:14 +03:00
0c8b3e5919 Refactoring 2025-10-18 11:44:05 +03:00
6fd500e55d Remove unused code 2025-10-17 19:07:17 +03:00
10f7dcee17 Add exe extension 2025-10-17 19:02:45 +03:00
2fcdef2e00 Add README.md 2025-10-17 18:36:20 +03:00
2ec27065f8 Add start.bat and gitignore 2025-10-17 18:18:27 +03:00
4f804ba0e6 Add shutdown 2025-10-17 18:02:16 +03:00
7fb05a51f9 Fix bug 2025-10-17 17:51:27 +03:00
30e3202fd5 Rewrite deploying 2025-10-17 17:40:35 +03:00
b6b09d17f4 Add config option 2025-10-17 14:38:46 +03:00
8a70f3d14a Add generation for all products 2025-10-17 14:03:13 +03:00
aaa5096526 Fix bug 2025-10-16 17:05:44 +03:00
668aa88c6e Developing execution win arm qemu 2025-10-16 17:03:01 +03:00
ec544ca9ab Developing 2025-10-16 14:34:16 +03:00
17ee00a04c Fix windows build 2025-10-15 17:25:47 +03:00
bc4daa9546 Merge pull request '[jsdoc] Fix paths' (#141) from fix/js-doc into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/141
2025-10-15 11:14:48 +00:00
099003b250 [jsdoc] Fix paths 2025-10-15 18:11:05 +07:00
4ca5e4bcb5 Merge branch release/v9.1.0 into master 2025-10-14 14:34:05 +00:00
ee4469885e Merge pull request 'Fix intecative request to keyboard' (#140) from fix/docker-debconfig into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/140
2025-10-13 14:41:47 +00:00
1350955f67 Fix intecative request to keyboard 2025-10-13 18:47:08 +05:00
de36280085 Fix build 2025-10-13 13:17:08 +03:00
0399ea1cb1 Merge pull request 'fix/docker-cmake3.30' (#139) from fix/docker-cmake3.30 into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/139
2025-10-12 14:24:30 +00:00
41ed9824ab Disable ai-agent 2025-10-10 14:23:22 +03:00
842df5ffd0 Up version to 9.1.0 2025-10-08 14:49:36 +05:00
d0e3f36313 Add cmake3.30 in Dockerfile 2025-10-08 12:26:25 +05:00
18605dc68f Merge pull request 'Fix get python in Dockerfile' (#138) from fix/docker into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/138
2025-10-06 08:54:10 +00:00
5004a30908 Fix get python in Dockerfile 2025-10-06 13:48:43 +05:00
33e41ed704 Fix bug 77116 - Fix mac license 2025-10-02 12:30:12 +03:00
1f4c88a489 Merge pull request 'Fix icu deploy' (#134) from fix/icu-deploy-sysroot into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/134
2025-10-02 09:26:29 +00:00
283977f014 Fix icu deploy 2025-10-02 12:22:19 +03:00
e71e0bee74 Merge pull request 'fix/sysroot' (#133) from fix/sysroot into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/133
2025-10-02 05:46:32 +00:00
fe9847f246 Remove unused 2025-10-02 00:14:35 +03:00
f79bfd099b Add libs 2025-10-01 22:11:19 +03:00
3ec9b4dba5 Add libs to sysroot 2025-10-01 21:50:54 +03:00
0c7348fc89 Change b2 addon for boost build 2025-10-01 19:34:20 +03:00
97b615c36a Fix build 2025-10-01 13:03:38 +03:00
59f95f52ce Fix missprint 2025-10-01 10:36:11 +03:00
ba04810793 Fix PATH for python 2025-10-01 10:29:24 +03:00
aea03d8554 FIx v8 build 2025-10-01 07:57:08 +03:00
09247281ef Fix for gcc as util
For 24.04 ubuntu
2025-10-01 06:42:38 +03:00
7b31d85c7c Merge pull request 'Remove libnuma dependency on linux' (#131) from fix/libheif into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/131
2025-09-30 09:22:08 +00:00
3ad5b9d05d Remove libnuma dependency on linux 2025-09-30 13:19:25 +04:00
894f23b292 Merge pull request 'Fix bug 77028' (#130) from fix/bug-77028 into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/130
2025-09-29 07:41:45 +00:00
125d0112e4 Fix typo 2025-09-26 19:48:28 +03:00
b46d6075e4 Fix bug 77028 2025-09-26 19:17:59 +04:00
c535c411da Developing 2025-09-26 16:50:57 +03:00
599db1f8be Developing 2025-09-26 16:22:48 +03:00
10ff21a974 Merge pull request 'Add xcprivacy file generation' (#128) from fix/ios-xcprivacy into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/128
2025-09-26 12:54:35 +00:00
c60dc81694 Add xcprivacy file generation 2025-09-26 16:49:54 +04:00
6de1859441 Revert changes with plist 2025-09-26 15:11:28 +03:00
70a50da160 Add check module version 2025-09-26 14:43:39 +03:00
3ca2efeb30 Merge branch 'release/v9.1.0' of git.onlyoffice.com:ONLYOFFICE/build_tools into release/v9.1.0 2025-09-26 14:33:09 +03:00
496594e77f Change cef package 2025-09-26 14:32:59 +03:00
8ebc7dba86 Fix typo 2025-09-26 12:29:43 +03:00
7da1a18753 Fix typo 2025-09-26 11:53:54 +03:00
c16242f25f Test for sign 2025-09-26 11:32:02 +03:00
2f43d90ab9 Merge pull request 'Fix bug 76997' (#127) from fix/bug-76997 into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/127
2025-09-25 15:15:26 +00:00
6f242eee81 Merge branch 'release/v9.1.0' into fix/bug-76997 2025-09-25 19:14:17 +04:00
f19a406ad2 Fix bug 76997 2025-09-25 19:08:20 +04:00
cfe69c6bcd Merge pull request 'fix/custom-sysroot' (#125) from fix/custom-sysroot into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/125
2025-09-24 07:18:30 +00:00
dcbeec9562 Fix flags for gcc >= 5.4 2025-09-24 09:56:18 +03:00
954e3b1ee8 Fix typo 2025-09-23 18:56:23 +03:00
d5666b1152 Fix typo 2025-09-23 18:35:13 +03:00
c4fa19a1c8 Fix build 2025-09-23 18:11:18 +03:00
7d9444a727 Enable ai agent 2025-09-23 17:56:32 +03:00
3646a2560a Add flag for build qt 2025-09-23 16:45:37 +03:00
2f877e0a4c Disable win_64 platform when build win_arm64 crossversion 2025-09-22 16:48:53 +03:00
434d6cc33c Add deploy ai-agent plugin 2025-09-22 12:13:09 +03:00
31386ad676 Fix xp deploy 2025-09-17 11:20:04 +03:00
0d917471a7 Merge pull request 'Build old icu version for Windows XP' (#126) from fix/icu-win-xp into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/126
2025-09-16 12:36:52 +00:00
4d91ac47ec Build old icu version for win_xp 2025-09-15 19:02:38 +04:00
44e346210b Remove fixed ndk version 2025-09-11 18:45:35 +03:00
2ffc1b9347 Merge branch hotfix/v9.0.4 into master 2025-09-11 08:38:14 +00:00
7a58da1af1 Change custom-sysroot to sysroot 2025-09-09 15:36:53 +03:00
f703663342 Fix missprint 2025-09-09 14:00:03 +03:00
af9db63711 Update for sysroot build 2025-09-09 13:45:01 +03:00
7e9d9051aa Fix build 2025-09-09 12:27:25 +03:00
73b41a5588 Merge pull request '[deploy] Deploy admin panel' (#124) from feature/admin-panel into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/124
2025-09-04 23:41:14 +00:00
1ab43f0551 [deploy] Deploy admin panel 2025-09-05 00:37:27 +03:00
79c4fa5042 Fix comment 2025-09-02 21:32:51 +03:00
944caac250 Fix build heif with custom-sysroot 2025-09-02 21:22:43 +03:00
7fe4ade155 Fix missprint 2025-09-02 20:51:29 +03:00
3d51a5e648 Fix build 2025-09-02 19:14:20 +03:00
d6af99141d Fix icu qt deploy 2025-09-02 12:32:38 +03:00
568e84275c Merge pull request 'Fix .dat file deploy' (#123) from fix/android-build into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/123
2025-09-01 08:20:54 +00:00
de5e5fe938 Fix .dat file deploy 2025-09-01 12:18:50 +04:00
152b524197 Merge pull request 'Fix android build' (#122) from fix/android-build into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/122
2025-08-29 13:56:30 +00:00
142e6541c7 Fix android build 2025-08-29 17:32:48 +04:00
357db616f7 Merge pull request 'hotfix/v9.0.4' (#121) from hotfix/v9.0.4 into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/121
2025-08-28 10:58:24 +00:00
8fc50cc0f2 Add support win_arm64 build 2025-08-26 16:11:04 +03:00
1feed69b71 Fix xp build 2025-08-26 10:36:30 +03:00
6b03a77791 Fix linux arm build 2025-08-26 10:15:32 +03:00
31b4e29e37 Merge pull request 'Fix libheif compilation for Linux arm64' (#119) from fix/libheif-linux-arm into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/119
2025-08-25 11:59:21 +00:00
08d8a02166 Simplified ios toolchain finding 2025-08-25 15:36:16 +04:00
e69a5135da Fix for linux_arm64 2025-08-25 15:19:21 +04:00
e768f17744 Add win_arm64 version (libheif) 2025-08-25 13:54:05 +03:00
4e9251e45b Fix build 2025-08-25 13:04:35 +03:00
2ec2173cad Fix build 2025-08-25 00:21:40 +03:00
72d6298bbc Merge pull request 'feature/custom-sysroot' (#118) from feature/custom-sysroot into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/118
2025-08-22 19:51:35 +00:00
a00302ad1d Merge pull request 'Add libheif and Switch to mac framework builds' (#100) from feature/mac-frameworks into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/100
2025-08-22 19:37:57 +00:00
56c93f97af Merge branch 'feature/libheif' into feature/mac-frameworks 2025-08-22 18:22:48 +04:00
a7432a6b4b Merge branch 'release/v9.1.0' into feature/mac-frameworks 2025-08-22 18:21:29 +04:00
75faf391b6 Merge branch 'release/v9.1.0' into feature/custom-sysroot 2025-08-22 14:40:15 +03:00
41a4e81c5a Merge pull request 'feature/qt-win-arm64' (#116) from feature/qt-win-arm64 into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/116
2025-08-20 14:55:27 +00:00
83374aa635 Refactoring win_arm64 build 2025-08-20 17:53:19 +03:00
4e6b45043a Update for custom arm toolchain 2025-08-20 17:47:45 +03:00
72124a2305 Disable QtQuick and qml building 2025-08-20 17:07:43 +03:00
b4b84dc462 Add cross building for linux arm64 2025-08-20 14:47:41 +03:00
6cd690d6b6 Disable build online installer 2025-08-20 09:12:53 +00:00
88d0c54040 Add include to deploy 2025-08-19 18:45:14 +03:00
46a18695fa Add fetching qt win arm64 2025-08-19 18:26:13 +03:00
05f2f636df Fix build on intel chip 2025-08-19 18:07:18 +03:00
506f558eed Fix deploy 2025-08-19 15:50:55 +03:00
38cd4e6e77 Merge pull request 'release/v9.1.0' (#115) from release/v9.1.0 into feature/qt-win-arm64 2025-08-19 12:30:28 +00:00
f86376fbc2 Fix deploy for desktop 2025-08-19 15:29:26 +03:00
3943237a64 Fix build for desktop win arm64 2025-08-19 14:39:55 +03:00
37d256acda Remove unused project 2025-08-19 12:58:24 +03:00
9cad51e611 All in one folder for easy cross-building 2025-08-19 11:40:39 +03:00
3571e02abf Delete non-used code 2025-08-19 10:48:49 +03:00
123af8265a Fix typo 2025-08-19 10:46:11 +03:00
4f55f8cc90 Merge branch 'release/v9.1.0' of git.onlyoffice.com:ONLYOFFICE/build_tools into release/v9.1.0 2025-08-19 09:50:56 +03:00
9a3642572c set -isysroot to x86_64 build 2025-08-19 09:50:48 +03:00
b93773ec78 Module version Up (for mac) 2025-08-19 09:28:52 +03:00
d2eb9b20af Merge branch 'release/v9.1.0' of git.onlyoffice.com:ONLYOFFICE/build_tools into release/v9.1.0 2025-08-19 09:27:23 +03:00
f2cb4e6a51 Fix icu build 2025-08-19 09:27:05 +03:00
5cdb4dae39 Fix typo 2025-08-19 08:36:44 +03:00
9102284b80 Fix mac icu version 2025-08-19 07:54:42 +03:00
1f009d0942 Up version module 2025-08-19 07:51:11 +03:00
566367daa5 Fix typo 2025-08-19 07:43:21 +03:00
c36a390292 Fix cross-compilation 2025-08-19 02:43:16 +03:00
4a947d2a3c Fix build 2025-08-18 23:43:40 +03:00
9b104f358e Revert use git for sources (save executable rights) 2025-08-18 23:03:32 +03:00
c8a72c53b8 Start developing build qt for win arm64 2025-08-18 19:55:05 +03:00
6a3d29bd00 Merge pull request 'feature/win-arm64' (#114) from feature/win-arm64 into release/v9.1.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/114
2025-08-16 11:15:11 +00:00
97c8a33e5d Fix macOS desktop license 2025-08-15 18:26:48 +03:00
39ff7e7692 Fix for builder deploy 2025-08-15 14:49:45 +03:00
4f9040d73b Fix typo 2025-08-15 12:52:33 +03:00
9579394788 Fix deploy for win_arm64 2025-08-15 12:20:53 +03:00
ea8a7bf52e Add macOS desktop commercial build 2025-08-15 12:11:51 +03:00
a1af0a6804 Patch for vs2019 2025-08-15 10:47:03 +03:00
65e6f05385 Build win_64 if win_arm64 2025-08-15 09:49:52 +03:00
08145c0d79 Fix typo 2025-08-15 09:27:56 +03:00
c1f60e27c8 Force update icu version 2025-08-15 09:27:44 +03:00
5168e20918 Fix bug for default build 2025-08-14 23:29:38 +03:00
0968ca2566 [desktop] fix build for macOS 2025-08-14 23:21:21 +03:00
e461da3a1e [desktop] copy license for macOS bundle 2025-08-14 21:20:12 +03:00
c6176a95f4 Fix icu build 2025-08-14 17:02:36 +03:00
224db5eb54 Merge pull request 'Fix bug 75808' (#110) from fix/bug-75808 into release/v9.1.0 2025-08-14 13:15:57 +00:00
a6c315302b [win] fix bug 75808 2025-08-14 15:59:03 +03:00
ae3bc78b29 Fix build for win 11 2025-08-14 13:16:16 +03:00
4c48514402 Fix boost build 2025-08-14 01:27:57 +03:00
e4bc6492be Change spec 2025-08-13 21:21:37 +03:00
23a526f3a1 Develop 2025-08-13 21:10:58 +03:00
df87cafbdb Developing build for win_arm64 2025-08-13 20:02:49 +03:00
595e2eaa86 Develop build for win_arm64 2025-08-13 18:35:12 +03:00
9440fc3494 Merge pull request 'fix/js-doc' (#108) from fix/js-doc into release/v9.1.0 2025-08-13 15:29:32 +00:00
56e2042711 [jsdoc] Fix typo 2025-08-13 22:23:21 +07:00
30167dbf76 [jsdoc] gen plugins events summary file 2025-08-13 22:23:16 +07:00
5a403cb3ac Merge pull request 'fix/jsdoc' (#107) from fix/jsdoc into master 2025-08-13 14:29:55 +00:00
d435dd496b [jsdoc] Fix typo 2025-08-12 19:05:12 +07:00
252a5c306d [jsdoc] gen plugins events summary file 2025-08-12 19:04:28 +07:00
e4b91f1b24 Fix desktop build 2025-08-11 15:10:26 +03:00
573612c1c5 Fix desktop commercial windows package name 2025-08-08 20:05:45 +03:00
a8ab257faf Merge branch hotfix/v9.0.4 into develop 2025-08-06 08:26:47 +00:00
fc9d060a78 Merge branch hotfix/v9.0.4 into master 2025-08-06 08:26:46 +00:00
a640943c60 Remove 3DPARTYLICENSE from desktop deploy 2025-08-05 18:06:08 +03:00
6c700fe492 Merge branch hotfix/v9.0.4 into master 2025-08-05 14:06:58 +00:00
afb9b8b61a Merge pull request 'Fix bug 76209' (#102) from fix/bug-76209 into hotfix/v9.0.4
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/102
2025-08-05 06:52:50 +00:00
38c49f70e5 Merge pull request 'Up version to 9.0.4' (#101) from fix/version-9.0.4 into hotfix/v9.0.4
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/101
2025-08-05 06:52:16 +00:00
bdc40e1572 Fix bug 76209 2025-08-05 11:44:32 +05:00
73bf068cb0 Up version to 9.0.4 2025-08-04 16:19:16 +05:00
6a4d3bff53 Rename brotli module 2025-08-04 12:32:19 +03:00
dc3ceb6ef8 Change default plugins list 2025-08-03 21:29:06 +03:00
a0cc2123bf Update make.py 2025-07-25 15:08:51 +00:00
c71e5c5bde Update make.py 2025-07-25 06:47:39 +00:00
1f84a604d2 Update make.py 2025-07-24 20:14:14 +00:00
648dc2119e Add fonts to builder 2025-07-24 15:13:06 +03:00
4f746cb484 Fix desktop windows packages build 2025-07-24 12:40:01 +03:00
853c760cc4 Update make.py 2025-07-24 06:25:19 +00:00
2b6557f0ec [desktop] set test license type 2025-07-24 00:57:58 +03:00
053c0c2fe9 [desktop] revert test changes 2025-07-23 20:00:53 +00:00
caf79933d8 [desktop] test license's type 2025-07-23 20:45:04 +03:00
debe284664 Add Windows & Linux DesktopEditors Commercial build 2025-07-23 12:39:24 +03:00
16858aa7c2 Add new module 2025-07-20 14:51:56 +03:00
584513fb15 Update url for glew 2025-07-15 16:01:59 +03:00
9203d68ed8 Add remark in configure.py 2025-07-15 15:52:43 +03:00
41abb6b09c Update for non-linux platforms 2025-07-15 15:31:03 +03:00
7bb5e65810 Update configuration 2025-07-15 14:52:12 +03:00
49ede6a10b Add removing tar after unpacking 2025-07-15 14:42:34 +03:00
ac394d8de6 Update for github downloading 2025-07-15 14:20:42 +03:00
abde837a74 Update arm toolchain to gcc 5.4.1 2025-07-14 20:47:06 +03:00
5568b7da2e Fix errors and bugs 2025-07-08 23:16:28 +03:00
0f89ba4247 Restore LD_LIBRARY_PATH after building
And fix bugs
2025-07-08 21:02:32 +03:00
4cefdc38fb FIx symlinks for entire folder 2025-07-08 19:53:46 +03:00
d1481021a7 Add custom sysroot for arm 2025-07-08 18:34:40 +03:00
bfd3bb009f Merge branch hotfix/v9.0.2 into develop 2025-07-07 14:37:18 +00:00
67c454b469 Fix build 2025-06-27 22:47:45 +03:00
1cc0528b11 Fix build 2025-06-27 18:25:09 +03:00
c3dce4bc91 Merge branch release/v9.0.0 into develop 2025-06-27 14:17:01 +00:00
c9151cd09d Add custom sysroot support 2025-06-24 22:28:32 +03:00
19fc33b7f5 [build] Bump nodejs version to 20 for all environments 2025-05-15 11:55:53 +03:00
23db442c82 [build] Downgrade to nodejs packaging version to 20 2025-05-10 16:14:27 +03:00
4d4d1612ce [build] Bump nodejs version to 22(linux only) 2025-05-08 01:22:34 +03:00
ded3dfa63c [build] Bump nodejs version to 22 2025-05-08 01:22:33 +03:00
227ecbde99 [deploy] Add check is_exist for addon path 2025-04-22 16:08:42 +03:00
d288d6326c Merge branch hotfix/v8.3.3 into develop 2025-04-21 08:57:49 +00:00
eebbd513d3 Added Python script for creating and launching the Libreoffice build 2025-04-08 09:47:48 +00:00
25a1e16824 Merge branch hotfix/v8.3.2 into develop 2025-04-01 08:32:41 +00:00
959d919d9e Merge pull request 'hotfix/v8.3.2' (#68) from hotfix/v8.3.2 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/68
2025-03-21 11:44:01 +00:00
520d779f04 [develop] Add information log message to restart_win_rabbit 2025-03-17 10:55:53 +03:00
c4b938b7db [deploy] Build and deploy server grunt module 2025-03-16 18:23:22 +03:00
12ce537781 [develop] Parse config to fix install_mysqlserver 2025-03-10 20:52:36 +03:00
12d824fe2d Merge branch hotfix/v8.3.1 into develop 2025-03-10 08:25:10 +00:00
6a9b2bac4a Merge pull request 'feature/build-lo' (#51) from feature/build-lo into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/build_tools/pulls/51
2025-03-04 08:42:49 +00:00
87542f4a56 [license_checker] Update config 2025-02-28 12:17:58 +03:00
1ed32fe71c [build] added disable_sln flag 2025-02-26 10:57:24 +03:00
3ce8f251a1 [build] fix build_lo_windows.py added build_vs_integration 2025-02-26 10:40:03 +03:00
e2ad38f297 [develop] Add "vs-ide-integration" make param 2025-02-25 21:48:52 +03:00
993303bfa4 [develop] Add "lo_build_path" param; Remove "requests" import; Fix LO build 2025-02-24 23:09:54 +03:00
50d9460f63 [build] fix build_lo_windows.py 2025-02-24 12:28:42 +03:00
4b02b57c07 [build] added script for building LO on Windows 2025-02-21 06:56:57 +03:00
75 changed files with 1855 additions and 1012 deletions

4
.gitignore vendored
View File

@ -7,6 +7,7 @@ config
*.*~
**~
*.DS_Store
.idea
scripts/license_checker/reports
tests/puppeteer/node_modules
tests/puppeteer/work_directory
@ -14,3 +15,6 @@ tests/puppeteer/package.json
tests/puppeteer/package-lock.json
scripts/sdkjs_common/jsdoc/node_modules
scripts/sdkjs_common/jsdoc/package-lock.json
tools/linux/python3/
tools/linux/python3.tar.gz
tools/linux/sysroot/sysroot_ubuntu_1604

View File

@ -1,14 +1,33 @@
FROM ubuntu:20.04
ENV TZ=Etc/UTC
ENV DEBIAN_FRONTEND=noninteractive
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN echo 'keyboard-configuration keyboard-configuration/layoutcode string us' | debconf-set-selections && \
echo 'keyboard-configuration keyboard-configuration/modelcode string pc105' | debconf-set-selections
RUN apt-get -y update && \
apt-get -y install python \
python3 \
sudo
RUN rm /usr/bin/python && ln -s /usr/bin/python2 /usr/bin/python
apt-get -y install tar \
sudo \
wget
RUN wget https://github.com/Kitware/CMake/releases/download/v3.30.0/cmake-3.30.0-linux-x86_64.tar.gz && \
tar -xzf cmake-3.30.0-linux-x86_64.tar.gz -C /opt && \
ln -s /opt/cmake-3.30.0-linux-x86_64/bin/cmake /usr/local/bin/cmake && \
ln -s /opt/cmake-3.30.0-linux-x86_64/bin/ctest /usr/local/bin/ctest && \
rm cmake-3.30.0-linux-x86_64.tar.gz
ADD . /build_tools
WORKDIR /build_tools
RUN mkdir -p /opt/python3 && \
wget -P /opt/python3/ https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/python/python3.tar.gz && \
tar -xzf /opt/python3/python3.tar.gz -C /opt/python3 --strip-components=1
ENV PATH="/opt/python3/bin:${PATH}"
RUN ln -s /opt/python3/bin/python3.10 /usr/bin/python
CMD ["sh", "-c", "cd tools/linux && python3 ./automate.py"]

View File

@ -14,7 +14,7 @@ parser.add_option("--clean", action="store", type="string", dest="clean", defaul
parser.add_option("--module", action="store", type="string", dest="module", default="builder", help="defines what modules to build. You can specify several of them, e.g. --module 'core desktop builder server mobile'")
parser.add_option("--develop", action="store", type="string", dest="develop", default="0", help="defines develop mode")
parser.add_option("--beta", action="store", type="string", dest="beta", default="0", help="defines beta mode")
parser.add_option("--platform", action="store", type="string", dest="platform", default="native", help="defines the destination platform for your build ['win_64', 'win_32', 'win_64_xp', 'win_32_xp', 'linux_64', 'linux_32', 'mac_64', 'ios', 'android_arm64_v8a', 'android_armv7', 'android_x86', 'android_x86_64'; combinations: 'native': your current system (windows/linux/mac only); 'all': all available systems; 'windows': win_64 win_32 win_64_xp win_32_xp; 'linux': linux_64 linux_32; 'mac': mac_64; 'android': android_arm64_v8a android_armv7 android_x86 android_x86_64]")
parser.add_option("--platform", action="store", type="string", dest="platform", default="native", help="defines the destination platform for your build ['win_64', 'win_32', 'win_64_xp', 'win_32_xp', 'win_arm64', 'linux_64', 'linux_32', 'mac_64', 'ios', 'android_arm64_v8a', 'android_armv7', 'android_x86', 'android_x86_64'; combinations: 'native': your current system (windows/linux/mac only); 'all': all available systems; 'windows': win_64 win_32 win_64_xp win_32_xp; 'linux': linux_64 linux_32; 'mac': mac_64; 'android': android_arm64_v8a android_armv7 android_x86 android_x86_64]")
parser.add_option("--config", action="store", type="string", dest="config", default="", help="provides ability to specify additional parameters for qmake")
parser.add_option("--qt-dir", action="store", type="string", dest="qt-dir", default="", help="defines qmake directory path. qmake can be found in qt-dir/compiler/bin directory")
parser.add_option("--qt-dir-xp", action="store", type="string", dest="qt-dir-xp", default="", help="defines qmake directory path for Windows XP. qmake can be found in 'qt-dir/compiler/bin directory")
@ -42,6 +42,8 @@ parser.add_option("--vs-version", action="store", type="string", dest="vs-versio
parser.add_option("--vs-path", action="store", type="string", dest="vs-path", default="", help="path to vcvarsall")
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("--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)

View File

@ -1,3 +1,3 @@
sdkjs-plugin="photoeditor, macros, ocr, translator, thesaurus, youtube, highlightcode, zotero"
sdkjs-plugin-server="speech, zotero, mendeley, speechrecognition, drawio"
sdkjs-plugin="ai, photoeditor, ocr, translator, thesaurus, youtube, highlightcode"
sdkjs-plugin-server="speech, zotero, mendeley, speechrecognition"
sdkjs-addons="sdkjs-forms"

View File

@ -19,8 +19,6 @@ import make_common
import develop
import argparse
base.check_python()
parser = argparse.ArgumentParser(description="options")
parser.add_argument("--build-only-branding", action="store_true")
args = parser.parse_args()
@ -30,6 +28,7 @@ if (args.build_only_branding):
# parse configuration
config.parse()
base.check_python()
base_dir = base.get_script_dir(__file__)

View File

@ -15,6 +15,8 @@ import stat
import json
__file__script__path__ = os.path.dirname( os.path.realpath(__file__))
icu_ver = "74"
icu_ver_old = "58" # for win_xp support
# common functions --------------------------------------
def get_script_dir(file=""):
@ -696,9 +698,12 @@ def get_prefix_cross_compiler_arm64():
return ""
def get_gcc_version():
gcc_path = "gcc"
if config.option("sysroot") != "":
gcc_path = config.option("sysroot") + "/usr/bin/gcc"
gcc_version_major = 4
gcc_version_minor = 0
gcc_version_str = run_command("gcc -dumpfullversion -dumpversion")['stdout']
gcc_version_str = run_command(gcc_path + " -dumpfullversion -dumpversion")['stdout']
if (gcc_version_str != ""):
try:
gcc_ver = gcc_version_str.split(".")
@ -736,6 +741,14 @@ def qt_setup(platform):
if ("gcc_arm" == compiler_platform):
qt_dir = config.option("qt-dir") + "/gcc"
# OVERRIDE IF NEEDED
set_env("QT_QMAKE_ADDON", "")
if platform == "win_arm64" and not is_dir(qt_dir):
override_qt_directory = os.path.abspath(os.path.dirname(__file__) + "/../tools/win/arm64/qt_build/Qt-5.15.2/win_arm64")
if is_dir(override_qt_directory):
qt_dir = os.path.abspath(override_qt_directory).replace("\\", "/")
set_env("QT_QMAKE_ADDON", "-spec win32-arm64-msvc2017")
set_env("QT_DEPLOY", qt_dir + "/bin")
if ("linux_arm64" == platform):
@ -830,6 +843,9 @@ def qt_config(platform):
if ("linux_arm64" == platform):
config_param += " linux_arm64"
if ("win_arm64" == platform):
config_param += " win_arm64"
config_param += qt_config_platform_addon(platform)
return config_param
@ -854,6 +870,12 @@ def qt_config_as_param(value):
def qt_copy_lib(lib, dir):
qt_dir = get_env("QT_DEPLOY")
# TODO: remove version from library name
qt_major = qt_major_version()
if ("5" != qt_major):
lib = lib.replace("Qt5", "Qt" + qt_major)
if ("windows" == host_platform()):
if ("" == qt_dst_postfix()):
copy_lib(qt_dir, dir, lib)
@ -862,7 +884,7 @@ def qt_copy_lib(lib, dir):
else:
src_file = qt_dir + "/../lib/lib" + lib + ".so." + qt_version()
if (is_file(src_file)):
copy_file(src_file, dir + "/lib" + lib + ".so." + qt_major_version())
copy_file(src_file, dir + "/lib" + lib + ".so." + qt_major)
else:
libFramework = lib
libFramework = libFramework.replace("Qt5", "Qt")
@ -886,9 +908,24 @@ def _check_icu_common(dir, out):
return isExist
def qt_copy_icu(out):
tests = [get_env("QT_DEPLOY") + "/../lib", "/lib", "/lib/x86_64-linux-gnu", "/lib64", "/lib64/x86_64-linux-gnu"]
tests += ["/usr/lib", "/usr/lib/x86_64-linux-gnu", "/usr/lib64", "/usr/lib64/x86_64-linux-gnu"]
tests += ["/lib/i386-linux-gnu", "/usr/lib/i386-linux-gnu"]
tests = [get_env("QT_DEPLOY") + "/../lib"]
prefix = ""
postfixes = [""]
# TODO add for linux arm desktop build
if config.option("sysroot") != "":
prefix = config.option("sysroot")
else:
prefix = ""
postfixes += ["/x86_64-linux-gnu"]
postfixes += ["/i386-linux-gnu"]
for postfix in postfixes:
tests += [prefix + "/lib" + postfix]
tests += [prefix + "/lib64" + postfix]
tests += [prefix + "/usr/lib" + postfix]
tests += [prefix + "/usr/lib64" + postfix]
for test in tests:
if (_check_icu_common(test, out)):
@ -977,7 +1014,7 @@ def generate_doctrenderer_config(path, root, product, vendor = "", dictionaries
file.close()
return
def generate_plist_framework_folder(file, platform):
def generate_plist(file, platform):
bundle_id_url = "com.onlyoffice."
if ("" != get_env("PUBLISHER_BUNDLE_ID")):
bundle_id_url = get_env("PUBLISHER_BUNDLE_ID")
@ -1028,7 +1065,29 @@ def generate_plist_framework_folder(file, platform):
fileInfo.close()
return
def generate_plist(path, platform, max_depth=512):
def generate_xcprivacy(file, platform):
content = \
"""<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
\t<key>NSPrivacyTracking</key>
\t<false/>
\t<key>NSPrivacyCollectedDataTypes</key>
\t<array/>
\t<key>NSPrivacyTrackingDomains</key>
\t<array/>
\t<key>NSPrivacyAccessedAPITypes</key>
\t<array/>
</dict>
</plist>"""
fileDst = os.path.join(file, "PrivacyInfo.xcprivacy")
fileInfo = codecs.open(fileDst, "w", "utf-8")
fileInfo.write(content)
fileInfo.close()
return
def for_each_framework(path, platform, callbacks, max_depth=512):
if not config.check_option("config", "bundle_dylibs"):
return
if max_depth == 0:
@ -1040,9 +1099,10 @@ def generate_plist(path, platform, max_depth=512):
for file in glob.glob(src_folder):
if (is_dir(file)):
if file.endswith(".framework"):
generate_plist_framework_folder(file, platform)
for callback in callbacks:
callback(file, platform)
else:
generate_plist(file, platform, max_depth - 1)
for_each_framework(file, platform, callbacks, max_depth - 1)
return
def correct_bundle_identifier(bundle_identifier):
@ -1269,12 +1329,13 @@ def mac_correct_rpath_binary(path, libs):
def mac_correct_rpath_library(name, libs):
return mac_correct_rpath_binary("./lib" + name + ".dylib", libs)
mac_icu_libs = ["icudata." + icu_ver, "icuuc." + icu_ver]
def mac_correct_rpath_x2t(dir):
cur_dir = os.getcwd()
os.chdir(dir)
mac_correct_rpath_library("icudata.58", [])
mac_correct_rpath_library("icuuc.58", ["icudata.58"])
mac_correct_rpath_library("UnicodeConverter", ["icuuc.58", "icudata.58"])
mac_correct_rpath_library("icudata." + icu_ver, [])
mac_correct_rpath_library("icuuc." + icu_ver, ["icudata." + icu_ver])
mac_correct_rpath_library("UnicodeConverter", mac_icu_libs)
mac_correct_rpath_library("kernel", ["UnicodeConverter"])
mac_correct_rpath_library("kernel_network", ["UnicodeConverter", "kernel"])
mac_correct_rpath_library("graphics", ["UnicodeConverter", "kernel"])
@ -1289,34 +1350,32 @@ def mac_correct_rpath_x2t(dir):
mac_correct_rpath_library("DocxRenderer", ["UnicodeConverter", "kernel", "graphics"])
mac_correct_rpath_library("IWorkFile", ["UnicodeConverter", "kernel"])
mac_correct_rpath_library("HWPFile", ["UnicodeConverter", "kernel", "graphics"])
cmd("chmod", ["-v", "+x", "./x2t"])
cmd("install_name_tool", ["-add_rpath", "@executable_path", "./x2t"], True)
mac_correct_rpath_binary("./x2t", ["icudata.58", "icuuc.58", "UnicodeConverter", "kernel", "kernel_network", "graphics", "PdfFile", "XpsFile", "OFDFile", "DjVuFile", "HtmlFile2", "Fb2File", "EpubFile", "doctrenderer", "DocxRenderer", "IWorkFile", "HWPFile"])
def correct_core_executable(name, libs):
cmd("chmod", ["-v", "+x", name])
cmd("install_name_tool", ["-add_rpath", "@executable_path", name], True)
mac_correct_rpath_binary(name, mac_icu_libs + libs)
return
correct_core_executable("x2t", ["UnicodeConverter", "kernel", "kernel_network", "graphics", "PdfFile", "XpsFile", "OFDFile", "DjVuFile", "HtmlFile2", "Fb2File", "EpubFile", "doctrenderer", "DocxRenderer", "IWorkFile", "HWPFile"])
if is_file("./allfontsgen"):
cmd("chmod", ["-v", "+x", "./allfontsgen"])
cmd("install_name_tool", ["-add_rpath", "@executable_path", "./allfontsgen"], True)
mac_correct_rpath_binary("./allfontsgen", ["icudata.58", "icuuc.58", "UnicodeConverter", "kernel", "graphics"])
correct_core_executable("allfontsgen", ["UnicodeConverter", "kernel", "graphics"])
if is_file("./allthemesgen"):
cmd("chmod", ["-v", "+x", "./allthemesgen"])
cmd("install_name_tool", ["-add_rpath", "@executable_path", "./allthemesgen"], True)
mac_correct_rpath_binary("./allthemesgen", ["icudata.58", "icuuc.58", "UnicodeConverter", "kernel", "graphics", "kernel_network", "doctrenderer", "PdfFile", "XpsFile", "OFDFile", "DjVuFile", "DocxRenderer"])
correct_core_executable("allthemesgen", ["UnicodeConverter", "kernel", "graphics", "kernel_network", "doctrenderer", "PdfFile", "XpsFile", "OFDFile", "DjVuFile", "DocxRenderer"])
if is_file("./pluginsmanager"):
cmd("chmod", ["-v", "+x", "./pluginsmanager"])
cmd("install_name_tool", ["-add_rpath", "@executable_path", "./pluginsmanager"], True)
mac_correct_rpath_binary("./pluginsmanager", ["icudata.58", "icuuc.58", "UnicodeConverter", "kernel", "kernel_network"])
correct_core_executable("pluginsmanager", ["UnicodeConverter", "kernel", "kernel_network"])
if is_file("./vboxtester"):
cmd("chmod", ["-v", "+x", "./vboxtester"])
cmd("install_name_tool", ["-add_rpath", "@executable_path", "./vboxtester"], True)
mac_correct_rpath_binary("./vboxtester", ["icudata.58", "icuuc.58", "UnicodeConverter", "kernel", "kernel_network"])
correct_core_executable("vboxtester", ["UnicodeConverter", "kernel", "kernel_network"])
if is_file("./x2ttester"):
correct_core_executable("x2ttester", ["UnicodeConverter", "kernel", "graphics"])
os.chdir(cur_dir)
return
def mac_add_loader_path_to_rpath(libs):
icu_libs = {"icudata.58", "icuuc.58"}
for lib in libs:
if config.check_option("config", "bundle_dylibs"):
# icu libs are linked statically for frameworks
if lib in icu_libs:
if lib in mac_icu_libs:
continue
cmd("install_name_tool", ["-add_rpath", "@loader_path/../../..", lib + ".framework/" + lib], True)
else:
@ -1327,9 +1386,10 @@ def mac_correct_rpath_docbuilder(dir):
os.chdir(dir)
cmd("chmod", ["-v", "+x", "./docbuilder"])
cmd("install_name_tool", ["-add_rpath", "@executable_path", "./docbuilder"], True)
mac_correct_rpath_binary("./docbuilder", ["icudata.58", "icuuc.58", "UnicodeConverter", "kernel", "kernel_network", "graphics", "PdfFile", "XpsFile", "OFDFile", "DjVuFile", "HtmlFile2", "Fb2File", "EpubFile", "IWorkFile", "HWPFile", "doctrenderer", "DocxRenderer"])
mac_correct_rpath_library("docbuilder.c", ["icudata.58", "icuuc.58", "UnicodeConverter", "kernel", "kernel_network", "graphics", "doctrenderer", "PdfFile", "XpsFile", "OFDFile", "DjVuFile", "DocxRenderer"])
mac_add_loader_path_to_rpath(["icuuc.58", "UnicodeConverter", "kernel", "kernel_network", "graphics", "doctrenderer", "PdfFile", "XpsFile", "OFDFile", "DjVuFile", "DocxRenderer", "docbuilder.c"])
mac_correct_rpath_binary("./docbuilder", mac_icu_libs + ["UnicodeConverter", "kernel", "kernel_network", "graphics", "PdfFile", "XpsFile", "OFDFile", "DjVuFile", "HtmlFile2", "Fb2File", "EpubFile", "IWorkFile", "HWPFile", "doctrenderer", "DocxRenderer"])
mac_correct_rpath_library("docbuilder.c", mac_icu_libs + ["UnicodeConverter", "kernel", "kernel_network", "graphics", "doctrenderer", "PdfFile", "XpsFile", "OFDFile", "DjVuFile", "DocxRenderer"])
mac_add_loader_path_to_rpath(["icuuc." + icu_ver, "UnicodeConverter", "kernel", "kernel_network", "graphics", "doctrenderer", "PdfFile", "XpsFile", "OFDFile", "DjVuFile", "DocxRenderer", "docbuilder.c"])
os.chdir(cur_dir)
return
@ -1375,7 +1435,7 @@ def linux_set_origin_rpath_libraries(dir, libs):
return
def linux_correct_rpath_docbuilder(dir):
linux_set_origin_rpath_libraries(dir, ["docbuilder.jni.so", "docbuilder.c.so", "icuuc.so.58", "doctrenderer.so", "graphics.so", "kernel.so", "kernel_network.so", "UnicodeConverter.so", "PdfFile.so", "XpsFile.so", "OFDFile.so", "DjVuFile.so", "DocxRenderer.so"])
linux_set_origin_rpath_libraries(dir, ["docbuilder.jni.so", "docbuilder.c.so", "icuuc.so." + icu_ver, "doctrenderer.so", "graphics.so", "kernel.so", "kernel_network.so", "UnicodeConverter.so", "PdfFile.so", "XpsFile.so", "OFDFile.so", "DjVuFile.so", "DocxRenderer.so"])
return
def common_check_version(name, good_version, clean_func):
@ -1458,7 +1518,7 @@ def copy_sdkjs_plugins(dst_dir, is_name_as_guid=False, is_desktop_local=False, i
plugins_dir = __file__script__path__ + "/../../onlyoffice.github.io/sdkjs-plugins/content"
plugins_list_config = config.option("sdkjs-plugin")
if isXp:
plugins_list_config="photoeditor, macros, highlightcode, doc2md"
plugins_list_config="photoeditor, highlightcode, doc2md"
if ("" == plugins_list_config):
return
plugins_list = plugins_list_config.rsplit(", ")
@ -1713,7 +1773,7 @@ def convert_ios_framework_to_xcframework_folder(folder, libs):
def change_elf_rpath(path, origin):
# excludes ---
if (-1 != path.find("libicudata.so.58")):
if (-1 != path.find("libicudata.so." + icu_ver)):
return
# ------------
tools_dir = get_script_dir() + "/../tools/linux/elf/"
@ -1827,6 +1887,25 @@ def check_module_version(actual_version, clear_func):
clear_func()
return
def set_sysroot_env():
global ENV_BEFORE_SYSROOT
ENV_BEFORE_SYSROOT = dict(os.environ)
if "linux" == host_platform() and config.option("sysroot") != "":
os.environ['PATH'] = config.option("sysroot") + "/usr/bin:" + get_env("PATH")
os.environ['LD_LIBRARY_PATH'] = config.get_custom_sysroot_lib()
os.environ['QMAKE_CUSTOM_SYSROOT'] = config.option("sysroot")
os.environ['PKG_CONFIG_PATH'] = config.get_custom_sysroot_lib() + "/pkgconfig"
os.environ['CC'] = config.get_custom_sysroot_bin() + "/gcc"
os.environ['CXX'] = config.get_custom_sysroot_bin() + "/g++"
os.environ['CFLAGS'] = "--sysroot=" + config.option("sysroot")
os.environ['CXXFLAGS'] = "--sysroot=" + config.option("sysroot")
check_python()
def restore_sysroot_env():
os.environ.clear()
os.environ.update(ENV_BEFORE_SYSROOT)
def check_python():
if ("linux" != host_platform()):
return
@ -1834,6 +1913,7 @@ def check_python():
directory_bin = __file__script__path__ + "/../tools/linux/python3/bin"
if not is_dir(directory + "/python3"):
download('https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/python/python3.tar.gz', directory + "/python3.tar.gz")
cmd("tar", ["xfz", directory + "/python3.tar.gz", "-C", directory])
cmd("ln", ["-s", directory_bin + "/python3", directory_bin + "/python"])
directory_bin = directory_bin.replace(" ", "\\ ")
@ -1892,13 +1972,43 @@ 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 is_os_arm():
return True
return False
def is_use_create_artifacts_qemu(platform):
if platform == "win_arm64" and not 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")
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"
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"):
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
if ((platform == "linux_arm64") and not is_os_arm()):
cmd_in_dir_qemu(platform, dir, "./x2t", ["-create-js-snapshots"], True)
return
@ -1910,3 +2020,33 @@ def setup_local_qmake(dir_qmake):
dir_base = os.path.dirname(dir_qmake)
writeFile(dir_base + "/onlyoffice_qt.conf", "Prefix = " + dir_base)
return
def deploy_icu(core_dir, dst_dir, platform):
if (0 == platform.find("android")):
src_dir = core_dir + "/Common/3dParty/icu/android/build/" + platform[8:]
copy_file(src_dir + "/icudt" + icu_ver + "l.dat", dst_dir + "/icudt" + icu_ver + "l.dat")
return
isXp = False
if platform.endswith("xp"):
isXp = True
platform = platform[0:-3]
src_dir = core_dir + "/Common/3dParty/icu/" + platform + "/build"
if (0 == platform.find("win")):
icu_ver_win = icu_ver
if isXp:
icu_ver_win = icu_ver_old
src_dir += "/xp"
copy_file(src_dir + "/icudt" + icu_ver_win + ".dll", dst_dir + "/icudt" + icu_ver_win + ".dll")
copy_file(src_dir + "/icuuc" + icu_ver_win + ".dll", dst_dir + "/icuuc" + icu_ver_win + ".dll")
if (0 == platform.find("linux")):
copy_file(src_dir + "/libicudata.so." + icu_ver, dst_dir + "/libicudata.so." + icu_ver)
copy_file(src_dir + "/libicuuc.so." + icu_ver, dst_dir + "/libicuuc.so." + icu_ver)
if (0 == platform.find("mac") and not config.check_option("config", "bundle_dylibs")):
copy_file(src_dir + "/libicudata." + icu_ver + ".dylib", dst_dir + "/libicudata." + icu_ver + ".dylib")
copy_file(src_dir + "/libicuuc." + icu_ver + ".dylib", dst_dir + "/libicuuc." + icu_ver + ".dylib")
return

View File

@ -65,10 +65,6 @@ def make():
deldirs = ['ie', 'mobile', 'embed']
[base.delete_dir(root + "/" + d) for root, dirs, f in os.walk(out_dir + "/desktop/web-apps/apps") for d in dirs if d in deldirs]
# for bug 62528. remove empty folders
walklist = list(os.walk(out_dir + "/desktop/sdkjs"))
[os.remove(p) for p, _, _ in walklist[::-1] if len(os.listdir(p)) == 0]
base.copy_file(base_dir + "/../web-apps/apps/api/documents/index.html.desktop", out_dir + "/desktop/web-apps/apps/api/documents/index.html")
build_interface(base_dir + "/../desktop-apps/common/loginpage/build")

View File

@ -52,6 +52,7 @@ def make():
base.cmd_in_dir(server_dir + "/DocService", "pkg", [".", "-t", pkg_target, "--options", "max_old_space_size=4096", "-o", "docservice"])
base.cmd_in_dir(server_dir + "/FileConverter", "pkg", [".", "-t", pkg_target, "-o", "converter"])
base.cmd_in_dir(server_dir + "/Metrics", "pkg", [".", "-t", pkg_target, "-o", "metrics"])
base.cmd_in_dir(server_dir + "/AdminPanel/server", "pkg", [".", "-t", pkg_target, "-o", "adminpanel"])
example_dir = base.get_script_dir() + "/../../document-server-integration/web/documentserver-example/nodejs"
base.delete_dir(example_dir + "/node_modules")

View File

@ -24,7 +24,7 @@ def parse():
# all platforms
global platforms
platforms = ["win_64", "win_32", "win_64_xp", "win_32_xp",
platforms = ["win_64", "win_32", "win_64_xp", "win_32_xp", "win_arm64",
"linux_64", "linux_32", "linux_arm64",
"mac_64", "mac_arm64",
"ios",
@ -57,6 +57,12 @@ def parse():
if not check_option("platform", "mac_64"):
options["platform"] = "mac_64 " + options["platform"]
if (False):
# use qemu on deploy for emulation
if ("windows" == host_platform) and check_option("platform", "win_arm64") and not base.is_os_arm():
if not check_option("platform", "win_64"):
options["platform"] = "win_64 " + options["platform"]
if ("linux" == host_platform) and check_option("platform", "linux_arm64") and not base.is_os_arm():
if not check_option("platform", "linux_64"):
# linux_64 binaries need only for desktop
@ -77,6 +83,27 @@ def parse():
if ("windows" == host_platform) and ("2019" == option("vs-version")):
extend_option("config", "vs2019")
# sysroot setup
if "linux" != host_platform and "sysroot" in options:
options["sysroot"] = ""
if "linux" == host_platform and "sysroot" in options:
if options["sysroot"] == "0":
options["sysroot"] = ""
elif options["sysroot"] == "1":
dst_dir = os.path.abspath(base.get_script_dir(__file__) + '/../tools/linux/sysroot')
custom_sysroot = dst_dir + '/sysroot_ubuntu_1604'
options["sysroot"] = custom_sysroot
if not os.path.isdir(custom_sysroot):
print("Sysroot is not found, downloading...")
sysroot_url = 'https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/sysroot/sysroot_ubuntu_1604.tar.xz'
base.download(sysroot_url, dst_dir + '/sysroot_ubuntu_1604.tar.xz')
os.mkdir(custom_sysroot)
print("Unpacking...")
base.cmd2('tar', ['-xf', dst_dir + '/sysroot_ubuntu_1604.tar.xz', '-C', dst_dir])
if os.path.exists(dst_dir + '/sysroot_ubuntu_1604.tar.xz'):
os.remove(dst_dir + '/sysroot_ubuntu_1604.tar.xz')
if is_cef_107():
extend_option("config", "cef_version_107")
@ -105,7 +132,10 @@ def parse():
options["sdkjs-plugin-server"] = "default"
if not "arm64-toolchain-bin" in options:
options["arm64-toolchain-bin"] = "/usr/bin"
if not "sysroot" in options:
options["arm64-toolchain-bin"] = "/usr/bin"
else:
options["arm64-toolchain-bin"] = get_custom_sysroot_bin()
if check_option("platform", "ios"):
if not check_option("config", "no_bundle_xcframeworks"):
@ -116,6 +146,10 @@ def parse():
if not check_option("config", "bundle_dylibs"):
extend_option("config", "bundle_dylibs")
if ("mac" == host_platform) and check_option("module", "desktop"):
if not check_option("config", "bundle_dylibs"):
extend_option("config", "bundle_dylibs")
if check_option("use-system-qt", "1"):
base.cmd_in_dir(base.get_script_dir() + "/../tools/linux", "python", ["use_system_qt.py"])
options["qt-dir"] = base.get_script_dir() + "/../tools/linux/system_qt"
@ -139,6 +173,9 @@ def check_compiler(platform):
if (0 == platform.find("win")):
compiler["compiler"] = "msvc" + options["vs-version"]
compiler["compiler_64"] = "msvc" + options["vs-version"] + "_64"
if (0 == platform.find("win_arm")):
compiler["compiler"] = "msvc" + options["vs-version"] + "_arm"
compiler["compiler_64"] = "msvc" + options["vs-version"] + "_arm64"
elif (0 == platform.find("linux")):
compiler["compiler"] = "gcc"
compiler["compiler_64"] = "gcc_64"
@ -199,6 +236,14 @@ def is_mobile_platform():
return True
return False
def get_custom_sysroot_bin():
return option("sysroot") + "/usr/bin"
# todo 32bit support?
def get_custom_sysroot_lib():
if base.is_os_64bit():
return option("sysroot") + "/usr/lib/x86_64-linux-gnu"
def parse_defaults():
defaults_path = base.get_script_dir() + "/../defaults"
if ("" != option("branding")):

View File

@ -21,6 +21,7 @@ import md
import hunspell
import glew
import harfbuzz
import oo_brotli
import hyphen
import googletest
import libvlc
@ -52,11 +53,12 @@ def make():
glew.make()
hyphen.make()
googletest.make()
oo_brotli.make()
heif.make()
if config.check_option("build-libvlc", "1"):
libvlc.make()
if config.check_option("module", "mobile"):
if (config.check_option("platform", "android")):
curl.make()

View File

@ -71,13 +71,6 @@ else:
"arch" : "darwin-x86_64"
}
def get_android_ndk_version():
#return "26.2.11394342"
return "21.1.6352462"
def get_android_ndk_version_major():
return int(get_android_ndk_version().split(".")[0])
def get_options_dict_as_array(opts):
value = []
for key in opts:

View File

@ -11,8 +11,8 @@ current_dir = os.path.abspath(current_dir)
if not current_dir.endswith("/"):
current_dir += "/"
icu_major = "58"
icu_minor = "3"
icu_major = "74"
icu_minor = "2"
options = {
"--enable-strict" : "no",
@ -41,12 +41,12 @@ cpp_flags_base = [
cpp_flags = [
"-fno-short-wchar",
"-fno-short-enums",
"-DU_USING_ICU_NAMESPACE=0",
"-DU_HAVE_NL_LANGINFO_CODESET=0",
"-DU_TIMEZONE=0",
"-DU_DISABLE_RENAMING=0",
"-DUCONFIG_NO_COLLATION=0",
"-DUCONFIG_NO_FORMATTING=0",
"-DUCONFIG_NO_REGULAR_EXPRESSIONS=0",
@ -55,16 +55,11 @@ cpp_flags = [
"-DU_STATIC_IMPLEMENTATION"
]
def fetch_icu():
def fetch_icu(major, minor):
if not base.is_dir(current_dir + "icu"):
base.cmd("git", ["clone", "--depth", "1", "--branch", "maint/maint-" + icu_major, "https://github.com/unicode-org/icu.git", current_dir + "icu2"])
base.cmd("git", ["clone", "--depth", "1", "--branch", "release-" + major + "-" + minor, "https://github.com/unicode-org/icu.git", current_dir + "icu2"])
base.copy_dir(current_dir + "icu2/icu4c", current_dir + "icu")
base.delete_dir_with_access_error(current_dir + "icu2")
if ("linux" == base.host_platform()):
base.replaceInFile(current_dir + "/icu/source/i18n/digitlst.cpp", "xlocale", "locale")
if False and ("mac" == base.host_platform()):
base.replaceInFile(current_dir + "/icu/source/tools/pkgdata/pkgdata.cpp", "cmd, \"%s %s -o %s%s %s %s%s %s %s\",", "cmd, \"%s %s -o %s%s %s %s %s %s %s\",")
return
def build_host():
@ -111,9 +106,9 @@ def build_arch(arch):
cross_build_dir = os.path.abspath(current_dir + "icu/cross_build")
arch_build_dir = os.path.abspath(current_dir + "build/tmp")
base.create_dir(arch_build_dir)
os.chdir(arch_build_dir)
base.cmd("./../../icu/source/configure", ["--with-cross-build=" + cross_build_dir] +
base.cmd("./../../icu/source/configure", ["--with-cross-build=" + cross_build_dir] +
android_ndk.get_options_dict_as_array(options) + ["--host=" + android_ndk.platforms[arch]["target"], "--prefix=" + arch_build_dir])
base.cmd("make", ["-j4"])
os.chdir(current_dir)
@ -132,7 +127,7 @@ def make():
old_env = dict(os.environ)
fetch_icu()
fetch_icu(icu_major, icu_minor)
build_host()

View File

@ -85,19 +85,36 @@ def make():
base.cmd("b2.exe", ["headers"])
base.cmd("b2.exe", ["--clean"])
base.cmd("b2.exe", ["--prefix=./../build/win_32", "link=static", "--with-filesystem", "--with-system", "--with-date_time", "--with-regex", "--toolset=" + win_toolset, "address-model=32", "install"])
if (-1 != config.option("platform").find("win_arm64") and not base.is_file("../build/win_arm64/lib/libboost_system-" + win_vs_version + "-mt-a64-1_72.lib")):
boost_bat = []
boost_bat.append("call bootstrap.bat " + win_boot_arg) # first build b2 for win64, so vcvarsall_call with arm64 later
vcvarsall_call = ("call \"" + config.option("vs-path") + "/vcvarsall.bat\" " + "x64_arm64")
boost_bat.append(vcvarsall_call)
boost_bat.append("call b2.exe headers")
boost_bat.append("call b2.exe --clean")
boost_bat.append("call b2.exe --prefix=./../build/win_arm64 architecture=arm link=static --with-filesystem --with-system --with-date_time --with-regex --toolset=" + win_toolset + " address-model=64 install")
base.run_as_bat(boost_bat)
correct_install_includes_win(base_dir, "win_64")
correct_install_includes_win(base_dir, "win_32")
correct_install_includes_win(base_dir, "win_32")
correct_install_includes_win(base_dir, "win_arm64")
if config.check_option("platform", "linux_64") and not base.is_dir("../build/linux_64"):
addon_config = []
addon_compile = []
if "1" == config.option("use-clang"):
addon_config = ["--with-toolset=clang"]
addon_compile = ["cxxflags=-stdlib=libc++", "linkflags=-stdlib=libc++", "define=_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION"]
base.cmd("./bootstrap.sh", ["--with-libraries=filesystem,system,date_time,regex"] + addon_config)
base.cmd("./b2", ["headers"])
base.cmd("./b2", ["--clean"])
base.cmd("./b2", ["--prefix=./../build/linux_64", "link=static", "cxxflags=-fPIC"] + addon_compile + ["install"])
if config.option("sysroot") == "":
addon_config = []
addon_compile = []
if "1" == config.option("use-clang"):
addon_config = ["--with-toolset=clang"]
addon_compile = ["cxxflags=-stdlib=libc++", "linkflags=-stdlib=libc++", "define=_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION"]
base.cmd("./bootstrap.sh", ["--with-libraries=filesystem,system,date_time,regex"] + addon_config)
base.cmd("./b2", ["headers"])
base.cmd("./b2", ["--clean"])
base.cmd("./b2", ["--prefix=./../build/linux_64", "link=static", "cxxflags=-fPIC"] + addon_compile + ["install"])
else: # build via qmake when custom sysroot is needed
boost_qt.make(os.getcwd(), ["filesystem", "system", "date_time", "regex"], "linux_64")
directory_build = base_dir + "/build/linux_64/lib"
base.delete_file(directory_build + "/libboost_system.a")
base.delete_file(directory_build + "/libboost_system.dylib")
base.copy_files(directory_build + "/linux_64/*.a", directory_build)
# TODO: support x86
if config.check_option("platform", "linux_arm64") and not base.is_dir("../build/linux_arm64"):

View File

@ -9,11 +9,24 @@ import qmake
def make(src_dir, modules, build_platform="android", qmake_addon=""):
old_cur = os.getcwd()
old_env = dict(os.environ)
b2_addon = ""
print("boost-headers...")
base.cmd("./bootstrap.sh", ["--with-libraries=system"])
base.cmd("./b2", ["--prefix=./../build/" + build_platform, "headers", "install"])
# for b2 checks
if config.option("sysroot") != "":
base.set_sysroot_env()
b2_addon = "cflags=\"--sysroot=" + config.option("sysroot") + "\""
b2_addon = "cxxflags=\"--sysroot=" + config.option("sysroot") + "\""
b2_addon = "linkflags=\"--sysroot=" + config.option("sysroot") + "\""
base.cmd("./bootstrap.sh", ["--with-libraries=system"])
base.cmd("./b2", ["--prefix=./../build/" + build_platform, "headers", "install", b2_addon])
if config.option("sysroot") != "":
base.restore_sysroot_env()
for module in modules:
print("boost-module: " + module + " ...")
module_dir = src_dir + "/libs/" + module
@ -40,6 +53,8 @@ def make(src_dir, modules, build_platform="android", qmake_addon=""):
base.save_as_script(module_dir + "/" + module + ".pro", pro_file_content)
os.chdir(module_dir)
qmake.make_all_platforms(module_dir + "/" + module + ".pro", qmake_addon)
os.environ.clear()
os.environ.update(old_env)
os.chdir(old_cur)
return

View File

@ -5,6 +5,13 @@ sys.path.append('../..')
import config
import base
import os
import glob
def clear_module():
for child in glob.glob("./*"):
if base.is_dir(child):
base.delete_dir(child)
return
def make():
print("[fetch & build]: cef")
@ -13,13 +20,14 @@ def make():
old_cur = os.getcwd()
os.chdir(base_dir)
platforms = ["win_64", "win_32", "win_64_xp", "win_32_xp", "linux_64", "linux_32", "mac_64", "mac_arm64"]
base.check_module_version("2", clear_module)
platforms = ["win_64", "win_32", "win_64_xp", "win_32_xp", "linux_64", "linux_32", "mac_64", "mac_arm64", "win_arm64"]
for platform in platforms:
if not config.check_option("platform", platform):
continue
url = "http://d2ettrnqo7v976.cloudfront.net/cef/"
url = "https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/cef/"
archive_name = "./cef_binary.7z"
if (-1 != platform.find("_xp")):

View File

@ -26,7 +26,7 @@ def make():
base.common_check_version("glew", "1", clean)
if not base.is_dir("glew-2.1.0"):
base.download("https://deac-ams.dl.sourceforge.net/project/glew/glew/2.1.0/glew-2.1.0-win32.zip", "./archive.zip")
base.download("https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/glew/glew-2.1.0-win32.zip", "./archive.zip")
base.extract("./archive.zip", "./")
base.delete_file("./archive.zip")

View File

@ -15,11 +15,36 @@ HEIF_VERSION = "1.18.2"
# ios cmake toolchain
IOS_CMAKE_VERSION = "4.5.0"
IOS_CMAKE_TOOLCHAIN_FILE = "ios-cmake/ios.toolchain.cmake"
IOS_CMAKE_TOOLCHAIN_FILE = base.get_script_dir() + "/../../core/Common/3dParty/heif/ios-cmake/ios.toolchain.cmake"
# android cmake toolchain
ANDROID_CMAKE_TOOLCHAIN_FILE = base.get_env("ANDROID_NDK_ROOT") + "/build/cmake/android.toolchain.cmake"
# linux arm64 cmake toolchain
LINUX_ARM64_CMAKE_TOOLCHAIN_FILE = base.get_script_dir() + "/../tools/linux/arm/cross_arm64/linux-arm64.toolchain.cmake"
LINUX_CUSTOM_SYSROOT_TOOLCHAIN_FILE = base.get_script_dir() + "/../tools/linux/sysroot/custom-sysroot.toolchain.cmake"
OLD_ENV = dict()
# get custom sysroot vars as str
def setup_custom_sysroot_env() -> str:
env_vars = []
env_vars += ['LD_LIBRARY_PATH=\"' + config.get_custom_sysroot_lib() + "\""]
env_vars += ['PATH=\"' + config.option("sysroot") + "/usr/bin:" + base.get_env("PATH") + "\""]
env_vars += ['CC=\"' + config.get_custom_sysroot_bin() + "/gcc\""]
env_vars += ['CXX=\"' + config.get_custom_sysroot_bin() + "/g++\""]
env_vars += ['AR=\"' + config.get_custom_sysroot_bin() + "/ar\""]
env_vars += ['RABLIB=\"' + config.get_custom_sysroot_bin() + "/ranlib\""]
env_vars += ['CFLAGS=\"' + "--sysroot=" + config.option("sysroot") + "\""]
env_vars += ['CXXFLAGS=\"' + "--sysroot=" + config.option("sysroot") + "\""]
env_vars += ['LDFLAGS=\"' + "--sysroot=" + config.option("sysroot") + "\""]
env_str = ""
for env_var in env_vars:
env_str += env_var + " "
return env_str
def get_vs_version():
vs_version = "14 2015"
@ -49,10 +74,12 @@ def build_with_cmake(platform, cmake_args, build_type):
cmake_args_ext = [
"-G", f"Visual Studio {get_vs_version()}"
]
if platform == "win_64":
if platform == "win_64" or platform == "win_64_xp":
cmake_args_ext += ["-A", "x64"]
elif platform == "win_32":
elif platform == "win_32" or platform == "win_32_xp":
cmake_args_ext += ["-A", "Win32"]
elif platform == "win_arm64":
cmake_args_ext += ["-A", "ARM64"]
# LINUX, MAC
elif "linux" in platform or "mac" in platform:
cmake_args_ext = [
@ -60,13 +87,13 @@ def build_with_cmake(platform, cmake_args, build_type):
"-DCMAKE_POSITION_INDEPENDENT_CODE=ON" # on UNIX we need to compile with fPIC
]
if platform == "mac_64":
cmake_args_ext += ["-DCMAKE_OSX_DEPLOYMENT_TARGET=10.11"]
if base.is_os_arm():
cmake_args_ext += [
"-DCMAKE_OSX_ARCHITECTURES=x86_64"
]
cmake_args_ext += ["-DCMAKE_OSX_DEPLOYMENT_TARGET=10.11", "-DCMAKE_OSX_ARCHITECTURES=x86_64"]
elif platform == "mac_arm64":
cmake_args_ext += ["-DCMAKE_OSX_DEPLOYMENT_TARGET=11.0"]
cmake_args_ext += ["-DCMAKE_OSX_DEPLOYMENT_TARGET=11.0", "-DCMAKE_OSX_ARCHITECTURES=arm64"]
elif platform == "linux_arm64":
cmake_args += ["-DCMAKE_TOOLCHAIN_FILE=" + LINUX_ARM64_CMAKE_TOOLCHAIN_FILE]
elif config.option("sysroot") != "":
cmake_args += ["-DCMAKE_TOOLCHAIN_FILE=" + LINUX_CUSTOM_SYSROOT_TOOLCHAIN_FILE] # force use custom CXXFLAGS with Release/Debug build
# IOS
elif "ios" in platform:
cmake_args_ext = [
@ -99,11 +126,15 @@ def build_with_cmake(platform, cmake_args, build_type):
elif platform == "android_x86_64":
cmake_args_ext += get_cmake_args_android("x86_64", "21")
# env setup for custom sysroot
env_str = setup_custom_sysroot_env() if config.option("sysroot") != "" else ""
# run cmake
base.cmd("cmake", cmake_args + cmake_args_ext)
base.cmd(env_str + "cmake", cmake_args + cmake_args_ext)
# build
if "Unix Makefiles" in cmake_args_ext:
base.cmd("make", ["-j4"])
base.cmd(env_str + "make", ["-j4"])
else:
base.cmd("cmake", ["--build", ".", "--config", build_type])
return
@ -113,11 +144,14 @@ def make_common(build_func, cmake_args):
# WINDOWS
if "windows" == base.host_platform():
# win_64
if config.check_option("platform", "win_64"):
if config.check_option("platform", "win_64") or config.check_option("platform", "win_64_xp"):
build_func("win_64", cmake_args)
# win_32
if config.check_option("platform", "win_32"):
if config.check_option("platform", "win_32") or config.check_option("platform", "win_32_xp"):
build_func("win_32", cmake_args)
# win_arm64
if config.check_option("platform", "win_arm64"):
build_func("win_arm64", cmake_args)
# LINUX
elif "linux" == base.host_platform():
@ -180,6 +214,7 @@ def make_x265(base_dir, build_type):
"-DENABLE_CLI=OFF", # do not build standalone CLI app
"-DENABLE_SHARED=OFF", # do not build shared libs
"-DENABLE_ASSEMBLY=OFF", # disable assembly optimizations
"-DENABLE_LIBNUMA=OFF", # disable libnuma usage (affects Linux only)
]
# lib build function
@ -269,6 +304,11 @@ def make_heif(base_dir, build_type):
"add_subdirectory(heifio)",
"# add_subdirectory(heifio)"
)
base.replaceInFile(
base_dir + "/libheif/CMakeLists.txt",
"if (DOXYGEN_FOUND)",
"if (FALSE)"
)
# prepare cmake args
cmake_dir = base_dir + "/libheif"
@ -333,6 +373,15 @@ def make_heif(base_dir, build_type):
make_common(build_heif, cmake_args)
return
def clear_module():
if base.is_dir("libde265"):
base.delete_dir_with_access_error("libde265")
if base.is_dir("x265_git"):
base.delete_dir_with_access_error("x265_git")
if base.is_dir("libheif"):
base.delete_dir_with_access_error("libheif")
return
def make():
print("[fetch & build]: heif")
@ -340,16 +389,16 @@ def make():
old_dir = os.getcwd()
os.chdir(base_dir)
base.check_module_version("2", clear_module)
build_type = "Release"
if (-1 != config.option("config").lower().find("debug")):
build_type = "Debug"
# fetch custom cmake toolchain for ios
if -1 != config.option("platform").find("ios"):
if not base.is_dir("ios-cmake"):
if not base.is_file(IOS_CMAKE_TOOLCHAIN_FILE):
fetch_repo("https://github.com/leetal/ios-cmake.git", IOS_CMAKE_VERSION)
global IOS_CMAKE_TOOLCHAIN_FILE
IOS_CMAKE_TOOLCHAIN_FILE = os.path.join(base_dir, IOS_CMAKE_TOOLCHAIN_FILE)
# build encoder library
make_x265(base_dir, build_type)

View File

@ -9,13 +9,12 @@ import os
import glob
import icu_android
def fetch_icu(major, minor):
def fetch_icu(major, minor, target_dir="icu"):
if (base.is_dir("./icu2")):
base.delete_dir_with_access_error("icu2")
base.cmd("git", ["clone", "--depth", "1", "--branch", "maint/maint-" + major, "https://github.com/unicode-org/icu.git", "./icu2"])
base.copy_dir("./icu2/icu4c", "./icu")
base.delete_dir_with_access_error("icu2")
base.cmd("git", ["clone", "--depth", "1", "--branch", "release-" + major + "-" + minor, "https://github.com/unicode-org/icu.git", "./icu2"])
base.copy_dir("./icu2/icu4c", target_dir)
base.delete_dir_with_access_error("icu2")
#base.cmd("svn", ["export", "https://github.com/unicode-org/icu/tags/release-" + icu_major + "-" + icu_minor + "/icu4c", "./icu", "--non-interactive", "--trust-server-cert"])
return
def clear_module():
@ -36,18 +35,26 @@ def make():
old_cur = os.getcwd()
os.chdir(base_dir)
base.check_module_version("3", clear_module)
base.check_module_version("7", clear_module)
if (-1 != config.option("platform").find("android")):
icu_android.make()
os.chdir(base_dir)
icu_major = "58"
icu_minor = "3"
icu_major = "74"
icu_minor = "2"
if not base.is_dir("icu"):
fetch_icu(icu_major, icu_minor)
fetch_icu(icu_major, icu_minor)
# old version for win_xp
icu_major_old = "58"
icu_minor_old = "3"
if config.check_option("platform", "win_64_xp") or config.check_option("platform", "win_32_xp"):
if not base.is_dir("icu58"):
fetch_icu(icu_major_old, icu_minor_old, "icu58")
if ("windows" == base.host_platform()):
platformToolset = "v140"
@ -58,36 +65,65 @@ def make():
need_platforms.append("win_64")
if (-1 != config.option("platform").find("win_32")):
need_platforms.append("win_32")
if (-1 != config.option("platform").find("win_arm64")):
need_platforms.append("win_64") # for exe files
need_platforms.append("win_arm64")
def build_icu_win(source_dir, out_dir, icu_major):
if base.is_dir(out_dir):
return
compile_bat = []
compile_bat.append("setlocal")
args = {
"win_32" : {
"msbuild_platfrom" : "Win32",
"vcvarsall_arch" : "x86",
"out_bin_dir" : source_dir + "/bin/",
"out_lib_dir" : source_dir + "/lib/"
},
"win_64" : {
"msbuild_platfrom" : "X64",
"vcvarsall_arch" : "x64",
"out_bin_dir" : source_dir + "/bin64/",
"out_lib_dir" : source_dir + "/lib64/"
},
"win_arm64" : {
"msbuild_platfrom" : "ARM64",
"vcvarsall_arch" : "x64_arm64",
"out_bin_dir" : source_dir + "/binARM64/",
"out_lib_dir" : source_dir + "/libARM64/"
}
}
platform_args = args[platform]
compile_bat.append("call \"" + config.option("vs-path") + "/vcvarsall.bat\" " + platform_args['vcvarsall_arch'])
compile_bat.append("call MSBuild.exe " + source_dir + "/source/allinone/allinone.sln /p:Configuration=Release /p:PlatformToolset=" + platformToolset + " /p:Platform=" + platform_args['msbuild_platfrom'])
compile_bat.append("endlocal")
base.run_as_bat(compile_bat)
base.create_dir(out_dir)
base.copy_file(platform_args['out_bin_dir'] + "icudt" + icu_major + ".dll", out_dir)
base.copy_file(platform_args['out_bin_dir'] + "icuuc" + icu_major + ".dll", out_dir)
base.copy_file(platform_args['out_lib_dir'] + "icudt.lib", out_dir)
base.copy_file(platform_args['out_lib_dir'] + "icuuc.lib", out_dir)
for platform in need_platforms:
if not config.check_option("platform", platform) and not config.check_option("platform", platform + "_xp"):
continue
if not base.is_dir(platform + "/build"):
base.create_dir(platform)
compile_bat = []
compile_bat.append("setlocal")
compile_bat.append("call \"" + config.option("vs-path") + "/vcvarsall.bat\" " + ("x86" if base.platform_is_32(platform) else "x64"))
compile_bat.append("call MSBuild.exe icu/source/allinone/allinone.sln /p:Configuration=Release /p:PlatformToolset=" + platformToolset + " /p:Platform=" + ("Win32" if base.platform_is_32(platform) else "X64"))
compile_bat.append("endlocal")
base.run_as_bat(compile_bat)
bin_dir = "icu/bin64/" if ("win_64" == platform) else "icu/bin/"
lib_dir = "icu/lib64/" if ("win_64" == platform) else "icu/lib/"
base.create_dir(platform + "/build")
base.copy_file(bin_dir + "icudt" + icu_major + ".dll", platform + "/build/")
base.copy_file(bin_dir + "icuuc" + icu_major + ".dll", platform + "/build/")
base.copy_file(lib_dir + "icudt.lib", platform + "/build/")
base.copy_file(lib_dir + "icuuc.lib", platform + "/build/")
if not (config.check_option("platform", "win_64_xp") or config.check_option("platform", "win_32_xp")):
build_icu_win("icu", platform + "/build", icu_major)
else:
# xp
build_icu_win("icu58", platform + "/build/xp", icu_major_old)
os.chdir(old_cur)
return
if ("linux" == base.host_platform()):
if not base.is_file("./icu/source/i18n/digitlst.cpp.bak"):
base.copy_file("./icu/source/i18n/digitlst.cpp", "./icu/source/i18n/digitlst.cpp.bak")
base.replaceInFile("./icu/source/i18n/digitlst.cpp", "xlocale", "locale")
if base.is_dir(base_dir + "/linux_64"):
base.delete_dir(base_dir + "/linux_64")
if base.is_dir(base_dir + "/linux_arm64"):
base.delete_dir(base_dir + "/linux_arm64")
if not base.is_dir(base_dir + "/linux_64"):
base.create_dir(base_dir + "/icu/cross_build")
os.chdir("icu/cross_build")
@ -96,20 +132,36 @@ def make():
if "1" == config.option("use-clang"):
command_configure = "CXXFLAGS=-stdlib=libc++ " + command_configure
command_compile_addon = "-stdlib=libc++"
base.cmd(command_configure, ["Linux", "--prefix=" + base_dir + "/icu/cross_build_install"])
base.replaceInFile("./../source/icudefs.mk.in", "LDFLAGS = @LDFLAGS@ $(RPATHLDFLAGS)", "LDFLAGS = @LDFLAGS@ $(RPATHLDFLAGS) " + command_compile_addon)
base.cmd("make", ["-j4"])
base.cmd("make", ["install"], True)
if "" == config.option("sysroot"):
base.cmd(command_configure, ["Linux", "--prefix=" + base_dir + "/icu/cross_build_install"])
base.replaceInFile("./../source/icudefs.mk.in", "LDFLAGS = @LDFLAGS@ $(RPATHLDFLAGS)", "LDFLAGS = @LDFLAGS@ $(RPATHLDFLAGS) " + command_compile_addon)
else:
base.set_sysroot_env()
base.cmd_exe("./../source/configure", ["--prefix=" + base_dir + "/icu/cross_build_install",
"CC=" + config.get_custom_sysroot_bin() + "/gcc", "CXX=" + config.get_custom_sysroot_bin() + "/g++",
"AR=" + config.get_custom_sysroot_bin() + "/ar", "RANLIB=" + config.get_custom_sysroot_bin() + "/ranlib",
"CFLAGS=--sysroot=" + config.option("sysroot"),
"CXXFLAGS=--sysroot=" + config.option("sysroot") + " " + command_compile_addon,
"LDFLAGS=--sysroot=" + config.option("sysroot")])
if "" == config.option("sysroot"):
base.cmd("make", ["-j4"])
base.cmd("make", ["install"], True)
else:
base.cmd_exe("make", ["-j4"])
base.cmd_exe("make", ["install"], True)
base.restore_sysroot_env()
base.create_dir(base_dir + "/linux_64")
base.create_dir(base_dir + "/linux_64/build")
base.copy_file(base_dir + "/icu/cross_build_install/lib/libicudata.so." + icu_major + "." + icu_minor, base_dir + "/linux_64/build/libicudata.so." + icu_major)
base.copy_file(base_dir + "/icu/cross_build_install/lib/libicuuc.so." + icu_major + "." + icu_minor, base_dir + "/linux_64/build/libicuuc.so." + icu_major)
base.copy_dir(base_dir + "/icu/cross_build_install/include", base_dir + "/linux_64/build/include")
if config.check_option("platform", "linux_arm64") and not base.is_dir(base_dir + "/linux_arm64") and not base.is_os_arm():
base.create_dir(base_dir + "/icu/linux_arm64")
os.chdir(base_dir + "/icu/linux_arm64")
base_arm_tool_dir = base.get_prefix_cross_compiler_arm64()
base_arm_tool_dir = config.option('arm64-toolchain-bin') + '/' + base.get_prefix_cross_compiler_arm64()
base.cmd("./../source/configure", ["--host=arm-linux", "--prefix=" + base_dir + "/icu/linux_arm64_install", "--with-cross-build=" + base_dir + "/icu/cross_build",
"CC=" + base_arm_tool_dir + "gcc", "CXX=" + base_arm_tool_dir + "g++", "AR=" + base_arm_tool_dir + "ar", "RANLIB=" + base_arm_tool_dir + "ranlib"])
base.cmd("make", ["-j4"])
@ -135,6 +187,6 @@ def make():
if (-1 != config.option("platform").find("ios")):
if not base.is_dir("build"):
base.bash("./icu_ios")
os.chdir(old_cur)
return

View File

@ -5,37 +5,29 @@ sys.path.append('../..')
import base
import os
def change_icu_defs(current_dir, arch):
icudef_file = current_dir + "/icudefs.mk"
icudef_file_old = current_dir + "/icudefs.mk.back"
def change_icu_defs(arch):
old_env = dict(os.environ)
param = "-arch x86_64"
if arch == "arm64":
param = "-arch arm64 -isysroot " + base.find_mac_sdk()
param = "-arch arm64"
param += " -isysroot " + base.find_mac_sdk()
param += " -mmacosx-version-min=10.12"
base.copy_file(icudef_file, icudef_file_old)
os.environ["CFLAGS"] = param
os.environ["CXXFLAGS"] = param + " --std=c++11"
os.environ["LDFLAGS"] = param
base.replaceInFile(icudef_file, "CFLAGS = ", "CFLAGS = " + param + " ")
base.replaceInFile(icudef_file, "CXXFLAGS = ", "CXXFLAGS = " + param + " ")
base.replaceInFile(icudef_file, "RPATHLDFLAGS =", "RPATHLDFLAGS2 =")
base.replaceInFile(icudef_file, "LDFLAGS = ", "LDFLAGS = " + param + " ")
base.replaceInFile(icudef_file, "RPATHLDFLAGS2 =", "RPATHLDFLAGS =")
return old_env
def restore_icu_defs(old_env):
os.environ.clear()
os.environ.update(old_env)
return
def restore_icu_defs(current_dir):
icudef_file = current_dir + "/icudefs.mk"
icudef_file_old = current_dir + "/icudefs.mk.back"
base.delete_file(icudef_file)
base.copy_file(icudef_file_old, icudef_file)
base.delete_file(icudef_file_old)
return
icu_major = "58"
icu_minor = "3"
icu_major = "74"
icu_minor = "2"
current_dir_old = os.getcwd()
current_dir = base.get_script_dir() + "/../../core/Common/3dParty/icu"
@ -46,29 +38,33 @@ if not base.is_dir(current_dir + "/mac_cross_64"):
base.create_dir(current_dir + "/mac_cross_64")
os.chdir(current_dir + "/mac_cross_64")
base.cmd("../icu/source/runConfigureICU", ["MacOSX",
"--prefix=" + current_dir + "/mac_cross_64", "--enable-static", "CFLAGS=-Os CXXFLAGS=--std=c++11"])
old_env = change_icu_defs("x86_64")
change_icu_defs(current_dir + "/mac_cross_64", "x86_64")
base.cmd("../icu/source/runConfigureICU", ["MacOSX",
"--prefix=" + current_dir + "/mac_cross_64", "--enable-static"])
base.cmd("make", ["-j4"])
base.cmd("make", ["install"], True)
restore_icu_defs(current_dir + "/mac_cross_64")
restore_icu_defs(old_env)
os.chdir(current_dir)
os.chdir(current_dir + "/icu/source")
base.cmd("./configure", ["--prefix=" + current_dir + "/mac_arm_64",
"--with-cross-build=" + current_dir + "/mac_cross_64", "--enable-static", "VERBOSE=1"])
old_env = change_icu_defs("arm64")
change_icu_defs(current_dir + "/icu/source", "arm64")
addon = []
if not base.is_os_arm():
addon = ["--host=aarch64-apple-darwin"]
base.cmd("./configure", ["--prefix=" + current_dir + "/mac_arm_64",
"--with-cross-build=" + current_dir + "/mac_cross_64", "--enable-static", "VERBOSE=1"] + addon)
base.cmd("make", ["-j4"])
base.cmd("make", ["install"])
restore_icu_defs(current_dir + "/icu/source")
restore_icu_defs(old_env)
os.chdir(current_dir)

View File

@ -0,0 +1,15 @@
#!/usr/bin/env python
import sys
sys.path.append('../..')
import base
import os
def make():
print("[fetch & build]: brotli")
base.cmd_in_dir(base.get_script_dir() + "/../../core/Common/3dParty/brotli", "./make.py")
return
if __name__ == '__main__':
# manual compile
make()

View File

@ -54,6 +54,14 @@ def make():
qmake_bat.append("call nmake clean")
qmake_bat.append("call nmake build_libs install")
base.run_as_bat(qmake_bat, True)
if (-1 != config.option("platform").find("win_arm64")) and not base.is_dir("../build/win_arm64"):
base.create_dir("./../build/win_arm64")
qmake_bat = []
qmake_bat.append("call \"" + config.option("vs-path") + "/vcvarsall.bat\" x64_arm64")
qmake_bat.append("perl Configure VC-WIN64-ARM --prefix=" + old_cur_dir + "\\build\\win_arm64 --openssldir=" + old_cur_dir + "\\build\\win_arm64 no-shared no-asm enable-md2")
qmake_bat.append("call nmake clean")
qmake_bat.append("call nmake build_libs install")
base.run_as_bat(qmake_bat, True)
os.chdir(old_cur)
# xp ----------------------------------------------------------------------------------------------------
os.chdir(base_dir + "/openssl")
@ -79,22 +87,32 @@ def make():
# -------------------------------------------------------------------------------------------------------
return
if (-1 != config.option("platform").find("linux")) and not base.is_dir("../build/linux_64"):
if (-1 != config.option("platform").find("linux")) and not base.is_dir("../build/linux_64"):
base.cmd("./config", ["enable-md2", "no-shared", "no-asm", "--prefix=" + old_cur_dir + "/build/linux_64", "--openssldir=" + old_cur_dir + "/build/linux_64"])
if "1" == config.option("use-clang"):
base.replaceInFile("./Makefile", "CC=$(CROSS_COMPILE)gcc", "CC=$(CROSS_COMPILE)clang")
base.replaceInFile("./Makefile", "CXX=$(CROSS_COMPILE)g++", "CXX=$(CROSS_COMPILE)clang++")
base.replaceInFile("./Makefile", "CFLAGS=-Wall -O3", "CFLAGS=-Wall -O3 -fvisibility=hidden")
base.replaceInFile("./Makefile", "CXXFLAGS=-Wall -O3", "CXXFLAGS=-Wall -O3 -fvisibility=hidden -stdlib=libc++")
base.replaceInFile("./Makefile", "LDFLAGS", "LDFLAGS=-stdlib=libc++")
else:
base.replaceInFile("./Makefile", "LDFLAGS=", "LDFLAGS=-stdlib=libc++")
elif config.option("sysroot") == "":
base.replaceInFile("./Makefile", "CFLAGS=-Wall -O3", "CFLAGS=-Wall -O3 -fvisibility=hidden")
base.replaceInFile("./Makefile", "CXXFLAGS=-Wall -O3", "CXXFLAGS=-Wall -O3 -fvisibility=hidden")
base.cmd("make")
base.cmd("make", ["install"])
base.cmd("make", ["clean"], True)
# TODO: support x86
else:
base.replaceInFile("./Makefile", "CROSS_COMPILE=", "CROSS_COMPILE=" + config.get_custom_sysroot_bin() + "/")
base.replaceInFile("./Makefile", "CFLAGS=-Wall -O3", "CFLAGS=-Wall -O3 -fvisibility=hidden --sysroot=" + config.option("sysroot"))
base.replaceInFile("./Makefile", "CXXFLAGS=-Wall -O3", "CXXFLAGS=-Wall -O3 -fvisibility=hidden --sysroot=" + config.option("sysroot"))
if config.option("sysroot") == "":
base.cmd("make", [])
base.cmd("make", ["install"])
base.cmd("make", ["clean"], True)
else:
base.set_sysroot_env()
base.cmd_exe("make", [])
base.cmd_exe("make", ["install"])
base.cmd_exe("make", ["clean"], True)
base.restore_sysroot_env()
if (-1 != config.option("platform").find("linux_arm64")) and not base.is_dir("../build/linux_arm64"):
if ("x86_64" != platform.machine()):

View File

@ -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"

View File

@ -26,6 +26,8 @@ def clean():
def is_main_platform():
if (config.check_option("platform", "win_64") or config.check_option("platform", "win_32")):
return True
if (config.check_option("platform", "win_arm64")):
return True
if (config.check_option("platform", "linux_64") or config.check_option("platform", "linux_32") or config.check_option("platform", "linux_arm64")):
return True
if config.check_option("platform", "mac_64"):
@ -45,7 +47,7 @@ def is_use_clang():
gcc_version = base.get_gcc_version()
is_clang = "false"
if (gcc_version >= 6000 or "1" == config.option("use-clang")):
if config.option("sysroot") == "" and (gcc_version >= 6000 or "1" == config.option("use-clang")):
is_clang = "true"
print("gcc version: " + str(gcc_version) + ", use clang:" + is_clang)

View File

@ -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"
@ -44,7 +48,13 @@ def make_args(args, platform, is_64=True, is_debug=False):
args_copy.append("target_cpu=\\\"arm64\\\"")
args_copy.append("v8_target_cpu=\\\"arm64\\\"")
args_copy.append("use_sysroot=true")
if (platform == "win_arm64"):
args_copy = args[:]
args_copy.append("target_cpu=\\\"arm64\\\"")
args_copy.append("v8_target_cpu=\\\"arm64\\\"")
args_copy.append("is_clang=false")
if is_debug:
args_copy.append("is_debug=true")
if (platform == "windows"):
@ -53,13 +63,18 @@ def make_args(args, platform, is_64=True, is_debug=False):
args_copy.append("is_debug=false")
linux_clang = False
if (platform == "linux"):
args_copy.append("is_clang=true")
if "1" == config.option("use-clang"):
args_copy.append("use_sysroot=true")
linux_clang = True
else:
if platform == "linux":
if "" != config.option("sysroot"):
args_copy.append("use_sysroot=false")
args_copy.append("is_clang=false")
else:
args_copy.append("is_clang=true")
if "1" == config.option("use-clang"):
linux_clang = True
else:
args_copy.append("use_sysroot=false")
if (platform == "windows"):
args_copy.append("is_clang=false")
@ -68,12 +83,21 @@ def make_args(args, platform, is_64=True, is_debug=False):
return "--args=\"" + " ".join(args_copy) + "\""
def ninja_windows_make(args, is_64=True, is_debug=False):
def ninja_windows_make(args, is_64=True, is_debug=False, is_arm=False):
directory_out = "out.gn/"
directory_out += ("win_64/" if is_64 else "win_32/")
if is_arm:
directory_out += "win_arm64/"
else:
directory_out += ("win_64/" if is_64 else "win_32/")
directory_out += ("debug" if is_debug else "release")
base.cmd2("gn", ["gen", directory_out, make_args(args, "windows", is_64, is_debug)])
if is_arm:
base.cmd2("gn", ["gen", directory_out, make_args(args, "win_arm64", is_64, is_debug)])
else:
base.cmd2("gn", ["gen", directory_out, make_args(args, "windows", is_64, is_debug)])
base.copy_file("./" + directory_out + "/obj/v8_wrappers.ninja", "./" + directory_out + "/obj/v8_wrappers.ninja.bak")
base.replaceInFile("./" + directory_out + "/obj/v8_wrappers.ninja", "target_output_name = v8_wrappers", "target_output_name = v8_wrappers\nbuild obj/v8_wrappers.obj: cxx ../../../src/base/platform/wrappers.cc")
base.replaceInFile("./" + directory_out + "/obj/v8_wrappers.ninja", "build obj/v8_wrappers.lib: alink", "build obj/v8_wrappers.lib: alink obj/v8_wrappers.obj")
@ -83,7 +107,10 @@ def ninja_windows_make(args, is_64=True, is_debug=False):
if (-1 == win_toolset_wrapper_file_content.find("line = line.decode('utf8')")):
base.replaceInFile(win_toolset_wrapper_file, "for line in link.stdout:\n", "for line in link.stdout:\n line = line.decode('utf8')\n")
base.cmd("ninja", ["-C", directory_out, "v8_wrappers"])
if is_arm:
base.copy_file('./' + directory_out + '/obj/v8_wrappers.lib', './' + directory_out + '/x64/obj/v8_wrappers.lib')
base.cmd("ninja", ["-C", directory_out])
base.delete_file("./" + directory_out + "/obj/v8_wrappers.ninja")
base.move_file("./" + directory_out + "/obj/v8_wrappers.ninja.bak", "./" + directory_out + "/obj/v8_wrappers.ninja")
@ -149,8 +176,19 @@ def make():
if ("windows" == base.host_platform()):
base.replaceInFile("v8/build/config/win/BUILD.gn", ":static_crt", ":dynamic_crt")
# fix for new depot_tools and vs2019, as VC folder contains a folder with a symbol in the name
# sorting is done by increasing version, so 0 is a dummy value
replace_src = " def to_int_if_int(x):\n try:\n return int(x)\n except ValueError:\n return x"
replace_dst = " def to_int_if_int(x):\n try:\n return int(x)\n except ValueError:\n return 0"
base.replaceInFile("v8/build/vs_toolchain.py", replace_src, replace_dst)
if not base.is_file("v8/src/base/platform/wrappers.cc"):
base.writeFile("v8/src/base/platform/wrappers.cc", "#include \"src/base/platform/wrappers.h\"\n")
if config.check_option("platform", "win_arm64"):
base.replaceInFile("v8/build/toolchain/win/setup_toolchain.py", "SDK_VERSION = \'10.0.26100.0\'", "SDK_VERSION = \'10.0.22621.0\'")
else:
base.replaceInFile("depot_tools/gclient_paths.py", "@functools.lru_cache", "")
@ -172,8 +210,24 @@ def make():
"treat_warnings_as_errors=false"]
if config.check_option("platform", "linux_64"):
base.cmd2("gn", ["gen", "out.gn/linux_64", make_args(gn_args, "linux")])
base.cmd("ninja", ["-C", "out.gn/linux_64"])
if config.option("sysroot") != "":
src_replace = "config(\"compiler\") {\n asmflags = []\n cflags = []\n cflags_c = []\n cflags_cc = []\n cflags_objc = []\n cflags_objcc = []\n ldflags = []"
dst_replace = "config(\"compiler\") {\n asmflags = []\n cflags = [\"--sysroot=" + config.option("sysroot") + "\"]" + "\n cflags_c = []\n cflags_cc = [\"--sysroot=" + config.option("sysroot") + "\"]" + "\n cflags_objc = []\n cflags_objcc = []\n ldflags = [\"--sysroot=" + config.option("sysroot") + "\"]"
base.replaceInFile("build/config/compiler/BUILD.gn", src_replace, dst_replace)
src_replace = "gcc_toolchain(\"x64\") {\n cc = \"gcc\"\n cxx = \"g++\""
dst_replace = "gcc_toolchain(\"x64\") {\n cc = \""+ config.get_custom_sysroot_bin() + "/gcc\"\n cxx = \"" + config.get_custom_sysroot_bin() + "/g++\""
base.replaceInFile("build/toolchain/linux/BUILD.gn", src_replace, dst_replace)
old_env = dict(os.environ)
base.set_sysroot_env()
base.cmd2("gn", ["gen", "out.gn/linux_64", make_args(gn_args, "linux")], False)
base.cmd2("ninja", ["-C", "out.gn/linux_64"], False)
base.restore_sysroot_env()
else:
base.cmd2("gn", ["gen", "out.gn/linux_64", make_args(gn_args, "linux")], False)
base.cmd2("ninja", ["-C", "out.gn/linux_64"], False)
if config.check_option("platform", "linux_32"):
base.cmd2("gn", ["gen", "out.gn/linux_32", make_args(gn_args, "linux", False)])
@ -187,6 +241,9 @@ def make():
if config.check_option("platform", "mac_64"):
base.cmd2("gn", ["gen", "out.gn/mac_64", make_args(gn_args, "mac")])
base.cmd("ninja", ["-C", "out.gn/mac_64"])
if config.check_option("platform", "win_arm64") and not base.is_file("out.gn/win_arm64/release/obj/v8_monolith.lib"):
ninja_windows_make(gn_args, True, False, True)
if config.check_option("platform", "win_64"):
if (-1 != config.option("config").lower().find("debug")):

View File

@ -22,4 +22,6 @@ def make():
deploy_mobile.make()
if config.check_option("module", "osign"):
deploy_osign.make()
if base.is_use_create_artifacts_qemu_any_platform():
base.create_artifacts_qemu_any_platform()
return

View File

@ -15,6 +15,7 @@ def make():
continue
root_dir = base_dir + ("/" + native_platform + "/" + branding + ("/DocumentBuilder" if base.is_windows() else "/documentbuilder"))
root_dir_win64 = base_dir + "/win_64/" + branding + "/DocumentBuilder"
if (base.is_dir(root_dir)):
base.delete_dir(root_dir)
base.create_dir(root_dir)
@ -57,17 +58,7 @@ def make():
# base.generate_check_linux_system(git_dir + "/build_tools", root_dir)
# icu
if (0 == platform.find("win")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/icudt58.dll", root_dir + "/icudt58.dll")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/icuuc58.dll", root_dir + "/icuuc58.dll")
if (0 == platform.find("linux")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicudata.so.58", root_dir + "/libicudata.so.58")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicuuc.so.58", root_dir + "/libicuuc.so.58")
if (0 == platform.find("mac") and not config.check_option("config", "bundle_dylibs")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicudata.58.dylib", root_dir + "/libicudata.58.dylib")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicuuc.58.dylib", root_dir + "/libicuuc.58.dylib")
base.deploy_icu(core_dir, root_dir, native_platform)
# doctrenderer
if isWindowsXP:
@ -117,18 +108,25 @@ def make():
# correct ios frameworks
if ("ios" == platform):
base.generate_plist(root_dir, "ios")
base.for_each_framework(root_dir, "ios", callbacks=[base.generate_plist, base.generate_xcprivacy])
if (0 == platform.find("linux")):
base.linux_correct_rpath_docbuilder(root_dir)
if (0 == platform.find("mac")):
base.generate_plist(root_dir, "mac", max_depth=1)
base.for_each_framework(root_dir, "mac", callbacks=[base.generate_plist], max_depth=1)
base.mac_correct_rpath_x2t(root_dir)
base.mac_correct_rpath_docbuilder(root_dir)
base.create_x2t_js_cache(root_dir, "builder", platform)
base.create_dir(root_dir + "/fonts")
base.copy_dir(git_dir + "/core-fonts/asana", root_dir + "/fonts/asana")
base.copy_dir(git_dir + "/core-fonts/caladea", root_dir + "/fonts/caladea")
base.copy_dir(git_dir + "/core-fonts/crosextra", root_dir + "/fonts/crosextra")
base.copy_dir(git_dir + "/core-fonts/openoffice", root_dir + "/fonts/openoffice")
base.copy_file(git_dir + "/core-fonts/ASC.ttf", root_dir + "/fonts/ASC.ttf")
# delete unnecessary builder files
def delete_files(files):
for file in files:

View File

@ -69,7 +69,8 @@ def make():
# correct mac frameworks
if (0 == platform.find("mac")):
base.generate_plist(archive_dir, "mac", max_depth=1)
base.for_each_framework(archive_dir, "mac", callbacks=[base.generate_plist], max_depth=1)
base.mac_correct_rpath_x2t(archive_dir)
# js cache
base.generate_doctrenderer_config(archive_dir + "/DoctRenderer.config", "./", "builder", "", "./dictionaries")

View File

@ -82,18 +82,7 @@ def make():
# base.generate_check_linux_system(git_dir + "/build_tools", root_dir + "/converter")
# icu
if (0 == platform.find("win")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/icudt58.dll", root_dir + "/converter/icudt58.dll")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/icuuc58.dll", root_dir + "/converter/icuuc58.dll")
#base.copy_file(git_dir + "/desktop-apps/common/converter/package.config", root_dir + "/converter/package.config")
if (0 == platform.find("linux")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicudata.so.58", root_dir + "/converter/libicudata.so.58")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicuuc.so.58", root_dir + "/converter/libicuuc.so.58")
if (0 == platform.find("mac") and not config.check_option("config", "bundle_dylibs")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicudata.58.dylib", root_dir + "/converter/libicudata.58.dylib")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicuuc.58.dylib", root_dir + "/converter/libicuuc.58.dylib")
base.deploy_icu(core_dir, root_dir + "/converter", native_platform)
# doctrenderer
if isWindowsXP:
@ -116,8 +105,6 @@ def make():
base.copy_dir(git_dir + "/core-fonts/openoffice", root_dir + "/fonts/openoffice")
base.copy_file(git_dir + "/core-fonts/ASC.ttf", root_dir + "/fonts/ASC.ttf")
base.copy_file(git_dir + "/desktop-apps/common/package/license/3dparty/3DPARTYLICENSE", root_dir + "/3DPARTYLICENSE")
# cef
build_dir_name = "build"
if (0 == platform.find("linux")) and (config.check_option("config", "cef_version_107")):
@ -130,6 +117,20 @@ def make():
else:
base.copy_files(core_dir + "/Common/3dParty/cef/" + native_platform + "/" + build_dir_name + "/*", root_dir)
if (0 == platform.find("mac")):
dir_base_old = os.getcwd()
os.chdir(root_dir + "/Chromium Embedded Framework.framework")
base.create_dir("Versions")
base.create_dir("Versions/A")
base.move_file("Chromium Embedded Framework", "Versions/A/Chromium Embedded Framework")
base.move_dir("Resources", "Versions/A/Resources")
base.move_dir("Libraries", "Versions/A/Libraries")
base.cmd("ln", ["-s", "Versions/A/Chromium Embedded Framework", "Chromium Embedded Framework"])
base.cmd("ln", ["-s", "Versions/A/Resources", "Resources"])
base.cmd("ln", ["-s", "Versions/A/Libraries", "Libraries"])
base.cmd("ln", ["-s", "A", "Versions/Current"])
os.chdir(dir_base_old);
isUseQt = True
if (0 == platform.find("mac")) or (0 == platform.find("ios")):
isUseQt = False
@ -243,6 +244,19 @@ def make():
#base.copy_dir(git_dir + "/desktop-sdk/ChromiumBasedEditors/plugins/encrypt/ui/engine/database/{9AB4BBA8-A7E5-48D5-B683-ECE76A020BB1}", root_dir + "/editors/sdkjs-plugins/{9AB4BBA8-A7E5-48D5-B683-ECE76A020BB1}")
base.copy_sdkjs_plugin(git_dir + "/desktop-sdk/ChromiumBasedEditors/plugins", root_dir + "/editors/sdkjs-plugins", "sendto", True)
isUseAgent = False
if isWindowsXP:
isUseAgent = False
if (isUseAgent):
agent_plugin_dir = git_dir + "/desktop-sdk/ChromiumBasedEditors/plugins/ai-agent"
if (False):
base.cmd_in_dir(agent_plugin_dir, "npm", ["install"], True)
base.cmd_in_dir(agent_plugin_dir, "npm", ["run", "build"], True)
base.copy_dir(agent_plugin_dir + "/{9DC93CDB-B576-4F0C-B55E-FCC9C48DD777}", root_dir + "/editors/sdkjs-plugins/{9DC93CDB-B576-4F0C-B55E-FCC9C48DD777}")
else:
base.copy_dir(agent_plugin_dir + "/deploy/{9DC93CDB-B576-4F0C-B55E-FCC9C48DD777}", root_dir + "/editors/sdkjs-plugins/{9DC93CDB-B576-4F0C-B55E-FCC9C48DD777}")
base.copy_file(base_dir + "/js/" + branding + "/desktop/index.html", root_dir + "/index.html")
base.create_dir(root_dir + "/editors/webext")
base.copy_file(base_dir + "/js/" + branding + "/desktop/noconnect.html", root_dir + "/editors/webext/noconnect.html")
@ -272,9 +286,14 @@ def make():
base.delete_file(root_dir + "/cef_sandbox.lib")
base.delete_file(root_dir + "/libcef.lib")
isMacArmPlaformOnIntel = False
is_host_not_arm = False
host_platform = ""
# TODO: fix this on mac_arm64 (qemu)
# on windows we are using qemu
if (platform == "mac_arm64") and not base.is_os_arm():
isMacArmPlaformOnIntel = True
is_host_not_arm = True
host_platform = "mac_64"
# all themes generate ----
base.copy_exe(core_build_dir + "/bin/" + platform_postfix, root_dir + "/converter", "allfontsgen")
@ -282,29 +301,31 @@ def make():
if (0 == platform.find("mac")):
# gen plists with max_depth 2 because frameworks are only located in root_dir and converter subdirectory
base.generate_plist(root_dir, "mac", max_depth=2)
base.for_each_framework(root_dir, "mac", callbacks=[base.generate_plist], max_depth=2)
base.mac_correct_rpath_desktop(root_dir)
if isMacArmPlaformOnIntel:
if is_host_not_arm:
sdkjs_dir = root_dir + "/editors/sdkjs"
end_find_platform = sdkjs_dir.rfind("/mac_arm64/")
sdkjs_dir_mac64 = sdkjs_dir[0:end_find_platform] + "/mac_64/" + sdkjs_dir[end_find_platform+11:]
str1 = "/" + platform + "/"
str2 = "/" + host_platform + "/"
sdkjs_dir_host = sdkjs_dir.replace(str1, str2)
base.delete_dir(sdkjs_dir)
base.copy_dir(sdkjs_dir_mac64, 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\""])
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)
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")
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 not 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

View File

@ -73,29 +73,14 @@ def make():
base.copy_lib(core_build_dir + "/lib/" + platform_postfix, root_dir, "x2t")
# icu
if (0 == platform.find("win")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/icudt58.dll", root_dir + "/icudt58.dll")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/icuuc58.dll", root_dir + "/icuuc58.dll")
if (0 == platform.find("linux")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicudata.so.58", root_dir + "/libicudata.so.58")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicuuc.so.58", root_dir + "/libicuuc.so.58")
if (0 == platform.find("mac")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicudata.58.dylib", root_dir + "/libicudata.58.dylib")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicuuc.58.dylib", root_dir + "/libicuuc.58.dylib")
if (0 == platform.find("android")):
#base.copy_file(core_dir + "/Common/3dParty/icu/android/build/" + platform[8:] + "/libicudata.so", root_dir + "/libicudata.so")
#base.copy_file(core_dir + "/Common/3dParty/icu/android/build/" + platform[8:] + "/libicuuc.so", root_dir + "/libicuuc.so")
base.copy_file(core_dir + "/Common/3dParty/icu/android/build/" + platform[8:] + "/icudt58l.dat", root_dir + "/icudt58l.dat")
base.deploy_icu(core_dir, root_dir, platform)
# js
base.copy_dir(base_dir + "/js/" + branding + "/mobile/sdkjs", root_dir + "/sdkjs")
# correct ios frameworks
if ("ios" == platform):
base.generate_plist(root_dir, "ios")
base.for_each_framework(root_dir, "ios", callbacks=[base.generate_plist, base.generate_xcprivacy])
deploy_fonts(git_dir, root_dir)
base.copy_dictionaries(git_dir + "/dictionaries", root_dir + "/dictionaries", True, False)

View File

@ -37,7 +37,7 @@ def make():
# correct ios frameworks
if ("ios" == platform):
base.generate_plist(root_dir, "ios")
base.for_each_framework(root_dir, "ios", callbacks=[base.generate_plist, base.generate_xcprivacy])
for native_platform in platforms:
if native_platform == "android":

View File

@ -58,6 +58,14 @@ def make():
base.create_dir(build_server_dir + '/Metrics/node_modules/modern-syslog/build/Release')
base.copy_file(server_dir + "/Metrics/node_modules/modern-syslog/build/Release/core.node", build_server_dir + "/Metrics/node_modules/modern-syslog/build/Release/core.node")
# AdminPanel server part
base.create_dir(build_server_dir + '/AdminPanel/server')
base.copy_exe(server_dir + "/AdminPanel/server", build_server_dir + '/AdminPanel/server', "adminpanel")
# AdminPanel client part
base.create_dir(build_server_dir + '/AdminPanel/client/build')
base.copy_dir(server_dir + '/AdminPanel/client/build', build_server_dir + '/AdminPanel/client/build')
qt_dir = base.qt_setup(native_platform)
platform = native_platform
@ -94,17 +102,7 @@ def make():
base.generate_doctrenderer_config(converter_dir + "/DoctRenderer.config", "../../../", "server", "", "../../../dictionaries")
# icu
if (0 == platform.find("win")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/icudt58.dll", converter_dir + "/icudt58.dll")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/icuuc58.dll", converter_dir + "/icuuc58.dll")
if (0 == platform.find("linux")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicudata.so.58", converter_dir + "/libicudata.so.58")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicuuc.so.58", converter_dir + "/libicuuc.so.58")
if (0 == platform.find("mac") and not config.check_option("config", "bundle_dylibs")):
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicudata.58.dylib", converter_dir + "/libicudata.58.dylib")
base.copy_file(core_dir + "/Common/3dParty/icu/" + platform + "/build/libicuuc.58.dylib", converter_dir + "/libicuuc.58.dylib")
base.deploy_icu(core_dir, converter_dir, platform)
base.copy_v8_files(core_dir, converter_dir, platform)
@ -114,7 +112,7 @@ def make():
# correct mac frameworks
if (0 == platform.find("mac")):
base.generate_plist(converter_dir, "mac", max_depth=1)
base.for_each_framework(converter_dir, "mac", callbacks=[base.generate_plist], max_depth=1)
# js
js_dir = root_dir

View File

@ -0,0 +1,104 @@
# This script was successfully executed on Ubuntu 22.04.5 LTS
# Before starting, make sure that:
# 1. Python >= 3.9
# 2. The current working folder with the script and its path do not contain spaces and use Latin characters.
# 3. Antivirus is turned off
# 4. There is enough free space on the disk (50GB Libre Office and during the unpacking of packages, it's recommended that you allocate at least 80 gigabytes of free space)
# 5. The current working folder with the script and its path do not contain spaces and use Latin characters.
# If the error "You must put some 'source' URIs in your sources.list" occurs, you need to run the command:
# software-properties-gtk
# in the terminal, and then under the "Ubuntu Software" tab, click "Source code" if it's not turned on and submit
# after completion, the file will appear:
# current_folder_with_script/libreoffice_build/instdir/soffice
# debugging can be done via MVS 2022
# https://wiki.documentfoundation.org/Development/IDE#Microsoft_Visual_Studio
# or via VS Code with c/c++ tools
# https://wiki.documentfoundation.org/Development/IDE#Visual_Studio_Code_(VSCode)
# or via Qt Creator
# https://wiki.documentfoundation.org/Development/IDE#Qt_Creator
# or via attatch to the soffice.bin process
# https://wiki.documentfoundation.org/Development/How_to_debug#Debugging_with_gdb
import subprocess
import sys
import os
CONFIGURE_PARAMS = [
"--enable-dbgutil",
"--without-doxygen",
"--enable-pch",
"--disable-ccache",
# "--with-visual-studio=2022",
'--enable-symbols="all"'
]
SUDO_DEPENDENCIES = [
"git", "build-essential", "zip", "ccache", "junit4", "libkrb5-dev", "nasm", "graphviz", "python3",
"python3-dev", "python3-setuptools", "qtbase5-dev", "libkf5coreaddons-dev", "libkf5i18n-dev",
"libkf5config-dev", "libkf5windowsystem-dev", "libkf5kio-dev", "libqt5x11extras5-dev", "autoconf",
"libcups2-dev", "libfontconfig1-dev", "gperf", "openjdk-17-jdk", "doxygen", "libxslt1-dev",
"xsltproc", "libxml2-utils", "libxrandr-dev", "libx11-dev", "bison", "flex", "libgtk-3-dev",
"libgstreamer-plugins-base1.0-dev", "libgstreamer1.0-dev", "ant", "ant-optional", "libnss3-dev",
"libavahi-client-dev", "libxt-dev"
]
DIR_NAME = "libreoffice"
OFFICE_PATH = "instdir/program/soffice"
class bcolors:
OKBLUE = '\033[94m'
OKCYAN = '\033[96m'
OKGREEN = '\033[92m'
FAIL = '\033[91m'
RESET = '\033[0m'
def run_command(command, exit_on_error=True):
try:
subprocess.run(command, shell=True, check=True)
except subprocess.CalledProcessError as e:
print(f"{bcolors.FAIL}Error executing command: {command}{bcolors.RESET}")
if exit_on_error:
sys.exit(1)
def install_dependencies():
print("Updating package list...")
run_command("sudo apt update")
print("Adding PPA for GCC/G++ update...")
run_command("sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test")
run_command("sudo apt update")
print("Installing dependencies for LibreOffice...")
run_command("sudo apt-get build-dep -y libreoffice")
run_command(f"sudo apt-get install {' '.join(map(str, SUDO_DEPENDENCIES))}")
print("Updating GCC/G++ to v12...")
run_command("sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 60 --slave /usr/bin/g++ g++ /usr/bin/g++-12", exit_on_error=False)
print(bcolors.OKGREEN + "All dependencies successfully installed!" + bcolors.RESET)
def build_libreoffice():
print("Cloning LibreOffice repository...")
run_command(f"git clone https://git.libreoffice.org/core {DIR_NAME}", exit_on_error=False)
print("Changing to build directory...")
os.chdir(f"./{DIR_NAME}")
print("Start configurator autogen.sh...")
run_command(f"./autogen.sh {' '.join(map(str, CONFIGURE_PARAMS))}")
print(bcolors.OKCYAN + "Starting libreoffice build, this may take up to 24 hours and takes up about 20 GB of drive space. You will also most likely need at least 8 GBs of RAM, otherwise the machine might fall into swap and appear to freeze up..." + bcolors.RESET)
run_command("make")
print(bcolors.OKGREEN + "LibreOffice build completed!" + bcolors.RESET)
# print(bcolors.OKCYAN + "Running LibreOffice..." + bcolors.RESET)
# run_command(OFFICE_PATH, exit_on_error=False)
if __name__ == "__main__":
install_dependencies()
build_libreoffice()

View File

@ -0,0 +1,202 @@
# Before starting, make sure that:
# 1. MVS 2022 is installed and the necessary individual components are in its installer
# <20> Windows Universal C Runtime
# <20> .NET Framework 4.x SDK (.NET Framework 5.x SDK and later are currently not supported. These don't register their information to registry, don't have csc.exe and they use dotnet command with csc.dll instead for compiling.)
# <20> C++ 20xx Redistributable MSMs (only required to build MSI installer)
# <20> C++ Clang Compiler for Windows (x.x.x)
# 2. Java JDK >= 17
# 3. Antivirus is turned off
# 4. There is enough free space on the disk (50GB Libre Office, 50Gb cygwin64)
# after completion, the files will appear:
# {LO_BUILD_PATH}/sources/libo-core/instdir/program/soffice.exe
# {LO_BUILD_PATH}/sources/libo-core/LibreOffice.sln
# debugging can be done via MVS 2022
# https://wiki.documentfoundation.org/Development/IDE#Microsoft_Visual_Studio
# or via attatch to the soffice.bin process
# https://wiki.documentfoundation.org/Development/How_to_debug#Debugging_with_gdb
import sys
sys.path.append('../../scripts')
import threading
import os
import subprocess
import shutil
import argparse
import base
CYGWIN_DOWNLOAD_URL = 'https://cygwin.com/setup-x86_64.exe'
CYGWIN_TEMP_PATH = './tmp'
CYGWIN_SETUP_FILENAME = 'setup-x86_64.exe'
CYGWIN_SETUP_PARAMS = [
"-P", "autoconf",
"-P", "automake",
"-P", "bison",
"-P", "cabextract",
"-P", "doxygen",
"-P", "flex",
"-P", "gawk=5.2.2-1",
"-P", "gcc-g++",
"-P", "gettext-devel",
"-P", "git",
"-P", "gnupg",
"-P", "gperf",
"-P", "make",
"-P", "mintty",
"-P", "nasm",
"-P", "openssh",
"-P", "openssl",
"-P", "patch",
"-P", "perl",
"-P", "python",
"-P", "python3",
"-P", "pkg-config",
"-P", "rsync",
"-P", "unzip",
"-P", "vim",
"-P", "wget",
"-P", "zip",
"-P", "perl-Archive-Zip",
"-P", "perl-Font-TTF",
"-P", "perl-IO-String",
"--no-admin",
"--quiet-mode"
]
CYGWIN_BAT_PATH = 'C:/cygwin64/Cygwin.bat'
LO_BUILD_PATH = os.path.normpath(os.path.join(os.getcwd(), '../../../LO'))
CONFIGURE_PARAMS = [f'--with-external-tar="{LO_BUILD_PATH}/sources/lo-externalsrc"',
f'--with-junit="{LO_BUILD_PATH}/sources/junit-4.10.jar"',
f'--with-ant-home="{LO_BUILD_PATH}/sources/apache-ant-1.9.5"',
"--enable-pch",
"--disable-ccache",
"--with-visual-studio=2022",
"--enable-dbgutil",
'--enable-symbols="all"']
def create_folder_safe(folder_path):
if not os.path.exists(folder_path):
try:
os.mkdir(folder_path)
print(f"Folder '{folder_path}' created successfully.")
except Exception as e:
print(f"Error creating folder: {e}")
else:
print(f"Folder '{folder_path}' already exists.")
class CygwinRunner:
@staticmethod
def process_commands(commands: list[str]):
proc = subprocess.Popen(
[CYGWIN_BAT_PATH], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True,
shell=True, creationflags=subprocess.CREATE_NEW_CONSOLE
)
def read_stdout():
for line in iter(proc.stdout.readline, ''):
sys.stdout.write(line)
proc.stdout.close()
def read_stderr():
for line in iter(proc.stderr.readline, ''):
sys.stderr.write(line)
proc.stderr.close()
stdout_thread = threading.Thread(target=read_stdout)
stderr_thread = threading.Thread(target=read_stderr)
stdout_thread.start()
stderr_thread.start()
for command in commands:
proc.stdin.write(command + '\n')
proc.stdin.flush()
stdout_thread.join()
stderr_thread.join()
proc.stdin.close()
proc.wait()
@staticmethod
def install_gnu_make():
base.print_info("install_gnu_make")
commands = ['mkdir -p /opt/lo/bin',
'cd /opt/lo/bin',
'wget https://dev-www.libreoffice.org/bin/cygwin/make-4.2.1-msvc.exe',
'cp make-4.2.1-msvc.exe make',
'chmod +x make',
'exit']
CygwinRunner.process_commands(commands)
@staticmethod
def install_ant_and_junit():
base.print_info("install_ant_and_junit")
commands = [f'mkdir -p {LO_BUILD_PATH}/sources',
f'cd {LO_BUILD_PATH}/sources',
'wget https://archive.apache.org/dist/ant/binaries/apache-ant-1.9.5-bin.tar.bz2',
'tar -xjvf apache-ant-1.9.5-bin.tar.bz2',
'wget http://downloads.sourceforge.net/project/junit/junit/4.10/junit-4.10.jar',
'exit']
CygwinRunner.process_commands(commands)
@staticmethod
def clone_lo():
base.print_info("clone_lo")
commands = [f'cd {LO_BUILD_PATH}/sources',
'git clone https://gerrit.libreoffice.org/core libo-core',
'exit']
CygwinRunner.process_commands(commands)
@staticmethod
def build_autogen():
base.print_info("build_autogen")
commands = [f'cd {LO_BUILD_PATH}/sources/libo-core',
f"./autogen.sh {' '.join(map(str, CONFIGURE_PARAMS))}",
'exit']
CygwinRunner.process_commands(commands)
@staticmethod
def run_make_build():
base.print_info("run_make")
commands = [f'cd {LO_BUILD_PATH}/sources/libo-core',
f'/opt/lo/bin/make gb_COLOR=1',
"exit"]
CygwinRunner.process_commands(commands)
@staticmethod
def build_vs_integration():
base.print_info("run_make")
commands = [f'cd {LO_BUILD_PATH}/sources/libo-core',
f'/opt/lo/bin/make gb_COLOR=1 vs-ide-integration',
"exit"]
CygwinRunner.process_commands(commands)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="options")
parser.add_argument("--lo_build_path", dest="build_path", default=f'../../../LO')
parser.add_argument("--disable_sln", dest="disable_sln", action=argparse.BooleanOptionalAction)
args = parser.parse_args()
LO_BUILD_PATH = args.build_path
DISABLE_SLN = args.disable_sln
create_folder_safe(f'{LO_BUILD_PATH}/sources/lo-externalsrc')
create_folder_safe(CYGWIN_TEMP_PATH)
os.chdir(CYGWIN_TEMP_PATH)
base.download(CYGWIN_DOWNLOAD_URL, CYGWIN_SETUP_FILENAME)
subprocess.run([CYGWIN_SETUP_FILENAME] + CYGWIN_SETUP_PARAMS)
os.chdir('..')
shutil.rmtree(CYGWIN_TEMP_PATH)
CygwinRunner.install_gnu_make()
CygwinRunner.install_ant_and_junit()
CygwinRunner.clone_lo()
CygwinRunner.build_autogen()
CygwinRunner.run_make_build()
if not DISABLE_SLN:
CygwinRunner.build_vs_integration()

View File

@ -8,6 +8,13 @@ import dependence
import traceback
import develop
# if (sys.version_info[0] >= 3):
# unicode = str
# host_platform = base.host_platform()
# if (host_platform == 'windows'):
# import libwindows
base_dir = base.get_script_dir(__file__)
def install_module(path):
@ -21,11 +28,18 @@ def find_rabbitmqctl(base_path):
return base.find_file(os.path.join(base_path, 'RabbitMQ Server'), 'rabbitmqctl.bat')
def restart_win_rabbit():
# todo maybe restarting is not relevant after many years and versions?
base.print_info('restart RabbitMQ node to prevent "Erl.exe high CPU usage every Monday morning on Windows" https://groups.google.com/forum/#!topic/rabbitmq-users/myl74gsYyYg')
rabbitmqctl = find_rabbitmqctl(os.environ['PROGRAMW6432']) or find_rabbitmqctl(os.environ['ProgramFiles(x86)'])
if rabbitmqctl is not None:
base.cmd_in_dir(base.get_script_dir(rabbitmqctl), 'rabbitmqctl.bat', ['stop_app'])
base.cmd_in_dir(base.get_script_dir(rabbitmqctl), 'rabbitmqctl.bat', ['start_app'])
try:
# code = libwindows.sudo(unicode(sys.executable), ['net', 'stop', 'rabbitmq'])
# code = libwindows.sudo(unicode(sys.executable), ['net', 'start', 'rabbitmq'])
base.cmd_in_dir(base.get_script_dir(rabbitmqctl), 'rabbitmqctl.bat', ['stop_app'])
base.cmd_in_dir(base.get_script_dir(rabbitmqctl), 'rabbitmqctl.bat', ['start_app'])
except SystemExit:
base.print_error('Perhaps Erlang cookies are different: Replace %userprofile%/.erlang.cookie with %WINDIR%/System32/config/systemprofile/.erlang.cookie')
raise
else:
base.print_info('Missing rabbitmqctl.bat')

View File

@ -198,6 +198,11 @@
"editors-ios/Vendor/ThreadSafeMutable/ThreadSafeMutableDictionary.h",
"editors-ios/Vendor/ThreadSafeMutable/ThreadSafeMutableDictionary.m"
]
},
{
"dir": "editors-webview-ios",
"fileExtensions": [".swift", ".xcconfig"],
"licensePath": "header.license",
}
]
}

View File

@ -1,5 +1,5 @@
/*
* (c) Copyright Ascensio System SIA 2010-2024
* (c) Copyright Ascensio System SIA 2010-2025
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)

View File

@ -35,7 +35,7 @@ def s3_upload(files, dst):
#
def make_windows():
global package_name, package_version, arch, xp, suffix
global package_name, package_version, arch, xp
utils.set_cwd("desktop-apps\\win-linux\\package\\windows")
package_name = branding.desktop_package_name
@ -47,7 +47,6 @@ def make_windows():
"windows_x86_xp": "x86"
}[common.platform]
xp = common.platform.endswith("_xp")
suffix = arch + ("-xp" if xp else "")
if common.clean:
utils.log_h2("desktop clean")
@ -59,125 +58,120 @@ def make_windows():
utils.delete_files("*.zip")
utils.delete_files("data\\*.exe")
make_prepare()
make_zip()
make_inno()
make_advinst()
make_online()
if not xp:
make_prepare()
make_zip()
make_inno()
if branding.onlyoffice:
make_inno("standalone")
make_inno("update")
make_advinst()
make_prepare("commercial")
make_zip("commercial")
make_inno("commercial")
make_advinst("commercial")
else:
make_prepare("xp")
make_zip("xp")
make_inno("xp")
# Disable build online installer
# if common.platform == "windows_x86_xp":
# make_online()
utils.set_cwd(common.workspace_dir)
return
def make_prepare():
def make_prepare(edition = "opensource"):
args = [
"-Version", package_version,
"-Arch", arch
"-Arch", arch,
"-Target", edition
]
if xp:
args += ["-Target", "xp"]
if common.sign:
args += ["-Sign"]
utils.log_h2("desktop prepare")
utils.log_h2("desktop prepare " + edition)
ret = utils.ps1("make.ps1", args, verbose=True)
utils.set_summary("desktop prepare", ret)
utils.set_summary("desktop prepare " + edition, ret)
return
def make_zip():
zip_file = "%s-%s-%s.zip" % (package_name, package_version, suffix)
def make_zip(edition = "opensource"):
if edition == "commercial": zip_file = "%s-Enterprise-%s-%s.zip"
elif edition == "xp": zip_file = "%s-XP-%s-%s.zip"
else: zip_file = "%s-%s-%s.zip"
zip_file = zip_file % (package_name, package_version, arch)
args = [
"-Version", package_version,
"-Arch", arch
"-Arch", arch,
"-Target", edition
]
if xp:
args += ["-Target", "xp"]
# if common.sign:
# args += ["-Sign"]
utils.log_h2("desktop zip build")
utils.log_h2("desktop zip " + edition + " build")
ret = utils.ps1("make_zip.ps1", args, verbose=True)
utils.set_summary("desktop zip build", ret)
utils.set_summary("desktop zip " + edition + " build", ret)
if common.deploy and ret:
utils.log_h2("desktop zip deploy")
utils.log_h2("desktop zip " + edition + " deploy")
ret = s3_upload([zip_file], "desktop/win/generic/")
utils.set_summary("desktop zip deploy", ret)
utils.set_summary("desktop zip " + edition + " deploy", ret)
return
def make_inno():
inno_file = "%s-%s-%s.exe" % (package_name, package_version, suffix)
inno_sa_file = "%s-Standalone-%s-%s.exe" % (package_name, package_version, suffix)
inno_update_file = "%s-Update-%s-%s.exe" % (package_name, package_version, suffix)
update_wrapper = not (hasattr(branding, 'desktop_updates_skip_iss_wrapper') and branding.desktop_updates_skip_iss_wrapper)
def make_inno(edition = "opensource"):
if edition == "commercial": inno_file = "%s-Enterprise-%s-%s.exe"
elif edition == "standalone": inno_file = "%s-Standalone-%s-%s.exe"
elif edition == "update": inno_file = "%s-Update-%s-%s.exe"
elif edition == "xp": inno_file = "%s-XP-%s-%s.exe"
else: inno_file = "%s-%s-%s.exe"
inno_file = inno_file % (package_name, package_version, arch)
args = [
"-Version", package_version,
"-Arch", arch
"-Arch", arch,
"-Target", edition
]
if common.sign:
args += ["-Sign"]
utils.log_h2("desktop inno build")
if xp:
ret = utils.ps1("make_inno.ps1", args + ["-Target", "xp"], verbose=True)
else:
ret = utils.ps1("make_inno.ps1", args, verbose=True)
utils.set_summary("desktop inno build", ret)
args += ["-TimestampServer", "http://timestamp.comodoca.com/authenticode"]
if branding.onlyoffice and not xp:
utils.log_h2("desktop inno standalone")
ret = utils.ps1("make_inno.ps1", args + ["-Target", "standalone"], verbose=True)
utils.set_summary("desktop inno standalone build", ret)
if update_wrapper and not xp:
utils.log_h2("desktop inno update build")
ret = utils.ps1("make_inno.ps1", args + ["-Target", "update"], verbose=True)
utils.set_summary("desktop inno update build", ret)
if common.deploy:
utils.log_h2("desktop inno deploy")
ret = s3_upload([inno_file], "desktop/win/inno/")
utils.set_summary("desktop inno deploy", ret)
if branding.onlyoffice and not xp:
utils.log_h2("desktop inno standalone deploy")
ret = s3_upload([inno_sa_file], "desktop/win/inno/")
utils.set_summary("desktop inno standalone deploy", ret)
utils.log_h2("desktop inno update deploy")
if utils.is_file(inno_update_file):
ret = s3_upload([inno_update_file], "desktop/win/inno/")
elif utils.is_file(inno_file):
ret = s3_upload([inno_file], "desktop/win/inno/" + inno_update_file)
else:
ret = False
utils.set_summary("desktop inno update deploy", ret)
return
def make_advinst():
if not common.platform in ["windows_x64", "windows_x86"]:
return
advinst_file = "%s-%s-%s.msi" % (package_name, package_version, suffix)
args = [
"-Version", package_version,
"-Arch", arch
]
if common.sign:
args += ["-Sign"]
utils.log_h2("desktop advinst build")
ret = utils.ps1("make_advinst.ps1", args, verbose=True)
utils.set_summary("desktop advinst build", ret)
utils.log_h2("desktop inno " + edition + " build")
ret = utils.ps1("make_inno.ps1", args, verbose=True)
utils.set_summary("desktop inno " + edition + " build", ret)
if common.deploy and ret:
utils.log_h2("desktop advinst deploy")
utils.log_h2("desktop inno " + edition + " deploy")
ret = s3_upload([inno_file], "desktop/win/inno/")
utils.set_summary("desktop inno " + edition + " deploy", ret)
return
def make_advinst(edition = "opensource"):
if edition == "commercial": advinst_file = "%s-Enterprise-%s-%s.msi"
else: advinst_file = "%s-%s-%s.msi"
advinst_file = advinst_file % (package_name, package_version, arch)
args = [
"-Version", package_version,
"-Arch", arch,
"-Target", edition
]
if common.sign:
args += ["-Sign"]
utils.log_h2("desktop advinst " + edition + " build")
ret = utils.ps1("make_advinst.ps1", args, verbose=True)
utils.set_summary("desktop advinst " + edition + " build", ret)
if common.deploy and ret:
utils.log_h2("desktop advinst " + edition + " deploy")
ret = s3_upload([advinst_file], "desktop/win/advinst/")
utils.set_summary("desktop advinst deploy", ret)
utils.set_summary("desktop advinst " + edition + " deploy", ret)
return
def make_online():
if not common.platform in ["windows_x86_xp"]:
return
online_file = "%s-%s-%s.exe" % ("OnlineInstaller", package_version, suffix)
online_file = utils.glob_file("OnlineInstaller-" + package_version + "*.exe")
utils.log_h2("desktop online installer build")
ret = utils.is_file(online_file)
utils.set_summary("desktop online installer build", ret)
@ -193,7 +187,7 @@ def make_online():
def make_macos():
global package_name, build_dir, branding_dir, updates_dir, changes_dir, \
suffix, lane, scheme, released_updates_dir
suffix, lane, scheme, source_dir, released_updates_dir
package_name = branding.desktop_package_name
build_dir = branding.desktop_build_dir
branding_dir = branding.desktop_branding_dir
@ -258,32 +252,34 @@ def make_macos():
dmg = make_dmg()
if dmg and sparkle_updates:
make_sparkle_updates()
if common.platform != "darwin_x86_64_v8":
make_dmg("commercial")
utils.set_cwd(common.workspace_dir)
return
def make_dmg():
utils.log_h2("desktop dmg build")
utils.log_h3(scheme)
def make_dmg(target = "opensource"):
utils.log_h2("desktop dmg " + target + " build")
utils.log_h3("build/" + package_name + ".app")
dmg = utils.sh(
"bundler exec fastlane " + lane + " skip_git_bump:true",
verbose=True
)
utils.set_summary("desktop dmg build", dmg)
args = ["bundler", "exec", "fastlane", lane, "skip_git_bump:true"]
if target == "commercial":
args += ["edition:Enterprise"]
dmg = utils.sh(" ".join(args), verbose=True)
utils.set_summary("desktop dmg " + target + " build", dmg)
if common.deploy and dmg:
utils.log_h2("desktop dmg deploy")
utils.log_h2("desktop dmg " + target + " deploy")
ret = s3_upload(
utils.glob_path("build/*.dmg"),
"desktop/mac/%s/%s/%s/" % (suffix, common.version, common.build))
utils.set_summary("desktop dmg deploy", ret)
utils.log_h2("desktop zip deploy")
if common.deploy and dmg and target != "commercial":
utils.log_h2("desktop zip " + target + " deploy")
ret = s3_upload(
["build/%s-%s.zip" % (scheme, common.version)],
"desktop/mac/%s/%s/%s/" % (suffix, common.version, common.build))
utils.set_summary("desktop zip deploy", ret)
utils.set_summary("desktop zip " + target + " deploy", ret)
return dmg
def make_sparkle_updates():
@ -333,20 +329,23 @@ def make_sparkle_updates():
def make_linux():
utils.set_cwd("desktop-apps/win-linux/package/linux")
utils.log_h2("desktop build")
make_args = [t["make"] for t in branding.desktop_make_targets]
if common.platform == "linux_aarch64":
make_args += ["-e", "UNAME_M=aarch64"]
if not branding.onlyoffice:
make_args += ["-e", "BRANDING_DIR=../../../../" + common.branding + "/desktop-apps/win-linux/package/linux"]
ret = utils.sh("make clean && make " + " ".join(make_args), verbose=True)
utils.set_summary("desktop build", ret)
for edition in ["opensource", "commercial"]:
utils.log_h2("desktop " + edition + " build")
make_args = [t["make"] for t in branding.desktop_make_targets]
if edition == "commercial":
make_args += ["-e", "PACKAGE_EDITION=commercial"]
if common.platform == "linux_aarch64":
make_args += ["-e", "UNAME_M=aarch64"]
if not branding.onlyoffice:
make_args += ["-e", "BRANDING_DIR=../../../../" + common.branding + "/desktop-apps/win-linux/package/linux"]
ret = utils.sh("make clean && make " + " ".join(make_args), verbose=True)
utils.set_summary("desktop " + edition + " build", ret)
if common.deploy:
for t in branding.desktop_make_targets:
utils.log_h2("desktop " + t["make"] + " deploy")
ret = s3_upload(utils.glob_path(t["src"]), t["dst"])
utils.set_summary("desktop " + t["make"] + " deploy", ret)
if common.deploy:
for t in branding.desktop_make_targets:
utils.log_h2("desktop " + edition + " " + t["make"] + " deploy")
ret = s3_upload(utils.glob_path(t["src"]), t["dst"])
utils.set_summary("desktop " + edition + " " + t["make"] + " deploy", ret)
utils.set_cwd(common.workspace_dir)
return

View File

@ -25,7 +25,7 @@ def get_j_num():
def check_support_platform(platform):
qt_dir = base.qt_setup(platform)
if not base.is_file(qt_dir + "/bin/qmake") and not base.is_file(qt_dir + "/bin/qmake.exe"):
if not base.is_file(qt_dir + "/bin/qmake") and not base.is_file(qt_dir + "/bin/qmake.exe") and not base.is_file(qt_dir + "/bin/qmake.bat"):
return False
return True
@ -91,6 +91,7 @@ def make(platform, project, qmake_config_addon="", is_no_errors=False):
build_params = ["-nocache", file_pro] + base.qt_config_as_param(config_param) + qmake_addon
qmake_app = qt_dir + "/bin/qmake"
# non windows platform
if not base.is_windows():
if base.is_file(qt_dir + "/onlyoffice_qt.conf"):
@ -99,7 +100,12 @@ def make(platform, project, qmake_config_addon="", is_no_errors=False):
if "1" == config.option("use-clang"):
build_params.append("-spec")
build_params.append("linux-clang-libc++")
base.cmd(qmake_app, build_params)
if "" != config.option("sysroot"):
base.set_sysroot_env()
base.cmd_exe(qmake_app, build_params) # calls cmd_exe to pass os.env
else:
base.cmd(qmake_app, build_params)
base.correct_makefile_after_qmake(platform, makefile)
if ("1" == config.option("clean")):
base.cmd_and_return_cwd("make", clean_params, True)
@ -116,12 +122,22 @@ def make(platform, project, qmake_config_addon="", is_no_errors=False):
if ("" != qmake_addon_string):
qmake_addon_string = " " + qmake_addon_string
vcvarsall_arch = "x64"
if base.platform_is_32(platform):
vcvarsall_arch = "x86"
if (platform == "win_arm64"):
vcvarsall_arch = "x64_arm64"
qmake_env_addon = base.get_env("QT_QMAKE_ADDON")
if (qmake_env_addon != ""):
qmake_env_addon += " "
qmake_bat = []
qmake_bat.append("call \"" + config.option("vs-path") + "/vcvarsall.bat\" " + ("x86" if base.platform_is_32(platform) else "x64"))
qmake_bat.append("call \"" + config.option("vs-path") + "/vcvarsall.bat\" " + vcvarsall_arch)
qmake_addon_string = ""
if ("" != config.option("qmake_addon")):
qmake_addon_string = " " + (" ").join(["\"" + addon + "\"" for addon in qmake_addon])
qmake_bat.append("call \"" + qmake_app + "\" -nocache " + file_pro + config_params_string + qmake_addon_string)
qmake_bat.append("call \"" + qmake_app + "\" -nocache " + qmake_env_addon + file_pro + config_params_string + qmake_addon_string)
if ("1" == config.option("clean")):
qmake_bat.append("call nmake " + " ".join(clean_params))
qmake_bat.append("call nmake " + " ".join(distclean_params))

View File

@ -1,16 +0,0 @@
{
"source": {
"include": ["../../../../sdkjs/cell/plugin-events.js"]
},
"plugins": ["./correct_doclets.js"],
"opts": {
"destination": "./out",
"recurse": true,
"encoding": "utf8"
},
"templates": {
"json": {
"pretty": true
}
}
}

View File

@ -1,16 +0,0 @@
{
"source": {
"include": ["../../../../sdkjs/common/base-plugin-events.js"]
},
"plugins": ["./correct_doclets.js"],
"opts": {
"destination": "./out",
"recurse": true,
"encoding": "utf8"
},
"templates": {
"json": {
"pretty": true
}
}
}

View File

@ -1,16 +0,0 @@
{
"source": {
"include": ["../../../../sdkjs/slide/plugin-events.js"]
},
"plugins": ["./correct_doclets.js"],
"opts": {
"destination": "./out",
"recurse": true,
"encoding": "utf8"
},
"templates": {
"json": {
"pretty": true
}
}
}

View File

@ -1,16 +0,0 @@
{
"source": {
"include": ["../../../../sdkjs/word/plugin-events.js"]
},
"plugins": ["./correct_doclets.js"],
"opts": {
"destination": "./out",
"recurse": true,
"encoding": "utf8"
},
"templates": {
"json": {
"pretty": true
}
}
}

View File

@ -1,85 +0,0 @@
exports.handlers = {
processingComplete: function(e) {
const filteredDoclets = [];
function checkNullProps(oDoclet) {
for (let key of Object.keys(oDoclet)) {
if (oDoclet[key] == null) {
delete oDoclet[key];
}
if (typeof(oDoclet[key]) == "object") {
checkNullProps(oDoclet[key]);
}
}
}
for (let i = 0; i < e.doclets.length; i++) {
const doclet = e.doclets[i];
if (true == doclet.undocumented || doclet.kind == 'package') {
continue;
}
const filteredDoclet = {
comment: doclet.comment,
meta: doclet.meta ? {
lineno: doclet.meta.lineno,
columnno: doclet.meta.columnno
} : doclet.meta,
kind: doclet.kind,
since: doclet.since,
name: doclet.name,
type: doclet.type ? {
names: doclet.type.names,
parsedType: doclet.type.parsedType
} : doclet.type,
description: doclet.description,
memberof: doclet.memberof,
properties: doclet.properties ? doclet.properties.map(property => ({
type: property.type ? {
names: property.type.names,
parsedType: property.type.parsedType
} : property.type,
name: property.name,
description: property.description,
optional: property.optional,
defaultvalue: property.defaultvalue
})) : doclet.properties,
longname: doclet.longname,
scope: doclet.scope,
alias: doclet.alias,
params: doclet.params ? doclet.params.map(param => ({
type: param.type ? {
names: param.type.names,
parsedType: param.type.parsedType
} : param.type,
name: param.name,
description: param.description,
optional: param.optional,
defaultvalue: param.defaultvalue
})) : doclet.params,
returns: doclet.returns ? doclet.returns.map(returnObj => ({
type: {
names: returnObj.type.names,
parsedType: returnObj.type.parsedType
}
})) : doclet.returns,
see: doclet.see
};
checkNullProps(filteredDoclet)
filteredDoclets.push(filteredDoclet);
}
e.doclets.splice(0, e.doclets.length, ...filteredDoclets);
}
};

View File

@ -1,110 +0,0 @@
import os
import subprocess
import json
import argparse
import re
# Configuration files
configs = [
"./config/plugins/events/common.json",
"./config/plugins/events/word.json",
"./config/plugins/events/cell.json",
"./config/plugins/events/slide.json"
]
root = '../../../..'
def generate(output_dir, md=False):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# Generate JSON documentation
for config in configs:
editor_name = config.split('/')[-1].replace('.json', '')
output_file = os.path.join(output_dir, editor_name + ".json")
command = f"npx jsdoc -c {config} -X > {output_file}"
print(f"Generating {editor_name}.json: {command}")
subprocess.run(command, shell=True)
common_doclets_file = os.path.join(output_dir, 'common.json')
with open(common_doclets_file, 'r', encoding='utf-8') as f:
common_doclets_json = json.dumps(json.load(f))
os.remove(common_doclets_file)
# Append examples to JSON documentation
for config in configs:
if (config.find('common') != -1):
continue
editor_name = config.split('/')[-1].replace('.json', '')
example_folder_name = editor_name # name of folder with examples
output_file = os.path.join(output_dir, editor_name + ".json")
# Read the JSON file
with open(output_file, 'r', encoding='utf-8') as f:
data = json.load(f)
start_common_doclet_idx = len(data)
data += json.loads(common_doclets_json)
# Modify JSON data
for idx, doclet in enumerate(data):
if idx == start_common_doclet_idx:
example_folder_name = 'common'
elif editor_name == 'forms':
example_folder_name = 'word'
if 'see' in doclet:
if doclet['see'] is not None:
doclet['see'][0] = doclet['see'][0].replace('{Editor}', example_folder_name.title())
file_path = f'{root}/' + doclet['see'][0]
if os.path.exists(file_path):
with open(file_path, 'r', encoding='utf-8') as see_file:
example_content = see_file.read()
# Extract the first line as a comment if it exists
lines = example_content.split('\n')
if lines[0].startswith('//'):
comment = lines[0] + '\n'
code_content = '\n'.join(lines[1:])
else:
comment = ''
code_content = example_content
doclet['examples'] = [remove_js_comments(comment) + code_content]
if md == False:
document_type = editor_name
if "forms" == document_type:
document_type = "pdf"
doclet['description'] = doclet['description'] + f'\n\n## Try it\n\n ```js document-builder={{"documentType": "{document_type}"}}\n{code_content}\n```'
# Write the modified JSON file back
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
print("Documentation generation for builder completed.")
def remove_builder_lines(text):
lines = text.splitlines() # Split text into lines
filtered_lines = [line for line in lines if not line.strip().startswith("builder.")]
return "\n".join(filtered_lines)
def remove_js_comments(text):
# Remove single-line comments, leaving text after //
text = re.sub(r'^\s*//\s?', '', text, flags=re.MULTILINE)
# Remove multi-line comments, leaving text after /*
text = re.sub(r'/\*\s*|\s*\*/', '', text, flags=re.DOTALL)
return text.strip()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Generate documentation")
parser.add_argument(
"destination",
type=str,
help="Destination directory for the generated documentation",
nargs='?', # Indicates the argument is optional
default=f"{root}/office-js-api-declarations/office-js-api-plugins/events"
)
args = parser.parse_args()
generate(args.destination)

View File

@ -1,356 +0,0 @@
#!/usr/bin/env python3
import os
import json
import re
import shutil
import argparse
import generate_docs_plugins_events_json
# Папки для каждого editor_name
editors = {
"word": "text-document-api",
"cell": "spreadsheet-api",
"slide": "presentation-api"
}
missing_examples = []
used_enumerations = set()
def load_json(path):
with open(path, 'r', encoding='utf-8') as f:
return json.load(f)
def write_markdown_file(path, content):
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(path, 'w', encoding='utf-8') as f:
f.write(content)
def remove_js_comments(text):
text = re.sub(r'^\s*//.*$', '', text, flags=re.MULTILINE)
text = re.sub(r'/\*.*?\*/', '', text, flags=re.DOTALL)
return text.strip()
def correct_description(string, root=''):
"""
Cleans or transforms specific tags in the doclet description:
- <b> => ** (bold text)
- <note>...</note> => 💡 ...
- {@link ...} is replaced with a Markdown link
- If the description is missing, returns a default value.
- All '\r' characters are replaced with '\n'.
"""
if string is None:
return 'No description provided.'
# Line breaks
string = string.replace('\r', '\\\n')
# Replace <b> tags with Markdown bold formatting
string = re.sub(r'<b>', '-**', string)
string = re.sub(r'</b>', '**', string)
# Replace <note> tags with an icon and text
string = re.sub(r'<note>(.*?)</note>', r'💡 \1', string, flags=re.DOTALL)
# Process {@link ...} constructions
string = process_link_tags(string, root)
return string
def process_link_tags(text, root=''):
"""
Finds patterns like {@link ...} and replaces them with Markdown links.
If the prefix 'global#' is found, a link to a typedef is generated,
otherwise, a link to a class method is created.
For a method, if an alias is not specified, the name is left in the format 'Class#Method'.
"""
reserved_links = {
'/docbuilder/global#ShapeType': f"{'../../../../../../' if root == '' else '../../../../../' if root == '../' else root}docs/office-api/usage-api/text-document-api/Enumeration/ShapeType.md",
'/plugin/config': 'https://api.onlyoffice.com/docs/plugin-and-macros/structure/manifest/',
'/docbuilder/basic': 'https://api.onlyoffice.com/docs/office-api/usage-api/text-document-api/'
}
def replace_link(match):
content = match.group(1).strip() # Example: "/docbuilder/global#ShapeType shape type" or "global#ErrorValue ErrorValue"
parts = content.split()
ref = parts[0]
label = parts[1] if len(parts) > 1 else None
if ref.startswith('/'):
# Handle reserved links using mapping
if ref in reserved_links:
url = reserved_links[ref]
display_text = label if label else ref
return f"[{display_text}]({url})"
elif ref.startswith('/plugins/methods/'):
url = f'../../{ref.split('/plugins/')[1]}.md'
display_text = label if label else ref
return f"[{display_text}]({url})"
else:
# If the link is not in the mapping, return the original construction
return match.group(0)
elif ref.startswith("global#"):
# Handle links to typedef (similar logic as before)
typedef_name = ref.split("#")[1]
used_enumerations.add(typedef_name)
display_text = label if label else typedef_name
return f"[{display_text}]({root}Enumeration/{typedef_name}.md)"
else:
# Handle links to class methods like ClassName#MethodName
try:
class_name, method_name = ref.split("#")
except ValueError:
return match.group(0)
display_text = label if label else ref # Keep the full notation, e.g., "Api#CreateSlide"
return f"[{display_text}]({root}{class_name}/Methods/{method_name}.md)"
return re.sub(r'{@link\s+([^}]+)}', replace_link, text)
def remove_line_breaks(s):
return re.sub(r'[\r\n]+', ' ', s)
def convert_jsdoc_array_to_ts(type_str):
p = re.compile(r'Array\.<([^>]+)>')
while True:
m = p.search(type_str)
if not m:
break
inner = convert_jsdoc_array_to_ts(m.group(1).strip())
type_str = type_str[:m.start()] + inner + '[]' + type_str[m.end():]
return type_str
def generate_data_types_markdown(types, enumerations, root=''):
converted = [convert_jsdoc_array_to_ts(t) for t in types]
primitives = {"string", "number", "boolean", "null", "undefined", "any", "object", "true", "false"}
result = []
enum_names = {e['name'] for e in enumerations}
for t in converted:
base = t.rstrip('[]')
dims = t[len(base):]
if base in enum_names:
used_enumerations.add(base)
link = f"[{base}]({root}Enumeration/{base}.md)"
elif base in primitives or re.match(r"^['\"].*['\"]$", base) or re.match(r"^-?\d+(\.\d+)?$", base):
link = base
else:
link = base
result.append(link + dims)
return " | ".join(result)
def escape_text_outside_code_blocks(md):
parts = re.split(r'(```.*?```)', md, flags=re.DOTALL)
for i in range(0, len(parts), 2):
parts[i] = parts[i].replace('<', '&lt;').replace('>', '&gt;')
return "".join(parts)
def generate_event_markdown(event, enumerations):
name = event['name']
desc = correct_description(event.get('description', ''))
params = event.get('params', [])
md = f"# {name}\n\n{desc}\n\n"
# Parameters
md += "## Parameters\n\n"
if params:
md += "| **Name** | **Data type** | **Description** |\n"
md += "| --------- | ------------- | ----------- |\n"
for p in params:
t_md = generate_data_types_markdown(
p.get('type', {}).get('names', []),
enumerations
)
d = remove_line_breaks(correct_description(p.get('description', '')))
md += f"| {p['name']} | {t_md} | {d} |\n"
md += "\n"
else:
md += "This event has no parameters.\n\n"
for ex in event.get('examples', []):
code = remove_js_comments(ex).strip()
md += f"```javascript\n{code}\n```\n\n"
return escape_text_outside_code_blocks(md)
def generate_enumeration_markdown(enumeration, enumerations):
"""
Generates Markdown documentation for a 'typedef' doclet.
This version only works with `enumeration['examples']` (an array of strings),
ignoring any single `enumeration['examples']` field.
"""
enum_name = enumeration['name']
if enum_name not in used_enumerations:
return None
description = enumeration.get('description', 'No description provided.')
description = correct_description(description, '../')
# Only use the 'examples' array
examples = enumeration.get('examples', [])
content = f"# {enum_name}\n\n{description}\n\n"
parsed_type = enumeration['type'].get('parsedType')
if not parsed_type:
# If parsedType is missing, just list 'type.names' if available
type_names = enumeration['type'].get('names', [])
if type_names:
content += "## Type\n\n"
t_md = generate_data_types_markdown(type_names, enumerations)
content += t_md + "\n\n"
else:
ptype = parsed_type['type']
# 1) Handle TypeUnion
if ptype == 'TypeUnion':
content += "## Type\n\nEnumeration\n\n"
content += "## Values\n\n"
for raw_t in enumeration['type']['names']:
# Attempt linking
if any(enum['name'] == raw_t for enum in enumerations):
used_enumerations.add(raw_t)
content += f"- [{raw_t}](../Enumeration/{raw_t}.md)\n"
else:
content += f"- {raw_t}\n"
# 2) Handle TypeApplication (e.g. Object.<string, string>)
elif ptype == 'TypeApplication':
content += "## Type\n\nObject\n\n"
type_names = enumeration['type'].get('names', [])
if type_names:
t_md = generate_data_types_markdown(type_names, enumerations)
content += f"**Type:** {t_md}\n\n"
# 3) If properties are present, treat it like an object
if enumeration.get('properties') is not None:
content += generate_properties_markdown(enumeration['properties'], enumerations)
# 4) If it's neither TypeUnion nor TypeApplication, just output the type names
if ptype not in ('TypeUnion', 'TypeApplication'):
type_names = enumeration['type'].get('names', [])
if type_names:
content += "## Type\n\n"
t_md = generate_data_types_markdown(type_names, enumerations)
content += t_md + "\n\n"
# Process examples array
if examples:
if len(examples) > 1:
content += "\n\n## Examples\n\n"
else:
content += "\n\n## Example\n\n"
for i, ex_line in enumerate(examples, start=1):
# Remove JS comments
cleaned_example = remove_js_comments(ex_line).strip()
# Attempt splitting if the user used ```js
if '```js' in cleaned_example:
comment, code = cleaned_example.split('```js', 1)
comment = comment.strip()
code = code.strip()
if len(examples) > 1:
content += f"**Example {i}:**\n\n{comment}\n\n"
content += f"```javascript\n{code}\n```\n"
else:
if len(examples) > 1:
content += f"**Example {i}:**\n\n{comment}\n\n"
# No special fences, just show as code
content += f"```javascript\n{cleaned_example}\n```\n"
return escape_text_outside_code_blocks(content)
def generate_properties_markdown(properties, enumerations, root='../'):
if properties is None:
return ''
content = "## Properties\n\n"
content += "| Name | Type | Description |\n"
content += "| ---- | ---- | ----------- |\n"
for prop in sorted(properties, key=lambda m: m['name']):
prop_name = prop['name']
prop_description = prop.get('description', 'No description provided.')
prop_description = remove_line_breaks(correct_description(prop_description))
prop_types = prop['type']['names'] if prop.get('type') else []
param_types_md = generate_data_types_markdown(prop_types, enumerations, root)
content += f"| {prop_name} | {param_types_md} | {prop_description} |\n"
# Escape outside code blocks
return escape_text_outside_code_blocks(content)
def process_events(data, events_root):
enumerations = []
events = []
for doclet in data:
kind = doclet.get('kind')
if kind == 'typedef':
enumerations.append(doclet)
elif kind == 'event':
events.append(doclet)
os.makedirs(events_root, exist_ok=True)
used_enumerations.clear()
# пишем события
for ev in events:
path = os.path.join(events_root, f"{ev['name']}.md")
write_markdown_file(path, generate_event_markdown(ev, enumerations))
if not ev.get('examples'):
missing_examples.append(os.path.relpath(path, events_root))
# пишем перечисления, используемые событиями
enum_dir = os.path.join(events_root, 'Enumeration')
os.makedirs(enum_dir, exist_ok=True)
prev = -1
while len(used_enumerations) != prev:
prev = len(used_enumerations)
for e in enumerations:
if e['name'] in used_enumerations:
generate_enumeration_markdown(e, enumerations)
for e in enumerations:
if e['name'] in used_enumerations:
path = os.path.join(enum_dir, f"{e['name']}.md")
write_markdown_file(path, generate_enumeration_markdown(e, enumerations))
if not e.get('examples'):
missing_examples.append(os.path.relpath(path, events_root))
def generate_events(output_dir):
if output_dir.endswith('/'):
output_dir = output_dir[:-1]
tmp = os.path.join(output_dir, 'tmp_json')
shutil.rmtree(output_dir, ignore_errors=True)
generate_docs_plugins_events_json.generate(tmp, md=True)
for editor_name, folder in editors.items():
data = load_json(os.path.join(tmp, f"{editor_name}.json"))
process_events(data, os.path.join(output_dir, folder))
shutil.rmtree(tmp)
print("Done. Missing examples:", missing_examples)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Generate events documentation")
parser.add_argument(
"destination",
nargs="?",
default="../../../../api.onlyoffice.com/site/docs/plugin-and-macros/interacting-with-editors/events/",
help="Output directory"
)
args = parser.parse_args()
generate_events(args.destination)

View File

@ -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)

View File

@ -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)

View File

@ -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",

View File

@ -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)

View File

@ -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()
@ -91,7 +94,7 @@ def process_link_tags(text, root=''):
display_text = label if label else ref
return f"[{display_text}]({url})"
elif ref.startswith('/docs/plugins/'):
url = f'../../{ref.split('/docs/plugins/')[1]}.md'
url = f"../../{ref.split('/docs/plugins/')[1]}.md"
display_text = label if label else ref
return f"[{display_text}]({url})"
else:
@ -275,6 +278,22 @@ def generate_enumeration_markdown(enumeration, enumerations):
return escape_text_outside_code_blocks(content)
def generate_events_summary(events):
"""
Create Events.md summary listing all events with their description.
"""
header = [
"# Events\n\n",
"| Event | Description |\n",
"| ----- | ----------- |\n"
]
lines = [
f"| [{ev['name']}](./{ev['name']}.md) | "
f"{remove_line_breaks(correct_description(ev.get('description', ''), isInTable=True))} |\n"
for ev in sorted(events, key=lambda e: e['name'])
]
return "".join(header + lines)
def generate_properties_markdown(properties, enumerations):
if properties is None:
return ''
@ -352,8 +371,12 @@ def process_events(data, editor_dir):
if not e.get('examples'):
missing_examples.append(os.path.relpath(path, editor_dir))
# events summary
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')
@ -373,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()

View File

@ -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)

View File

@ -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)

View File

@ -93,8 +93,7 @@
"[win,linux]desktop-apps/win-linux/ASCDocumentEditor.pro",
"[win]desktop-apps/win-linux/extras/projicons/ProjIcons.pro",
"[win,!win_xp]desktop-apps/win-linux/extras/update-daemon/UpdateDaemon.pro",
"[win_xp]desktop-apps/win-linux/extras/online-installer/OnlineInstaller.pro"
"[win,!win_xp]desktop-apps/win-linux/extras/update-daemon/UpdateDaemon.pro"
],
"mobile" : [

View File

@ -0,0 +1,5 @@
qt_source*
qt_binary*
qt_build*
qt-*
gcc-linaro-*

View File

@ -0,0 +1,103 @@
#!/usr/bin/env python
import sys
import os
sys.path.append('../../../../scripts')
import base
def update_qmake_conf(arm_toolchain_bin):
replace_file = "./qt-everywhere-src-5.15.2/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf"
arm_toolchain_bin = os.path.abspath(arm_toolchain_bin)
replace_src = ""
replace_src += "# modifications to g++.conf\n"
replace_src += "QMAKE_CC = aarch64-linux-gnu-gcc\n"
replace_src += "QMAKE_CXX = aarch64-linux-gnu-g++\n"
replace_src += "QMAKE_LINK = aarch64-linux-gnu-g++\n"
replace_src += "QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++\n"
replace_src += "\n"
replace_src += "# modifications to linux.conf\n"
replace_src += "QMAKE_AR = aarch64-linux-gnu-ar cqs\n"
replace_src += "QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy\n"
replace_src += "QMAKE_NM = aarch64-linux-gnu-nm -P\n"
replace_src += "QMAKE_STRIP = aarch64-linux-gnu-strip\n"
replace_dst = ""
replace_dst += "# modifications to g++.conf\n"
replace_dst += "QMAKE_CC = " + arm_toolchain_bin + "/aarch64-linux-gnu-gcc\n"
replace_dst += "QMAKE_CXX = " + arm_toolchain_bin + "/aarch64-linux-gnu-g++\n"
replace_dst += "QMAKE_LINK = " + arm_toolchain_bin + "/aarch64-linux-gnu-g++\n"
replace_dst += "QMAKE_LINK_SHLIB = " + arm_toolchain_bin + "/aarch64-linux-gnu-g++\n"
replace_dst += "\n"
replace_dst += "# modifications to linux.conf\n"
replace_dst += "QMAKE_AR = " + arm_toolchain_bin + "/aarch64-linux-gnu-ar cqs\n"
replace_dst += "QMAKE_OBJCOPY = " + arm_toolchain_bin + "/aarch64-linux-gnu-objcopy\n"
replace_dst += "QMAKE_NM = " + arm_toolchain_bin + "/aarch64-linux-gnu-nm -P\n"
replace_dst += "QMAKE_STRIP = " + arm_toolchain_bin + "/aarch64-linux-gnu-strip\n"
base.replaceInFile(replace_file, replace_src, replace_dst)
def make(arm_toolchain_bin=""):
qt_build_path = os.path.dirname(os.path.abspath(__file__)) + "/qt_build/Qt-5.15.2/linux_arm64"
qt_params = ["-opensource",
"-confirm-license",
"-release",
"-shared",
"-accessibility",
"-prefix", "\"" + qt_build_path + "\"",
"-extprefix", "\"" + qt_build_path + "\"",
"-hostprefix", "\"" + qt_build_path + "\"",
"-c++std", "c++11",
"-qt-zlib",
"-qt-libpng",
"-qt-libjpeg",
"-qt-pcre",
"-no-sql-sqlite",
"-no-opengl",
"-nomake", "examples",
"-nomake", "tests",
"-skip", "qtlocation",
"-skip", "qtserialport",
"-skip", "qtsensors",
"-skip", "qtxmlpatterns",
"-skip", "qt3d",
"-skip", "qtwebview",
"-skip", "qtwebengine",
"-skip", "qtdeclarative",
"-xplatform", "linux-aarch64-gnu-g++", # be sure that aarch64 gnu compiler is installed
"-no-pch"]
qt_params_str = ""
for param in qt_params:
qt_params_str += (param + " ")
qt_url = "https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/qt/qt-everywhere-src-5.15.2.tar.xz"
if not base.is_file("./qt_source_5.15.2.tar.xz"):
base.download(qt_url, "./qt_source_5.15.2.tar.xz")
if not base.is_dir("./qt-everywhere-src-5.15.2"):
base.cmd("tar", ["-xf", "./qt_source_5.15.2.tar.xz"])
# https://bugreports.qt.io/browse/QTBUG-93452
# for GCC 11 and Qt5/Qt6
additional_gcc_11 = "#ifdef __cplusplus\n#include <limits>\n#endif\n"
chanage_file = "./qt-everywhere-src-5.15.2/qtbase/src/corelib/global/qglobal.h"
filedata = base.readFile(chanage_file)
if filedata.find(additional_gcc_11) == -1:
filedata = additional_gcc_11 + filedata
base.writeFile(chanage_file, filedata)
if arm_toolchain_bin != "":
update_qmake_conf(arm_toolchain_bin)
base.cmd_in_dir("./qt-everywhere-src-5.15.2", "./configure " + qt_params_str)
base.cmd_in_dir("./qt-everywhere-src-5.15.2", "make -j4")
base.cmd_in_dir("./qt-everywhere-src-5.15.2", "make install")
if __name__ == "__main__":
arm_toolchain_path = "./gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu/bin"
if len(sys.argv) != 1:
arm_toolchain_path = sys.argv[1]
make(arm_toolchain_path)

View File

@ -0,0 +1,16 @@
#!/usr/bin/env python
import sys
import os
sys.path.append('../../../../scripts')
import base
def make():
arm_toolchain_url = 'https://releases.linaro.org/components/toolchain/binaries/5.4-2017.05/aarch64-linux-gnu/'
arm_toolchain_tar_filename = 'gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz'
base.cmd2('wget', [arm_toolchain_url + arm_toolchain_tar_filename])
base.cmd2('tar', ['-xf', arm_toolchain_tar_filename])
if __name__ == "__main__":
make()

View File

@ -0,0 +1,22 @@
#!/usr/bin/env python
import sys
import os
sys.path.append('../../../scripts')
import base
def make():
qt_build_path = os.path.dirname(os.path.abspath(__file__)) + "/qt_build/Qt-5.15.2"
qt_binary_url = "https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/qt/qt_binary_linux_arm64.7z"
if not base.is_file("./qt_binary_linux_arm64.7z"):
base.download(qt_binary_url, "./qt_binary_linux_arm64.7z")
if not base.is_dir(qt_build_path):
os.makedirs(qt_build_path)
base.cmd("tar", ["-xf", "./qt_binary_linux_arm64.7z", "-C", qt_build_path])
if __name__ == "__main__":
make()

View File

@ -0,0 +1,10 @@
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

View File

@ -0,0 +1,5 @@
{
"exclude": [
"qt-everywhere-src-5.15.2/**"
]
}

View File

@ -20,7 +20,7 @@ def get_branch_name(directory):
def install_qt():
# qt
if not base.is_file("./qt_source_5.9.9.tar.xz"):
base.download("https://download.qt.io/new_archive/qt/5.9/5.9.9/single/qt-everywhere-opensource-src-5.9.9.tar.xz", "./qt_source_5.9.9.tar.xz")
base.download("https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/qt/qt-everywhere-opensource-src-5.9.9.tar.xz", "./qt_source_5.9.9.tar.xz")
if not base.is_dir("./qt-everywhere-opensource-src-5.9.9"):
base.cmd("tar", ["-xf", "./qt_source_5.9.9.tar.xz"])
@ -57,7 +57,7 @@ def install_qt():
return
def install_qt_prebuild():
url_amd64 = "https://s3.eu-west-1.amazonaws.com/static-doc.teamlab.eu.com/qt/5.9.9/linux_amd64/qt_binary.7z"
url_amd64 = "https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/qt/qt_binary_linux_amd64.7z"
base.download(url_amd64, "./qt_amd64.7z")
base.extract("./qt_amd64.7z", "./qt_build")
base.create_dir("./qt_build/Qt-5.9.9")
@ -71,7 +71,10 @@ if not base.is_file("./node_js_setup_14.x"):
if not base.is_dir("./qt_build"):
print("install qt...")
install_qt_prebuild()
if base.get_env("DO_NOT_USE_PREBUILD_QT") == "1":
install_qt()
else:
install_qt_prebuild()
branch = get_branch_name("../..")

View File

@ -43,7 +43,8 @@ def install_deps():
"libncurses6",
"curl",
"libxkbcommon-dev",
"libxkbcommon-x11-dev"]
"libxkbcommon-x11-dev",
"libnotify-dev"]
for package in packages:
base.cmd("sudo", ["apt-get", "install", "-y", package], True)

Binary file not shown.

View File

@ -0,0 +1,82 @@
#!/usr/bin/env python
import sys
sys.path.append('../../../scripts')
import base
import os
import shutil
import fix_symlinks
def bash_chroot(command, sysroot):
base.cmd2('sudo -S chroot', [sysroot, '/bin/bash -c', '\"' + command + ' \"'])
def download_sysroot():
curr_dir = base.get_script_dir(__file__)
tmp_sysroot_ubuntu_dir = curr_dir + '/sysroot_ubuntu_1604'
if os.path.isdir(tmp_sysroot_ubuntu_dir):
shutil.rmtree(tmp_sysroot_ubuntu_dir)
# debootstrap for downloading sysroot
base.cmd2('sudo -S apt-get', ['install', 'debootstrap'])
archive_ubuntu_url = 'http://archive.ubuntu.com/ubuntu/'
base.cmd2('sudo -S debootstrap', ['--arch=amd64', 'xenial', tmp_sysroot_ubuntu_dir, archive_ubuntu_url])
# setup a new sources
base.cmd2('sudo -S cp', [curr_dir + '/sources.list', tmp_sysroot_ubuntu_dir + '/etc/apt/sources.list'])
bash_chroot('apt update -y', tmp_sysroot_ubuntu_dir)
bash_chroot('apt upgrade -y', tmp_sysroot_ubuntu_dir)
apt_libs = ["build-essential"]
apt_libs += ["libpthread-stubs0-dev"]
apt_libs += ["zlib1g-dev"]
apt_libs += ["curl"]
apt_libs += ["libc6-dev"]
apt_libs += ["glib-2.0-dev"]
apt_libs += ["libglu1-mesa-dev"]
apt_libs += ["libgtk-3-dev"]
apt_libs += ["libpulse-dev"]
apt_libs += ["libasound2-dev"]
apt_libs += ["libatspi2.0-dev"]
apt_libs += ["libcups2-dev"]
apt_libs += ["libdbus-1-dev"]
apt_libs += ["libicu-dev"]
apt_libs += ["libgstreamer1.0-dev"]
apt_libs += ["libgstreamer-plugins-base1.0-dev"]
apt_libs += ["libx11-xcb-dev"]
apt_libs += ["libxcb*"]
apt_libs += ["libxi-dev"]
apt_libs += ["libxrender-dev"]
apt_libs += ["libxss-dev"]
apt_libs += ["libxkbcommon-dev"]
apt_libs += ["libxkbcommon-x11-dev"]
apt_libs += ["libnotify-dev"]
apt_libs += ["gtk+-3.0-dev"]
apt_libs_str = ""
for apt_lib in apt_libs:
apt_libs_str += apt_lib + " "
bash_chroot('apt install -y ' + apt_libs_str, tmp_sysroot_ubuntu_dir)
# # downloading arm toolchain
arm_toolchain_url = 'https://releases.linaro.org/components/toolchain/binaries/5.4-2017.05/aarch64-linux-gnu/'
arm_toolchain_tar_filename = 'gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz'
arm_toolchain_output_dir = 'gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu'
base.cmd2('wget', [arm_toolchain_url + arm_toolchain_tar_filename])
base.cmd2('tar', ['-xf', arm_toolchain_tar_filename])
base.cmd2('sudo -S rsync', ['-avh', '--progress', curr_dir + '/' + arm_toolchain_output_dir + '/', tmp_sysroot_ubuntu_dir + '/usr/'])
shutil.rmtree(arm_toolchain_output_dir)
os.remove(arm_toolchain_tar_filename)
base.cmd2('sudo -S chmod', ['-R', 'o+rwx', tmp_sysroot_ubuntu_dir])
# fix symlinks
fix_symlinks.fix_symlinks(tmp_sysroot_ubuntu_dir)
return
if __name__ == '__main__':
download_sysroot()

View File

@ -0,0 +1,4 @@
set(CMAKE_C_FLAGS $ENV{CFLAGS})
set(CMAKE_CXX_FLAGS $ENV{CXXFLAGS})
set(CMAKE_C_LINKER_FLAGS $ENV{LDFLAGS})
set(CMAKE_CXX_LINKER_FLAGS $ENV{LDFLAGS})

View File

@ -0,0 +1,45 @@
import os
import sys
import uuid
# change symbolic link to relative paths
def fix_symlinks(top_dir='./sysroot_ubuntu_1604'):
for root, dirs, files in os.walk(top_dir):
for name in files:
path = os.path.join(root, name)
if not os.path.islink(path):
continue
try:
target = os.readlink(path)
except OSError as e:
print(f"Error reading link '{path}': {e}", file=sys.stderr)
continue
if not target.startswith('/'):
continue
new_target = top_dir + target
new_target_rel = os.path.relpath(new_target, os.path.dirname(path))
temp_name = f".tmp.{uuid.uuid4().hex}"
temp_path = os.path.join(root, temp_name)
try:
os.symlink(new_target_rel, temp_path)
except OSError as e:
print(f"Failed to create temporary symlink for '{path}': {e}", file=sys.stderr)
continue
try:
os.replace(temp_path, path)
print(f"Updated: {path} -> {new_target_rel}")
except OSError as e:
print(f"Failed to replace symlink '{path}': {e}", file=sys.stderr)
try:
os.unlink(temp_path)
except OSError:
pass
if __name__ == "__main__":
if len(sys.argv) > 1:
directory = sys.argv[1]
else:
directory = './sysroot_ubuntu_1604'
fix_symlinks(directory)

View File

@ -0,0 +1,51 @@
#deb cdrom:[Ubuntu 16.04.2 LTS _Xenial Xerus_ - Release amd64 (20170215.2)]/ xenial main restricted
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://us.archive.ubuntu.com/ubuntu/ xenial main restricted
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main restricted
## Major bug fix updates produced after the final release of the
## distribution.
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates main restricted
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates main restricted
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://us.archive.ubuntu.com/ubuntu/ xenial universe
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial universe
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://us.archive.ubuntu.com/ubuntu/ xenial multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial multiverse
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse
## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://us.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu xenial partner
# deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://security.ubuntu.com/ubuntu xenial-security main restricted
# deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted
deb http://security.ubuntu.com/ubuntu xenial-security universe
# deb-src http://security.ubuntu.com/ubuntu xenial-security universe
deb http://security.ubuntu.com/ubuntu xenial-security multiverse
# deb-src http://security.ubuntu.com/ubuntu xenial-security multiverse

5
tools/win/arm64/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
tmp.bat
qt_source*
qt_binary*
qt_build*
qt-*

View File

@ -0,0 +1,77 @@
import sys
import os
sys.path.append('../../../scripts')
import base
def get_vs_path(version = "2019"):
vs_path = ""
programFilesDir = base.get_env("ProgramFiles")
if ("" != base.get_env("ProgramFiles(x86)")):
programFilesDir = base.get_env("ProgramFiles(x86)")
if ("2015" == version):
vs_path = programFilesDir + "/Microsoft Visual Studio 14.0/VC"
elif ("2019" == version):
if base.is_dir(programFilesDir + "/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build"):
vs_path = programFilesDir + "/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build"
elif base.is_dir(programFilesDir + "/Microsoft Visual Studio/2019/Professional/VC/Auxiliary/Build"):
vs_path = programFilesDir + "/Microsoft Visual Studio/2019/Professional/VC/Auxiliary/Build"
else:
vs_path = programFilesDir + "/Microsoft Visual Studio/2019/Community/VC/Auxiliary/Build"
return vs_path
def make():
qt_build_path = os.path.dirname(os.path.abspath(__file__)) + "/qt_build/Qt-5.15.2/win_arm64"
qt_params = ["-opensource",
"-confirm-license",
"-release",
"-shared",
"-accessibility",
"-prefix", "\"" + qt_build_path + "\"",
"-extprefix", "\"" + qt_build_path + "\"",
"-hostprefix", "\"" + qt_build_path + "\"",
"-c++std", "c++11",
"-qt-zlib",
"-qt-libpng",
"-qt-libjpeg",
"-qt-pcre",
"-no-sql-sqlite",
"-no-qml-debug",
"-nomake", "examples",
"-nomake", "tests",
"-skip", "qtlocation",
"-skip", "qtserialport",
"-skip", "qtsensors",
"-skip", "qtxmlpatterns",
"-skip", "qt3d",
"-skip", "qtwebview",
"-skip", "qtwebengine",
"-xplatform", "win32-arm64-msvc2017",
"-mp",
"-no-pch"]
qt_params_str = ""
for param in qt_params:
qt_params_str += (param + " ")
qt_url = "https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/qt/qt-everywhere-src-5.15.2.tar.xz"
if not base.is_file("./qt_source_5.15.2.tar.xz"):
base.download(qt_url, "./qt_source_5.15.2.tar.xz")
if not base.is_dir("./qt-everywhere-src-5.15.2"):
base.cmd("tar", ["-xf", "./qt_source_5.15.2.tar.xz"])
vs_path = get_vs_path()
vcvarsall_host_arch = "x64"
qt_build_bat = []
qt_build_bat.append("call \"" + vs_path + "/vcvarsall.bat\" " + vcvarsall_host_arch) # for nmake
qt_build_bat.append("cd qt-everywhere-src-5.15.2")
qt_build_bat.append("call configure " + qt_params_str)
qt_build_bat.append("call nmake")
qt_build_bat.append("call nmake install")
base.run_as_bat(qt_build_bat)
if __name__ == "__main__":
make()

View File

@ -0,0 +1,20 @@
import sys
import os
sys.path.append('../../../scripts')
import base
def make():
qt_build_path = os.path.dirname(os.path.abspath(__file__)) + "/qt_build/Qt-5.15.2"
qt_binary_url = "https://github.com/ONLYOFFICE-data/build_tools_data/raw/refs/heads/master/qt/qt_binary_win_arm64.7z"
if not base.is_file("./qt_binary_win_arm64.7z"):
base.download(qt_binary_url, "./qt_binary_win_arm64.7z")
if not base.is_dir(qt_build_path):
os.makedirs(qt_build_path)
base.extract("./qt_binary_win_arm64.7z", qt_build_path)
if __name__ == "__main__":
base.configure_common_apps()
make()

View File

@ -0,0 +1,5 @@
{
"exclude": [
"qt-everywhere-src-5.15.2/**"
]
}

5
tools/win/qemu/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
*
!.gitignore
!README.md
!automate.bat
!start.bat

102
tools/win/qemu/README.md Normal file
View File

@ -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 its 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.

View File

@ -0,0 +1,52 @@
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 (
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"
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
)
if "%%m"=="builder" (
call %base_out_dir%\DocumentBuilder\x2t -create-js-snapshots
)
if "%%m"=="core" (
call %base_out_dir%\core\x2t -create-js-snapshots
)
)
shutdown /s /f /t 10

17
tools/win/qemu/start.bat Normal file
View File

@ -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

View File

@ -1 +1 @@
9.0.3
9.1.0