diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c8f2a1..aa2c057 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,303 +1,303 @@ -# Based on: https://github.com/ttroy50/cmake-examples/blob/master/03-code-generation/protobuf/CMakeLists.txt -cmake_minimum_required(VERSION 3.6) - -# Set the project name -project(goldberg_emulator) - -if(MSVC) - # Set static environment (results in static compile flags) if Visual Studio is used (dynamic by default) - # Officially recommended solution: https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-build-my-msvc-application-with-a-static-runtime - # Should be replaced by a better solution in the future: https://gitlab.kitware.com/cmake/cmake/merge_requests/3211 - foreach(flag_var - CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE - CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) - if(${flag_var} MATCHES "/MD") - string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") - endif(${flag_var} MATCHES "/MD") - endforeach(flag_var) - - # Disable MSVC++ warning C4996: 'may be unsafe/disable deprecation' - add_definitions(-D_CRT_SECURE_NO_WARNINGS) -endif() - -# Add option to enable experimental build -option(EMU_EXPERIMENTAL_BUILD "Enable experimental build" OFF) - -# Set CXX standard -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) - -# Find the protobuf compiler and libraries -include(FindProtobuf) -find_package(Protobuf 3.1.0 REQUIRED) - -# Generate the .h and .cxx files for dll/net.proto -protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS dll/net.proto) - -# Print path to generated files -message(STATUS "PROTO_SRCS = ${PROTO_SRCS}") -message(STATUS "PROTO_HDRS = ${PROTO_HDRS}") -message(STATUS "PROTOBUF_INCLUDE_DIRS = ${PROTOBUF_INCLUDE_DIRS}") -message(STATUS "PROTOBUF_LIBRARIES = ${PROTOBUF_LIBRARIES}") -message(STATUS "PROTOBUF_PROTOC_EXECUTABLE = ${PROTOBUF_PROTOC_EXECUTABLE}") - -# Setup the lib/exe names for the targets -if(WIN32) - if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") - set(LIB_STEAM_API steam_api64) - set(LIB_STEAMCLIENT steamclient64) - set(LIB_STEAMNETWORKINGSOCKETS steamnetworkingsockets64) - set(BIN_LOBBY_CONNECT lobby_connect64) - set(BIN_GENERATE_INTERFACES_FILE generate_interfaces_file64) - else() - set(LIB_STEAM_API steam_api) - set(LIB_STEAMCLIENT steamclient) - set(LIB_STEAMNETWORKINGSOCKETS steamnetworkingsockets) - set(BIN_LOBBY_CONNECT lobby_connect) - set(BIN_GENERATE_INTERFACES_FILE generate_interfaces_file) - endif() -elseif(UNIX AND NOT APPLE) - set(LIB_STEAM_API steam_api) - set(LIB_STEAMCLIENT steamclient) - set(LIB_STEAMNETWORKINGSOCKETS steamnetworkingsockets) - set(BIN_LOBBY_CONNECT lobby_connect) - set(BIN_GENERATE_INTERFACES_FILE generate_interfaces_file) -else() - message(FATAL_ERROR "Other platforms not supported...") -endif() - -# Gather the files that are shared between multiple targets -file(GLOB DLL_SRC_SHARED - dll/*.h - dll/*.cpp -) - -file(GLOB DETOURS_SRC_SHARED - detours/*.cpp -) - -################################################### -# Setup for the steam_api(64).dll / libsteam_api.so -################################################### - -# Setup the target -add_library(${LIB_STEAM_API} - SHARED - $<$:${DETOURS_SRC_SHARED}> - ${DLL_SRC_SHARED} - ${PROTO_SRCS} - ${PROTO_HDRS} -) - -# Include the required directories -target_include_directories(${LIB_STEAM_API} - PRIVATE - ${PROTOBUF_INCLUDE_DIRS} - ${CMAKE_CURRENT_BINARY_DIR} -) - -# Link the required libraries -target_link_libraries(${LIB_STEAM_API} - PRIVATE - protobuf::libprotobuf - $<$:ws2_32> - $<$:iphlpapi> -) - -# Add target compile definitions -target_compile_definitions(${LIB_STEAM_API} - PRIVATE - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_EXPERIMENTAL_BUILD> -) - -# Install the target -if(WIN32) - install(TARGETS - ${LIB_STEAM_API} - RUNTIME DESTINATION ./ - ) -else() - install(TARGETS - ${LIB_STEAM_API} - LIBRARY DESTINATION ./ - ) -endif() - -######################################################## -# Setup for the steamclient(64).dll / libsteamclient.so? -######################################################## - -# Setup the target -add_library(${LIB_STEAMCLIENT} - SHARED - steamclient.cpp -) - -# Add target compile definitions -target_compile_definitions(${LIB_STEAMCLIENT} - PRIVATE - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_EXPERIMENTAL_BUILD> -) - -# Install the target -if(WIN32) - install(TARGETS - ${LIB_STEAMCLIENT} - RUNTIME DESTINATION ./ - ) -else() - install(TARGETS - ${LIB_STEAMCLIENT} - LIBRARY DESTINATION ./ - ) -endif() - -if(NOT WIN32) - message(STATUS "Target library 'steamclient' is only suported for windows at this time... Disabling Build ALL inclusion for this target") - set_target_properties(${LIB_STEAMCLIENT} PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) -endif() - -############################################################################## -# Setup for the steamnetworkingsockets(64).dll / libsteamnetworkingsockets.so? -############################################################################## - -# Setup the target -add_library(${LIB_STEAMNETWORKINGSOCKETS} - SHARED - steamnetworkingsockets.cpp -) - -# Add target compile definitions -target_compile_definitions(${LIB_STEAMNETWORKINGSOCKETS} - PRIVATE - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_EXPERIMENTAL_BUILD> -) - -# Setup install rules for the target -if(WIN32) - install(TARGETS - ${LIB_STEAMNETWORKINGSOCKETS} - RUNTIME DESTINATION ./ - ) -else() - install(TARGETS - ${LIB_STEAMNETWORKINGSOCKETS} - LIBRARY DESTINATION ./ - ) -endif() - -if(NOT WIN32) - message(STATUS "Target library 'steamnetworkingsockets' is only supported for windows at this time... Disabling Build ALL inclusion for this target") - set_target_properties(${LIB_STEAMNETWORKINGSOCKETS} PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) -endif() - -########################################################################### -# Setup for the lobby_connect(64).exe / lobby_connect -########################################################################### - -# Setup the target -add_executable(${BIN_LOBBY_CONNECT} - lobby_connect.cpp - $<$:${DETOURS_SRC_SHARED}> - ${DLL_SRC_SHARED} - ${PROTO_SRCS} - ${PROTO_HDRS} -) - -target_include_directories(${BIN_LOBBY_CONNECT} - PRIVATE - ${PROTOBUF_INCLUDE_DIRS} - ${CMAKE_CURRENT_BINARY_DIR} -) - -# Link the required libraries -target_link_libraries(${BIN_LOBBY_CONNECT} - PRIVATE - protobuf::libprotobuf - $<$:ws2_32> - $<$:iphlpapi> - $<$:comdlg32> - -debug:none -) - -# Add target compile definitions -target_compile_definitions(${BIN_LOBBY_CONNECT} - PRIVATE - NO_DISK_WRITES - LOBBY_CONNECT - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_RELEASE_BUILD> - $<$:EMU_EXPERIMENTAL_BUILD> -) - -# Setup install rules for the target -install(TARGETS - ${BIN_LOBBY_CONNECT} - RUNTIME DESTINATION lobby_connect/ -) - -########################################################################### -# Setup for the generate_interfaces_file(64).exe / generate_interfaces_file -########################################################################### - -# Setup the target -add_executable(${BIN_GENERATE_INTERFACES_FILE} - generate_interfaces_file.cpp -) - -# Link the required libraries -target_link_libraries(${BIN_GENERATE_INTERFACES_FILE} - PRIVATE - -debug:none -) - -# Setup install rules for the target -install(TARGETS - ${BIN_GENERATE_INTERFACES_FILE} - RUNTIME DESTINATION tools/ -) - -########################################################################### -# Installation setup for non target files and directories -########################################################################### - -install(FILES - Readme_lobby_connect.txt - DESTINATION lobby_connect/ -) - -install(FILES - scripts/find_interfaces.sh - scripts/find_interfaces.ps1 - Readme_generate_interfaces.txt - DESTINATION tools/ -) - -install(FILES - Readme_release.txt - files_example/steam_appid.EDIT_AND_RENAME.txt - files_example/steam_interfaces.EXAMPLE.txt - $<$:${PROJECT_SOURCE_DIR}/Readme_experimental.txt> - $<$:${PROJECT_SOURCE_DIR}/Readme_debug.txt> - DESTINATION ./ -) - -install(DIRECTORY - files_example/steam_settings.EXAMPLE - DESTINATION ./ -) +# Based on: https://github.com/ttroy50/cmake-examples/blob/master/03-code-generation/protobuf/CMakeLists.txt +cmake_minimum_required(VERSION 3.6) + +# Set the project name +project(goldberg_emulator) + +if(MSVC) + # Set static environment (results in static compile flags) if Visual Studio is used (dynamic by default) + # Officially recommended solution: https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-build-my-msvc-application-with-a-static-runtime + # Should be replaced by a better solution in the future: https://gitlab.kitware.com/cmake/cmake/merge_requests/3211 + foreach(flag_var + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + if(${flag_var} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") + endif(${flag_var} MATCHES "/MD") + endforeach(flag_var) + + # Disable MSVC++ warning C4996: 'may be unsafe/disable deprecation' + add_definitions(-D_CRT_SECURE_NO_WARNINGS) +endif() + +# Add option to enable experimental build +option(EMU_EXPERIMENTAL_BUILD "Enable experimental build" OFF) + +# Set CXX standard +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Find the protobuf compiler and libraries +include(FindProtobuf) +find_package(Protobuf 3.1.0 REQUIRED) + +# Generate the .h and .cxx files for dll/net.proto +protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS dll/net.proto) + +# Print path to generated files +message(STATUS "PROTO_SRCS = ${PROTO_SRCS}") +message(STATUS "PROTO_HDRS = ${PROTO_HDRS}") +message(STATUS "PROTOBUF_INCLUDE_DIRS = ${PROTOBUF_INCLUDE_DIRS}") +message(STATUS "PROTOBUF_LIBRARIES = ${PROTOBUF_LIBRARIES}") +message(STATUS "PROTOBUF_PROTOC_EXECUTABLE = ${PROTOBUF_PROTOC_EXECUTABLE}") + +# Setup the lib/exe names for the targets +if(WIN32) + if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") + set(LIB_STEAM_API steam_api64) + set(LIB_STEAMCLIENT steamclient64) + set(LIB_STEAMNETWORKINGSOCKETS steamnetworkingsockets64) + set(BIN_LOBBY_CONNECT lobby_connect64) + set(BIN_GENERATE_INTERFACES_FILE generate_interfaces_file64) + else() + set(LIB_STEAM_API steam_api) + set(LIB_STEAMCLIENT steamclient) + set(LIB_STEAMNETWORKINGSOCKETS steamnetworkingsockets) + set(BIN_LOBBY_CONNECT lobby_connect) + set(BIN_GENERATE_INTERFACES_FILE generate_interfaces_file) + endif() +elseif(UNIX AND NOT APPLE) + set(LIB_STEAM_API steam_api) + set(LIB_STEAMCLIENT steamclient) + set(LIB_STEAMNETWORKINGSOCKETS steamnetworkingsockets) + set(BIN_LOBBY_CONNECT lobby_connect) + set(BIN_GENERATE_INTERFACES_FILE generate_interfaces_file) +else() + message(FATAL_ERROR "Other platforms not supported...") +endif() + +# Gather the files that are shared between multiple targets +file(GLOB DLL_SRC_SHARED + dll/*.h + dll/*.cpp +) + +file(GLOB DETOURS_SRC_SHARED + detours/*.cpp +) + +################################################### +# Setup for the steam_api(64).dll / libsteam_api.so +################################################### + +# Setup the target +add_library(${LIB_STEAM_API} + SHARED + $<$:${DETOURS_SRC_SHARED}> + ${DLL_SRC_SHARED} + ${PROTO_SRCS} + ${PROTO_HDRS} +) + +# Include the required directories +target_include_directories(${LIB_STEAM_API} + PRIVATE + ${PROTOBUF_INCLUDE_DIRS} + ${CMAKE_CURRENT_BINARY_DIR} +) + +# Link the required libraries +target_link_libraries(${LIB_STEAM_API} + PRIVATE + protobuf::libprotobuf + $<$:ws2_32> + $<$:iphlpapi> +) + +# Add target compile definitions +target_compile_definitions(${LIB_STEAM_API} + PRIVATE + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_EXPERIMENTAL_BUILD> +) + +# Install the target +if(WIN32) + install(TARGETS + ${LIB_STEAM_API} + RUNTIME DESTINATION ./ + ) +else() + install(TARGETS + ${LIB_STEAM_API} + LIBRARY DESTINATION ./ + ) +endif() + +######################################################## +# Setup for the steamclient(64).dll / libsteamclient.so? +######################################################## + +# Setup the target +add_library(${LIB_STEAMCLIENT} + SHARED + steamclient.cpp +) + +# Add target compile definitions +target_compile_definitions(${LIB_STEAMCLIENT} + PRIVATE + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_EXPERIMENTAL_BUILD> +) + +# Install the target +if(WIN32) + install(TARGETS + ${LIB_STEAMCLIENT} + RUNTIME DESTINATION ./ + ) +else() + install(TARGETS + ${LIB_STEAMCLIENT} + LIBRARY DESTINATION ./ + ) +endif() + +if(NOT WIN32) + message(STATUS "Target library 'steamclient' is only suported for windows at this time... Disabling Build ALL inclusion for this target") + set_target_properties(${LIB_STEAMCLIENT} PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) +endif() + +############################################################################## +# Setup for the steamnetworkingsockets(64).dll / libsteamnetworkingsockets.so? +############################################################################## + +# Setup the target +add_library(${LIB_STEAMNETWORKINGSOCKETS} + SHARED + steamnetworkingsockets.cpp +) + +# Add target compile definitions +target_compile_definitions(${LIB_STEAMNETWORKINGSOCKETS} + PRIVATE + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_EXPERIMENTAL_BUILD> +) + +# Setup install rules for the target +if(WIN32) + install(TARGETS + ${LIB_STEAMNETWORKINGSOCKETS} + RUNTIME DESTINATION ./ + ) +else() + install(TARGETS + ${LIB_STEAMNETWORKINGSOCKETS} + LIBRARY DESTINATION ./ + ) +endif() + +if(NOT WIN32) + message(STATUS "Target library 'steamnetworkingsockets' is only supported for windows at this time... Disabling Build ALL inclusion for this target") + set_target_properties(${LIB_STEAMNETWORKINGSOCKETS} PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) +endif() + +########################################################################### +# Setup for the lobby_connect(64).exe / lobby_connect +########################################################################### + +# Setup the target +add_executable(${BIN_LOBBY_CONNECT} + lobby_connect.cpp + $<$:${DETOURS_SRC_SHARED}> + ${DLL_SRC_SHARED} + ${PROTO_SRCS} + ${PROTO_HDRS} +) + +target_include_directories(${BIN_LOBBY_CONNECT} + PRIVATE + ${PROTOBUF_INCLUDE_DIRS} + ${CMAKE_CURRENT_BINARY_DIR} +) + +# Link the required libraries +target_link_libraries(${BIN_LOBBY_CONNECT} + PRIVATE + protobuf::libprotobuf + $<$:ws2_32> + $<$:iphlpapi> + $<$:comdlg32> + -debug:none +) + +# Add target compile definitions +target_compile_definitions(${BIN_LOBBY_CONNECT} + PRIVATE + NO_DISK_WRITES + LOBBY_CONNECT + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_RELEASE_BUILD> + $<$:EMU_EXPERIMENTAL_BUILD> +) + +# Setup install rules for the target +install(TARGETS + ${BIN_LOBBY_CONNECT} + RUNTIME DESTINATION lobby_connect/ +) + +########################################################################### +# Setup for the generate_interfaces_file(64).exe / generate_interfaces_file +########################################################################### + +# Setup the target +add_executable(${BIN_GENERATE_INTERFACES_FILE} + generate_interfaces_file.cpp +) + +# Link the required libraries +target_link_libraries(${BIN_GENERATE_INTERFACES_FILE} + PRIVATE + -debug:none +) + +# Setup install rules for the target +install(TARGETS + ${BIN_GENERATE_INTERFACES_FILE} + RUNTIME DESTINATION tools/ +) + +########################################################################### +# Installation setup for non target files and directories +########################################################################### + +install(FILES + Readme_lobby_connect.txt + DESTINATION lobby_connect/ +) + +install(FILES + scripts/find_interfaces.sh + scripts/find_interfaces.ps1 + Readme_generate_interfaces.txt + DESTINATION tools/ +) + +install(FILES + Readme_release.txt + files_example/steam_appid.EDIT_AND_RENAME.txt + files_example/steam_interfaces.EXAMPLE.txt + $<$:${PROJECT_SOURCE_DIR}/Readme_experimental.txt> + $<$:${PROJECT_SOURCE_DIR}/Readme_debug.txt> + DESTINATION ./ +) + +install(DIRECTORY + files_example/steam_settings.EXAMPLE + DESTINATION ./ +)