From 08b37453a4e97ac2afcc6ffb024886ea0b8e6707 Mon Sep 17 00:00:00 2001 From: Steven Noonan Date: Wed, 4 Apr 2018 05:52:36 -0700 Subject: [PATCH] CMake: adding work-in-progress CMakeLists files Signed-off-by: Steven Noonan --- CMakeLists.txt | 12 +++ cmake/FlagsMSVC.cmake | 57 ++++++++++++++ src/CMakeLists.txt | 172 ++++++++++++++++++++++++++++++++++++++++++ tests/CMakeLists.txt | 4 + 4 files changed, 245 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 cmake/FlagsMSVC.cmake create mode 100644 src/CMakeLists.txt create mode 100644 tests/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5a2e501 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.10) +project(GameNetworkingSockets C CXX) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) + +include(FlagsMSVC) +set(MSVC_RUNTIME "dynamic") +configure_msvc_runtime() +print_default_msvc_flags() + +add_subdirectory(src) +add_subdirectory(tests) \ No newline at end of file diff --git a/cmake/FlagsMSVC.cmake b/cmake/FlagsMSVC.cmake new file mode 100644 index 0000000..83a7010 --- /dev/null +++ b/cmake/FlagsMSVC.cmake @@ -0,0 +1,57 @@ +macro(configure_msvc_runtime) + if(MSVC) + # Default to statically-linked runtime. + if("${MSVC_RUNTIME}" STREQUAL "") + set(MSVC_RUNTIME "static") + endif() + # Set compiler options. + set(variables + CMAKE_C_FLAGS_DEBUG + CMAKE_C_FLAGS_MINSIZEREL + CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS_DEBUG + CMAKE_CXX_FLAGS_MINSIZEREL + CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_RELWITHDEBINFO + ) + if(${MSVC_RUNTIME} STREQUAL "static") + message(STATUS "MSVC -> forcing use of statically-linked runtime.") + foreach(variable ${variables}) + if(${variable} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${variable} "${${variable}}") + endif() + endforeach() + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:MSVCRT /NODEFAULTLIB:MSVCRTd") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NODEFAULTLIB:MSVCRT /NODEFAULTLIB:MSVCRTd") + else() + message(STATUS "MSVC -> forcing use of dynamically-linked runtime.") + foreach(variable ${variables}) + if(${variable} MATCHES "/MT") + string(REGEX REPLACE "/MT" "/MD" ${variable} "${${variable}}") + endif() + endforeach() + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:LIBCMTd") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NODEFAULTLIB:LIBCMT /NODEFAULTLIB:LIBCMTd") + endif() + endif() +endmacro() +macro(print_default_msvc_flags) + if(MSVC) + set(variables + CMAKE_C_FLAGS_DEBUG + CMAKE_C_FLAGS_MINSIZEREL + CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS_DEBUG + CMAKE_CXX_FLAGS_MINSIZEREL + CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_RELWITHDEBINFO + ) + message(STATUS "Initial build flags:") + foreach(variable ${variables}) + message(STATUS " '${variable}': ${${variable}}") + endforeach() + message(STATUS "") + endif() +endmacro() \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..082c6be --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,172 @@ +find_package(Protobuf REQUIRED) +find_package(OpenSSL REQUIRED) + +include(CheckCCompilerFlag) +include(CheckCXXCompilerFlag) + +set(GNS_PROTOS + "common/steamnetworkingsockets_messages_certs.proto" + "common/steamnetworkingsockets_messages.proto" + "common/steamnetworkingsockets_messages_udp.proto" +) + +set(GNS_SRCS + "external/curve25519-donna/curve25519.c" + "external/curve25519-donna/curve25519_VALVE_sse2.c" + "external/ed25519-donna/ed25519_VALVE.c" + "external/ed25519-donna/ed25519_VALVE_sse2.c" + "common/crypto.cpp" + "common/opensslwrapper.cpp" + "common/steamid.cpp" + "public/minbase/minbase_common_errors.cpp" + "steamnetworkingsockets/certtool/steamnetworkingsockets_certtool.cpp" + "steamnetworkingsockets/clientlib/csteamnetworkingsockets.cpp" + "steamnetworkingsockets/clientlib/steamnetworkingsockets_connections.cpp" + "steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp" + "steamnetworkingsockets/clientlib/steamnetworkingsockets_snp.cpp" + "steamnetworkingsockets/clientlib/steamnetworkingsockets_snp_debug.cpp" + "steamnetworkingsockets/clientlib/steamnetworkingsockets_udp.cpp" + "steamnetworkingsockets/steamnetworkingsockets_certs.cpp" + "steamnetworkingsockets/steamnetworkingsockets_shared.cpp" + "tier0/cpu.cpp" + "tier0/dbg.cpp" + "tier0/platformtime.cpp" + "tier1/netadr.cpp" + "tier1/utlbuffer.cpp" + "tier1/utlmemory.cpp" + "vstdlib/strtools.cpp" +) + +set(GNS_COMMON_FLAGS + -fvisibility=hidden + -fno-strict-aliasing + -Wall + #-Wextra + #-pedantic + -Wno-unknown-pragmas + -Wno-sign-compare +) + +set(GNS_C_FLAGS + -Wstrict-prototypes +) + +set(GNS_CXX_FLAGS + -fvisibility-inlines-hidden + -Wno-reorder + -Wno-non-virtual-dtor + -fno-rtti + -fno-exceptions +) + +protobuf_generate_cpp(GNS_PROTO_SRCS GNS_PROTO_HDRS ${GNS_PROTOS}) + +macro(gamenetworkingsockets_common GNS_TARGET) + + target_sources(${GNS_TARGET} PRIVATE ${GNS_SRCS}) + target_sources(${GNS_TARGET} PRIVATE ${GNS_PROTO_SRCS}) + + target_include_directories(${GNS_TARGET} PUBLIC + "../include" + ) + + target_include_directories(${GNS_TARGET} PRIVATE + "common" + "public" + ${CMAKE_CURRENT_BINARY_DIR} + + # Only necessary if we're not using protobuf::libprotobuf + # But that's not supported in CMake 3.5 + ${Protobuf_INCLUDE_DIRS} + ) + + target_link_libraries(${GNS_TARGET} PRIVATE + # protobuf::libprotobuf + ${PROTOBUF_LIBRARIES} + OpenSSL::Crypto + ) + + target_compile_definitions(${GNS_TARGET} PRIVATE + STEAMDATAGRAMLIB_FOREXPORT + STATIC_TIER0 + # needed for ed25519-donna + ENABLE_CRYPTO_25519 + HAVE_OPENSSL + ENABLE_OPENSSLCONNECTION + CRYPTO_DISABLE_ENCRYPT_WITH_PASSWORD + GOOGLE_PROTOBUF_NO_RTTI + ) + + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" + OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + foreach(FLAG ${GNS_COMMON_FLAGS} ${GNS_C_FLAGS}) + string(MAKE_C_IDENTIFIER ${FLAG} FLAG_ID) + check_c_compiler_flag(${FLAG} ${FLAG_ID}_TEST) + if(${FLAG_ID}_TEST) + target_compile_options(${GNS_TARGET} PRIVATE + $<$:${FLAG}>) + endif() + endforeach() + + foreach(FLAG ${GNS_COMMON_FLAGS} ${GNS_CXX_FLAGS}) + string(MAKE_C_IDENTIFIER ${FLAG} FLAG_ID) + check_cxx_compiler_flag(${FLAG} ${FLAG_ID}_TEST) + if(${FLAG_ID}_TEST) + target_compile_options(${GNS_TARGET} PRIVATE + $<$:${FLAG}> + ) + endif() + endforeach() + endif() + + if(CMAKE_SYSTEM_NAME MATCHES Linux) + target_compile_definitions(${GNS_TARGET} PRIVATE POSIX LINUX) + elseif(CMAKE_SYSTEM_NAME MATCHES Darwin) + target_compile_definitions(${GNS_TARGET} PRIVATE POSIX OSX) + elseif(CMAKE_SYSTEM_NAME MATCHES Windows) + target_compile_definitions(${GNS_TARGET} PRIVATE + WIN32 + ) + if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + target_compile_definitions(${GNS_TARGET} PRIVATE + _CRT_SECURE_NO_WARNINGS + _ITERATOR_DEBUG_LEVEL=0 + PROTOBUF_USE_DLLS + ) + target_compile_options(${GNS_TARGET} PRIVATE + /wd4146 # include/google/protobuf/wire_format_lite.h(863): warning C4146: unary minus operator applied to unsigned type, result still unsigned + ) + else() + target_compile_definitions(${GNS_TARGET} PRIVATE + __STDC_FORMAT_MACROS=1 + __USE_MINGW_ANSI_STDIO=0 + ) + target_compile_options(${GNS_TARGET} PRIVATE -fno-stack-protector) + endif() + target_link_libraries(${GNS_TARGET} PRIVATE ws2_32) + else() + message(FATAL_ERROR "Could not identify your target operating system") + endif() + + if(NOT CMAKE_SYSTEM_NAME MATCHES Windows) + target_compile_options(${GNS_TARGET} PRIVATE -fstack-protector-strong) + endif() + + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" + OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + target_compile_definitions(${GNS_TARGET} PRIVATE GNUC GNU_COMPILER) + endif() + + set_target_properties(${GNS_TARGET} PROPERTIES + CXX_STANDARD 11 + ) + +endmacro() + +add_library(GameNetworkingSockets SHARED "") +add_library(GameNetworkingSockets::shared ALIAS GameNetworkingSockets) +gamenetworkingsockets_common(GameNetworkingSockets) + +add_library(GameNetworkingSockets_s STATIC "") +add_library(GameNetworkingSockets::static ALIAS GameNetworkingSockets_s) +gamenetworkingsockets_common(GameNetworkingSockets_s) \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..e3803b3 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,4 @@ +add_executable( + test_connection + connection_test.cpp) +target_link_libraries(test_connection GameNetworkingSockets) \ No newline at end of file