diff options
Diffstat (limited to 'protocols/Telegram/tdlib/td/CMakeLists.txt')
-rw-r--r-- | protocols/Telegram/tdlib/td/CMakeLists.txt | 792 |
1 files changed, 792 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/CMakeLists.txt b/protocols/Telegram/tdlib/td/CMakeLists.txt new file mode 100644 index 0000000000..5e2a626021 --- /dev/null +++ b/protocols/Telegram/tdlib/td/CMakeLists.txt @@ -0,0 +1,792 @@ +cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR) + +project(TDLib VERSION 1.2.0 LANGUAGES CXX C) + +# 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") +endif() + +set(MEMPROF "" CACHE STRING "Use one of \"ON\", \"FAST\" or \"SAFE\" to enable memory profiling. \ +Works under Mac OS 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 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} -Os -s ALLOW_MEMORY_GROWTH=1 -s USE_ZLIB=1 -s MODULARIZE=1 -s EXTRA_EXPORTED_RUNTIME_METHODS=\"['FS']\"") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os -s ALLOW_MEMORY_GROWTH=1 -s USE_ZLIB=1 -s MODULARIZE=1 -s EXTRA_EXPORTED_RUNTIME_METHODS=\"['FS']\"") + 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) + 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} /GR- /W4 /wd4100 /wd4127 /wd4324 /wd4505 /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 -DNOMINMAX -DUNICODE -D_UNICODE) +endif() +if (CYGWIN) + add_definitions(-D_DEFAULT_SOURCE=1 -DFD_SETSIZE=4096) +endif() + +if (NOT ANDROID) # _FILE_OFFSET_BITS is broken in ndk r15 and r15b 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("-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() + +#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_AUTO} 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_AUTO} 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 "Not found OpenSSL: skip TDLib, tdactor, tdnet, tddb") + return() +endif() + +if (NOT ZLIB_FOUND) + find_package(ZLIB) +endif() +if (NOT ZLIB_FOUND) + message(WARNING "Not found zlib: skip TDLib, tdactor, tdnet, tddb") + return() +endif() + +add_subdirectory(tdactor) + +add_subdirectory(tdnet) + +add_subdirectory(sqlite) + +add_subdirectory(tddb) + +add_subdirectory(test) + +if (NOT CMAKE_CROSSCOMPILING) + add_subdirectory(benchmark) +endif() + + +get_directory_property(HAS_PARENT PARENT_DIRECTORY) +if (HAS_PARENT) + set(TL_TD_AUTO_INCLUDES ${TL_TD_AUTO_INCLUDES} PARENT_SCOPE) + set(TL_TD_API_TLO ${TL_TD_API_TLO} PARENT_SCOPE) + set(TL_TD_JSON_AUTO ${TL_TD_JSON_AUTO} PARENT_SCOPE) + set(TD_TEST_SOURCE ${TD_TEST_SOURCE} PARENT_SCOPE) +endif() + + +#SOURCE SETS + +set_source_files_properties(${TL_TD_AUTO} PROPERTIES GENERATED TRUE) +if (TD_ENABLE_JNI) + set(TL_JNI_OBJECT + td/tl/tl_jni_object.cpp + td/tl/tl_jni_object.h + ) +else() + set(TL_JNI_OBJECT) +endif() + +set(TL_TD_SCHEME_SOURCE + ${TL_TD_AUTO} + ${TL_JNI_OBJECT} + td/tl/TlObject.h + td/tl/tl_object_parse.h + td/tl/tl_object_store.h +) + +set_source_files_properties(${TL_TD_JSON_AUTO} PROPERTIES GENERATED TRUE) +set(TL_TD_JSON + ${TL_TD_JSON_AUTO} + td/tl/tl_json.h +) + +set_source_files_properties(${TL_C_AUTO} PROPERTIES GENERATED TRUE) +set(TL_C_SCHEME_SOURCE + ${TL_C_AUTO} +) + +set_source_files_properties(${TL_DOTNET_AUTO} PROPERTIES GENERATED TRUE) +set(TL_DOTNET_SCHEME_SOURCE + ${TL_DOTNET_AUTO} + td/tl/tl_dotnet_object.h +) + +set(TDLIB_SOURCE + td/mtproto/AuthData.cpp + td/mtproto/crypto.cpp + td/mtproto/Handshake.cpp + td/mtproto/HandshakeActor.cpp + td/mtproto/HttpTransport.cpp + td/mtproto/IStreamTransport.cpp + td/mtproto/RawConnection.cpp + td/mtproto/SessionConnection.cpp + td/mtproto/TcpTransport.cpp + td/mtproto/Transport.cpp + td/mtproto/utils.cpp + + td/telegram/AnimationsManager.cpp + td/telegram/AudiosManager.cpp + td/telegram/AuthManager.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/DelayDispatcher.cpp + td/telegram/DeviceTokenManager.cpp + td/telegram/DhCache.cpp + td/telegram/DialogDb.cpp + td/telegram/DialogId.cpp + td/telegram/DialogParticipant.cpp + td/telegram/DocumentsManager.cpp + td/telegram/files/FileDb.cpp + td/telegram/files/FileDownloader.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/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/Location.cpp + td/telegram/MessageEntity.cpp + td/telegram/MessagesDb.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/NetQueryCounter.cpp + td/telegram/net/NetQueryCreator.cpp + td/telegram/net/NetQueryDelayer.cpp + td/telegram/net/NetQueryDispatcher.cpp + td/telegram/net/NetStatsManager.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/Payments.cpp + td/telegram/PasswordManager.cpp + td/telegram/PrivacyManager.cpp + td/telegram/Photo.cpp + td/telegram/ReplyMarkup.cpp + td/telegram/SecretChatActor.cpp + td/telegram/SecretChatDb.cpp + td/telegram/SecretChatsManager.cpp + td/telegram/SequenceDispatcher.cpp + td/telegram/StateManager.cpp + td/telegram/StickersManager.cpp + td/telegram/StorageManager.cpp + td/telegram/Td.cpp + td/telegram/TdDb.cpp + td/telegram/TopDialogManager.cpp + td/telegram/UpdatesManager.cpp + td/telegram/VideoNotesManager.cpp + td/telegram/VideosManager.cpp + td/telegram/VoiceNotesManager.cpp + td/telegram/WebPagesManager.cpp + + td/mtproto/AuthData.h + td/mtproto/AuthKey.h + td/mtproto/crypto.h + td/mtproto/CryptoStorer.h + td/mtproto/Handshake.h + td/mtproto/HandshakeActor.h + td/mtproto/HandshakeConnection.h + td/mtproto/HttpTransport.h + td/mtproto/IStreamTransport.h + td/mtproto/NoCryptoStorer.h + td/mtproto/PacketStorer.h + td/mtproto/PingConnection.h + td/mtproto/RawConnection.h + td/mtproto/SessionConnection.h + td/mtproto/TcpTransport.h + td/mtproto/Transport.h + td/mtproto/utils.h + + td/telegram/AccessRights.h + td/telegram/AnimationsManager.h + td/telegram/AudiosManager.h + td/telegram/AuthManager.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/DelayDispatcher.h + td/telegram/DeviceTokenManager.h + td/telegram/DhCache.h + td/telegram/DhConfig.h + td/telegram/DialogDb.h + td/telegram/DialogId.h + td/telegram/DialogParticipant.h + td/telegram/DocumentsManager.h + td/telegram/files/FileDb.h + td/telegram/files/FileDownloader.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/FileStats.h + td/telegram/files/FileStatsWorker.h + td/telegram/files/FileUploader.h + td/telegram/files/PartsManager.h + td/telegram/files/ResourceManager.h + td/telegram/files/ResourceState.h + td/telegram/Game.h + td/telegram/Global.h + td/telegram/HashtagHints.h + td/telegram/InlineQueriesManager.h + td/telegram/Location.h + td/telegram/logevent/LogEvent.h + td/telegram/logevent/SecretChatEvent.h + td/telegram/MessageEntity.h + td/telegram/MessageId.h + td/telegram/MessagesDb.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/NetStatsManager.h + td/telegram/net/NetType.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/PasswordManager.h + td/telegram/Payments.h + td/telegram/Photo.h + td/telegram/PrivacyManager.h + td/telegram/PtsManager.h + td/telegram/ReplyMarkup.h + td/telegram/SecretChatActor.h + td/telegram/SecretChatId.h + td/telegram/SecretChatDb.h + td/telegram/SecretChatsManager.h + td/telegram/SecretInputMedia.h + td/telegram/SequenceDispatcher.h + td/telegram/StateManager.h + td/telegram/StickersManager.h + td/telegram/StorageManager.h + td/telegram/Td.h + td/telegram/TdCallback.h + td/telegram/TdDb.h + td/telegram/TdParameters.h + td/telegram/TopDialogManager.h + td/telegram/UniqueId.h + td/telegram/UpdatesManager.h + td/telegram/UserId.h + td/telegram/Version.h + td/telegram/VideoNotesManager.h + td/telegram/VideosManager.h + td/telegram/VoiceNotesManager.h + td/telegram/WebPageId.h + td/telegram/WebPagesManager.h + + td/telegram/AnimationsManager.hpp + td/telegram/AudiosManager.hpp + td/telegram/AuthManager.hpp + td/telegram/DocumentsManager.hpp + td/telegram/files/FileId.hpp + td/telegram/files/FileManager.hpp + td/telegram/Game.hpp + td/telegram/Payments.hpp + td/telegram/Photo.hpp + td/telegram/ReplyMarkup.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 (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 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>) +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() + + +# tdcore - mostly internal TDLib interface. One should use tdactor for interactions with it. +add_library(tdcore STATIC ${TDLIB_SOURCE}) +target_include_directories(tdcore PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> $<BUILD_INTERFACE:${TL_TD_AUTO_INCLUDES}>) +target_include_directories(tdcore SYSTEM PRIVATE ${OPENSSL_INCLUDE_DIR}) +target_link_libraries(tdcore PUBLIC tdactor tdutils tdnet tddb PRIVATE ${OPENSSL_CRYPTO_LIBRARY} ${CMAKE_DL_LIBS} ${ZLIB_LIBRARIES}) + +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(tdcore PUBLIC ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}) + target_link_libraries(tdcore PUBLIC ${JAVA_JVM_LIBRARY}) +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 + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<BUILD_INTERFACE:${TL_TD_AUTO_INCLUDES}> +) +target_link_libraries(tdclient PRIVATE tdcore) + +if (TD_ENABLE_JNI AND NOT ANDROID) # jni is available by default on Android + target_include_directories(tdclient PUBLIC ${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2}) + target_link_libraries(tdclient PUBLIC ${JAVA_JVM_LIBRARY}) +endif() + +if (TD_ENABLE_DOTNET) + add_library(tddotnet SHARED + td/telegram/ClientDotNet.cpp + td/telegram/LogDotNet.cpp + ${TL_DOTNET_SCHEME_SOURCE} + ) + set(VCPKG_APPLOCAL_LIBRARY_DEPS ON) + set_target_properties(tddotnet PROPERTIES OUTPUT_NAME Telegram.Td) + target_link_libraries(tddotnet PRIVATE tdclient tdutils) + target_include_directories(tddotnet PUBLIC + $<BUILD_INTERFACE:${TL_TD_AUTO_INCLUDES}> + ) + 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 ${TL_C_SCHEME_SOURCE} td/telegram/td_c_client.cpp td/telegram/td_c_client.h) +target_include_directories(tdc PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<BUILD_INTERFACE:${TL_TD_AUTO_INCLUDES}>) +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} td/telegram/ClientJson.cpp td/telegram/ClientJson.h) +target_include_directories(tdjson_private PUBLIC + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}> + $<BUILD_INTERFACE:${TL_TD_AUTO_INCLUDES}>) +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 + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>) +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 + $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}> + $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>) + +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(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 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>) + target_link_libraries(${TD_EMSCRIPTEN} PRIVATE tdjson_static) +endif() + +#EXECUTABLES +if (NOT CMAKE_CROSSCOMPILING) + add_executable(tg_cli td/telegram/cli.cpp ${TL_TD_JSON}) + + if (NOT READLINE_FOUND) + find_package(Readline) + endif() + if (NOT READLINE_FOUND) + message(STATUS "Could NOT find Readline") + else() + message(STATUS "Found Readline: ${READLINE_INCLUDE_DIR} ${READLINE_LIBRARY}") + 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() + target_link_libraries(tg_cli PRIVATE memprof tdclient tdcore tdtl) + add_dependencies(tg_cli tl_generate_json) +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 TdStatic EXPORT TdTargets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include +) + +install(EXPORT TdTargets + FILE TdTargets.cmake + NAMESPACE Td:: + DESTINATION lib/cmake/Td +) + +install(FILES ${TD_JSON_HEADERS} ${CMAKE_CURRENT_BINARY_DIR}/td/telegram/tdjson_export.h DESTINATION include/td/telegram) +install(FILES td/telegram/Client.h td/telegram/Log.h DESTINATION include/td/telegram) +install(FILES td/tl/TlObject.h DESTINATION include/td/tl) +install(FILES ${TL_TD_AUTO_INCLUDES}/td/telegram/td_api.h ${TL_TD_AUTO_INCLUDES}/td/telegram/td_api.hpp DESTINATION include/td/telegram) +if (TD_ENABLE_JNI) + install(FILES td/tl/tl_jni_object.h DESTINATION include/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 lib/cmake/Td +) |