PMM is a module for CMake that manages... package managers.
People hate installing new software. Especially when they already have a perfectly working tool present. PMM uses the CMake scripting language to manage external packaging tools. PMM will automatically download, install, and control package managers from within your CMake project.
(As you are reading this, only Conan and VCPKG are supported.)
Never fear! PMM is the lowest-maintenance software you will ever use.
Using PMM is simple:
pmm.cmake
file, and place it at the top level of your repository
(alongside your CMakeLists.txt
).CMakeLists.txt
, add a line include(pmm.cmake)
.pmm()
CMake function.That's it! The pmm.cmake
file is just 23 significant lines. Take a look inside
if you doubt.
Precisely! pmm.cmake
is just a bootstrapper for the real PMM code, which
can be found in the pmm/
directory in the repository. The content is
served over HTTPS from the gh-pages
branch of the PMM repository, so it is all publicly visible.
Great! I sympathize, but remember: If you run apt
, yum
, pip
, or even
conan
, you are automatically downloading and running code from the
internet. It's all about whose code you trust.
Even still, you can host the PMM code yourself: Download the pmm/
directory as you want it, and modify the pmm.cmake
script to download
from your alternate location (eg, a corporate engineering intranet server).
Nope. pmm.cmake
will never automatically change the version of PMM that
it uses, and the files served will never be modified in-place: New versions
will be added, but old versions will remain unmodified.
PMM will notify you if a new version is available, but it won't be annoying
about it, and you can always disable this nagging by setting
PMM_IGNORE_NEW_VERSION
before including pmm.cmake
.
There are two ways:
PMM_VERSION
before including the pmm.cmake
script.PMM_VERSION_INIT
value at the top of pmm.cmake
.Prefer (1) for conditional/temporary version changes, and (2) for permanent version changes.
For permanent changes, set PMM_URL
and/or PMM_URL_BASE
in pmm.cmake
.
For temporary changes, set PMM_URL
before including pmm.cmake
pmm()
FunctionThe only interface to PMM (after including pmm.cmake
) is the pmm()
CMake function. Using it is very simple. At the time or writing, pmm()
only supports Conan and vcpkg, but other packaging solutions may be supported
in the future.
The VERBOSE
and DEBUG
options enable verbose and debug logging,
respectively. You may set PMM_{DEBUG,VERBOSE}
before include(pmm.cmake)
to
enable these options globally and see information about the PMM bootstrapping
process.
The pmm()
signature:
pmm(
# Enable verbose logging
[VERBOSE]
# Enable debug logging (implies VERBOSE)
[DEBUG]
# Use Conan
[CONAN
# Set additional --setting flags
[SETTINGS ...]
# Set additional --option flags
[OPTIONS ...]
# Set the --build option. (Default is `missing`)
[BUILD <policy>]
# Use a custom profile instead of the auto-generated profile created by PMM
[PROFILE <profile_name>]
# Ensure remotes are present before installing
[REMOTES [<name>[::no_verify] <url> [...]]]
# Enable the Bincrafters repository
[BINCRAFTERS]
# Enable the conan-community repository
[COMMUNITY]
]
# Use vcpkg
[VCPKG
# Specify the revision of vcpkg that you want to use (required)
REVISION <rev>
# Ensure the given packages are installed using vcpkg
[REQUIRES [req [...]]]
# Copy custom ports to the vcpkg ports directory
[PORTS [req [...]]]
]
# Use CMakeCM
[CMakeCM
# Either use the latest release, or specify a specific base URL to
# download from
{ROLLING | FROM <base-url>}
]
)
CONAN
PMM modeIn CONAN
mode, PMM will find, obtain, and use Conan to manage project
packages.
PMM will always use the cmake
Conan generator, and will define imported
targets for consumption (Equivalent of conan_basic_setup(TARGETS)
). It will
also set CMAKE_PREFIX_PATH
and CMAKE_MODULE_PATH
for you to use
find_package()
and include()
against the installed dependencies.
NOTE: No other CMake variables from regular Conan usage are defined.
CONAN
mode requires a conanfile.txt
or conanfile.py
in your project
source directory. It will run conan install
against this file to obtain
dependencies for your project.
The nitty-gritty of how PMM finds/obtains Conan:
CONAN_EXECUTABLE
variable. If found, it is used.conan
executable. Searches:
pyenv
versions in the user home directory~/.local/bin
for user-mode install binariesC:/Python{36,27,}/Scripts
for Conan installationsPATH
venv
or virtualenv
executable Python module.While PMM will ensure that Conan has been executed for you as part of your configure stage, it is up to you to provide a Conanfile that Conan can consume to get your dependency information.
You will still need to read the Conan documentation to understand the basics of how to declare and consume your dependencies.
VCPKG
PMM modeIn VCPKG
mode, PMM will download the vcpkg repository at the given
REVISION
, build the vcpkg
tool, and manage the package installation in a
use-local data directory.
REVISION
should be a git tree-ish (A revision number (preferred), branch,
or tag) that you could git checkout
from the vcpkg repository. PMM will
download the specified commit from GitHub and build the vcpkg
command line
tool from source. You will need std::filesystem
or std::experimental::filesystem
support from your
compiler and standard library.
If you want to copy custom ports to the vcpkg ports folder, you can define PORTS
with a list of folders to copy over.
REQUIRES
is a list of packages that you would like to install using the
vcpkg
command line tool.
When using PMM, you do not need to use the vcpkg.cmake
CMake toolchain
file: PMM will take care of this aspect for you.
After calling pmm(VCPKG)
, all you need to do is find_package()
the
packages that you want to use.
CMakeCM
PMM modeIf CMakeCM
is provided, PMM will download and make available the CMake
Community Modules for you project.
Once the pmm()
function is run, you may include
or find_package
any of the
modules provided by CMakeCM
.
You must also specify either ROLLING
or FROM <base-url>
to use CMakeCM with
PMM:
ROLLING
, PMM will download the latest version of the CMakeCM
module index every time you configure (with a few minutes of cooldown).FROM
, the module index will only be obtained from the given
base URL. Note: This URL is not the URL of a CMakeCM.cmake
file: It
is a url that prefixes the CMakeCM.cmake
module URL.After PMM has run for the first time, it will generate a sh and bat script that can be used to maintain your PMM installation
Get help with the /Help
option:
> pmm-cli.sh /Help
As an example, you can rebuild a Conan package with this command:
> pmm-cli.sh /Conan /Rebuild <package name>