I promise I'm a UI developer - mbedtls can now be used as a system package - zycore can now be used as a system package - cleaned up dynarmic externals - fixed libusb incorrectly showing as bundled - add version/tag formatting to JSON - add custom GIT_HOST option for packages - moved some of my repos to my new git - slightly better version identification - combined VUL/VH since they are codependent (using my combo vendor) - fix cpmfile inclusion - remove libusb submodule This PR succeeds #383 since it includes it Co-authored-by: SDK Chan <sdkchan@eden-emu.dev> Reviewed-on: #392 Co-authored-by: crueter <crueter@crueter.xyz> Co-committed-by: crueter <crueter@crueter.xyz>
9.9 KiB
CPM
CPM (CMake Package Manager) is the preferred method of managing dependencies within Eden.
Global Options:
YUZU_USE_CPMis set by default on MSVC and Android. Other platforms should use this if certain "required" system dependencies (e.g. OpenSSL) are broken or missing- If this is
OFF, required system dependencies will be searched viafind_package, although certain externals use CPM regardless.
- If this is
CPMUTIL_FORCE_SYSTEM(defaultOFF): Require all CPM dependencies to use system packages. NOT RECOMMENDED!- Many packages, e.g. mcl, sirit, xbyak, discord-rpc, are not generally available as a system package.
- You may optionally override these (see CPMUtil section)
CPMUTIL_FORCE_BUNDLED(defaultONon MSVC and Android,OFFelsewhere): Require all CPM dependencies to use bundled packages.
CPMUtil
CPMUtil is a wrapper around CPM that aims to reduce boilerplate and add useful utility functions to make dependency management a piece of cake.
AddPackage
AddPackage is the core of the CPMUtil wrapper, and is generally the lowest level you will need to go when dealing with dependencies.
Identification/Fetching
NAME(required): The package name (must be the same as thefind_packagename if applicable)VERSION: The minimum version of this package that can be used on the systemGIT_VERSION: The "version" found within gitURL: The URL to fetch.REPO: The GitHub repo to use (owner/repo).- Only GitHub is supported for now, though other platforms will see support at some point
TAG: The tag to fetch, if applicable.ARTIFACT: The name of the artifact, if applicable.SHA: Commit sha to fetch, if applicable.BRANCH: Branch to fetch, if applicable.
The following configurations are supported, in descending order of precedence:
URL: Bare URL download, useful for custom artifacts- If this is set,
GIT_URLorREPOshould be set to allow the dependency viewer to link to the project's Git repository. - If this is NOT set,
REPOmust be defined.
- If this is set,
REPO + TAG + ARTIFACT: GitHub release artifact- The final download URL will be
https://github.com/${REPO}/releases/download/${TAG}/${ARTIFACT} - Useful for prebuilt libraries and prefetched archives
- The final download URL will be
REPO + TAG: GitHub tag archive- The final download URL will be
https://github.com/${REPO}/archive/refs/tags/${TAG}.tar.gz - Useful for pinning to a specific tag, better for build identification
- The final download URL will be
REPO + SHA: GitHub commit archive- The final download URL will be
https://github.com/${REPO}/archive/${SHA}.zip - Useful for pinning to a specific commit
- The final download URL will be
REPO + BRANCH: GitHub branch archive- The final download URL will be
https://github.com/${REPO}/archive/refs/heads/${BRANCH}.zip - Generally not recommended unless the branch is frozen
- The final download URL will be
REPO: GitHub master archive- The final download URL will be
https://github.com/${REPO}/archive/refs/heads/master.zip - Generally not recommended unless the project is dead
- The final download URL will be
Hashing
Hashing is used for verifying downloads. It's highly recommended to use these.
HASH_ALGO(defaultSHA512): Hash algorithm to use
Hashing strategies, descending order of precedence:
HASH: Bare hash verification, useful for static downloads e.g. commit archivesHASH_SUFFIX: Download the hash as${DOWNLOAD_URL}.${HASH_SUFFIX}- The downloaded hash must match the hash algorithm and contain nothing but the hash; no filenames or extra content.
HASH_URL: Download the hash from a separate URL
Additional Options
KEY: Custom cache key to use (stored as.cache/cpm/${packagename_lower}/${key})- Default is based on, in descending order of precedence:
- First 4 characters of the sha
GIT_VERSION- Tag
VERSION- Otherwise, CPM defaults will be used. This is not recommended as it doesn't produce reproducible caches
- Default is based on, in descending order of precedence:
DOWNLOAD_ONLY: Whether or not to configure the downloaded package via CMake- Useful to turn
OFFif the project doesn't use CMake
- Useful to turn
SOURCE_SUBDIR: Subdirectory of the project containing a CMakeLists.txt fileFIND_PACKAGE_ARGUMENTS: Arguments to pass to thefind_packagecallBUNDLED_PACKAGE: Set toONto force the usage of a bundled packageOPTIONS: Options to pass to the configuration of the packagePATCHES: Patches to apply to the package, stored in.patch/${packagename_lower}/0001-patch-name.patchand so on- Other arguments can be passed to CPM as well
Extra Variables
For each added package, users may additionally force usage of the system/bundled package.
${package}_FORCE_SYSTEM: Require the package to be installed on the system${package}_FORCE_BUNDLED: Force the package to be fetched and use the bundled version
Bundled/System Switching
Descending order of precedence:
- If
${package}_FORCE_SYSTEMis true, requires the package to be on the system - If
${package}_FORCE_BUNDLEDis true, forcefully uses the bundled package - If
CPMUTIL_FORCE_SYSTEMis true, requires the package to be on the system - If
CPMUTIL_FORCE_BUNDLEDis true, forcefully uses the bundled package - If the
BUNDLED_PACKAGEargument is true, forcefully uses the bundled package - Otherwise, CPM will search for the package first, and if not found, will use the bundled package
Identification
All dependencies must be identifiable in some way for usage in the dependency viewer. Lists are provided in descending order of precedence.
URLs:
GIT_URLREPOas a GitHub repositoryURL
Versions (bundled):
SHAGIT_VERSIONVERSIONTAG- "unknown"
If the package is a system package, AddPackage will attempt to determine the package version and append (system) to the identifier. Otherwise, it will be marked as unknown (system)
AddCIPackage
Adds a package that follows crueter's CI repository spec.
VERSION(required): The version to get (the tag will bev${VERSION})NAME(required): Name used within the artifactsREPO(required): CI repository, e.g.crueter-ci/OpenSSLPACKAGE(required):find_packagepackage nameEXTENSION: Artifact extension (defaulttar.zst)MIN_VERSION: Minimum version forfind_package. Only used if platform does not support this package as a bundled artifactDISABLED_PLATFORMS: List of platforms that lack artifacts for this package. One of:windows-amd64windows-arm64androidsolarisfreebsdlinuxlinux-aarch64
CMAKE_FILENAME: Custom CMake filename, relative to the package root (default${PACKAGE_ROOT}/${NAME}.cmake)
AddJsonPackage
This is the recommended method of usage for CPMUtil. In each directory that utilizes CPMUtil, there must be a cpmfile.json that defines dependencies in a similar manner to the individual calls.
The cpmfile is an object of objects, with each sub-object being named according to the package's identifier, e.g. openssl, which can then be fetched with AddJsonPackage(<identifier>). Options are designed to map closely to the argument names, and are always strings unless otherwise specified.
package->NAME(PACKAGEfor CI), defaults to the object keyrepo->REPOversion->VERSIONci(bool)
If ci is false:
hash->HASHsha->SHAtag->TAGartifact->ARTIFACTgit_version->GIT_VERSIONsource_subdir->SOURCE_SUBDIRbundled->BUNDLED_PACKAGEfind_args->FIND_PACKAGE_ARGUMENTSpatches->PATCHES(array)options->OPTIONS(array)
Other arguments aren't currently supported. If you wish to add them, see the AddJsonPackage function in CMakeModules/CPMUtil.cmake.
If ci is true:
name->NAME, defaults to the object keyextension->EXTENSION, defaults totar.zstmin_version->MIN_VERSIONcmake_filename->CMAKE_FILENAMEextension->EXTENSION
Examples
In order: OpenSSL CI, Boost (tag + artifact), discord-rpc (sha + options + patches), Opus (options + find_args)
{
"openssl": {
"ci": true,
"package": "OpenSSL",
"name": "openssl",
"repo": "crueter-ci/OpenSSL",
"version": "3.5.2",
"min_version": "1.1.1"
},
"boost": {
"package": "Boost",
"repo": "boostorg/boost",
"tag": "boost-1.88.0",
"artifact": "boost-1.88.0-cmake.7z",
"hash": "e5b049e5b61964480ca816395f63f95621e66cb9bcf616a8b10e441e0e69f129e22443acb11e77bc1e8170f8e4171b9b7719891efc43699782bfcd4b3a365f01",
"git_version": "1.88.0",
"version": "1.57"
},
"opus": {
"package": "Opus",
"repo": "xiph/opus",
"sha": "5ded705cf4",
"hash": "0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203",
"version": "1.3",
"find_args": "MODULE",
"options": [
"OPUS_BUILD_TESTING OFF",
"OPUS_BUILD_PROGRAMS OFF",
"OPUS_INSTALL_PKG_CONFIG_MODULE OFF",
"OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF"
]
},
"discord-rpc": {
"repo": "discord/discord-rpc",
"sha": "963aa9f3e5",
"hash": "386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde",
"options": [
"BUILD_EXAMPLES OFF"
],
"patches": [
"0001-cmake-version.patch",
"0002-no-clang-format.patch",
"0003-fix-cpp17.patch"
]
},
}
Inclusion
To include CPMUtil:
include(CPMUtil)
Prefetching
- To prefetch a CPM dependency (requires cpmfile):
tools/cpm-fetch.sh <packages>
- To prefetch all CPM dependencies:
tools/cpm-fetch-all.sh
Currently, cpm-fetch.sh defines the following directories for cpmfiles (max depth of 2, so subdirs are caught as well):
externals src/yuzu src/dynarmic .
Whenever you add a new cpmfile, update the script accordingly