Installation directory layout conventions
This article describes the layout conventions used by vcpkg for the installation directory. The installation directory holds the files installed by each package. Port authors should ensure that their packages follow the conventions described in this article.
In classic mode, the installation directory is
located in $VCPKG_ROOT/installed
(where $VCPKG_ROOT
is your vcpkg
installation path). In manifest mode, each
manifest file has a corresponding vcpkg_installed
directory. The location of
the installation directory can be changed with the
--x-install-root
option.
Regardless of the operation mode, the layout of the installation directory
remains the same.
The installation directory is created the first time a package is installed, if you don't see an installation directory try installing some packages first.
The root level of the installation directory contains:
- A
vcpkg
directory which keeps track of installed packages and files - A directory for each triplet. Each triplet directory contains files installed by each package.
Triplet directories
The output of each package installation is contained in a triplet-specific directory.
For example, packages installed for the x64-windows
triplet are located in
installed/x64-windows
directory.
The layout for the subdirectories inside each triplet directory is the same:
Note
Some packages may produce files that don't match the conventions described here. Port authors should determine the final location of the produced files based on the purpose each file serves.
Subdirectory | File type |
---|---|
bin |
Release .dll and .pdb files |
debug/bin |
Debug .dll and .pdb files |
debug/lib |
Debug .lib , .so , .dylib , and .a files |
debug/lib/manual-link |
Manually-linkable debug .lib , .so , .dylib , and .a files |
debug/plugins/<group> |
Runtime-load debug .dll files |
debug/lib/pkgconfig |
Debug pkgconfig files (.pc ) |
include |
Header-files (.h , .hpp , .hxx ) |
lib |
Release .lib , .so , .dylib and .a files |
lib/manual-link |
Manually-linkable release .lib , .so , .dylib , and .a files |
lib/pkgconfig |
Pkgconfig files (.pc ) |
plugins/<group> |
Runtime-load release .dll files |
share/<port> |
Additional configuration-independent files |
share/<port>/copyright |
The license text for the package |
share/<port>/usage |
Buildsystem integration instructions file |
share/<port>/vcpkg-port-config.cmake |
Port-defined CMake functions and variables |
share/<lowercase-package>/<package>Config.cmake |
CMake integration files for find_package(package) |
share/<cmakepackagename>/vcpkg-cmake-wrapper.cmake |
CMake find_package(<cmakepackagename>) override |
share/pkgconfig |
Configuration-independent pkgconfig files (.pc ) |
tools/<port> |
Executable tools |
bin
and debug/bin
directories
On Windows, these directories contain DLL and PDB files for release and debug configuration
respectively. Any executable file produced by a port should be moved to a
tools/<port>
directory.
include
Contains header files (.h
, .hpp
, .hxx
). The layout under this directory
should reflect the intended usage of the package's header files. For example, a contoso
library that intends to use #include <contoso/contoso.h>
should provide the
header file include/contoso/contoso.h
.
vcpkg forbids installing some reserved header file names in the root of the
include
directory, for example: err.h
, user.h
, time.h
, and others.
Libraries that provide a forbidden header file name should place their header
files inside a include/<port>
directory. If the library intends to replace a
system header file, it should set the VCPKG_POLICY_ALLOW_RESTRICTED_HEADERS
policy in its portfile.cmake
.
lib
and debug/lib
directories
Contains static libraries, import libraries (on Windows), and shared libraries (on non-Windows).
lib/manual-link
and debug/lib/manual-link
directories
Contains libraries that must be manually linked.
Files that may cause issues when linked automatically must be placed in the
lib/manual-link
folders instead of the lib
directory. For example, if a
library is intended to define the main()
function for a program.
lib/pkgconfig
, debug/lib/pkgconfig
and share/pkgconfig
directories
Contains pkgconfig integration files (.pc
). A library should not provide
configuration-dependent and configuration-independent files at the same time.
For example: don't install lib/pkgconfig/contoso.pc
and share/pkgconfig/contoso.pc
.
plugins/<group>
and debug/plugins/<group>
Contains shared libraries that are meant to be loaded during runtime by consuming applications.
share/<port>
Contains miscellaneous files installed by each port. For example, SPDX files, scripts, etc.
share/<port>/copyright
vcpkg expects ports to provide a copyright
file that contains the license
information of the installed package. See the maintainer
guide
for more information.
share/<port>/usage
A text file with instructions to integrate a library within a project. See the guide to provide usage documentation for packages for more information.
share/<lowercase-package>/<package>Config.cmake
, share/<package>/<package>-config.cmake
CMake integration files should be placed in the share
folder and respect
CMake's rules for
find_package(package)
in CONFIG
mode.
For example, if a port expect to provide find_package(MyPackage REQUIRED)
, it
must provide either share/mypackage/MyPackageConfig.cmake
or share/mypackage/MyPackage-config.cmake
.
If a package provides CMake integration files, the
vcpkg_cmake_config_fixup()
helper function should be invoked to fix any non-relocatable paths and to merge
build configurations.
tools/<port>
Important
vcpkg is first and foremost a C++ library dependency manager. Port authors should be deliberate when deciding to include tools in the installation output. For example: consider installing only a release executable when the debug tool is not needed.
Both release and debug executables should be provided when the executables are intended for runtime use.
Contains executable tools produced by a port. It is highly recommended,
but not required, that each installed executable goes into a subdirectory
matching the name of the port that produced it. For example, a contoso
port might install a ContosoGenerator.exe
to tools/contoso/ContosoGenerator.exe
.
Some ports require that their executables go into a bin
subdirectory, in which
case the recommended pattern is tools/<port>/bin
.