Files
eden/docs/CPMUtil
crueter 89f72d286a [cmake, tools] update CPMUtil and add support for CPMUtil bundled Qt, module updates, cleanups (#3289)
Support for bundled Qt, not through aqtinstall but rather my CI. Multimedia is
implemented too, works on both Windows and Linux, though we don't
actually use it so it doesn't really matter. Contains Declarative and all that so the Quick frontend will work once it becomes a thing.

Some options have changed, notably w.r.t LTO and faster
linker, which are now handled directly in the modules.

CPMUtil also has support for custom dirs (`PackageName_CUSTOM_DIR`) now. Probably most useful for adding external fragment shaders and whatnot.

Signed-off-by: crueter <crueter@eden-emu.dev>
Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3289
2026-01-14 19:29:13 +01:00
..

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.

Global Options:

  • CPMUTIL_FORCE_SYSTEM (default OFF): Require all CPM dependencies to use system packages. NOT RECOMMENDED!
    • You may optionally override this (section)
  • CPMUTIL_FORCE_BUNDLED (default ON on MSVC and Android, OFF elsewhere): Require all CPM dependencies to use bundled packages.

You are highly encouraged to read AddPackage first, even if you plan to only interact with CPMUtil via AddJsonPackage.

AddPackage

The core of CPMUtil is the AddPackage function. AddPackage itself is fully CMake-based, and largely serves as an interface between CPM and the rest of CPMUtil.

AddCIPackage

AddCIPackage adds a package that follows crueter's CI repository spec.

AddJsonPackage

AddJsonPackage is the recommended method of usage for CPMUtil.

AddQt

AddQt adds a specific version of Qt to your project.

Lists

CPMUtil will create three lists of dependencies where AddPackage or similar was used. Each is in order of addition.

  • CPM_PACKAGE_NAMES: The names of packages included by CPMUtil
  • CPM_PACKAGE_URLS: The URLs to project/repo pages of packages
  • CPM_PACKAGE_SHAS: Short version identifiers for each package
    • If the package was included as a system package, (system) is appended thereafter
    • Packages whose versions can't be deduced will be left as unknown.

For an example of how this might be implemented in an application, see Eden's implementation:

For Packagers

If you are packaging a project that uses CPMUtil, read this!

Network Sandbox

For sandboxed environments (e.g. Gentoo, nixOS) you must install all dependencies to the system beforehand and set -DCPMUTIL_FORCE_SYSTEM=ON. If a dependency is missing, get creating!

Alternatively, if CPMUtil pulls in a package that has no suitable way to install or use a system version, download it separately and pass -DPackageName_DIR=/path/to/downloaded/dir (e.g. shaders)

Unsandboxed

For others (AUR, MPR, etc). CPMUtil will handle everything for you, including if some of the project's dependencies are missing from your distribution's repositories. That is pretty much half the reason I created this behemoth, after all.