Compare commits

...

134 Commits

Author SHA1 Message Date
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
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
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
a640943c60 Remove 3DPARTYLICENSE from desktop deploy 2025-08-05 18:06:08 +03: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
57 changed files with 1345 additions and 939 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

@ -4,11 +4,17 @@ ENV TZ=Etc/UTC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apt-get -y update && \
apt-get -y install python \
python3 \
apt-get -y install tar \
sudo
RUN rm /usr/bin/python && ln -s /usr/bin/python2 /usr/bin/python
ADD . /build_tools
WORKDIR /build_tools
RUN mkdir -p /opt/python3 && \
tar -xzf /build_tools/tools/linux/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,7 @@ 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("--custom-sysroot", action="store", type="string", dest="custom-sysroot", default="0", help="provides ability to use custom sysroot (ubuntu 16.04) to build c++ core. 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")
(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

@ -15,6 +15,7 @@ import stat
import json
__file__script__path__ = os.path.dirname( os.path.realpath(__file__))
icu_ver = "74"
# common functions --------------------------------------
def get_script_dir(file=""):
@ -736,6 +737,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 +839,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 +866,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 +880,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")
@ -1269,12 +1287,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"])
@ -1291,32 +1310,31 @@ def mac_correct_rpath_x2t(dir):
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"])
mac_correct_rpath_binary("./x2t", mac_icu_libs + ["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"])
mac_correct_rpath_binary("./allfontsgen", mac_icu_libs + ["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"])
mac_correct_rpath_binary("./allthemesgen", mac_icu_libs + ["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"])
mac_correct_rpath_binary("./pluginsmanager", mac_icu_libs + ["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"])
mac_correct_rpath_binary("./vboxtester", mac_icu_libs + ["UnicodeConverter", "kernel", "kernel_network"])
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 +1345,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 +1394,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 +1477,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 +1732,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/"
@ -1834,6 +1853,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(" ", "\\ ")
@ -1903,6 +1923,9 @@ def create_x2t_js_cache(dir, product, platform):
cmd_in_dir_qemu(platform, dir, "./x2t", ["-create-js-snapshots"], True)
return
if platform == "win_arm64": # copying sdkjs later
return
cmd_in_dir(dir, "./x2t", ["-create-js-snapshots"], True)
return
@ -1910,3 +1933,25 @@ 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
src_dir = core_dir + "/Common/3dParty/icu/" + platform + "/build"
if (0 == platform.find("win")):
copy_file(src_dir + "/icudt" + icu_ver + ".dll", dst_dir + "/icudt" + icu_ver + ".dll")
copy_file(src_dir + "/icuuc" + icu_ver + ".dll", dst_dir + "/icuuc" + icu_ver + ".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",
@ -56,6 +56,10 @@ def parse():
if ("mac" == host_platform) and check_option("platform", "mac_arm64") and not base.is_os_arm():
if not check_option("platform", "mac_64"):
options["platform"] = "mac_64 " + options["platform"]
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"):
@ -104,8 +108,32 @@ def parse():
if not "sdkjs-plugin-server" in options:
options["sdkjs-plugin-server"] = "default"
# custom-sysroot setup
if "linux" != host_platform and "custom-sysroot" in options:
options["custom-sysroot"] = ""
if "linux" == host_platform and "custom-sysroot" in options:
if options["custom-sysroot"] == "0":
options["custom-sysroot"] = ""
elif options["custom-sysroot"] == "1":
dst_dir = os.path.abspath(base.get_script_dir(__file__) + '/../tools/linux/sysroot')
custom_sysroot = dst_dir + '/sysroot_ubuntu_1604'
options["custom-sysroot"] = custom_sysroot
if not os.path.isdir(custom_sysroot):
print("Custom 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 not "arm64-toolchain-bin" in options:
options["arm64-toolchain-bin"] = "/usr/bin"
if not "custom-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 +144,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 +171,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 +234,14 @@ def is_mobile_platform():
return True
return False
def get_custom_sysroot_bin():
return option("custom-sysroot") + "/usr/bin"
# todo 32bit support?
def get_custom_sysroot_lib():
if base.is_os_64bit():
return option("custom-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

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

@ -13,13 +13,13 @@ 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"]
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,13 @@ 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"
def get_vs_version():
vs_version = "14 2015"
@ -49,10 +51,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 +64,11 @@ 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]
# IOS
elif "ios" in platform:
cmake_args_ext = [
@ -113,11 +115,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():
@ -269,6 +274,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 +343,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 +359,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

@ -12,10 +12,9 @@ import icu_android
def fetch_icu(major, minor):
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.cmd("git", ["clone", "--depth", "1", "--branch", "release-" + major + "-" + minor, "https://github.com/unicode-org/icu.git", "./icu2"])
base.copy_dir("./icu2/icu4c", "./icu")
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,15 +35,15 @@ 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)
@ -58,48 +57,87 @@ 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")
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"))
args = {
"win_32" : {
"msbuild_platfrom" : "Win32",
"vcvarsall_arch" : "x86",
"out_bin_dir" : "icu/bin/",
"out_lib_dir" : "icu/lib/"
},
"win_64" : {
"msbuild_platfrom" : "X64",
"vcvarsall_arch" : "x64",
"out_bin_dir" : "icu/bin64/",
"out_lib_dir" : "icu/lib64/"
},
"win_arm64" : {
"msbuild_platfrom" : "ARM64",
"vcvarsall_arch" : "x64_arm64",
"out_bin_dir" : "icu/binARM64/",
"out_lib_dir" : "icu/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 icu/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)
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/")
base.copy_file(platform_args['out_bin_dir'] + "icudt" + icu_major + ".dll", platform + "/build/")
base.copy_file(platform_args['out_bin_dir'] + "icuuc" + icu_major + ".dll", platform + "/build/")
base.copy_file(platform_args['out_lib_dir'] + "icudt.lib", platform + "/build/")
base.copy_file(platform_args['out_lib_dir'] + "icuuc.lib", platform + "/build/")
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")
command_configure = "./../source/runConfigureICU"
command_compile_addon = "-static-libstdc++ -static-libgcc"
ld_library_path_copy = ''
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("custom-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:
if 'LD_LIBRARY_PATH' in os.environ:
ld_library_path_copy = os.environ['LD_LIBRARY_PATH']
os.environ['LD_LIBRARY_PATH'] = config.get_custom_sysroot_lib()
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("custom-sysroot"),
"CXXFLAGS=--sysroot=" + config.option("custom-sysroot") + " " + command_compile_addon,
"LDFLAGS=--sysroot=" + config.option("custom-sysroot")])
if "" == config.option("custom-sysroot"):
base.cmd("make", ["-j4"])
base.cmd("make", ["install"], True)
else:
base.cmd_exe("make", ["-j4"])
base.cmd_exe("make", ["install"], True)
os.environ['LD_LIBRARY_PATH'] = ld_library_path_copy
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)
@ -109,7 +147,7 @@ def make():
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"])

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")
@ -80,20 +88,35 @@ def make():
return
if (-1 != config.option("platform").find("linux")) and not base.is_dir("../build/linux_64"):
ld_library_path_copy = ''
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("custom-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)
else:
if 'LD_LIBRARY_PATH' in os.environ:
ld_library_path_copy = os.environ['LD_LIBRARY_PATH']
os.environ['LD_LIBRARY_PATH'] = config.get_custom_sysroot_lib()
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("custom-sysroot"),)
base.replaceInFile("./Makefile", "CXXFLAGS=-Wall -O3", "CXXFLAGS=-Wall -O3 -fvisibility=hidden --sysroot=" + config.option("custom-sysroot"))
if config.option("custom-sysroot") == "":
base.cmd("make", [])
base.cmd("make", ["install"])
base.cmd("make", ["clean"], True)
else:
base.cmd_exe("make", [])
base.cmd_exe("make", ["install"])
base.cmd_exe("make", ["clean"], True)
os.environ['LD_LIBRARY_PATH'] = ld_library_path_copy
# TODO: support x86
if (-1 != config.option("platform").find("linux_arm64")) and not base.is_dir("../build/linux_arm64"):

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("custom-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

@ -44,7 +44,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 +59,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("custom-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 +79,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 +103,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 +172,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 +206,23 @@ 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"])
ld_library_path_copy = ''
if config.option("custom-sysroot") != "":
if 'LD_LIBRARY_PATH' in os.environ:
ld_library_path_copy = os.environ['LD_LIBRARY_PATH']
os.environ['LD_LIBRARY_PATH'] = config.get_custom_sysroot_lib()
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("custom-sysroot") + "\"]" + "\n cflags_c = []\n cflags_cc = [\"--sysroot=" + config.option("custom-sysroot") + "\"]" + "\n cflags_objc = []\n cflags_objcc = []\n ldflags = [\"--sysroot=" + config.option("custom-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)
base.cmd2("gn", ["gen", "out.gn/linux_64", make_args(gn_args, "linux")], False)
base.cmd2("ninja", ["-C", "out.gn/linux_64"], False)
os.environ['LD_LIBRARY_PATH'] = ld_library_path_copy
if config.check_option("platform", "linux_32"):
base.cmd2("gn", ["gen", "out.gn/linux_32", make_args(gn_args, "linux", False)])
@ -187,6 +236,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

@ -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, platform)
# doctrenderer
if isWindowsXP:
@ -129,6 +120,18 @@ def make():
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")
if native_platform == "win_arm64":
base.delete_dir(root_dir + "/sdkjs")
base.copy_dir(root_dir_win64 + "/sdkjs", root_dir + "/sdkjs")
return
# delete unnecessary builder files
def delete_files(files):
for file in files:

View File

@ -75,6 +75,11 @@ def make():
base.generate_doctrenderer_config(archive_dir + "/DoctRenderer.config", "./", "builder", "", "./dictionaries")
base.create_x2t_js_cache(archive_dir, "core", platform)
base.delete_file(archive_dir + "/DoctRenderer.config")
# just copy sdkjs to avoid executing arm64 x2t on non-arm system
if native_platform == "win_arm64" :
base.delete_dir(archive_dir + "/sdkjs")
base.copy_dir(archive_dir + "/../../../win_64/" + branding + "/core/sdkjs", archive_dir + "/sdkjs")
# dictionaries
base.copy_dictionaries(git_dir + "/dictionaries", archive_dir + "/dictionaries", True, False)

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", 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")):
@ -253,6 +240,11 @@ def make():
else:
base.copy_dir(git_dir + "/desktop-apps/common/loginpage/providers", root_dir + "/providers")
# license
if (0 == platform.find("mac")):
base.create_dir(root_dir + "/license")
base.copy_file(git_dir + "/desktop-apps/common/package/license/opensource/EULA.html", root_dir + "/license/EULA.html")
isUseJSC = False
if (0 == platform.find("mac")):
doctrenderer_lib = "libdoctrenderer.dylib"
@ -272,9 +264,14 @@ def make():
base.delete_file(root_dir + "/cef_sandbox.lib")
base.delete_file(root_dir + "/libcef.lib")
isMacArmPlaformOnIntel = False
if (platform == "mac_arm64") and not base.is_os_arm():
isMacArmPlaformOnIntel = True
is_host_not_arm = False
host_platform = ""
if (platform == "mac_arm64" or platform == "win_arm64") and not base.is_os_arm():
is_host_not_arm = True
if platform == "mac_arm64":
host_platform = "mac_64"
elif platform == "win_arm64":
host_platform = "win_64"
# all themes generate ----
base.copy_exe(core_build_dir + "/bin/" + platform_postfix, root_dir + "/converter", "allfontsgen")
@ -285,12 +282,12 @@ def make():
base.generate_plist(root_dir, "mac", 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:]
end_find_platform = sdkjs_dir.rfind("/" + platform + "/")
sdkjs_dir_64 = sdkjs_dir[0:end_find_platform] + "/" + host_platform + "/" + sdkjs_dir[end_find_platform+11:]
base.delete_dir(sdkjs_dir)
base.copy_dir(sdkjs_dir_mac64, sdkjs_dir)
base.copy_dir(sdkjs_dir_64, sdkjs_dir)
else:
themes_params = []
if ("" != config.option("themesparams")):

View File

@ -73,22 +73,7 @@ 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")

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)

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,13 @@ 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("custom-sysroot"):
os.environ['LD_LIBRARY_PATH'] = config.get_custom_sysroot_lib()
os.environ['QMAKE_CUSTOM_SYSROOT'] = config.option("custom-sysroot")
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 +123,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

@ -91,7 +91,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 +275,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,6 +368,8 @@ 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):
if output_dir.endswith('/'):

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

Binary file not shown.

View File

@ -0,0 +1,52 @@
#!/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)
bash_chroot('apt install -y build-essential curl libpthread-stubs0-dev zlib1g-dev', 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,49 @@
import os
import sys
import uuid
# change symbolic link to relative paths
def fix_symlinks(top_dir='./sysroot_ubuntu_1604'):
top_dir += '/usr/lib/x86_64-linux-gnu'
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('/lib/'):
continue
new_target = "../../../lib" + target[4:]
temp_name = f".tmp.{uuid.uuid4().hex}"
temp_path = os.path.join(root, temp_name)
try:
os.symlink(new_target, 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}")
except OSError as e:
print(f"Failed to replace symlink '{path}': {e}", file=sys.stderr)
try:
os.unlink(temp_path)
except OSError:
pass
break # no subfolders
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/**"
]
}

View File

@ -1 +1 @@
9.0.3
9.0.4