From d97dcaec62a480274533bec90bdb5f63d5a4d7b2 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 6 Nov 2020 20:22:02 +0300 Subject: [PATCH] Add possibility to build on Windows for x64. --- .../SourceFiles/platform/win/launcher_win.cpp | 4 +- Telegram/ThirdParty/libtgvoip | 2 +- Telegram/configure.py | 8 + Telegram/lib_base | 2 +- cmake | 2 +- docs/building-msvc-x64.md | 244 ++++++++++++++++++ docs/building-msvc.md | 27 +- 7 files changed, 270 insertions(+), 19 deletions(-) create mode 100644 docs/building-msvc-x64.md diff --git a/Telegram/SourceFiles/platform/win/launcher_win.cpp b/Telegram/SourceFiles/platform/win/launcher_win.cpp index 20d530249..44821f1ea 100644 --- a/Telegram/SourceFiles/platform/win/launcher_win.cpp +++ b/Telegram/SourceFiles/platform/win/launcher_win.cpp @@ -129,11 +129,11 @@ bool Launcher::launch( arguments.toStdWString().c_str(), nativeWorkingDir.empty() ? nullptr : nativeWorkingDir.c_str(), SW_SHOWNORMAL); - if (long(result) < 32) { + if (int64(result) < 32) { DEBUG_LOG(("Application Error: failed to execute %1, working directory: '%2', result: %3" ).arg(binaryPath ).arg(cWorkingDir() - ).arg(long(result) + ).arg(int64(result) )); return false; } diff --git a/Telegram/ThirdParty/libtgvoip b/Telegram/ThirdParty/libtgvoip index 7563a96b8..931f6a49c 160000 --- a/Telegram/ThirdParty/libtgvoip +++ b/Telegram/ThirdParty/libtgvoip @@ -1 +1 @@ -Subproject commit 7563a96b8f8e86b7a5fd1ce783388adf29bf4cf9 +Subproject commit 931f6a49c531995d4daf64f8357042a1eeeef43f diff --git a/Telegram/configure.py b/Telegram/configure.py index 61f88e93d..e42616858 100644 --- a/Telegram/configure.py +++ b/Telegram/configure.py @@ -38,6 +38,12 @@ if os.path.isfile(officialTargetFile): for line in f: officialTarget = line.strip() +arch = '' +if officialTarget == 'win' or officialTarget == 'uwp': + arch = 'x86' +elif officialTarget == 'win64' or officialTarget == 'uwp64': + arch = 'x64' + if officialTarget != '': officialApiIdFile = scriptPath + '/../../DesktopPrivate/custom_api_id.h' if not os.path.isfile(officialApiIdFile): @@ -51,6 +57,8 @@ if officialTarget != '': arguments.append('-DTDESKTOP_API_ID=' + apiIdMatch.group(1)) elif apiHashMatch: arguments.append('-DTDESKTOP_API_HASH=' + apiHashMatch.group(1)) + if arch != '': + arguments.append(arch) finish(run_cmake.run(scriptName, arguments)) elif 'linux' in sys.platform: debugCode = run_cmake.run(scriptName, arguments, "Debug") diff --git a/Telegram/lib_base b/Telegram/lib_base index 03b7b4cd6..2d674eff9 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit 03b7b4cd6f26ff53dff311438bf9c3f84dec13aa +Subproject commit 2d674eff931c2540147e4f1ac29965e90ab4af22 diff --git a/cmake b/cmake index 4bf45519f..d9e8a608c 160000 --- a/cmake +++ b/cmake @@ -1 +1 @@ -Subproject commit 4bf45519f6b39afa85e394c19680971fd92bfac4 +Subproject commit d9e8a608c21ca175ed118955d83010580fb46e65 diff --git a/docs/building-msvc-x64.md b/docs/building-msvc-x64.md new file mode 100644 index 000000000..91c1fa4fe --- /dev/null +++ b/docs/building-msvc-x64.md @@ -0,0 +1,244 @@ +# Build instructions for Visual Studio 2019 for 64 bit + +- [Prepare folder](#prepare-folder) +- [Install third party software](#install-third-party-software) +- [Clone source code and prepare libraries](#clone-source-code-and-prepare-libraries) +- [Build the project](#build-the-project) +- [Qt Visual Studio Tools](#qt-visual-studio-tools) + +## Prepare folder + +Choose an empty folder for the future build, for example **D:\\TBuild**. It will be named ***BuildPath*** in the rest of this document. Create two folders there, ***BuildPath*\\ThirdParty** and ***BuildPath*\\Libraries**. + +All commands (if not stated otherwise) will be launched from **x64 Native Tools Command Prompt for VS 2019.bat** (should be in **Start Menu > Visual Studio 2019** menu folder). Pay attention not to use any other Command Prompt. + +### Obtain your API credentials + +You will require **api_id** and **api_hash** to access the Telegram API servers. To learn how to obtain them [click here][api_credentials]. + +## Install third party software + +* Download **Strawberry Perl** installer from [http://strawberryperl.com/](http://strawberryperl.com/) and install to ***BuildPath*\\ThirdParty\\Strawberry** +* Download **NASM** installer from [http://www.nasm.us](http://www.nasm.us) and install to ***BuildPath*\\ThirdParty\\NASM** +* Download **Yasm** executable from [http://yasm.tortall.net/Download.html](http://yasm.tortall.net/Download.html), rename to *yasm.exe* and put to ***BuildPath*\\ThirdParty\\yasm** +* Download **MSYS2** installer from [http://www.msys2.org/](http://www.msys2.org/) and install to ***BuildPath*\\ThirdParty\\msys64** +* Download **jom** archive from [http://download.qt.io/official_releases/jom/jom.zip](http://download.qt.io/official_releases/jom/jom.zip) and unpack to ***BuildPath*\\ThirdParty\\jom** +* Download **Python 2.7** installer from [https://www.python.org/downloads/](https://www.python.org/downloads/) and install to ***BuildPath*\\ThirdParty\\Python27** +* Download **CMake** installer from [https://cmake.org/download/](https://cmake.org/download/) and install to ***BuildPath*\\ThirdParty\\cmake** +* Download **Ninja** executable from [https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-win.zip](https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-win.zip) and unpack to ***BuildPath*\\ThirdParty\\Ninja** +* Download **Git** installer from [https://git-scm.com/download/win](https://git-scm.com/download/win) and install it. + +Open **x64 Native Tools Command Prompt for VS 2019.bat**, go to ***BuildPath*** and run + + cd ThirdParty + git clone https://github.com/desktop-app/patches.git + cd patches + git checkout 9fb66f2 + cd ../ + git clone https://chromium.googlesource.com/external/gyp + cd gyp + git checkout 9f2a7bb1 + git apply ../patches/gyp.diff + cd ..\.. + +Add **GYP** and **Ninja** to your PATH: + +* Open **Control Panel** -> **System** -> **Advanced system settings** +* Press **Environment Variables...** +* Select **Path** +* Press **Edit** +* Add ***BuildPath*\\ThirdParty\\gyp** value +* Add ***BuildPath*\\ThirdParty\\Ninja** value + +## Clone source code and prepare libraries + +Open **x64 Native Tools Command Prompt for VS 2019.bat**, go to ***BuildPath*** and run + + SET PATH=%cd%\ThirdParty\Strawberry\perl\bin;%cd%\ThirdParty\Python27;%cd%\ThirdParty\NASM;%cd%\ThirdParty\jom;%cd%\ThirdParty\cmake\bin;%cd%\ThirdParty\yasm;%PATH% + + git clone --recursive https://github.com/telegramdesktop/tdesktop.git + + if not exist Libraries\win64 mkdir Libraries\win64 + cd Libraries\win64 + + git clone https://github.com/desktop-app/patches.git + cd patches + git checkout 9fb66f2 + cd .. + + git clone https://github.com/desktop-app/lzma.git + cd lzma\C\Util\LzmaLib + msbuild LzmaLib.sln /property:Configuration=Debug /property:Platform="x64" + msbuild LzmaLib.sln /property:Configuration=Release /property:Platform="x64" + cd ..\..\..\.. + + git clone https://github.com/openssl/openssl.git openssl_1_1_1 + cd openssl_1_1_1 + git checkout OpenSSL_1_1_1-stable + perl Configure no-shared no-tests debug-VC-WIN64A + nmake + mkdir out64.dbg + move libcrypto.lib out64.dbg + move libssl.lib out64.dbg + move ossl_static.pdb out64.dbg\ossl_static + nmake clean + move out64.dbg\ossl_static out64.dbg\ossl_static.pdb + perl Configure no-shared no-tests VC-WIN64A + nmake + mkdir out64 + move libcrypto.lib out64 + move libssl.lib out64 + move ossl_static.pdb out64 + cd .. + + git clone https://github.com/desktop-app/zlib.git + cd zlib\contrib\vstudio\vc14 + msbuild zlibstat.vcxproj /property:Configuration=Debug /property:Platform="x64" + msbuild zlibstat.vcxproj /property:Configuration=ReleaseWithoutAsm /property:Platform="x64" + cd ..\..\..\.. + + git clone -b v4.0.1-rc2 https://github.com/mozilla/mozjpeg.git + cd mozjpeg + cmake . ^ + -G "Visual Studio 16 2019" ^ + -A x64 ^ + -DWITH_JPEG8=ON ^ + -DPNG_SUPPORTED=OFF + cmake --build . --config Debug + cmake --build . --config Release + cd .. + + git clone https://github.com/telegramdesktop/openal-soft.git + cd openal-soft + git checkout fix_mono + cd build + cmake .. ^ + -G "Visual Studio 16 2019" ^ + -A x64 ^ + -D LIBTYPE:STRING=STATIC ^ + -D FORCE_STATIC_VCRT=ON + msbuild OpenAL.vcxproj /property:Configuration=Debug /property:Platform="x64" + msbuild OpenAL.vcxproj /property:Configuration=RelWithDebInfo /property:Platform="x64" + cd ..\.. + + git clone https://github.com/google/breakpad + cd breakpad + git checkout a1dbcdcb43 + git apply ../patches/breakpad.diff + cd src + git clone https://github.com/google/googletest testing + cd client\windows + gyp --no-circular-check breakpad_client.gyp --format=ninja + cd ..\.. + ninja -C out/Debug_x64 common crash_generation_client exception_handler + ninja -C out/Release_x64 common crash_generation_client exception_handler + cd tools\windows\dump_syms + gyp dump_syms.gyp + msbuild dump_syms.vcxproj /property:Configuration=Release /property:Platform="x64" + cd ..\..\..\..\.. + + git clone https://github.com/telegramdesktop/opus.git + cd opus + git checkout tdesktop + cd win32\VS2015 + msbuild opus.sln /property:Configuration=Debug /property:Platform="x64" + msbuild opus.sln /property:Configuration=Release /property:Platform="x64" + + cd ..\..\..\..\.. + SET PATH_BACKUP_=%PATH% + SET PATH=%cd%\ThirdParty\msys64\usr\bin;%PATH% + cd Libraries\win64 + + git clone https://github.com/FFmpeg/FFmpeg.git ffmpeg + cd ffmpeg + git checkout release/4.2 + + set CHERE_INVOKING=enabled_from_arguments + set MSYS2_PATH_TYPE=inherit + bash --login ../patches/build_ffmpeg_win.sh + + SET PATH=%PATH_BACKUP_% + cd .. + + SET LibrariesPath=%cd% + git clone git://code.qt.io/qt/qt5.git qt_5_15_1 + cd qt_5_15_1 + perl init-repository --module-subset=qtbase,qtimageformats + git checkout v5.15.1 + git submodule update qtbase qtimageformats + cd qtbase + for /r %i in (..\..\patches\qtbase_5_15_1\*) do git apply %i + cd .. + + configure ^ + -prefix "%LibrariesPath%\Qt-5.15.1" ^ + -debug-and-release ^ + -force-debug-info ^ + -opensource ^ + -confirm-license ^ + -static ^ + -static-runtime ^ + -no-opengl ^ + -openssl-linked ^ + -I "%LibrariesPath%\openssl_1_1_1\include" ^ + OPENSSL_LIBS_DEBUG="%LibrariesPath%\openssl_1_1_1\out64.dbg\libssl.lib %LibrariesPath%\openssl_1_1_1\out64.dbg\libcrypto.lib Ws2_32.lib Gdi32.lib Advapi32.lib Crypt32.lib User32.lib" ^ + OPENSSL_LIBS_RELEASE="%LibrariesPath%\openssl_1_1_1\out64\libssl.lib %LibrariesPath%\openssl_1_1_1\out64\libcrypto.lib Ws2_32.lib Gdi32.lib Advapi32.lib Crypt32.lib User32.lib" ^ + -I "%LibrariesPath%\mozjpeg" ^ + LIBJPEG_LIBS_DEBUG="%LibrariesPath%\mozjpeg\Debug\jpeg-static.lib" ^ + LIBJPEG_LIBS_RELEASE="%LibrariesPath%\mozjpeg\Release\jpeg-static.lib" ^ + -mp ^ + -nomake examples ^ + -nomake tests ^ + -platform win32-msvc + + jom -j8 + jom -j8 install + cd .. + + git clone https://github.com/desktop-app/tg_owt.git + cd tg_owt + mkdir out + cd out + mkdir Debug + cd Debug + cmake -G Ninja ^ + -DCMAKE_BUILD_TYPE=Debug ^ + -DTG_OWT_SPECIAL_TARGET=win64 ^ + -DTG_OWT_LIBJPEG_INCLUDE_PATH=%cd%/../../../mozjpeg ^ + -DTG_OWT_OPENSSL_INCLUDE_PATH=%cd%/../../../openssl_1_1_1/include ^ + -DTG_OWT_OPUS_INCLUDE_PATH=%cd%/../../../opus/include ^ + -DTG_OWT_FFMPEG_INCLUDE_PATH=%cd%/../../../ffmpeg ../.. + ninja + cd .. + mkdir Release + cd Release + cmake -G Ninja ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DTG_OWT_SPECIAL_TARGET=win64 ^ + -DTG_OWT_LIBJPEG_INCLUDE_PATH=%cd%/../../../mozjpeg ^ + -DTG_OWT_OPENSSL_INCLUDE_PATH=%cd%/../../../openssl_1_1_1/include ^ + -DTG_OWT_OPUS_INCLUDE_PATH=%cd%/../../../opus/include ^ + -DTG_OWT_FFMPEG_INCLUDE_PATH=%cd%/../../../ffmpeg ../.. + ninja + cd ..\..\.. + +## Build the project + +Go to ***BuildPath*\\tdesktop\\Telegram** and run (using [your **api_id** and **api_hash**](#obtain-your-api-credentials)) + + configure.bat x64 -D TDESKTOP_API_ID=YOUR_API_ID -D TDESKTOP_API_HASH=YOUR_API_HASH -D DESKTOP_APP_USE_PACKAGED=OFF -D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF + +* Open ***BuildPath*\\tdesktop\\out\\Telegram.sln** in Visual Studio 2019 +* Select Telegram project and press Build > Build Telegram (Debug and Release configurations) +* The result Telegram.exe will be located in **D:\TBuild\tdesktop\out\Debug** (and **Release**) + +### Qt Visual Studio Tools + +For better debugging you may want to install Qt Visual Studio Tools: + +* Open **Extensions** -> **Manage Extensions** +* Go to **Online** tab +* Search for **Qt** +* Install **Qt Visual Studio Tools** extension + +[api_credentials]: api_credentials.md diff --git a/docs/building-msvc.md b/docs/building-msvc.md index 0913e0e1d..5d12e6f71 100644 --- a/docs/building-msvc.md +++ b/docs/building-msvc.md @@ -68,8 +68,8 @@ Open **x86 Native Tools Command Prompt for VS 2019.bat**, go to ***BuildPath*** git clone https://github.com/desktop-app/lzma.git cd lzma\C\Util\LzmaLib - msbuild LzmaLib.sln /property:Configuration=Debug - msbuild LzmaLib.sln /property:Configuration=Release + msbuild LzmaLib.sln /property:Configuration=Debug /property:Platform="x86" + msbuild LzmaLib.sln /property:Configuration=Release /property:Platform="x86" cd ..\..\..\.. git clone https://github.com/openssl/openssl.git openssl_1_1_1 @@ -92,19 +92,18 @@ Open **x86 Native Tools Command Prompt for VS 2019.bat**, go to ***BuildPath*** cd .. git clone https://github.com/desktop-app/zlib.git - cd zlib - cd contrib\vstudio\vc14 - msbuild zlibstat.vcxproj /property:Configuration=Debug - msbuild zlibstat.vcxproj /property:Configuration=ReleaseWithoutAsm + cd zlib\contrib\vstudio\vc14 + msbuild zlibstat.vcxproj /property:Configuration=Debug /property:Platform="x86" + msbuild zlibstat.vcxproj /property:Configuration=ReleaseWithoutAsm /property:Platform="x86" cd ..\..\..\.. git clone -b v4.0.1-rc2 https://github.com/mozilla/mozjpeg.git cd mozjpeg cmake . ^ - -G "Visual Studio 16 2019" ^ - -A Win32 ^ - -DWITH_JPEG8=ON ^ - -DPNG_SUPPORTED=OFF + -G "Visual Studio 16 2019" ^ + -A Win32 ^ + -DWITH_JPEG8=ON ^ + -DPNG_SUPPORTED=OFF cmake --build . --config Debug cmake --build . --config Release cd .. @@ -114,10 +113,10 @@ Open **x86 Native Tools Command Prompt for VS 2019.bat**, go to ***BuildPath*** git checkout fix_mono cd build cmake .. ^ - -G "Visual Studio 16 2019" ^ - -A Win32 ^ - -D LIBTYPE:STRING=STATIC ^ - -D FORCE_STATIC_VCRT=ON + -G "Visual Studio 16 2019" ^ + -A Win32 ^ + -D LIBTYPE:STRING=STATIC ^ + -D FORCE_STATIC_VCRT=ON msbuild OpenAL.vcxproj /property:Configuration=Debug msbuild OpenAL.vcxproj /property:Configuration=RelWithDebInfo cd ..\..