Как включить библиотеки только с внешними заголовками в собственные сборки Gradle с помощью нового нативного eplugin (5.3.1) gradle?
Оценивая родной язык gradle Я хочу включить lib только для заголовка, {fmt}, который будет использоваться в родном мультипроекте gradle с новым родным плагином gradle.
Я попытался включить его через flatDir и репозитории Maven. Документация только упоминает бинарные зависимости. Но даже тогда кажется, что внешний код должен быть расширен с помощью файла build.gradle. Ниже вы видите мою последнюю попытку
build.gradle в корне
allprojects {
apply plugin: 'xcode'
apply plugin: 'visual-studio'
configurations {
fmtLib
}
dependencies {
fmtLib files(file("$rootDir/../fmt"))
}
}
build.gradle в библиотеке, которая должна использовать {fmt}
plugins {
id 'cpp-library'
}
library {
linkage = [Linkage.SHARED]
targetMachines = [
machines.windows.x86_64,
machines.macOS.x86_64,
machines.linux.x86_64
]
baseName = "greeter"
}
greeter.cpp, который должен использовать {fmt}
#define FMT_HEADER_ONLY
#include <iostream>
#include "../public/greeter.hpp"
#include "include/fmt/format.h"
void Greeter::greet() {
fmt::print("Hello, {}!", "world");
std::cout << "Hello, " << name << ", your name has " << getNameLength() << " chars." << std::endl;
}
int Greeter::getNameLength() {
return name.length();
}
Приведенный выше пример приводит к ошибке компиляции, которая очевидна из-за неразрешимых зависимостей.
1 ответ
Нашел решение сам. К сожалению, Gradle не предоставляет лучшего решения до 5.3.1, но обходной путь может быть сделан
def fmtHeaders = file("$rootDir/../fmt/include")
components.main.binaries.whenElementFinalized { binary ->
project.dependencies {
if (binary.optimized) {
add(binary.includePathConfiguration.name, files(fmtHeaders))
} else {
add(binary.includePathConfiguration.name, files(fmtHeaders))
}
}
}