cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR) project(TDLib VERSION 1.6.9 LANGUAGES CXX C) if (NOT DEFINED CMAKE_INSTALL_LIBDIR) set(CMAKE_INSTALL_LIBDIR "lib") endif() if (NOT DEFINED CMAKE_INSTALL_BINDIR) set(CMAKE_INSTALL_BINDIR "bin") endif() if (NOT DEFINED CMAKE_INSTALL_INCLUDEDIR) set(CMAKE_INSTALL_INCLUDEDIR "include") endif() if (POLICY CMP0054) # do not expand quoted arguments cmake_policy(SET CMP0054 NEW) endif() # Prevent in-source build get_filename_component(TD_REAL_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" REALPATH) get_filename_component(TD_REAL_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" REALPATH) if (TD_REAL_BINARY_DIR STREQUAL TD_REAL_SOURCE_DIR) message(" Out-of-source build should be used to build TDLib.") message(" You need to remove the files already created by CMake and") message(" rerun CMake from a new directory:") message(" rm -rf CMakeFiles CMakeCache.txt") message(" mkdir build") message(" cd build") message(" cmake ..") message(FATAL_ERROR "In-source build failed.") endif() option(TD_ENABLE_JNI "Use \"ON\" to enable JNI-compatible TDLib API.") option(TD_ENABLE_DOTNET "Use \"ON\" to enable generation of C++/CLI or C++/CX TDLib API bindings.") if (TD_ENABLE_DOTNET AND (CMAKE_VERSION VERSION_LESS "3.1.0")) message(FATAL_ERROR "CMake 3.1.0 or higher is required. You are running version ${CMAKE_VERSION}.") endif() if (NOT DEFINED CMAKE_MODULE_PATH) set(CMAKE_MODULE_PATH "") endif() set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" "${CMAKE_MODULE_PATH}") set(CMAKE_EXPORT_COMPILE_COMMANDS 1) set(CMAKE_POSITION_INDEPENDENT_CODE ON) enable_testing() if (POLICY CMP0069) option(TD_ENABLE_LTO "Use \"ON\" to enable Link Time Optimization.") if (TD_ENABLE_LTO) cmake_policy(SET CMP0069 NEW) include(CheckIPOSupported) check_ipo_supported(RESULT IPO_SUPPORTED) if (IPO_SUPPORTED) # set_property(DIRECTORY PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) do not work? string(REPLACE ";" " " CXX_FLAGS_IPO "${CMAKE_CXX_COMPILE_OPTIONS_IPO}") message(STATUS "Use link time optimization CXX options: ${CXX_FLAGS_IPO}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${CXX_FLAGS_IPO}") string(REPLACE ";" " " C_FLAGS_IPO "${CMAKE_C_COMPILE_OPTIONS_IPO}") message(STATUS "Use link time optimization C options: ${C_FLAGS_IPO}") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${C_FLAGS_IPO}") string(REPLACE ";" " " LINK_FLAGS_IPO "${CMAKE_CXX_LINK_OPTIONS_IPO}") message(STATUS "Use link time optimization linker options: ${LINK_FLAGS_IPO}") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${LINK_FLAGS_IPO}") endif() endif() endif() # Configure CCache if available find_program(CCACHE_FOUND ccache) #set(CCACHE_FOUND 0) if (CCACHE_FOUND) message(STATUS "Found ccache") set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) else() message(STATUS "Could NOT find ccache (this is NOT an error)") endif() set(MEMPROF "" CACHE STRING "Use one of \"ON\", \"FAST\" or \"SAFE\" to enable memory profiling. \ Works under macOS and Linux when compiled using glibc. \ In FAST mode stack is unwinded only using frame pointers, which may fail. \ In SAFE mode stack is unwinded using backtrace function from execinfo.h, which may be very slow. \ By default both methods are used to achieve the maximum speed and accuracy") if (EMSCRIPTEN) # use prebuilt zlib set(ZLIB_FOUND 1) set(ZLIB_LIBRARIES) set(ZLIB_INCLUDE_DIR) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -s MEMFS_APPEND_TO_TYPED_ARRAYS=1 -s USE_ZLIB=1 -s MODULARIZE=1 -s WEBSOCKET_URL=\"'wss:#'\" -s EXTRA_EXPORTED_RUNTIME_METHODS=\"['FS','cwrap']\" -lidbfs.js -lworkerfs.js") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s ALLOW_MEMORY_GROWTH=1 -s MEMFS_APPEND_TO_TYPED_ARRAYS=1 -s USE_ZLIB=1 -s MODULARIZE=1 -s WEBSOCKET_URL=\"'wss:#'\" -s EXTRA_EXPORTED_RUNTIME_METHODS=\"['FS','cwrap']\" -lidbfs.js -lworkerfs.js") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -s DEMANGLE_SUPPORT=1 -s ASSERTIONS=1") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -s DEMANGLE_SUPPORT=1 -s ASSERTIONS=1") if (ASMJS) set(TD_EMSCRIPTEN td_asmjs) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=0 -Wno-almost-asm") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s WASM=0 -Wno-almost-asm") else() set(TD_EMSCRIPTEN td_wasm) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s WASM=1") endif() endif() if (NOT OPENSSL_FOUND) find_package(OpenSSL) endif() if (OPENSSL_FOUND) message(STATUS "Found OpenSSL: ${OPENSSL_INCLUDE_DIR} ${OPENSSL_LIBRARIES}") endif() if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(GCC 1) elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CLANG 1) elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") set(INTEL 1) elseif (NOT MSVC) message(FATAL_ERROR "Compiler isn't supported") endif() include(CheckCXXCompilerFlag) if (GCC OR CLANG OR INTEL) if (WIN32 AND INTEL) set(STD14_FLAG /Qstd=c++14) else() set(STD14_FLAG -std=c++14) endif() check_cxx_compiler_flag(${STD14_FLAG} HAVE_STD14) if (NOT HAVE_STD14) string(REPLACE "c++14" "c++1y" STD14_FLAG "${STD14_FLAG}") check_cxx_compiler_flag(${STD14_FLAG} HAVE_STD1Y) set(HAVE_STD14 ${HAVE_STD1Y}) endif() elseif (MSVC) set(HAVE_STD14 MSVC_VERSION>=1900) endif() if (NOT HAVE_STD14) message(FATAL_ERROR "No C++14 support in the compiler. Please upgrade the compiler.") endif() set(CMAKE_THREAD_PREFER_PTHREAD ON) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) if (THREADS_HAVE_PTHREAD_ARG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread") endif() if (MSVC) if (CMAKE_CXX_FLAGS_DEBUG MATCHES "/RTC1") string(REPLACE "/RTC1" " " CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") endif() add_definitions(-D_SCL_SECURE_NO_WARNINGS -D_CRT_SECURE_NO_WARNINGS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8 /GR- /W4 /wd4100 /wd4127 /wd4324 /wd4505 /wd4814 /wd4702") elseif (CLANG OR GCC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${STD14_FLAG} -fno-omit-frame-pointer -fno-exceptions -fno-rtti") if (APPLE) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-dead_strip,-x,-S") else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections -Wl,--exclude-libs,ALL") endif() if (MEMPROF) check_cxx_compiler_flag(-no-pie CXX_NO_PIE_FLAG) if (CXX_NO_PIE_FLAG) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie") elseif (APPLE) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-no_pie") endif() endif() elseif (INTEL) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${STD14_FLAG}") endif() if (WIN32) add_definitions(-DNTDDI_VERSION=0x06020000 -DWINVER=0x0602 -D_WIN32_WINNT=0x0602 -DPSAPI_VERSION=1 -DNOMINMAX -DUNICODE -D_UNICODE -DWIN32_LEAN_AND_MEAN) endif() if (CYGWIN) add_definitions(-D_DEFAULT_SOURCE=1 -DFD_SETSIZE=4096) endif() if (NOT ANDROID) # _FILE_OFFSET_BITS is broken in NDK r15, r15b and r17 and doesn't work prior to Android 7.0 add_definitions(-D_FILE_OFFSET_BITS=64) endif() include(AddCXXCompilerFlag) if (NOT MSVC) add_cxx_compiler_flag("-Wall") add_cxx_compiler_flag("-Wextra") add_cxx_compiler_flag("-Wimplicit-fallthrough=2") add_cxx_compiler_flag("-Wpointer-arith") add_cxx_compiler_flag("-Wcast-qual") add_cxx_compiler_flag("-Wsign-compare") add_cxx_compiler_flag("-Wduplicated-branches") add_cxx_compiler_flag("-Wduplicated-cond") add_cxx_compiler_flag("-Walloc-zero") add_cxx_compiler_flag("-Wlogical-op") add_cxx_compiler_flag("-Wno-tautological-compare") add_cxx_compiler_flag("-Wpointer-arith") add_cxx_compiler_flag("-Wvla") add_cxx_compiler_flag("-Wnon-virtual-dtor") add_cxx_compiler_flag("-Wno-unused-parameter") add_cxx_compiler_flag("-Wconversion") add_cxx_compiler_flag("-Wno-sign-conversion") add_cxx_compiler_flag("-Wc++14-compat-pedantic") add_cxx_compiler_flag("-Wdeprecated") add_cxx_compiler_flag("-Wno-unused-command-line-argument") add_cxx_compiler_flag("-Qunused-arguments") add_cxx_compiler_flag("-Wodr") add_cxx_compiler_flag("-flto-odr-type-merging") # add_cxx_compiler_flag("-Werror") # add_cxx_compiler_flag("-Wcast-align") #std::int32_t <-> int and off_t <-> std::size_t/std::int64_t # add_cxx_compiler_flag("-Wuseless-cast") #external headers like openssl # add_cxx_compiler_flag("-Wzero-as-null-pointer-constant") endif() if (GCC AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0)) add_cxx_compiler_flag("-Wno-maybe-uninitialized") # too much false positives endif() if (GCC AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0)) # warns about a lot of "return std::move", which are not redundant for compilers without fix for DR 1579, i.e. GCC 4.9 or clang 3.8 # see http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1579 add_cxx_compiler_flag("-Wno-redundant-move") endif() if (CLANG AND (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5)) # https://stackoverflow.com/questions/26744556/warning-returning-a-captured-reference-from-a-lambda add_cxx_compiler_flag("-Wno-return-stack-address") endif() #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -isystem /usr/include/c++/v1") #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread") #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined") #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=leak") add_subdirectory(tdtl) add_subdirectory(tdutils) add_subdirectory(td/generate) if (NOT CMAKE_CROSSCOMPILING) add_custom_target(prepare_cross_compiling DEPENDS tl_generate_common tdmime_auto tl_generate_json) if (TD_ENABLE_DOTNET) add_custom_target(remove_cpp_documentation WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND remove_documentation ${TL_TD_API_AUTO_SOURCE} td/telegram/Client.h td/telegram/Log.h td/tl/TlObject.h COMMENT "Remove C++ documentation from sources" DEPENDS remove_documentation tl_generate_common generate_dotnet_api ${TL_TD_API_AUTO_SOURCE} td/telegram/Client.h td/telegram/Log.h td/tl/TlObject.h ) add_dependencies(prepare_cross_compiling generate_dotnet_api remove_cpp_documentation) endif() endif() if (NOT OPENSSL_FOUND) message(WARNING "Can't find OpenSSL: stop TDLib building") return() endif() if (NOT ZLIB_FOUND) find_package(ZLIB) endif() if (NOT ZLIB_FOUND) message(WARNING "Can't find zlib: stop TDLib building") return() endif() if (NOT TDUTILS_MIME_TYPE) message(WARNING "Option TDUTILS_MIME_TYPE must not be disabled: stop TDLib building") return() endif() add_subdirectory(tdactor) add_subdirectory(tdnet) add_subdirectory(sqlite) add_subdirectory(tddb) option(TD_SKIP_TEST "Use \"ON\" to skip building/running the test harness.") if (NOT TD_SKIP_TEST) add_subdirectory(test) endif() option(TD_SKIP_BENCHMARK "Use \"ON\" to skip building/running the benchmarks.") if (NOT CMAKE_CROSSCOMPILING AND NOT TD_SKIP_BENCHMARK) add_subdirectory(benchmark) endif() get_directory_property(HAS_PARENT PARENT_DIRECTORY) if (HAS_PARENT) set(TL_TD_API_TLO ${TL_TD_API_TLO} PARENT_SCOPE) # was used in standalone binding generators set(TL_TD_JSON_AUTO ${TL_TD_JSON_AUTO_SOURCE} PARENT_SCOPE) # used in tdbot set(TD_TEST_SOURCE ${TD_TEST_SOURCE} PARENT_SCOPE) # used to build tests endif() #SOURCE SETS set_source_files_properties(${TL_TD_API_AUTO_SOURCE} PROPERTIES GENERATED TRUE) if (TD_ENABLE_JNI OR ANDROID) set(TL_JNI_OBJECT_SOURCE td/tl/tl_jni_object.cpp td/tl/tl_jni_object.h ) else() set(TL_JNI_OBJECT_SOURCE) endif() set(TL_TD_API_SOURCE ${TL_TD_API_AUTO_SOURCE} ${TL_JNI_OBJECT_SOURCE} td/tl/TlObject.h ) set_source_files_properties(${TL_TD_AUTO_SOURCE} PROPERTIES GENERATED TRUE) set(TL_TD_SCHEME_SOURCE ${TL_TD_AUTO_SOURCE} td/tl/TlObject.h td/tl/tl_object_parse.h td/tl/tl_object_store.h ) set_source_files_properties(${TL_TD_JSON_AUTO_SOURCE} PROPERTIES GENERATED TRUE) set(TL_TD_JSON_SOURCE ${TL_TD_JSON_AUTO_SOURCE} td/tl/tl_json.h ) set_source_files_properties(${TL_C_AUTO_SOURCE} PROPERTIES GENERATED TRUE) set(TL_C_SCHEME_SOURCE ${TL_C_AUTO_SOURCE} ) set_source_files_properties(${TL_DOTNET_AUTO_SOURCE} PROPERTIES GENERATED TRUE) set(TL_DOTNET_SCHEME_SOURCE ${TL_DOTNET_AUTO_SOURCE} td/tl/tl_dotnet_object.h ) set(TDLIB_SOURCE td/mtproto/AuthData.cpp td/mtproto/DhHandshake.cpp td/mtproto/Handshake.cpp td/mtproto/HandshakeActor.cpp td/mtproto/HttpTransport.cpp td/mtproto/IStreamTransport.cpp td/mtproto/KDF.cpp td/mtproto/Ping.cpp td/mtproto/PingConnection.cpp td/mtproto/ProxySecret.cpp td/mtproto/RawConnection.cpp td/mtproto/RSA.cpp td/mtproto/SessionConnection.cpp td/mtproto/TcpTransport.cpp td/mtproto/TlsInit.cpp td/mtproto/TlsReaderByteFlow.cpp td/mtproto/Transport.cpp td/mtproto/utils.cpp td/telegram/AnimationsManager.cpp td/telegram/AudiosManager.cpp td/telegram/AuthManager.cpp td/telegram/AutoDownloadSettings.cpp td/telegram/BackgroundManager.cpp td/telegram/BackgroundType.cpp td/telegram/CallActor.cpp td/telegram/CallDiscardReason.cpp td/telegram/CallManager.cpp td/telegram/CallbackQueriesManager.cpp td/telegram/ClientActor.cpp td/telegram/ConfigManager.cpp td/telegram/ConfigShared.cpp td/telegram/Contact.cpp td/telegram/ContactsManager.cpp td/telegram/CountryInfoManager.cpp td/telegram/DelayDispatcher.cpp td/telegram/Dependencies.cpp td/telegram/DeviceTokenManager.cpp td/telegram/DhCache.cpp td/telegram/DialogAction.cpp td/telegram/DialogAdministrator.cpp td/telegram/DialogDb.cpp td/telegram/DialogFilter.cpp td/telegram/DialogId.cpp td/telegram/DialogLocation.cpp td/telegram/DialogParticipant.cpp td/telegram/DialogSource.cpp td/telegram/Document.cpp td/telegram/DocumentsManager.cpp td/telegram/DraftMessage.cpp td/telegram/FileReferenceManager.cpp td/telegram/files/FileBitmask.cpp td/telegram/files/FileDb.cpp td/telegram/files/FileDownloader.cpp td/telegram/files/FileEncryptionKey.cpp td/telegram/files/FileFromBytes.cpp td/telegram/files/FileGcParameters.cpp td/telegram/files/FileGcWorker.cpp td/telegram/files/FileGenerateManager.cpp td/telegram/files/FileHashUploader.cpp td/telegram/files/FileLoader.cpp td/telegram/files/FileLoaderUtils.cpp td/telegram/files/FileLoadManager.cpp td/telegram/files/FileManager.cpp td/telegram/files/FileStats.cpp td/telegram/files/FileStatsWorker.cpp td/telegram/files/FileType.cpp td/telegram/files/FileUploader.cpp td/telegram/files/PartsManager.cpp td/telegram/files/ResourceManager.cpp td/telegram/Game.cpp td/telegram/Global.cpp td/telegram/HashtagHints.cpp td/telegram/InlineQueriesManager.cpp td/telegram/InputDialogId.cpp td/telegram/InputMessageText.cpp td/telegram/JsonValue.cpp td/telegram/LanguagePackManager.cpp td/telegram/Location.cpp td/telegram/logevent/LogEventHelper.cpp td/telegram/Logging.cpp td/telegram/MessageContent.cpp td/telegram/MessageContentType.cpp td/telegram/MessageEntity.cpp td/telegram/MessageId.cpp td/telegram/MessageReplyInfo.cpp td/telegram/MessagesDb.cpp td/telegram/MessageSearchFilter.cpp td/telegram/MessagesManager.cpp td/telegram/misc.cpp td/telegram/net/AuthDataShared.cpp td/telegram/net/ConnectionCreator.cpp td/telegram/net/DcAuthManager.cpp td/telegram/net/DcOptionsSet.cpp td/telegram/net/MtprotoHeader.cpp td/telegram/net/NetActor.cpp td/telegram/net/NetQuery.cpp td/telegram/net/NetQueryCreator.cpp td/telegram/net/NetQueryDelayer.cpp td/telegram/net/NetQueryDispatcher.cpp td/telegram/net/NetQueryStats.cpp td/telegram/net/NetStatsManager.cpp td/telegram/net/Proxy.cpp td/telegram/net/PublicRsaKeyShared.cpp td/telegram/net/PublicRsaKeyWatchdog.cpp td/telegram/net/Session.cpp td/telegram/net/SessionProxy.cpp td/telegram/net/SessionMultiProxy.cpp td/telegram/NotificationManager.cpp td/telegram/NotificationSettings.cpp td/telegram/NotificationType.cpp td/telegram/Payments.cpp td/telegram/PasswordManager.cpp td/telegram/PhoneNumberManager.cpp td/telegram/PrivacyManager.cpp td/telegram/Photo.cpp td/telegram/PhotoSizeSource.cpp td/telegram/PollManager.cpp td/telegram/QueryCombiner.cpp td/telegram/ReplyMarkup.cpp td/telegram/RestrictionReason.cpp td/telegram/SecretChatActor.cpp td/telegram/SecretChatDb.cpp td/telegram/SecretChatsManager.cpp td/telegram/SecureManager.cpp td/telegram/SecureStorage.cpp td/telegram/SecureValue.cpp td/telegram/SendCodeHelper.cpp td/telegram/SequenceDispatcher.cpp td/telegram/SpecialStickerSetType.cpp td/telegram/StateManager.cpp td/telegram/StickersManager.cpp td/telegram/StorageManager.cpp td/telegram/SuggestedAction.cpp td/telegram/Td.cpp td/telegram/TdDb.cpp td/telegram/TermsOfService.cpp td/telegram/TopDialogManager.cpp td/telegram/UpdatesManager.cpp td/telegram/Venue.cpp td/telegram/VideoNotesManager.cpp td/telegram/VideosManager.cpp td/telegram/VoiceNotesManager.cpp td/telegram/WebPageBlock.cpp td/telegram/WebPagesManager.cpp td/mtproto/AuthData.h td/mtproto/AuthKey.h td/mtproto/CryptoStorer.h td/mtproto/DhHandshake.h td/mtproto/Handshake.h td/mtproto/HandshakeActor.h td/mtproto/HandshakeConnection.h td/mtproto/HttpTransport.h td/mtproto/IStreamTransport.h td/mtproto/KDF.h td/mtproto/NoCryptoStorer.h td/mtproto/PacketInfo.h td/mtproto/PacketStorer.h td/mtproto/Ping.h td/mtproto/PingConnection.h td/mtproto/ProxySecret.h td/mtproto/Query.h td/mtproto/RawConnection.h td/mtproto/RSA.h td/mtproto/SessionConnection.h td/mtproto/TcpTransport.h td/mtproto/TlsInit.h td/mtproto/TlsReaderByteFlow.h td/mtproto/Transport.h td/mtproto/TransportType.h td/mtproto/utils.h td/telegram/AccessRights.h td/telegram/AnimationsManager.h td/telegram/AudiosManager.h td/telegram/AuthManager.h td/telegram/AutoDownloadSettings.h td/telegram/BackgroundId.h td/telegram/BackgroundManager.h td/telegram/BackgroundType.h td/telegram/CallActor.h td/telegram/CallDiscardReason.h td/telegram/CallId.h td/telegram/CallManager.h td/telegram/CallbackQueriesManager.h td/telegram/ChannelId.h td/telegram/ChatId.h td/telegram/ClientActor.h td/telegram/ConfigManager.h td/telegram/ConfigShared.h td/telegram/Contact.h td/telegram/ContactsManager.h td/telegram/CountryInfoManager.h td/telegram/DelayDispatcher.h td/telegram/Dependencies.h td/telegram/DeviceTokenManager.h td/telegram/DhCache.h td/telegram/DhConfig.h td/telegram/DialogAction.h td/telegram/DialogAdministrator.h td/telegram/DialogDate.h td/telegram/DialogDb.h td/telegram/DialogFilter.h td/telegram/DialogFilterId.h td/telegram/DialogId.h td/telegram/DialogListId.h td/telegram/DialogLocation.h td/telegram/DialogParticipant.h td/telegram/DialogSource.h td/telegram/Document.h td/telegram/DocumentsManager.h td/telegram/DraftMessage.h td/telegram/FileReferenceManager.h td/telegram/files/FileBitmask.h td/telegram/files/FileData.h td/telegram/files/FileDb.h td/telegram/files/FileDbId.h td/telegram/files/FileDownloader.h td/telegram/files/FileEncryptionKey.h td/telegram/files/FileFromBytes.h td/telegram/files/FileGcParameters.h td/telegram/files/FileGcWorker.h td/telegram/files/FileGenerateManager.h td/telegram/files/FileHashUploader.h td/telegram/files/FileId.h td/telegram/files/FileLoaderActor.h td/telegram/files/FileLoader.h td/telegram/files/FileLoaderUtils.h td/telegram/files/FileLoadManager.h td/telegram/files/FileLocation.h td/telegram/files/FileManager.h td/telegram/files/FileSourceId.h td/telegram/files/FileStats.h td/telegram/files/FileStatsWorker.h td/telegram/files/FileType.h td/telegram/files/FileUploader.h td/telegram/files/PartsManager.h td/telegram/files/ResourceManager.h td/telegram/files/ResourceState.h td/telegram/FolderId.h td/telegram/FullMessageId.h td/telegram/Game.h td/telegram/Global.h td/telegram/HashtagHints.h td/telegram/InlineQueriesManager.h td/telegram/InputDialogId.h td/telegram/InputMessageText.h td/telegram/JsonValue.h td/telegram/LanguagePackManager.h td/telegram/Location.h td/telegram/logevent/LogEvent.h td/telegram/logevent/LogEventHelper.h td/telegram/logevent/SecretChatEvent.h td/telegram/Logging.h td/telegram/MessageContent.h td/telegram/MessageContentType.h td/telegram/MessageCopyOptions.h td/telegram/MessageEntity.h td/telegram/MessageId.h td/telegram/MessageReplyInfo.h td/telegram/MessagesDb.h td/telegram/MessageSearchFilter.h td/telegram/MessagesManager.h td/telegram/misc.h td/telegram/net/AuthDataShared.h td/telegram/net/ConnectionCreator.h td/telegram/net/DcAuthManager.h td/telegram/net/DcId.h td/telegram/net/DcOptions.h td/telegram/net/DcOptionsSet.h td/telegram/net/MtprotoHeader.h td/telegram/net/NetActor.h td/telegram/net/NetQuery.h td/telegram/net/NetQueryCounter.h td/telegram/net/NetQueryCreator.h td/telegram/net/NetQueryDelayer.h td/telegram/net/NetQueryDispatcher.h td/telegram/net/NetQueryStats.h td/telegram/net/NetStatsManager.h td/telegram/net/NetType.h td/telegram/net/Proxy.h td/telegram/net/PublicRsaKeyShared.h td/telegram/net/PublicRsaKeyWatchdog.h td/telegram/net/Session.h td/telegram/net/SessionProxy.h td/telegram/net/SessionMultiProxy.h td/telegram/net/TempAuthKeyWatchdog.h td/telegram/Notification.h td/telegram/NotificationGroupId.h td/telegram/NotificationGroupKey.h td/telegram/NotificationGroupType.h td/telegram/NotificationId.h td/telegram/NotificationManager.h td/telegram/NotificationSettings.h td/telegram/NotificationType.h td/telegram/PasswordManager.h td/telegram/Payments.h td/telegram/PhoneNumberManager.h td/telegram/Photo.h td/telegram/PhotoSizeSource.h td/telegram/PollId.h td/telegram/PollManager.h td/telegram/PrivacyManager.h td/telegram/PtsManager.h td/telegram/PublicDialogType.h td/telegram/QueryCombiner.h td/telegram/ReplyMarkup.h td/telegram/RequestActor.h td/telegram/RestrictionReason.h td/telegram/ScheduledServerMessageId.h td/telegram/SecretChatActor.h td/telegram/SecretChatId.h td/telegram/SecretChatDb.h td/telegram/SecretChatsManager.h td/telegram/SecretInputMedia.h td/telegram/SecureManager.h td/telegram/SecureStorage.h td/telegram/SecureValue.h td/telegram/SendCodeHelper.h td/telegram/SequenceDispatcher.h td/telegram/ServerMessageId.h td/telegram/SetWithPosition.h td/telegram/SpecialStickerSetType.h td/telegram/StateManager.h td/telegram/StickerSetId.h td/telegram/StickersManager.h td/telegram/StorageManager.h td/telegram/SuggestedAction.h td/telegram/Td.h td/telegram/TdCallback.h td/telegram/TdDb.h td/telegram/TdParameters.h td/telegram/TermsOfService.h td/telegram/TopDialogCategory.h td/telegram/TopDialogManager.h td/telegram/UniqueId.h td/telegram/UpdatesManager.h td/telegram/UserId.h td/telegram/Venue.h td/telegram/Version.h td/telegram/VideoNotesManager.h td/telegram/VideosManager.h td/telegram/VoiceNotesManager.h td/telegram/WebPageBlock.h td/telegram/WebPageId.h td/telegram/WebPagesManager.h td/telegram/AnimationsManager.hpp td/telegram/AudiosManager.hpp td/telegram/AuthManager.hpp td/telegram/BackgroundType.hpp td/telegram/DialogFilter.hpp td/telegram/Document.hpp td/telegram/DocumentsManager.hpp td/telegram/DraftMessage.hpp td/telegram/FileReferenceManager.hpp td/telegram/files/FileData.hpp td/telegram/files/FileId.hpp td/telegram/files/FileLocation.hpp td/telegram/files/FileManager.hpp td/telegram/Game.hpp td/telegram/InputMessageText.hpp td/telegram/MessageEntity.hpp td/telegram/NotificationSettings.hpp td/telegram/Payments.hpp td/telegram/Photo.hpp td/telegram/PhotoSizeSource.hpp td/telegram/PollId.hpp td/telegram/PollManager.hpp td/telegram/ReplyMarkup.hpp td/telegram/SecureValue.hpp td/telegram/SendCodeHelper.hpp td/telegram/StickerSetId.hpp td/telegram/StickersManager.hpp td/telegram/VideoNotesManager.hpp td/telegram/VideosManager.hpp td/telegram/VoiceNotesManager.hpp ${TL_TD_SCHEME_SOURCE} ) set(MEMPROF_SOURCE memprof/memprof.cpp memprof/memprof.h ) #RULES file(MAKE_DIRECTORY auto) if (CMAKE_HOST_WIN32) set(GIT_COMMIT_CMD powershell -ExecutionPolicy ByPass ./gen_git_commit_h.ps1) else() set(GIT_COMMIT_CMD ./gen_git_commit_h.sh) endif() add_custom_target(git_commit ALL WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMAND ${GIT_COMMIT_CMD} COMMENT "Generate git_commit.h" ) #LIBRARIES # memprof - simple library for memory usage profiling add_library(memprof STATIC ${MEMPROF_SOURCE}) target_include_directories(memprof PUBLIC $) target_link_libraries(memprof PRIVATE tdutils) if (MEMPROF) target_compile_definitions(memprof PRIVATE -DUSE_MEMPROF=1) if (MEMPROF STREQUAL "SAFE") target_compile_definitions(memprof PRIVATE -DUSE_MEMPROF_SAFE=1) elseif (MEMPROF STREQUAL "FAST") target_compile_definitions(memprof PRIVATE -DUSE_MEMPROF_FAST=1) elseif (NOT MEMPROF) message(FATAL_ERROR "Unsupported MEMPROF value \"${MEMPROF}\"") endif() endif() add_library(tdapi STATIC ${TL_TD_API_SOURCE}) target_include_directories(tdapi PUBLIC $ INTERFACE $) target_link_libraries(tdapi PRIVATE tdutils) if (TD_ENABLE_JNI AND NOT ANDROID) # jni is available by default on Android if (NOT JNI_FOUND) find_package(JNI REQUIRED) endif() message(STATUS "Found JNI: ${JNI_INCLUDE_DIRS} ${JNI_LIBRARIES}") target_include_directories(tdapi PUBLIC ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}) target_link_libraries(tdapi PUBLIC ${JAVA_JVM_LIBRARY}) endif() if (NOT CMAKE_CROSSCOMPILING) add_dependencies(tdapi tl_generate_common) endif() # tdcore - mostly internal TDLib interface. One should use tdactor for interactions with it. add_library(tdcore STATIC ${TDLIB_SOURCE}) target_include_directories(tdcore PUBLIC $ $) target_include_directories(tdcore SYSTEM PRIVATE ${OPENSSL_INCLUDE_DIR}) target_link_libraries(tdcore PUBLIC tdapi tdactor tdutils tdnet tddb PRIVATE ${OPENSSL_CRYPTO_LIBRARY} ${CMAKE_DL_LIBS} ${ZLIB_LIBRARIES}) if (WIN32) if (MINGW) target_link_libraries(tdcore PRIVATE ws2_32 mswsock) else() target_link_libraries(tdcore PRIVATE ws2_32 Mswsock) endif() endif() if (NOT CMAKE_CROSSCOMPILING) add_dependencies(tdcore tl_generate_common) if (TD_ENABLE_JNI) add_dependencies(tdcore td_generate_java_api) endif() if (TD_ENABLE_DOTNET) add_dependencies(tdcore remove_cpp_documentation) endif() endif() add_library(tdclient td/telegram/Client.cpp td/telegram/Client.h td/telegram/Log.cpp td/telegram/Log.h) target_include_directories(tdclient PUBLIC $ ) target_link_libraries(tdclient PUBLIC tdapi PRIVATE tdcore) if (TD_ENABLE_DOTNET) add_library(tddotnet SHARED td/telegram/ClientDotNet.cpp td/telegram/LogDotNet.cpp ${TL_DOTNET_SCHEME_SOURCE} ) set_target_properties(tddotnet PROPERTIES OUTPUT_NAME Telegram.Td) target_link_libraries(tddotnet PRIVATE tdclient tdutils) target_include_directories(tddotnet PUBLIC $ ) if (NOT CMAKE_CROSSCOMPILING) add_dependencies(tddotnet generate_dotnet_api) endif() target_compile_options(tddotnet PRIVATE "/doc") if (CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") set_target_properties(tddotnet PROPERTIES VS_WINRT_COMPONENT "true") target_compile_options(tddotnet PUBLIC "/ZW") else() set_target_properties(tddotnet PROPERTIES COMPILE_FLAGS "/GR /clr") target_compile_options(tddotnet PUBLIC "/EHa") endif() endif() # tdc - TDLib interface in pure c. add_library(tdc STATIC EXCLUDE_FROM_ALL ${TL_C_SCHEME_SOURCE} td/telegram/td_c_client.cpp td/telegram/td_c_client.h) target_include_directories(tdc PUBLIC $ $) target_link_libraries(tdc PRIVATE tdclient tdutils) if (NOT CMAKE_CROSSCOMPILING) add_dependencies(tdc tl_generate_c) endif() add_library(tdjson_private STATIC ${TL_TD_JSON_SOURCE} td/telegram/ClientJson.cpp td/telegram/ClientJson.h) target_include_directories(tdjson_private PUBLIC $ $) target_link_libraries(tdjson_private PUBLIC tdclient tdutils) if (NOT CMAKE_CROSSCOMPILING) add_dependencies(tdjson_private tl_generate_common tl_generate_json) if (TD_ENABLE_DOTNET) add_dependencies(tdjson_private remove_cpp_documentation) endif() endif() set(TD_JSON_HEADERS td/telegram/td_json_client.h td/telegram/td_log.h) set(TD_JSON_SOURCE td/telegram/td_json_client.cpp td/telegram/td_log.cpp) include(GenerateExportHeader) add_library(tdjson SHARED ${TD_JSON_SOURCE} ${TD_JSON_HEADERS}) target_link_libraries(tdjson PRIVATE tdjson_private) generate_export_header(tdjson EXPORT_FILE_NAME ${CMAKE_CURRENT_BINARY_DIR}/td/telegram/tdjson_export.h) target_include_directories(tdjson PUBLIC $ $) if (APPLE) set_target_properties(tdjson PROPERTIES LINK_FLAGS "-Wl,-exported_symbols_list,${CMAKE_CURRENT_SOURCE_DIR}/tdclientjson_export_list") endif() add_library(tdjson_static STATIC ${TD_JSON_SOURCE} ${TD_JSON_HEADERS}) target_link_libraries(tdjson_static PRIVATE tdjson_private) target_compile_definitions(tdjson_static PUBLIC TDJSON_STATIC_DEFINE) target_include_directories(tdjson_static PUBLIC $ $) set(BIGOBJ) if (WIN32 OR CYGWIN) if (MSVC) set(BIGOBJ "/bigobj") elseif (GCC) set(BIGOBJ "-Wa,-mbig-obj") endif() endif() if (BIGOBJ) target_compile_options(tdapi PUBLIC ${BIGOBJ}) target_compile_options(tdc PUBLIC ${BIGOBJ}) target_compile_options(tdcore PUBLIC ${BIGOBJ}) target_compile_options(tdclient PUBLIC ${BIGOBJ}) target_compile_options(tdjson PUBLIC ${BIGOBJ}) target_compile_options(tdjson_static PUBLIC ${BIGOBJ}) if (TD_ENABLE_DOTNET) target_compile_options(tddotnet PUBLIC "/bigobj") endif() endif() if (EMSCRIPTEN) set(TD_EMSCRIPTEN_SRC td/telegram/td_emscripten.cpp) add_executable(${TD_EMSCRIPTEN} ${TD_EMSCRIPTEN_SRC}) target_include_directories(${TD_EMSCRIPTEN} PUBLIC $) target_link_libraries(${TD_EMSCRIPTEN} PRIVATE tdjson_static tdactor) endif() #EXECUTABLES if (NOT CMAKE_CROSSCOMPILING) option(TD_SKIP_TG_CLI "Use \"ON\" to skip building tg_cli.") if (NOT CMAKE_CROSSCOMPILING AND NOT TD_SKIP_TG_CLI) add_executable(tg_cli td/telegram/cli.cpp ${TL_TD_JSON_SOURCE}) if (NOT READLINE_FOUND) find_package(Readline) endif() if (NOT READLINE_FOUND) message(STATUS "Could NOT find Readline (this is NOT an error)") else() message(STATUS "Found Readline: ${READLINE_INCLUDE_DIR} ${READLINE_LIBRARY}") if (NOT USABLE_READLINE_FOUND) set(CMAKE_REQUIRED_INCLUDES "${READLINE_INCLUDE_DIR}") set(CMAKE_REQUIRED_LIBRARIES "${READLINE_LIBRARY}") include(CheckCXXSourceCompiles) unset(USABLE_READLINE_FOUND CACHE) check_cxx_source_compiles("#include \n#include \nint main() { rl_free(0); }" USABLE_READLINE_FOUND) if (NOT USABLE_READLINE_FOUND) message(STATUS "Found Readline is too old, ignore it (this is NOT an error)") unset(READLINE_INCLUDE_DIR CACHE) unset(READLINE_LIBRARY CACHE) endif() endif() if (USABLE_READLINE_FOUND) target_link_libraries(tg_cli PRIVATE ${READLINE_LIBRARY}) target_include_directories(tg_cli SYSTEM PRIVATE ${READLINE_INCLUDE_DIR}) target_compile_definitions(tg_cli PRIVATE -DUSE_READLINE=1) endif() endif() target_link_libraries(tg_cli PRIVATE memprof tdclient tdcore) add_dependencies(tg_cli tl_generate_json) endif() endif() #Exported libraries add_library(TdStatic INTERFACE) target_link_libraries(TdStatic INTERFACE tdclient) add_library(TdJson INTERFACE) target_link_libraries(TdJson INTERFACE tdjson) add_library(TdJsonStatic INTERFACE) target_link_libraries(TdJsonStatic INTERFACE tdjson_static) add_library(Td::TdStatic ALIAS TdStatic) add_library(Td::TdJson ALIAS TdJson) add_library(Td::TdJsonStatic ALIAS TdJsonStatic) install(TARGETS tdjson TdJson tdjson_static TdJsonStatic tdjson_private tdclient tdcore tdapi TdStatic EXPORT TdTargets LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) install(EXPORT TdTargets FILE TdTargets.cmake NAMESPACE Td:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Td" ) # Install tdjson/tdjson_static: install(FILES ${TD_JSON_HEADERS} "${CMAKE_CURRENT_BINARY_DIR}/td/telegram/tdjson_export.h" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/td/telegram") # Install tdclient: install(FILES td/telegram/Client.h td/telegram/Log.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/td/telegram") # Install tdapi: install(FILES td/tl/TlObject.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/td/tl") install(FILES "${TL_TD_AUTO_INCLUDE_DIR}/td/telegram/td_api.h" "${TL_TD_AUTO_INCLUDE_DIR}/td/telegram/td_api.hpp" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/td/telegram") if (TD_ENABLE_JNI) install(FILES td/tl/tl_jni_object.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/td/tl") endif() include(CMakePackageConfigHelpers) write_basic_package_version_file("TdConfigVersion.cmake" VERSION "${TDLib_VERSION}" COMPATIBILITY ExactVersion ) install(FILES "TdConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/TdConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Td" ) # Add SOVERSION to shared libraries set_property(TARGET tdclient PROPERTY SOVERSION "${TDLib_VERSION}") set_property(TARGET tdjson PROPERTY SOVERSION "${TDLib_VERSION}")