aboutsummaryrefslogtreecommitdiff
path: root/docs/users
diff options
context:
space:
mode:
authornicole mazzuca <mazzucan@outlook.com>2020-09-14 15:07:02 -0700
committerGitHub <noreply@github.com>2020-09-14 15:07:02 -0700
commit0fec1340eba828e95c489796eb0c7a4330120686 (patch)
treea5e9f8e8592705c790ae0e987fd2b36219a3276d /docs/users
parent76362dd2b2e4d9b03f6722219c8a1189e3a255fa (diff)
downloadvcpkg-0fec1340eba828e95c489796eb0c7a4330120686.tar.gz
vcpkg-0fec1340eba828e95c489796eb0c7a4330120686.zip
[vcpkg manifest] Add documentation! (#13488)
* [vcpkg docs] add docs for manifest files These are just for the maintainer docs, not user docs. * [vcpkg] EBNF-ify platform expression parsing this modifies nothing about what strings are accepted or rejected, it just moves stuff around. also adds tests. * [vcpkg docs] add manifest mode example * [wip] docs for augustin also fix tabs * [vcpkg manifest] switch to using maps for features * Apply suggestions from code review * un-experimentize format-manifest * flesh out the user manifest mode docs * CRs * billy CRs * final personal pass-thru
Diffstat (limited to 'docs/users')
-rw-r--r--docs/users/manifests.md259
-rw-r--r--docs/users/triplets.md2
2 files changed, 260 insertions, 1 deletions
diff --git a/docs/users/manifests.md b/docs/users/manifests.md
new file mode 100644
index 000000000..331665f2f
--- /dev/null
+++ b/docs/users/manifests.md
@@ -0,0 +1,259 @@
+# Manifest Mode
+
+vcpkg has two modes of operation - classic mode and manifest mode.
+
+In classic mode, vcpkg produces an "installed" tree,
+whose contents are changed by explicit calls to `vcpkg install` or `vcpkg remove`.
+The installed tree is intended for consumption by any number of projects:
+for example, installing a bunch of libraries and then using those libraries from Visual Studio,
+without additional configuration.
+Because the installed tree is not associated with an individual project,
+it's similar to tools like `brew` or `apt`,
+except that the installed tree is vcpkg-installation-local,
+rather than global to a system or user.
+
+In manifest mode, an installed tree is associated with a particular project rather than the vcpkg installation.
+The set of installed ports is controlled by editing the project's "manifest file",
+and the installed tree is placed in the project directory or build directory.
+This mode acts more similarly to language package managers like Cargo, or npm.
+We recommend using this manifest mode whenever possible,
+because it allows one to encode a project's dependencies explicitly in a project file,
+rather than in the documentation, making your project much easier to consume.
+
+Manifest mode is in beta, but one can use it from the CMake integration,
+which will be stable when used via things like `find_package`.
+This is the recommended way to use manifest mode.
+
+In this document, we have basic information on [Writing a Manifest](#writing-a-manifest),
+the [vcpkg Command Line Interface](#command-line-interface),
+and a little more information on [CMake](#cmake-integration) integration.
+
+Check out the [manifest cmake example](../examples/manifest-mode-cmake.md) for an example project using CMake and manifest mode.
+
+## Writing a Manifest
+
+A manifest is a JSON-formatted file which lies at the root of your project.
+It contains all the information a person needs to know to get dependencies for your project,
+as well as all the metadata about your project that a person who depends on you might be interested in.
+
+Every manifest is named `vcpkg.json`, and has a top level object. It is a strict JSON file,
+and can't contain things like comments or trailing commas - however,
+you can use field names that start with `$` to write your comments.
+
+All of the fields that `vcpkg.json` supports are as follows; the most important ones are [`"name"`](#name),
+the [version fields](#version-fields), and [`"dependencies"`](#dependencies):
+
+### `"name"`
+
+This is the name of your project! It must be formatted in a way that vcpkg understands - in other words,
+it must be lowercase alphabetic characters, digits, and hyphens, and it must not start nor end with a hyphen.
+For example, `Boost.Asio` might be given the name `boost-asio`.
+
+This is a required field.
+
+### Version fields
+
+There is, at this point, only one version field - `"version-string"`. However, more will be added in the future.
+You must have one (and only one) version field. There are different reasons to use each version field:
+
+* `"version-string"` - used for packages that don't have orderable versions. This is pretty uncommon,
+ but since we don't have any versioning constraints yet, this is the only one that you can use.
+
+Additionally, the `"port-version"` field is used by registries of packages,
+as a way to version "the package gotten from `vcpkg install`" differently from the upstream package version.
+You shouldn't need to worry about this at all.
+
+### `"description"`
+
+This is where you describe your project. Give it a good description to help in searching for it!
+This can be a single string, or it can be an array of strings;
+in the latter case, the first string is treated as a summary,
+while the remaining strings are treated as the full description.
+
+### `"dependencies"`
+
+This field lists all the dependencies you'll need to build your library (as well as any your dependents might need,
+if they were to use you). It's an array of strings and objects:
+
+* A string dependency (e.g., `"dependencies": [ "zlib" ]`) is the simplest way one can depend on a library;
+ it means you don't depend on a single version, and don't need to write down any more information.
+* On the other hand, an object dependency (e.g., `"dependencies": [ { "name": "zlib" } ]`)
+ allows you to add that extra information.
+
+An object dependency can have the following fields:
+
+#### `"name"`
+
+The name of the dependency. This follows the same restrictions as the [`"name"`](#name) property for a project.
+
+#### `"features"` and `"default-features"`
+
+`"features"` is an array of feature names which tell you the set of features that the
+dependencies need to have at a minimum,
+while `"default-features"` is a boolean that tells vcpkg whether or not to
+install the features the package author thinks should be "most common for most people to use".
+
+For example, `ffmpeg` is a library which supports many, many audio and video codecs;
+however, for your specific project, you may only need mp3 encoding.
+Then, you might just ask for:
+
+```json
+{
+ "name": "ffmpeg",
+ "default-features": false,
+ "features": [ "mp3lame" ]
+}
+```
+
+#### `"platform"`
+
+The `"platform"` field defines the platforms where the dependency should be installed - for example,
+you might need to use sha256, and so you use platform primitives on Windows, but `picosha2` on non-Windows platforms.
+
+```json
+{
+ "name": "picosha2",
+ "platform": "!windows"
+}
+```
+
+This is a string field which takes boolean expressions of the form `<identifier>`,
+`!expression`, `expression { & expression & expression...}`, and `expression { | expression | expression...}`,
+along with parentheses to denote precedence.
+For example, a dependency that's only installed on the Windows OS, for the ARM64 architecture,
+and on Linux on x64, would be written `(windows & arm64) | (linux & x64)`.
+
+The common identifiers are:
+
+- The operating system: `windows`, `uwp`, `linux`, `osx` (includes macOS), `android`, `emscripten`
+- The architecture: `x86`, `x64`, `wasm32`, `arm64`, `arm` (includes both arm32 and arm64 due to backwards compatibility)
+
+although one can define their own.
+
+#### Example:
+
+```json
+{
+ "dependencies": [
+ {
+ "name": "arrow",
+ "default-features": false,
+ "features": [ "json" ]
+ },
+ "boost-asio",
+ "openssl",
+ {
+ "name": "picosha2",
+ "platform": "!windows"
+ }
+ ]
+}
+```
+
+### `"supports"`
+
+If your project doesn't support common platforms, you can tell your users this with the `"supports"` field.
+It uses the same platform expressions as [`"platform"`](#platform), from dependencies, as well as the
+`"supports"` field of features.
+For example, if your library doesn't support linux, you might write `{ "supports": "!linux" }`.
+
+
+### `"features"` and `"default-features"`
+
+The `"features"` field defines _your_ project's optional features, that others may either depend on or not.
+It's an object, where the keys are the names of the features, and the values are objects describing the feature.
+`"description"` is required,
+and acts exactly like the [`"description"`](#description) field on the global package,
+and `"dependencies"` are optional,
+and again act exactly like the [`"dependencies"`](#dependencies) field on the global package.
+There's also the `"supports"` field,
+which again acts exactly like the [`"supports"`](#supports) field on the global package.
+
+You also have control over which features are default, if a person doesn't ask for anything specific,
+and that's the `"default-features"` field, which is an array of feature names.
+
+#### Example:
+
+```
+{
+ "name": "libdb",
+ "description": [
+ "An example database library.",
+ "Optionally uses one of CBOR, JSON, or CSV as a backend."
+ ],
+ "default-features": [ "cbor", "csv", "json" ],
+ "features": {
+ "cbor": {
+ "description": "The CBOR backend",
+ "dependencies": [
+ {
+ "$explanation": [
+ "This is currently how you tell vcpkg that the cbor feature depends on the json feature of this package",
+ "We're looking into making this easier"
+ ],
+ "name": "libdb",
+ "default-features": false,
+ "features": [ "json" ]
+ }
+ ]
+ },
+ "csv": {
+ "description": "The CSV backend",
+ "dependencies": [
+ "fast-cpp-csv-parser"
+ ]
+ },
+ "gui": {
+ "description": "The GUI libdb database viewer.",
+ "supports": "windows | osx"
+ }
+ "json": {
+ "description": "The JSON backend",
+ "dependencies": [
+ "jsoncons"
+ ]
+ },
+ }
+}
+```
+
+## Command Line Interface
+
+The command line interface around the new manifest mode is pretty simple.
+There's only one command that one really needs to worry about, `vcpkg install`,
+although `vcpkg search` is still useful.
+Since manifest mode is still in beta, you'll need to pass a feature flag: `manifests`.
+There are a few ways to pass this feature flag:
+
+* `--feature-flag` option: On any vcpkg command, you can pass `--feature-flag=manifests`
+* `VCPKG_FEATURE_FLAGS` environment variable: one can set the environment variable `VCPKG_FEATURE_FLAGS` to
+ `manifests`.
+
+### `vcpkg install`
+
+Once one has written a manifest file,
+they can run `vcpkg install` in any subdirectory of the directory containing `vcpkg.json`.
+It will install all of the dependencies for the default triplet into
+`<directory containing vcpkg.json>/vcpkg_installed`.
+If you want to switch the triplet (for example, this is very common on windows, where the default triplet is x86-windows, not x64-windows),
+you can pass it with the `--triplet` option: `vcpkg install --triplet x64-windows` (or whatever).
+Then, vcpkg will install all the dependencies, and you're ready to go!
+
+## CMake Integration
+
+The CMake integration acts exactly like the existing CMake integration.
+One passes the toolchain file, located at `[vcpkg root]/scripts/buildsystems/vcpkg.cmake`,
+to the CMake invocation via the `CMAKE_TOOLCHAIN_FILE` variable.
+Then, CMake will install all dependencies into the build directory, and you're good!
+It ends up that you only have to run CMake, and vcpkg is called only as part of the build process.
+Unlike bare vcpkg, the feature flag is not required,
+since the CMake integration won't break as long as you depending on the exact naming of vcpkg's installed directory.
+
+### Example:
+
+```
+> cmake -B builddir -S . -DCMAKE_TOOLCHAIN_FILE=[vcpkg root]/scripts/buildsystems/vcpkg.cmake
+> cmake --build builddir
+```
+
+with a `vcpkg.json` in the same directory as `CMakeLists.txt` should Just Work!
diff --git a/docs/users/triplets.md b/docs/users/triplets.md
index b587a91e5..9903b197c 100644
--- a/docs/users/triplets.md
+++ b/docs/users/triplets.md
@@ -93,7 +93,7 @@ Replaces the default computed list of triplet "Supports" terms.
This option (if set) will override the default set of terms used for qualified dependency resolution and "Supports" field evaluation.
-See the [`Supports`](../maintainers/control-files.md#Supports) control file field documentation for more details.
+See the [`"supports"`](../maintainers/manifest-files.md#supports) manifest file field documentation for more details.
> Implementers' Note: this list is extracted via the `vcpkg_get_dep_info` mechanism.