Advertisement
mattygrogy

src_Cmake

Mar 23rd, 2022
1,028
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
CMake 10.29 KB | None | 0 0
  1. include(CheckCCompilerFlag)
  2. include(CheckCXXCompilerFlag)
  3. include(CheckSymbolExists)
  4. include(CMakePushCheckState)
  5. include(GNUInstallDirs)
  6.  
  7. find_package(Protobuf REQUIRED)
  8. find_package(Threads REQUIRED)
  9.  
  10. set(GNS_PROTOS
  11.     "common/steamnetworkingsockets_messages_certs.proto"
  12.     "common/steamnetworkingsockets_messages.proto"
  13.     "common/steamnetworkingsockets_messages_udp.proto"
  14.     )
  15.  
  16. set(GNS_SRCS
  17.     "common/crypto.cpp"
  18.     "common/crypto_textencode.cpp"
  19.     "common/keypair.cpp"
  20.     "common/steamid.cpp"
  21.     "steamnetworkingsockets/clientlib/csteamnetworkingsockets.cpp"
  22.     "steamnetworkingsockets/clientlib/csteamnetworkingmessages.cpp"
  23.     "steamnetworkingsockets/clientlib/steamnetworkingsockets_flat.cpp"
  24.     "steamnetworkingsockets/clientlib/steamnetworkingsockets_connections.cpp"
  25.     "steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp"
  26.     "steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p.cpp"
  27.     "steamnetworkingsockets/clientlib/steamnetworkingsockets_p2p_ice.cpp"
  28.     "steamnetworkingsockets/clientlib/steamnetworkingsockets_snp.cpp"
  29.     "steamnetworkingsockets/clientlib/steamnetworkingsockets_udp.cpp"
  30.     "steamnetworkingsockets/steamnetworkingsockets_certs.cpp"
  31.     "steamnetworkingsockets/steamnetworkingsockets_certstore.cpp"
  32.     "steamnetworkingsockets/steamnetworkingsockets_shared.cpp"
  33.     "steamnetworkingsockets/steamnetworkingsockets_stats.cpp"
  34.     "steamnetworkingsockets/steamnetworkingsockets_thinker.cpp"
  35.     "tier0/dbg.cpp"
  36.     "tier0/platformtime.cpp"
  37.     "tier1/netadr.cpp"
  38.     "tier1/utlbuffer.cpp"
  39.     "tier1/utlmemory.cpp"
  40.     "tier1/ipv6text.c"
  41.     "vstdlib/strtools.cpp"
  42.     )
  43.  
  44. if(USE_CRYPTO STREQUAL "BCrypt")
  45.     set(GNS_CRYPTO_DEFINES ${GNS_CRYPTO_DEFINES} STEAMNETWORKINGSOCKETS_CRYPTO_BCRYPT ED25519_HASH_BCRYPT)
  46.     set(GNS_SRCS ${GNS_SRCS}
  47.         "common/crypto_bcrypt.cpp"
  48.         )
  49. endif()
  50.  
  51. if(USE_CRYPTO STREQUAL "OpenSSL")
  52.     set(GNS_CRYPTO_DEFINES ${GNS_CRYPTO_DEFINES} STEAMNETWORKINGSOCKETS_CRYPTO_VALVEOPENSSL)
  53.     set(GNS_SRCS ${GNS_SRCS}
  54.         "common/crypto_openssl.cpp"
  55.         "common/opensslwrapper.cpp"
  56.         )
  57. endif()
  58.  
  59. if(USE_CRYPTO STREQUAL "libsodium")
  60.     set(GNS_CRYPTO_DEFINES ${GNS_CRYPTO_DEFINES} STEAMNETWORKINGSOCKETS_CRYPTO_LIBSODIUM)
  61.     set(GNS_SRCS ${GNS_SRCS}
  62.         "common/crypto_libsodium.cpp")
  63. endif()
  64.  
  65. # Use OpenSSL for 25519 if possible
  66. if(USE_CRYPTO25519 STREQUAL "OpenSSL")
  67.     set(GNS_CRYPTO_DEFINES  ${GNS_CRYPTO_DEFINES} STEAMNETWORKINGSOCKETS_CRYPTO_25519_OPENSSL)
  68.     set(GNS_SRCS ${GNS_SRCS}
  69.         "common/crypto_25519_openssl.cpp"
  70.         )
  71. endif()
  72.  
  73. if(USE_CRYPTO25519 STREQUAL "libsodium")
  74.     set(GNS_CRYPTO_DEFINES ${GNS_CRYPTO_DEFINES} STEAMNETWORKINGSOCKETS_CRYPTO_25519_LIBSODIUM)
  75.     set(GNS_SRCS ${GNS_SRCS}
  76.         "common/crypto_25519_libsodium.cpp"
  77.         )
  78. endif()
  79.  
  80. # Use reference 25519 crypto implementation?
  81. if(USE_CRYPTO25519 STREQUAL "Reference")
  82.     set(GNS_CRYPTO_DEFINES ${GNS_CRYPTO_DEFINES} VALVE_CRYPTO_25519_DONNA)
  83.     set(GNS_SRCS ${GNS_SRCS}
  84.         "common/crypto_25519_donna.cpp"
  85.         "external/curve25519-donna/curve25519.c"
  86.         "external/curve25519-donna/curve25519_VALVE_sse2.c"
  87.         "external/ed25519-donna/ed25519_VALVE.c"
  88.         "external/ed25519-donna/ed25519_VALVE_sse2.c"
  89.         )
  90. endif()
  91.  
  92. # If WebRTC enabled, build the thin wrapper library
  93. if(USE_STEAMWEBRTC)
  94.     add_subdirectory(external/steamwebrtc)
  95. endif(USE_STEAMWEBRTC)
  96.  
  97. set(C99_FEATURES
  98.     c_restrict
  99.     c_function_prototypes)
  100.  
  101. set(CXX11_FEATURES
  102.     cxx_constexpr
  103.     cxx_auto_type)
  104.  
  105. set(GNS_COMMON_FLAGS
  106.     -fvisibility=hidden
  107.     -fno-strict-aliasing
  108.     -Wall
  109.     -Wno-unknown-pragmas
  110.     -Wno-sign-compare
  111.     -Wno-unused-local-typedef
  112.     -Wno-unused-const-variable
  113.     -Wno-nested-anon-types
  114.     -Wno-format-truncation
  115.     )
  116.  
  117. if(USE_CRYPTO25519 STREQUAL "Reference")
  118.     # We don't use some of the 25519 functions with static linkage. Silence
  119.     # -Wunused-function if we're including the reference ed25519/curve25519
  120.     # stuff.
  121.     set(GNS_COMMON_FLAGS ${GNS_COMMON_FLAGS} -Wno-unused-function)
  122. endif()
  123.  
  124. if(WERROR)
  125.     set(GNS_COMMON_FLAGS
  126.         ${GNS_COMMON_FLAGS}
  127.         -Werror)
  128. endif()
  129.  
  130. set(GNS_C_FLAGS
  131.     -Wstrict-prototypes
  132.     )
  133.  
  134. set(GNS_CXX_FLAGS
  135.     -fvisibility-inlines-hidden
  136.     -Wno-reorder
  137.     -Wno-non-virtual-dtor
  138.     -Wno-zero-as-null-pointer-constant
  139.     -fno-exceptions
  140.     )
  141.  
  142. if(NOT SANITIZE_UNDEFINED)
  143.     set(GNS_CXX_FLAGS
  144.         ${GNS_CXX_FLAGS}
  145.         -fno-rtti
  146.         )
  147. endif()
  148.  
  149. protobuf_generate_cpp(GNS_PROTO_SRCS GNS_PROTO_HDRS ${GNS_PROTOS})
  150.  
  151. macro(gamenetworkingsockets_common GNS_TARGET)
  152.  
  153.     target_sources(${GNS_TARGET} PRIVATE ${GNS_SRCS})
  154.     target_sources(${GNS_TARGET} PRIVATE ${GNS_PROTO_SRCS})
  155.  
  156.     set_target_common_gns_properties( ${GNS_TARGET} )
  157.  
  158.     target_include_directories(${GNS_TARGET} PUBLIC
  159.         "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include>"
  160.         "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}/GameNetworkingSockets>"
  161.         )
  162.  
  163.     target_include_directories(${GNS_TARGET} PRIVATE
  164.         "common"
  165.         "public"
  166.         ${CMAKE_CURRENT_BINARY_DIR}
  167.  
  168.         # Only necessary if we're not using protobuf::libprotobuf
  169.         # But that's not supported until CMake 3.9
  170.         ${Protobuf_INCLUDE_DIRS}
  171.         )
  172.  
  173.     target_link_libraries(${GNS_TARGET} PUBLIC
  174.         # protobuf::libprotobuf
  175.         ${PROTOBUF_LIBRARIES}
  176.         Threads::Threads
  177.         )
  178.  
  179.     # Enable ICE?
  180.     if(USE_STEAMWEBRTC)
  181.  
  182.         # Enable ICE
  183.         target_compile_definitions(${GNS_TARGET} PRIVATE
  184.             STEAMNETWORKINGSOCKETS_ENABLE_ICE )
  185.  
  186.         # Wrapper lib is always linked statically in the opensource code.
  187.         # We might link dynamically in other environments.
  188.         target_compile_definitions(${GNS_TARGET} PRIVATE
  189.             STEAMWEBRTC_USE_STATIC_LIBS
  190.             )
  191.         target_link_libraries(${GNS_TARGET} PUBLIC
  192.             steamwebrtc
  193.             )
  194.     endif()
  195.  
  196.     if(USE_CRYPTO STREQUAL "OpenSSL" OR USE_CRYPTO25519 STREQUAL "OpenSSL")
  197.         target_link_libraries(${GNS_TARGET} PUBLIC
  198.             OpenSSL::Crypto
  199.             )
  200.         if(WIN32 AND OPENSSL_USE_STATIC_LIBS)
  201.             target_link_libraries(${GNS_TARGET} PUBLIC
  202.                 ws2_32
  203.                 crypt32
  204.                 )
  205.         endif()
  206.     endif()
  207.  
  208.     if(USE_CRYPTO STREQUAL "libsodium" OR USE_CRYPTO25519 STREQUAL "libsodium")
  209.         target_link_libraries(${GNS_TARGET} PUBLIC
  210.             sodium
  211.             )
  212.     endif()
  213.  
  214.     target_compile_definitions(${GNS_TARGET} PRIVATE
  215.         STEAMNETWORKINGSOCKETS_FOREXPORT
  216.         ENABLE_OPENSSLCONNECTION
  217.         CRYPTO_DISABLE_ENCRYPT_WITH_PASSWORD
  218.         ${GNS_CRYPTO_DEFINES}
  219.         )
  220.  
  221.     if(SANITIZE AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  222.         target_compile_definitions(${GNS_TARGET} PRIVATE ED25519_NO_INLINE_ASM)
  223.     endif()
  224.  
  225.     ## Needs CMake 3.8, then we could get rid of the workaround below it.
  226.     #target_compile_features(${GNS_TARGET} PUBLIC c_std_99 cxx_std_11)
  227.     if(NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  228.         target_compile_features(${GNS_TARGET} PUBLIC ${C99_FEATURES} ${CXX11_FEATURES})
  229.     endif()
  230.  
  231.     if(CMAKE_CXX_COMPILER_ID MATCHES "GNU"
  232.             OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  233.         foreach(FLAG ${GNS_COMMON_FLAGS} ${GNS_C_FLAGS})
  234.             string(MAKE_C_IDENTIFIER ${FLAG} FLAG_ID)
  235.             check_c_compiler_flag(${FLAG} ${FLAG_ID}_TEST)
  236.             if(${FLAG_ID}_TEST)
  237.                 target_compile_options(${GNS_TARGET} PRIVATE
  238.                     $<$<COMPILE_LANGUAGE:C>:${FLAG}>)
  239.             endif()
  240.         endforeach()
  241.  
  242.         foreach(FLAG ${GNS_COMMON_FLAGS} ${GNS_CXX_FLAGS})
  243.             string(MAKE_C_IDENTIFIER ${FLAG} FLAG_ID)
  244.             check_cxx_compiler_flag(${FLAG} ${FLAG_ID}_TEST)
  245.             if(${FLAG_ID}_TEST)
  246.                 target_compile_options(${GNS_TARGET} PRIVATE
  247.                     $<$<COMPILE_LANGUAGE:CXX>:${FLAG}>
  248.                     )
  249.             endif()
  250.         endforeach()
  251.     endif()
  252.  
  253.     if(CMAKE_SYSTEM_NAME MATCHES Linux)
  254.         #if(USE_STEAMWEBRTC AND NOT STEAMWEBRTC_USE_STATIC_LIBS)
  255.         #   target_link_libraries(${GNS_TARGET} PRIVATE dl)
  256.         #endif()
  257.     elseif(CMAKE_SYSTEM_NAME MATCHES Darwin)
  258.         #if(USE_STEAMWEBRTC AND NOT STEAMWEBRTC_USE_STATIC_LIBS)
  259.         #   target_link_libraries(${GNS_TARGET} PRIVATE dl)
  260.         #endif()
  261.     elseif(CMAKE_SYSTEM_NAME MATCHES FreeBSD)
  262.  
  263.     elseif(CMAKE_SYSTEM_NAME MATCHES Windows)
  264.         if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
  265.             get_target_property(TARGET_TYPE ${GNS_TARGET} TYPE)
  266.             if(NOT TARGET_TYPE STREQUAL STATIC_LIBRARY)
  267.                 target_compile_options(${GNS_TARGET} PRIVATE
  268.                     /GL       # Enable link-time code generation
  269.                     )
  270.                 set_target_properties(${GNS_TARGET} PROPERTIES LINK_FLAGS "/LTCG /SUBSYSTEM:WINDOWS")
  271.             endif()
  272.         endif()
  273.         target_link_libraries(${GNS_TARGET} PUBLIC ws2_32 crypt32)
  274.         if(USE_CRYPTO STREQUAL "BCrypt")
  275.             target_link_libraries(${GNS_TARGET} PUBLIC bcrypt)
  276.         endif()
  277.     else()
  278.         message(FATAL_ERROR "Could not identify your target operating system")
  279.     endif()
  280. endmacro()
  281.  
  282. add_library(GameNetworkingSockets SHARED "")
  283. add_library(GameNetworkingSockets::GameNetworkingSockets ALIAS GameNetworkingSockets)
  284. add_library(GameNetworkingSockets::shared ALIAS GameNetworkingSockets)
  285. gamenetworkingsockets_common(GameNetworkingSockets)
  286.  
  287. add_library(GameNetworkingSockets_s STATIC "")
  288. add_library(GameNetworkingSockets::GameNetworkingSockets_s ALIAS GameNetworkingSockets_s)
  289. add_library(GameNetworkingSockets::static ALIAS GameNetworkingSockets_s)
  290. target_compile_definitions(GameNetworkingSockets_s INTERFACE STEAMNETWORKINGSOCKETS_STATIC_LINK)
  291. gamenetworkingsockets_common(GameNetworkingSockets_s)
  292.  
  293. # Install rules
  294.  
  295. install(
  296.     TARGETS
  297.         GameNetworkingSockets
  298.         GameNetworkingSockets_s
  299.     EXPORT GameNetworkingSockets
  300.     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  301.     ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  302.     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  303.     )
  304.  
  305. install(DIRECTORY ../include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/GameNetworkingSockets)
  306.  
  307. # Export doesn't work if we're using WebRTC and the Abseil dependency came from the submodule
  308. if(NOT (USE_STEAMWEBRTC AND STEAMWEBRTC_ABSL_SOURCE STREQUAL submodule))
  309.     install(
  310.         EXPORT GameNetworkingSockets
  311.         DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/GameNetworkingSockets
  312.         NAMESPACE GameNetworkingSockets::
  313.         )
  314.  
  315.     include(CMakePackageConfigHelpers)
  316.  
  317.     # Ensure that variables used in GameNetworkingSocketsConfig.cmake.in have some value
  318.     # rather than an empty string.
  319.     if(NOT USE_CRYPTO)
  320.         set(USE_CRYPTO USE_CRYPTO-NOTFOUND)
  321.     endif()
  322.  
  323.     if(NOT STEAMWEBRTC_ABSL_SOURCE)
  324.         set(STEAMWEBRTC_ABSL_SOURCE STEAMWEBRTC_ABSL_SOURCE-NOTFOUND)
  325.     endif()
  326.  
  327.     configure_package_config_file(../cmake/GameNetworkingSocketsConfig.cmake.in
  328.         ${CMAKE_CURRENT_BINARY_DIR}/GameNetworkingSocketsConfig.cmake
  329.         INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/GameNetworkingSockets
  330.         PATH_VARS CMAKE_INSTALL_FULL_INCLUDEDIR
  331.         )
  332.  
  333.     install(FILES
  334.         ${CMAKE_CURRENT_BINARY_DIR}/GameNetworkingSocketsConfig.cmake
  335.         DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/GameNetworkingSockets
  336.         )
  337. endif()
  338.  
  339. # vim: set ts=4 sts=4 sw=4 noet:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement