Added CMake option to enable/disable scripting support

This commit is contained in:
EverOddish 2018-09-23 18:16:57 -04:00
parent 6b538a49ac
commit fce7afb8dc
5 changed files with 122 additions and 95 deletions

View file

@ -22,6 +22,8 @@ option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF) option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF)
option(ENABLE_SCRIPTING ON)
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit) if(NOT EXISTS ${CMAKE_SOURCE_DIR}/.git/hooks/pre-commit)
message(STATUS "Copying pre-commit hook") message(STATUS "Copying pre-commit hook")
file(COPY hooks/pre-commit file(COPY hooks/pre-commit
@ -258,6 +260,10 @@ if (CITRA_ENABLE_COMPATIBILITY_REPORTING)
add_definitions(-DCITRA_ENABLE_COMPATIBILITY_REPORTING) add_definitions(-DCITRA_ENABLE_COMPATIBILITY_REPORTING)
endif() endif()
if (ENABLE_SCRIPTING)
add_definitions(-DENABLE_SCRIPTING)
endif()
# Platform-specific library requirements # Platform-specific library requirements
# ====================================== # ======================================

View file

@ -94,95 +94,97 @@ if (ENABLE_WEB_SERVICE)
target_include_directories(json-headers INTERFACE ./json) target_include_directories(json-headers INTERFACE ./json)
endif() endif()
# ZeroMQ if (ENABLE_SCRIPTING)
# libzmq includes its own clang-format target, which conflicts with the # ZeroMQ
# clang-format in Citra if libzmq is added as a subdirectory. An external # libzmq includes its own clang-format target, which conflicts with the
# project gets around this issue. Unfortunately, a lot of different # clang-format in Citra if libzmq is added as a subdirectory. An external
# configuration options are required for each different platform. An # project gets around this issue. Unfortunately, a lot of different
# attempt was made to use CMake variables where possible, but some # configuration options are required for each different platform. An
# information necessarily had to be repeated. Hopefully there is not # attempt was made to use CMake variables where possible, but some
# often a need to change anything. # information necessarily had to be repeated. Hopefully there is not
if (MINGW) # often a need to change anything.
if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows") if (MINGW)
set(LIBZMQ_MAKE mingw32-make) if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows")
set(LIBZMQ_COMPILER "") set(LIBZMQ_MAKE mingw32-make)
set(LIBZMQ_TOOLCHAIN_FILE "") set(LIBZMQ_COMPILER "")
set(LIBZMQ_TOOLCHAIN_FILE "")
else()
set(LIBZMQ_MAKE make)
set(LIBZMQ_COMPILER -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER};-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER})
set(LIBZMQ_TOOLCHAIN_FILE -DCMAKE_TOOLCHAIN_FILE=${PROJECT_SOURCE_DIR}/CMakeModules/MinGWCross.cmake)
endif()
ExternalProject_Add(libzmq-external
SOURCE_DIR ./libzmq
CMAKE_ARGS -DWITH_PERF_TOOL=OFF;-DZMQ_BUILD_TESTS=OFF;-DENABLE_CPACK=OFF;-DCMAKE_MAKE_PROGRAM=${LIBZMQ_MAKE};-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE};${LIBZMQ_TOOLCHAIN_FILE};${LIBZMQ_COMPILER}
BUILD_COMMAND cmake --build ${CMAKE_CURRENT_BINARY_DIR}/libzmq-external-prefix/src/libzmq-external-build --target libzmq-static --config ${CMAKE_BUILD_TYPE}
GIT_REPOSITORY https://github.com/zeromq/libzmq
GIT_TAG v4.2.5
INSTALL_COMMAND "")
else() else()
set(LIBZMQ_MAKE make) if (MSVC)
set(LIBZMQ_COMPILER -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER};-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}) set(LIBZMQ_COMPILER_FLAGS -DCMAKE_C_FLAGS=/GL-;-DCMAKE_CXX_FLAGS=/GL-)
set(LIBZMQ_TOOLCHAIN_FILE -DCMAKE_TOOLCHAIN_FILE=${PROJECT_SOURCE_DIR}/CMakeModules/MinGWCross.cmake) else()
set(LIBZMQ_COMPILER_FLAGS "")
endif()
ExternalProject_Add(libzmq-external
SOURCE_DIR ./libzmq
CMAKE_ARGS -DCMAKE_MACOSX_RPATH=1;-DCMAKE_OSX_ARCHITECTURES=x86_64;-DWITH_PERF_TOOL=OFF;-DZMQ_BUILD_TESTS=OFF;-DENABLE_CPACK=OFF;-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE};${LIBZMQ_COMPILER_FLAGS}
BUILD_COMMAND cmake --build ${CMAKE_CURRENT_BINARY_DIR}/libzmq-external-prefix/src/libzmq-external-build --target libzmq-static --config ${CMAKE_BUILD_TYPE}
GIT_REPOSITORY https://github.com/zeromq/libzmq
GIT_TAG v4.2.5
INSTALL_COMMAND "")
endif() endif()
ExternalProject_Add(libzmq-external set(LIBZMQ_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzmq-external-prefix/src/libzmq-external-build/lib)
SOURCE_DIR ./libzmq # On macOS, we need to build a fat static library containing both x86_64 and x86_64h, since macOS
CMAKE_ARGS -DWITH_PERF_TOOL=OFF;-DZMQ_BUILD_TESTS=OFF;-DENABLE_CPACK=OFF;-DCMAKE_MAKE_PROGRAM=${LIBZMQ_MAKE};-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE};${LIBZMQ_TOOLCHAIN_FILE};${LIBZMQ_COMPILER} # targets specify two architectures in their link command line ("-arch x86_64 -arch x86_64h").
BUILD_COMMAND cmake --build ${CMAKE_CURRENT_BINARY_DIR}/libzmq-external-prefix/src/libzmq-external-build --target libzmq-static --config ${CMAKE_BUILD_TYPE}
GIT_REPOSITORY https://github.com/zeromq/libzmq
GIT_TAG v4.2.5
INSTALL_COMMAND "")
else()
if (MSVC)
set(LIBZMQ_COMPILER_FLAGS -DCMAKE_C_FLAGS=/GL-;-DCMAKE_CXX_FLAGS=/GL-)
else()
set(LIBZMQ_COMPILER_FLAGS "")
endif()
ExternalProject_Add(libzmq-external
SOURCE_DIR ./libzmq
CMAKE_ARGS -DCMAKE_MACOSX_RPATH=1;-DCMAKE_OSX_ARCHITECTURES=x86_64;-DWITH_PERF_TOOL=OFF;-DZMQ_BUILD_TESTS=OFF;-DENABLE_CPACK=OFF;-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE};${LIBZMQ_COMPILER_FLAGS}
BUILD_COMMAND cmake --build ${CMAKE_CURRENT_BINARY_DIR}/libzmq-external-prefix/src/libzmq-external-build --target libzmq-static --config ${CMAKE_BUILD_TYPE}
GIT_REPOSITORY https://github.com/zeromq/libzmq
GIT_TAG v4.2.5
INSTALL_COMMAND "")
endif()
set(LIBZMQ_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzmq-external-prefix/src/libzmq-external-build/lib)
# On macOS, we need to build a fat static library containing both x86_64 and x86_64h, since macOS
# targets specify two architectures in their link command line ("-arch x86_64 -arch x86_64h").
if (APPLE)
ExternalProject_Add(libzmq-external-h
SOURCE_DIR ./libzmq-h
CMAKE_ARGS -DCMAKE_MACOSX_RPATH=1;-DCMAKE_OSX_ARCHITECTURES=x86_64h;-DWITH_PERF_TOOL=OFF;-DZMQ_BUILD_TESTS=OFF;-DENABLE_CPACK=OFF;-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
BUILD_COMMAND cmake --build ${CMAKE_CURRENT_BINARY_DIR}/libzmq-external-h-prefix/src/libzmq-external-h-build --target libzmq-static --config ${CMAKE_BUILD_TYPE}
GIT_REPOSITORY https://github.com/zeromq/libzmq
GIT_TAG v4.2.5
INSTALL_COMMAND "")
set(LIBZMQ_H_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzmq-external-h-prefix/src/libzmq-external-h-build/lib)
add_library(libzmq-external-imported STATIC IMPORTED GLOBAL)
add_library(libzmq-external-imported-h STATIC IMPORTED GLOBAL)
add_dependencies(libzmq-external-imported libzmq-external)
add_dependencies(libzmq-external-imported-h libzmq-external-h)
else()
add_library(libzmq STATIC IMPORTED GLOBAL)
add_dependencies(libzmq libzmq-external)
endif()
# Set up the imported target properties
if (MSVC)
set_target_properties(libzmq PROPERTIES IMPORTED_LOCATION ${LIBZMQ_DIR}/${CMAKE_BUILD_TYPE}/libzmq-v141-mt-s-4_2_5${CMAKE_STATIC_LIBRARY_SUFFIX})
set_target_properties(libzmq PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES iphlpapi${CMAKE_STATIC_LIBRARY_SUFFIX})
else()
if (APPLE) if (APPLE)
set_target_properties(libzmq-external-imported PROPERTIES IMPORTED_LOCATION ${LIBZMQ_DIR}/libzmq${CMAKE_STATIC_LIBRARY_SUFFIX}) ExternalProject_Add(libzmq-external-h
set_target_properties(libzmq-external-imported-h PROPERTIES IMPORTED_LOCATION ${LIBZMQ_H_DIR}/libzmq${CMAKE_STATIC_LIBRARY_SUFFIX}) SOURCE_DIR ./libzmq-h
CMAKE_ARGS -DCMAKE_MACOSX_RPATH=1;-DCMAKE_OSX_ARCHITECTURES=x86_64h;-DWITH_PERF_TOOL=OFF;-DZMQ_BUILD_TESTS=OFF;-DENABLE_CPACK=OFF;-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
BUILD_COMMAND cmake --build ${CMAKE_CURRENT_BINARY_DIR}/libzmq-external-h-prefix/src/libzmq-external-h-build --target libzmq-static --config ${CMAKE_BUILD_TYPE}
GIT_REPOSITORY https://github.com/zeromq/libzmq
GIT_TAG v4.2.5
INSTALL_COMMAND "")
set(LIBZMQ_H_DIR ${CMAKE_CURRENT_BINARY_DIR}/libzmq-external-h-prefix/src/libzmq-external-h-build/lib)
add_library(libzmq-external-imported STATIC IMPORTED GLOBAL)
add_library(libzmq-external-imported-h STATIC IMPORTED GLOBAL)
add_dependencies(libzmq-external-imported libzmq-external)
add_dependencies(libzmq-external-imported-h libzmq-external-h)
else() else()
set_target_properties(libzmq PROPERTIES IMPORTED_LOCATION ${LIBZMQ_DIR}/libzmq${CMAKE_STATIC_LIBRARY_SUFFIX}) add_library(libzmq STATIC IMPORTED GLOBAL)
if(MINGW) add_dependencies(libzmq libzmq-external)
set_target_properties(libzmq PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES "ws2_32${CMAKE_STATIC_LIBRARY_SUFFIX};iphlpapi${CMAKE_STATIC_LIBRARY_SUFFIX}") endif()
# Set up the imported target properties
if (MSVC)
set_target_properties(libzmq PROPERTIES IMPORTED_LOCATION ${LIBZMQ_DIR}/${CMAKE_BUILD_TYPE}/libzmq-v141-mt-s-4_2_5${CMAKE_STATIC_LIBRARY_SUFFIX})
set_target_properties(libzmq PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES iphlpapi${CMAKE_STATIC_LIBRARY_SUFFIX})
else()
if (APPLE)
set_target_properties(libzmq-external-imported PROPERTIES IMPORTED_LOCATION ${LIBZMQ_DIR}/libzmq${CMAKE_STATIC_LIBRARY_SUFFIX})
set_target_properties(libzmq-external-imported-h PROPERTIES IMPORTED_LOCATION ${LIBZMQ_H_DIR}/libzmq${CMAKE_STATIC_LIBRARY_SUFFIX})
else()
set_target_properties(libzmq PROPERTIES IMPORTED_LOCATION ${LIBZMQ_DIR}/libzmq${CMAKE_STATIC_LIBRARY_SUFFIX})
if(MINGW)
set_target_properties(libzmq PROPERTIES IMPORTED_LINK_INTERFACE_LIBRARIES "ws2_32${CMAKE_STATIC_LIBRARY_SUFFIX};iphlpapi${CMAKE_STATIC_LIBRARY_SUFFIX}")
endif()
endif() endif()
endif() endif()
# On macOS, create the combined target
if (APPLE)
set(LIBZMQ_COMBINED_OUTPUT ${LIBZMQ_DIR}/libzmq_combined${CMAKE_STATIC_LIBRARY_SUFFIX})
add_custom_target(libzmq-combined COMMAND lipo -create ${LIBZMQ_DIR}/libzmq${CMAKE_STATIC_LIBRARY_SUFFIX} ${LIBZMQ_H_DIR}/libzmq${CMAKE_STATIC_LIBRARY_SUFFIX} -o ${LIBZMQ_COMBINED_OUTPUT}
BYPRODUCTS ${LIBZMQ_COMBINED_OUTPUT})
add_dependencies(libzmq-combined libzmq-external-imported libzmq-external-imported-h)
add_library(libzmq STATIC IMPORTED GLOBAL)
set_target_properties(libzmq PROPERTIES IMPORTED_LOCATION ${LIBZMQ_COMBINED_OUTPUT})
add_dependencies(libzmq libzmq-combined)
endif()
# C interface to ZeroMQ
add_library(libzmq-headers INTERFACE)
target_include_directories(libzmq-headers INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libzmq/include)
# C++ interface to ZeroMQ
add_library(cppzmq-headers INTERFACE)
target_include_directories(cppzmq-headers INTERFACE ./cppzmq)
add_dependencies(cppzmq-headers libzmq)
endif() endif()
# On macOS, create the combined target
if (APPLE)
set(LIBZMQ_COMBINED_OUTPUT ${LIBZMQ_DIR}/libzmq_combined${CMAKE_STATIC_LIBRARY_SUFFIX})
add_custom_target(libzmq-combined COMMAND lipo -create ${LIBZMQ_DIR}/libzmq${CMAKE_STATIC_LIBRARY_SUFFIX} ${LIBZMQ_H_DIR}/libzmq${CMAKE_STATIC_LIBRARY_SUFFIX} -o ${LIBZMQ_COMBINED_OUTPUT}
BYPRODUCTS ${LIBZMQ_COMBINED_OUTPUT})
add_dependencies(libzmq-combined libzmq-external-imported libzmq-external-imported-h)
add_library(libzmq STATIC IMPORTED GLOBAL)
set_target_properties(libzmq PROPERTIES IMPORTED_LOCATION ${LIBZMQ_COMBINED_OUTPUT})
add_dependencies(libzmq libzmq-combined)
endif()
# C interface to ZeroMQ
add_library(libzmq-headers INTERFACE)
target_include_directories(libzmq-headers INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libzmq/include)
# C++ interface to ZeroMQ
add_library(cppzmq-headers INTERFACE)
target_include_directories(cppzmq-headers INTERFACE ./cppzmq)
add_dependencies(cppzmq-headers libzmq)

View file

@ -1,4 +1,4 @@
add_library(core STATIC set(core_sources
3ds.h 3ds.h
announce_multiplayer_session.cpp announce_multiplayer_session.cpp
announce_multiplayer_session.h announce_multiplayer_session.h
@ -410,14 +410,6 @@ add_library(core STATIC
movie.h movie.h
perf_stats.cpp perf_stats.cpp
perf_stats.h perf_stats.h
rpc/packet.cpp
rpc/packet.h
rpc/rpc_server.cpp
rpc/rpc_server.h
rpc/server.cpp
rpc/server.h
rpc/zmq_server.cpp
rpc/zmq_server.h
settings.cpp settings.cpp
settings.h settings.h
telemetry_session.cpp telemetry_session.cpp
@ -426,6 +418,19 @@ add_library(core STATIC
tracer/recorder.cpp tracer/recorder.cpp
tracer/recorder.h tracer/recorder.h
) )
if (ENABLE_SCRIPTING)
list(APPEND core_sources
rpc/packet.cpp
rpc/packet.h
rpc/rpc_server.cpp
rpc/rpc_server.h
rpc/server.cpp
rpc/server.h
rpc/zmq_server.cpp
rpc/zmq_server.h
)
endif()
add_library(core STATIC ${core_sources})
create_target_directory_groups(core) create_target_directory_groups(core)
@ -445,4 +450,6 @@ if (ARCHITECTURE_x86_64)
target_link_libraries(core PRIVATE dynarmic) target_link_libraries(core PRIVATE dynarmic)
endif() endif()
target_link_libraries(core PUBLIC libzmq-headers cppzmq-headers libzmq) if (ENABLE_SCRIPTING)
target_link_libraries(core PUBLIC libzmq-headers cppzmq-headers libzmq)
endif()

View file

@ -25,7 +25,9 @@
#include "core/loader/loader.h" #include "core/loader/loader.h"
#include "core/memory_setup.h" #include "core/memory_setup.h"
#include "core/movie.h" #include "core/movie.h"
#ifdef ENABLE_SCRIPTING
#include "core/rpc/rpc_server.h" #include "core/rpc/rpc_server.h"
#endif
#include "core/settings.h" #include "core/settings.h"
#include "network/network.h" #include "network/network.h"
#include "video_core/video_core.h" #include "video_core/video_core.h"
@ -182,7 +184,11 @@ System::ResultStatus System::Init(EmuWindow& emu_window, u32 system_mode) {
dsp_core->EnableStretching(Settings::values.enable_audio_stretching); dsp_core->EnableStretching(Settings::values.enable_audio_stretching);
telemetry_session = std::make_unique<Core::TelemetrySession>(); telemetry_session = std::make_unique<Core::TelemetrySession>();
#ifdef ENABLE_SCRIPTING
rpc_server = std::make_unique<RPC::RPCServer>(); rpc_server = std::make_unique<RPC::RPCServer>();
#endif
service_manager = std::make_shared<Service::SM::ServiceManager>(); service_manager = std::make_shared<Service::SM::ServiceManager>();
shared_page_handler = std::make_shared<SharedPage::Handler>(); shared_page_handler = std::make_shared<SharedPage::Handler>();
@ -234,7 +240,9 @@ void System::Shutdown() {
Kernel::Shutdown(); Kernel::Shutdown();
HW::Shutdown(); HW::Shutdown();
telemetry_session.reset(); telemetry_session.reset();
#ifdef ENABLE_SCRIPTING
rpc_server.reset(); rpc_server.reset();
#endif
service_manager.reset(); service_manager.reset();
dsp_core.reset(); dsp_core.reset();
cpu_core.reset(); cpu_core.reset();

View file

@ -21,9 +21,11 @@ namespace AudioCore {
class DspInterface; class DspInterface;
} }
#ifdef ENABLE_SCRIPTING
namespace RPC { namespace RPC {
class RPCServer; class RPCServer;
} }
#endif
namespace Service { namespace Service {
namespace SM { namespace SM {
@ -220,8 +222,10 @@ private:
/// Frontend applets /// Frontend applets
std::shared_ptr<Frontend::SoftwareKeyboard> registered_swkbd; std::shared_ptr<Frontend::SoftwareKeyboard> registered_swkbd;
#ifdef ENABLE_SCRIPTING
/// RPC Server for scripting support /// RPC Server for scripting support
std::unique_ptr<RPC::RPCServer> rpc_server; std::unique_ptr<RPC::RPCServer> rpc_server;
#endif
/// Shared Page /// Shared Page
std::shared_ptr<SharedPage::Handler> shared_page_handler; std::shared_ptr<SharedPage::Handler> shared_page_handler;