summaryrefslogtreecommitdiff
path: root/protocols/Telegram/tdlib/td/CMake/TdSetUpCompiler.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Telegram/tdlib/td/CMake/TdSetUpCompiler.cmake')
-rw-r--r--protocols/Telegram/tdlib/td/CMake/TdSetUpCompiler.cmake174
1 files changed, 174 insertions, 0 deletions
diff --git a/protocols/Telegram/tdlib/td/CMake/TdSetUpCompiler.cmake b/protocols/Telegram/tdlib/td/CMake/TdSetUpCompiler.cmake
new file mode 100644
index 0000000000..536c5efb29
--- /dev/null
+++ b/protocols/Telegram/tdlib/td/CMake/TdSetUpCompiler.cmake
@@ -0,0 +1,174 @@
+# - Configures C++14 compiler, setting TDLib-specific compilation options.
+
+function(td_set_up_compiler)
+ set(CMAKE_EXPORT_COMPILE_COMMANDS 1 PARENT_SCOPE)
+
+ set(CMAKE_POSITION_INDEPENDENT_CODE ON PARENT_SCOPE)
+
+ include(illumos)
+
+ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ set(GCC 1)
+ set(GCC 1 PARENT_SCOPE)
+ elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ set(CLANG 1)
+ set(CLANG 1 PARENT_SCOPE)
+ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
+ set(INTEL 1)
+ set(INTEL 1 PARENT_SCOPE)
+ 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()
+
+ 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 /bigobj")
+ elseif (CLANG OR GCC)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${STD14_FLAG} -fno-omit-frame-pointer -fno-exceptions -fno-rtti")
+ if (APPLE)
+ set(TD_LINKER_FLAGS "-Wl,-dead_strip")
+ if (NOT CMAKE_BUILD_TYPE MATCHES "Deb")
+ set(TD_LINKER_FLAGS "${TD_LINKER_FLAGS},-x,-S")
+ endif()
+ else()
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections")
+ if (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
+ set(TD_LINKER_FLAGS "-Wl,-z,ignore")
+ elseif (EMSCRIPTEN)
+ set(TD_LINKER_FLAGS "-Wl,--gc-sections")
+ else()
+ set(TD_LINKER_FLAGS "-Wl,--gc-sections -Wl,--exclude-libs,ALL")
+ endif()
+ endif()
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${TD_LINKER_FLAGS}")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${TD_LINKER_FLAGS}")
+
+ if (WIN32 OR CYGWIN)
+ if (GCC)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wa,-mbig-obj")
+ 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()
+
+ # _FILE_OFFSET_BITS is broken in Android NDK r15, r15b and r17 and doesn't work prior to Android 7.0
+ add_definitions(-D_FILE_OFFSET_BITS=64)
+
+ # _GNU_SOURCE might not be defined by g++
+ add_definitions(-D_GNU_SOURCE)
+
+ if (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lsocket -lnsl")
+ if (ILLUMOS)
+ add_definitions(-DTD_ILLUMOS=1)
+ endif()
+ 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 many false positives
+ endif()
+ if (WIN32 AND GCC AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0))
+ # warns about casts of function pointers returned by GetProcAddress
+ add_cxx_compiler_flag("-Wno-cast-function-type")
+ 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 (GCC AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.0))
+ add_cxx_compiler_flag("-Wno-stringop-overflow") # some false positives
+ 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()
+
+ if (MINGW)
+ add_cxx_compiler_flag("-ftrack-macro-expansion=0")
+ 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")
+
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" PARENT_SCOPE)
+ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" PARENT_SCOPE)
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}" PARENT_SCOPE)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" PARENT_SCOPE)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" PARENT_SCOPE)
+endfunction()