++++
<a href="https://mod.io"><img src="https://mod.io/images/branding/modio-logo-bluedark.svg" alt="mod.io" width="360" align="right"/></a>
++++
= mod.io SDK2

image:https://img.shields.io/badge/license-MIT-brightgreen.svg[alt="License", link="https://github.com/modio/modio-sdk/blob/master/LICENSE"]
image:https://img.shields.io/discord/389039439487434752.svg?label=Discord&logo=discord&color=7289DA&labelColor=2C2F33[alt="Discord", link="https://discord.mod.io"]

Welcome to the mod.io SDK repository, built using C++. It allows game developers to host and automatically install user-generated content in their games. It connects to the https://docs.mod.io[mod.io REST API].

== Features

* Permissive MIT/BSL-license
* Async callback-based interface
* Non-blocking IO with a 'bring your own thread' model
* Automatic downloads and updates
* Email / Steam / EGS / Consoles / Custom SSO authentication
* Mod Browsing / Filtering
* Header-only, direct compilation or static library support with C++17 compiler
* Native Unreal Engine integration available via our https://github.com/modio/modio-ue[dedicated plugin]

== Platform Support

|===
|Platform       | Support                       |Compiler
|Windows        | ✔                             | MSVC C++ 2019
|Windows (GDK)  | ✔ <<contact-us,(Contact Us)>> | Vendor-provided
|Nintendo Switch| ✔ <<contact-us,(Contact Us)>> | Vendor-provided
|XBox (GDK)     | ✔ <<contact-us,(Contact Us)>> | Vendor-provided
|PlayStation®4  | ✔ <<contact-us,(Contact Us)>> | Vendor-provided
|PlayStation®5  | ✔ <<contact-us,(Contact Us)>> | Vendor-provided
|Linux          | ✔                             | Clang 10
|macOS          | ✔                             | Clang 10
|iOS            | ✔                             | Clang 10
|Android        | ✔                             | Clang 10
|===

== Compiler Support

|===
|Configuration  | Version
|Header-only    | C++17 (Windows)
|Static Library | C++17
|===

== Download repository

Pre-requisites to compile this SDK are listed in https://docs.mod.io/cppsdk/[Getting Started documentation]

It is possible to download the source code as a zip file from this webpage. However, a recursive clone downloads all dependencies. Therefore, the suggestion is to perform the following:

[source, zsh]
----
git clone --recurse-submodule https://github.com/modio/modio-sdk
cd modio-sdk
----

== Installation

To use the mod.io SDK, you can proceed with the installation using one of the following perspectives:

- Inside a CMake project
- Standalone: <<header-only>>
- Standalone: <<separate-compilation>>
- Standalone: <<static-library>>

=== Linux Dependencies

The mod.io SDK requires a Linux kernel with liburing support (v5.1 or later). The io_uring system calls provides asynchronous input/output operations. To fulfill that requirement and have the development tools ready, the following commands employ the "apt" package manager (tested on Ubuntu 20.04 Focal Fossa):

[source,bash]
----
sudo apt update
sudo apt upgrade
sudo apt install llvm clang lldb make wget python3 ninja-build git unzip libsdl2-dev
## Install Cmake
wget -q -O cmake-linux.sh https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0-Linux-x86_64.sh
sh cmake-linux.sh -- --skip-license --prefix=/usr/
## Install liburing-dev
wget http://mirrors.kernel.org/ubuntu/pool/main/libu/liburing/liburing-dev_0.7-3ubuntu3_amd64.deb
wget http://mirrors.kernel.org/ubuntu/pool/main/libu/liburing/liburing1_0.7-3ubuntu3_amd64.deb
sudo apt install ./liburing*deb
----

NOTE: If you are using the "header_only" release mode, the mod.io SDK includes MbedTLS headers, but requires the library installed in your system, which was tested with libmbedtls-dev 2.28.0 in Ubuntu. The "static" mode includes these libraries in the same folder as the libmodioStatic.a

=== macOS / iOS Dependencies

The mod.io SDK for development on macOS / iOS requires Clang 10 or GCC 10 or later, which come included in the XCode installation. XCode 14 or later is recommended. To install CMake 3.20 or Ninja 1.10, it is recommended to use https://brew.sh[brew] as follows:

[source,bash]
----
brew install cmake ninja
----

iOS compiles by default to the simulator. If you need to deploy to a device, add variable `MODIO_IOS_DEVICE` to cmake. Check documentation in the platform link:platform/ios/README.adoc[README.adoc] for more details.

The minimum deployment target is macOS 12.0. In case of mobile, it is iOS 15.0

=== Inside a CMake project

. Clone the repository, or add it as a submodule
. Confirm `your_project` uses CMake 3.20 or later
+
[source,cmake]
----
cmake_minimum_required(VERSION 3.20)
----
. Specify the target platform, with options: WIN or LINUX
+
[source,cmake]
----
set (MODIO_PLATFORM WIN)
----
. Add the SDK subdirectory to your project
+
[source,cmake]
----
add_subdirectory(<modio-sdk folder> EXCLUDE_FROM_ALL)
target_compile_features(your_project PUBLIC cxx_std_17)
----
. Link the library to your project
+
* To use the header-only configuration:
+
[source,cmake]
----
target_link_libraries(your_project PUBLIC modio)
----
* Or to use the static library configuration:
+
[source,cmake]
----
target_link_libraries(your_project PUBLIC modioStatic)
----


=== Standalone
To simplify the SDK compilation, the file `CMakePresets.json` includes the most common configurations as `presets` that employ Ninja by default. Therefore, confirm it is available on your `PATH` unless you want to <<override, override>> the CMake generator in use.

|===
|Platform | Preset          | Target       | Build System
|Windows  | win             | Release      | Visual Studio 2019
|Windows  | win-debug       | Debug        | Visual Studio 2019
|Windows  | win-dbginfo     | Pre-Release  | Visual Studio 2019
|Linux    | linux64         | Release      | Ninja
|Linux    | linux64-debug   | Debug        | Ninja
|Linux    | linux64-dbginfo | Pre-Release  | Ninja
|macOS    | macOS           | Release      | Ninja or XCode
|macOS    | macOS-debug     | Debug        | Ninja or XCode
|macOS    | macOS-dbginfo   | Pre-Release  | Ninja or XCode
|iOS      | iOS             | Release      | Ninja or XCode
|iOS      | iOS-debug       | Debug        | Ninja or XCode
|iOS      | iOS-dbginfo     | Pre-Release  | Ninja or XCode
|===

Debug presets have the `-debug` suffix, and Release-with-debug-info is `-dbginfo`. If you want to build the SDK in debug configuration specify the name, for example `win-debug` as the preset name.

To build the SDK using the default build and install directories:

. `cmake -S <modio-sdk folder> --preset=win`
+
This will use the Ninja generator to create a Ninja build system in `<modio-sdk folder>/out/build/win`. It installs the compiled libraries/headers to `<modio-sdk folder>/out/install/win`. To build the examples, append ` -DMODIO_BUILD_EXAMPLES=true`.
. `cmake --build <modio-sdk folder>/out/build/win`
+
This step compiles the SDK as a static library.
. `cmake --install <modio-sdk folder>/out/build/win`
+
This produces a folder `<modio-sdk folder>/out/install/win` with the following:
+
* `header_only` - directory with the header-only version of the SDK
* `source` - directory containing the implementation files of the SDK for use in 'split compilation' mode
* `static` - directory containing the static library binaries and necessary public include headers

NOTE: If you are compiling the mod.io SDK using different architectures, you can change the preset compilation folder by modifying the "CMAKE_INSTALL_PREFIX" path.

==== Header-only mode [[header-only]]

Simply add each of the subdirectories in `header_only` to your include directories. Then, in `your_project` source file add `#include "modio/ModioSDK.h"`

==== Separate compilation mode [[separate-compilation]]

If you prefer to compile the source code directly, add the `cpp` files in the `source` directory, along with the `include` from the header-only mode.
You must add `MODIO_SEPARATE_COMPILATION` to your project's compiler definitions. Then, in `your_project` source file add `#include "modio/ModioSDK.h"`

==== Static library mode [[static-library]]

Add the `inc` directory inside `static` to your `include` and link against the static binary in the `lib` folder.  You must add `MODIO_SEPARATE_COMPILATION` to your project's compiler definitions. Then, in `your_project` source file add `#include "modio/ModioSDK.h"`

=== Other Build Systems [[override]]

If you use a different build system or wish to generate project files for inclusion in an existing Visual Studio solution, you can override the default CMake generator. For example, it is possible to use an MSBuild-based Visual Studio Solution:

```
cmake -S <modio-sdk folder> --preset=win -G "Visual Studio 16 2019"
cmake --build <modio-sdk folder>/out/build/win
cmake --install <modio-sdk folder>/out/build/win
```

Note that when using the Visual Studio code generator, you have to pass in the target configuration (ie Release or Debug) as well, for instance:

```
cmake -S <modio-sdk folder> --preset=win -G "Visual Studio 16 2019" --Config=Release
```

If you are using the `clang` compiler with Visual studio, check section https://docs.mod.io/cppsdkref/#clang-win[Clang compiler in Visual Studio] for further details

==== Custom FMT library
If you have a custom version of the FMT library, you can modify the linking stage defining `MODIO_USE_CUSTOM_FMT`. This define signals the CMake build system to use a custom version of the library. Also, it requires that you define `MODIO_CUSTOM_FMT_PATH` to the system path that contains the FMT library to use.

The directory given to `MODIO_CUSTOM_FMT_PATH` should contain a CMakeLists.txt which exposes the `fmt` and/or `fmt-header-only` targets.

By default the SDK will consume the `fmt-header-only` target. Define `MODIO_CUSTOM_FMT_STATIC` to `true` to override this and request the consumption of the `fmt` static library target instead.

=== Windows Terminal Compilation of x64 library

When you compile the mod.io SDK and you require a x64 library in Windows, confirm the use the "x64 Native Tools Command Prompt for VS 2019", which by default employs the x64 compiler. To verify the Static or Shared library was compiled with x64 architecture, you can use the "dumpbin" command:
```
dumpbin out\build\win\modio\modioStatic.lib /headers
```
Then search for the confirmation as follows:
```
Dump of file out\build\win\modio\modioStatic.lib

File Type: LIBRARY

FILE HEADER VALUES
            8664 machine (x64)
             34A number of sections
        63336D7D time date stamp Wed Sep 28 10:39:09 2022
           136EC file pointer to symbol table
             AC9 number of symbols
               0 size of optional header
               0 characteristics
```

== Usage

Please see the https://docs.mod.io/cppsdk/[Getting Started documentation] for a breakdown of the mod.io SDK's concepts and usage, including:

* https://docs.mod.io/cppsdk/getting-started/#initialization-and-teardown[SDK initialization and event loop]
* https://docs.mod.io/cppsdk/getting-started/#user-authentication[Authentication]
* https://docs.mod.io/cppsdk/getting-started/#browsing-available-mods[Mod Browsing]
* https://docs.mod.io/cppsdk/getting-started/#mod-management-and-subscriptions[Mod Subscription Management]

== Game studios and Publishers [[contact-us]]
If you need assistance with 1st party approvals, or require a private, white-label UGC solution. mailto:developers@mod.io[Contact us] to discuss.

== Contributions Welcome
Our SDK is public and open source. Game developers are welcome to utilize it directly, to add support for mods in their games, or fork it for their customized use. If you want to contribute to the SDK, submit a pull request with your recommended changes for review.

== Other Repositories
https://mod.io[mod.io] provides an https://docs.mod.io[open API for user-generated content]. You are welcome to https://github.com/modio[view, fork and contribute to other codebases] we release.
