Add support for vcpkg CRT and library linkage customization

main
Duncan Ogilvie 2 years ago
parent 1596a8143d
commit 232e49e087

@ -97,6 +97,8 @@ include-after = ["cmake/after-subdir.cmake"]
version = "2021.05.12"
url = "https://github.com/microsoft/vcpkg/archive/refs/tags/2021.05.12.tar.gz"
packages = ["fmt", "zlib"]
crt-linkage = "dynamic"
library-linkage = "dynamic"
```
The vcpkg `version` will automatically generate the `url` from the [official repository](https://github.com/microsoft/vcpkg/releases). For a custom registry you can specify your own `url` (and omit the `version`). You can browse available packages on [vcpkg.io](https://vcpkg.io/en/packages.html).
@ -114,6 +116,8 @@ config = true
components = ["mycomponent"]
```
The `crt-linkage` specifies the MSVC runtime library variant to use while compiling packages. `library-linkage` is whether libraries built are dynamic (default) or static.
## FetchContent
**Note**: The `[fetch-content]` feature is unpolished and will likely change in a future release.

@ -21,6 +21,8 @@ description = "Dependencies from vcpkg"
[vcpkg]
version = "2021.05.12"
packages = ["fmt"]
crt-linkage = "dynamic"
library-linkage = "dynamic"
[find-package]
fmt = {}

@ -39,6 +39,8 @@ struct Package {
struct Vcpkg {
std::string version;
std::string url;
std::string crt_linkage;
std::string library_linkage;
struct Package {
std::string name;

@ -634,6 +634,12 @@ void generate_cmake(const char *path, const parser::Project *parent_project) {
cmd("message")("STATUS", "Fetching vcpkg (" + version_name + ")...");
cmd("FetchContent_Declare")("vcpkg", "URL", url);
cmd("FetchContent_MakeAvailable")("vcpkg");
if (!project.vcpkg.crt_linkage.empty()) {
cmd("set")("VCPKG_CRT_LINKAGE", project.vcpkg.crt_linkage);
}
if (!project.vcpkg.library_linkage.empty()) {
cmd("set")("VCPKG_LIBRARY_LINKAGE", project.vcpkg.library_linkage);
}
cmd("include")("${vcpkg_SOURCE_DIR}/scripts/buildsystems/vcpkg.cmake");
cmd("endif")();
endl();

@ -627,6 +627,19 @@ Project::Project(const Project *parent, const std::string &path, bool build) {
auto &v = checker.create(toml, "vcpkg");
v.optional("url", vcpkg.url);
v.optional("version", vcpkg.version);
auto handle_linkage = [&v](const toml::key &ky, std::string &value) {
if (v.contains(ky)) {
v.required(ky, value);
if (value != "dynamic" && value != "static") {
throw std::runtime_error(format_key_error("Unknown linkage, expected dynamic/static", value, v.find(ky)));
}
}
};
handle_linkage("crt-linkage", vcpkg.crt_linkage);
handle_linkage("library-linkage", vcpkg.library_linkage);
for (const auto &p : v.find("packages").as_array()) {
Vcpkg::Package package;
const auto &package_str = p.as_string().str;

@ -9,6 +9,8 @@ description = "Dependencies from vcpkg"
[vcpkg]
version = "2021.05.12"
packages = ["fmt"]
crt-linkage = "dynamic"
library-linkage = "dynamic"
[find-package]
fmt = {}

Loading…
Cancel
Save